Muove i primi passi nella Sanzenese all'età di 6 anni; messosi in mostra giocando contro avversari di categoria superiore, si trasferisce nel settore giovanile dell'Atalanta nel 2007, all'età di 8 anni, dove è poi sempre rimasto ad eccezione di una stagione (2014-2015) trascorsa in prestito alla Feralpisalò.[4]
Il 16 luglio 2019 viene ceduto a titolo temporaneo al Trapani, neopromosso in Serie B.[5] Esordisce tra i professionisti l'11 agosto, a 20 anni, nella partita del secondo turno di Coppa Italia contro il Piacenza, nella vittoria dei granata per 3-1.[6] Colleziona 34 presenze in campionato con il Trapani, che tuttavia retrocede in Serie C a fine stagione.
Monza
Il 22 agosto 2020 passa in prestito biennale al Monza, neopromosso in Serie B, con obbligo di riscatto al raggiungimento di determinati obiettivi.[7][8] Il 29 maggio 2022, con la promozione del Monza in Serie A, scatta l'obbligo di riscatto del cartellino, fissato a 9 milioni. Il 26 agosto seguente sigla il suo primo gol in massima serie, nella sconfitta per 1-2 contro l'Udinese, ripetendosi anche nella partita di ritorno, pareggiata per 2-2.[9] Il 26 agosto 2023 segna la sua prima doppietta in serie A nel successo per 2-0 contro l'Empoli.[10]
Fiorentina
Il 26 luglio 2024 viene ufficializzato il suo passaggio alla Fiorentina in prestito oneroso a 4 milioni, con diritto di riscatto a 12 milioni di euro.[11][12] Esordisce con i viola giocando da titolare la prima di campionato in casa del Parma. Il 20 ottobre segna una doppietta nel successo per 6-0 in casa del Lecce, che rappresenta i suoi primi gol con la maglia viola.[13]