Benfica
Cancelo is geboren in Barreiro, een stad in het district Setúbal. Hij kwam in 2007 bij de jeugdopleiding van SL Benfica.
Hij maakte zijn debuut voor Benfica op 28 juli 2012. De wedstrijd was een vriendschappelijke wedstrijd tegen Gil Vicente. Ondanks dat hij bij het reserveteam stond ingeschreven, werd hij besproken als mogelijke vervanger van Maxi Pereira. Hij maakte zijn profdebuut op 25 januari 2014. De wedstrijd was een Taça da Liga 3e ronde wedstrijd tegen Gil Vicente, waar hij in de 82e minuut inviel voor André Almeida. Zijn enige competitiewedstrijd voor Benfica was een 2-1 verlies tegen FC Porto.
Valencia
Cancelo sloot zich op 20 augustus 2014 aan bij Valencia voor een lening van een jaar, met een optie tot koop voor 15 miljoen euro. Hij maakte zijn debuut in La Liga op 25 september 2014, in een 3-0 overwinning tegen Córdoba. Hij werd op 12 april 2015 uitgeroepen tot man van de wedstrijd na een 3-0 overwinning tegen Levante. In het seizoen 2014-15 kwam hij slechts tot 13 optredens, omdat hij voornamelijk de back-up was van Antonio Barragán. Op 25 mei stemde Cancelo in met een vast contract bij Valencia tot 30 juni 2021. De transfersom bedroeg 15 miljoen euro.
Op 16 september 2015 maakte Cancelo zijn debuut in de UEFA Champions League. De wedstrijd was een 3-2 verlies tegen Zenit Sint-Petersburg, waar hij 1 doelpunt maakte. Het doelpunt maakte hem de 5e jongste Champions League-topscorer, 21 jaar en 107 dagen oud. Op 20 april 2016 maakte hij zijn eerste competitiedoelpunt voor Valenica. De wedstrijd was een 4-0 overwinning tegen Eibar.
Uitgeleend aan Inter Milaan
Op 22 augustus 2017 sloot Cancelo zich aan bij Inter Milaan voor een eenjarige lening tot 30 juni 2018, met een optie om de transfer definitief te maken. De deal betekende ook dat Geoffrey Kondogbia werd uitgeleend aan Valencia. Hij maakte zijn debuut in de Serie A op 26 augustus 2017 in een 3-1 overwinning tegen AS Roma. Eind augustus 2017 liep hij tijdens zijn interlandperiode een kniebandblessure op. Zijn eerste wedstrijd terug van blessure was een 3-2 overwinning op 15 oktober 2018 tegen AC Milan.Hij was lid van het 2017-18 Serie A Team van het Jaar Na het seizoen besloot Inter Milan de uitleen niet permanent te maken.
Juventus
Op 27 juni 2018 tekende Juventus João Cancelo op een 5-jarig contract voor €40,4 miljoen. Hij maakte zijn debuut bij Juventus op 18 augustus, in een 3-2 overwinning tegen ChievoVerona. Hij won zijn eerste trofee met Juventus op 16 januari 2019, toen Juventus AC Milan met 1-0 versloeg in de 2018 Supercoppa Italiana. Hij zou meespelen in de Scudetto-winnende wedstrijd, waarin Juventus met 2-1 won van Fiorentina.
Manchester City
Op 7 augustus 2019 sloot Cancelo zich aan bij de Engelse Premier League-kampioen Manchester City. De deal was een zesjarige overeenkomst ter waarde van 27,4 miljoen pond, waarbij Danilo zich bij Juventus voegde als onderdeel van de deal, gelijk aan 60 miljoen pond. Daarmee werd João Cancelo de duurste rechtsback ooit. Hij maakte zijn debuut in de Premier League op 25 augustus 2019 in een 3-1 overwinning tegen Bournemouth, waar hij opkwam als vervanger van Kyle Walker. Hij maakte zijn eerste doelpunt voor Manchester City op 18 december 2019, in een 3-1 overwinning tegen Oxford United in de kwartfinale van de EFL Cup.
Hij maakte zijn eerste start van het seizoen 2020-21 op 17 oktober 2020 vanwege een blessure.De wedstrijd was een 1-0 overwinning tegen Arsenal. Op 3 november 2020 scoorde Cancelo zijn eerste Champions League-doelpunt voor Manchester City in een 3-0 overwinning tegen de Griekse ploeg Olympiacos. Zijn eerste competitiedoelpunt van het seizoen vond plaats op 26 januari 2021. In die wedstrijd scoorde Cancelo het 2e doelpunt in een 5-0 overwinning tegen West Bromwich Albion. Hij werd genoemd in het PFA Team van het Jaar 2020-21.
Op 17 oktober 2021 maakte Cancelo zijn eerste doelpunt van het seizoen voor Manchester City. Het doelpunt werd gemaakt in een 6-3 overwinning tegen RB Leipzig in de groepsfase van de UEFA Champions League. Op 3 november gaf Cancelo een hattrick aan assists in een 4-1 overwinning tegen Club Brugge in de Champions League groepsfase.