Thulani Serero begon zijn carrière bij het plaatselijke Senoane Gunners. Vervolgens werd hij gescout door Ajax Cape Town.
Bij Ajax Cape Town ontwikkelde hij zich in de loop der jaren goed. In de zomer van 2010 liep hij stage bij Ajax, de moederclub van Ajax Cape Town. Hij wist echter geen contract af te dwingen. In de lente van 2011 mocht hij opnieuw een stage lopen bij Ajax.[1] Na afloop van die periode had de middenvelder de technische leiding van Ajax weten te overtuigen, waarna de mogelijkheid werd onderzocht om de speler uit Zuid-Afrika over te nemen.[2] In april 2011 heeft Ajax hem een contract aangeboden. In het seizoen 2010/11 werd Ajax Cape Town net niet kampioen. Wel werd Serero uitgeroepen tot zowel talent als speler van het jaar in Zuid-Afrika bij verscheidene verkiezingen.[3]
Ajax
Op 22 mei 2011 ondertekende Serero het aangeboden contract. Het ging om een contract voor 2 jaar met optie tot nog 2 jaar. Hij zou gaan spelen onder het rugnummer 25.[4] Op 7 augustus 2011 debuteerde Serero officieel voor Ajax. Hij kwam als invaller in het veld in de wedstrijd tegen De Graafschap. In zijn eerste seizoen speelde Serero maar zes wedstrijden, mede door een blessure.
Op 25 augustus 2012 maakte Serero zijn eerste goal voor Ajax, in een thuiswedstrijd tegen NAC Breda. Een week later scoorde hij uit tegen sc Heerenveen twee keer, hij kreeg die wedstrijd tevens een rode kaart.
Op 5 augustus 2013 speelde Serero mee met Jong Ajax (2-0 winst) in de Jupiler League wedstrijd tegen Telstar.
Serero scoorde op 26 november 2013 zijn eerste Europese doelpunt voor Ajax in de UEFA Champions League thuiswedstrijd tegen FC Barcelona. In de 19e minuut scoorde Serero de 1-0 in de wedstrijd die uiteindelijk met 2-1 door Ajax werd gewonnen. Serero speelde op 9 februari 2014 zijn 50e officiële wedstrijd voor Ajax in de uitwedstrijd bij PEC Zwolle die in 1-1 eindigde. Door de ontwikkeling van Riechedly Bazoer en de komst van Daley Sinkgraven en Nemanja Gudelj was Serero niet meer de eerste keuze van trainer Frank de Boer en moest hij het voornamelijk doen met invalbeurten.
Na de komst van de nieuwe trainer Peter Bosz in de zomer van 2016 kreeg Serero geen rugnummer meer toegewezen en werd hij terug gezet naar de selectie van Jong Ajax. Bosz gaf aan dat Serero niet bij de selectie zat die hij aan het begin van het seizoen van Ajax kreeg. Serero had op dat moment nog een contract tot de zomer van 2017.[5]
Vitesse
Op 14 juni 2017 werd bekend dat Thulani Serero een driejarig contract had getekend bij Vitesse, de winnaar van de KNVB beker in het voorgaande seizoen. Hij kwam transfervrij over van Ajax, waar zijn contract afliep. Als bekerwinnaar mocht Vitesse spelen om de Johan Cruijff Schaal tegen landskampioen Feyenoord op 5 augustus 2017. Serero maakte in deze wedstrijd zijn officiële debuut voor de Arnhemmers. Het duel eindigde na reguliere speeltijd in 1-1. Vitesse verloor daarna na strafschoppen (4-2). Hij speelde in zijn eerste jaar 29 competitiewedstrijden en eindigde op twee goals. Daarnaast speelde hij vier groepswedstrijden in de UEFA Europa League. Het seizoen daarop was hij wederom sterkhouder op het middenveld.
Al-Jazira Club
Serero tekende in augustus 2019 een contract tot medio 2021 bij Al-Jazira, de club van hoofdtrainer Jurgen Streppel.
Serero maakte op 9 februari 2011 zijn debuut voor het Zuid-Afrikaanse elftal tegen Kenia, toen hij als vervanger van Bernard Parker binnen de lijnen kwam.[6] In september 2013 meldde Serero zich met een blessure af voor het WK-kwalificatieduel met Botswana. Bondscoach Gordon Igesund vermoedde dat hij een blessure verzon in verband met een aankomende wedstrijd in de UEFA Champions League die voor Serero op het programma stond bij Ajax en stuurde hem daarom naar huis. Igesund eiste een excuus, maar Serero toonde zich van geen kwaad bewust. Hij was vijf maanden afwezig in het nationaal team, tot hij op 5 maart 2014 weer meedeed in een vriendschappelijke wedstrijd tegen Brazilië, die met 5-0 werd verloren.
Afrika Cup 2015
Serero maakte op 15 november 2014 zijn eerste doelpunt voor het nationale team. Hij scoorde 1-0 in een met 2-1 gewonnen wedstrijd tegen het Soedanees voetbalelftal. Met deze overwinning verzekerde Zuid-Afrika zich van deelname aan de Afrika Cup 2015.[7] Serero werd echter door bondscoach Shakes Mashaba buiten de selectie gelaten voor de Afrika Cup. Zuid-Afrika eindigde op dat toernooi als laatste in groep C.