Cresciuto nel Firenze Ovest,[1] nel 1980 passa alla Pistoiese con cui debutta in Serie B nel 1982. Gioca in arancione cinque stagioni, l'ultima in Serie C1.
Nel 1986 approda al Prato dove disputa due stagioni in Serie C1.
Nel 1988 va alla Lucchese, con cui conquista la promozione dalla Serie C1 nel 1990, giocando nella serie cadetta fino al 1996. Successivamente ha militato in cadetteria nell'Empoli (promozione in Serie A), prima di fare ritorno al Prato in Serie C2 dove ha chiuso la carriera nel 1999.
In carriera ha totalizzato 269 presenze in Serie B con 16 reti.
Allenatore
Questa sezione sull'argomento calciatori italiani è ancora vuota. Aiutaci a scriverla!
In seguito allena, in Serie C2, Sansovino, venendo esonerato dopo 3 mesi a fronte della preoccupante situazione di classifica[3], e Carrarese (subentrato).
Ha poi guidato nuovamente per due mesi la formazione del Comprensorio del Cuoio nel 2006, rimediando l'esonero a causa del quintultimo posto in classifica.[4]
Dopo una breve parentesi di un anno da allenatore degli allievi dell'Empoli, dal 22 agosto 2012 è l'allenatore in seconda, vice di Duccio Innocenti, della Lucchese in Serie D[6]
A gennaio 2014 è chiamato alla guida del Verbania in Serie D: complice la debole rosa a disposizione, incappa in nove sconfitte consecutive e viene esonerato.
L'approdo in Serie B come vice allenatore del Varese
A luglio 2014 è chiamato dal Varese, in Serie B, per ricoprire il ruolo di vice-allenatore di Stefano Bettinelli per la stagione 2014-2015[7], fino all'esonero di quest'ultimo, avvenuto il 1º marzo 2015, in favore di Davide Dionigi.
Otto giorni dopo, il 9 marzo, avendo la società lombarda esonerato lo stesso Dionigi e contemporaneamente riassunto Bettinelli, torna come vice allenatore sulla panchina della squadra biancorossa.[8] Al pari di Bettinelli non viene riconfermato al termine della stagione.
Il biennio a Livorno e il ritorno a Lucca
Dopo aver allenato la formazione Berretti della Lucchese nella stagione 2017-2018 e quella degli Under-16 del Livorno dal 2018 al 2020, il 19 agosto 2020 viene richiamato a Lucca per ricoprire il ruolo di vice allenatore di Francesco Monaco sulla panchina della Lucchese ma a causa dell'esonero di quest'ultimo avvenuto il 22 ottobre 2020, il giorno seguente viene nominato ad interim tecnico della prima squadra per la giornata successiva esordendo con una sconfitta per 0-1 nella gara interna al Porta Elisa contro la Juventus U23. Verrà a sua volta sostituito il giorno dopo la partita da Giovanni Lopez, tornando pertanto a ricoprire il ruolo di vice allenatore come ad inizio stagione.