Inizia la sua carriera da professionista in Campania: alla Casertana, con cui debutta in Serie B nella stagione 1991-1992, alla Sambenedettese e all'Avellino in serie C con cui conquista la serie B nello spareggio sul neutro di Pescara, contro il Gualdo ai rigori.
Nel 1995 approda all'Empoli, squadra con cui ottiene in due anni consecutivi prima la promozione in Serie B poi quella nella massima serie: nella Serie A 1997-1998 riesce a totalizzare 14 reti contribuendo alla salvezza del neo-promosso club toscano. La sua carriera in Serie A prosegue vestendo la maglia della Fiorentina, scendendo poi in Serie B con la Sampdoria e il ritorno in massima serie con il prestito al Vicenza. Terminata quest'esperienza, torna a disputare campionati inferiori, con presenze tra le file di Alessandria, nuovamente Sambenedettese, dunque Imolese e Forlì.
Negli ultimi anni della carriera gioca nelle serie dilettantistiche del bolognese (Casalecchio e Crespellano),[2] mentre nella stagione 2008-2009 ha militato nell'Anziolavino.[3] Nel 2009 torna al Casalecchio.[3] Nella stagione 2010-2011 gioca nell'Emmetre, squadra della provincia di Bologna che milita nel campionato di Promozione, per poi passare la stagione successiva al Bo.Ca. Calcio, squadra della provincia di Bologna che milita nel girone L di Seconda categoria.[4]
Il 29 maggio 2015 dà l'addio ufficiale al calcio giocato in una partita di beneficenza allo stadio Castellani di Empoli.[5]
Allenatore
Nella stagione calcistica 2012-2013 fa parte della società Val.Sa. Gold in veste di tecnico nel settore giovanile. Dalla successiva stagione, è nell'organigramma delle giovanili dell'Empoli, ricoprendo vari incarichi di allenatore.
Nella stagione 2016-2017, diventa il nuovo allenatore del Treviso in Eccellenza.[6] Tuttavia, il 17 dicembre, la società Treviso, dopo gravi problemi gestionali, firma lo svincolo gratuito dei tesserati.[7]
Nel marzo 2017 gli viene affidata la direzione tecnica dell'Imolese, formazione di calcio femminile che disputa il campionato di Serie B, rilevando Ademaro Mosconi, che già aveva sostituito Gianluca Alberti, nella seconda parte della stagione 2016-2017.[8]