João Pedro speelde acht jaar in de jeugdopleiding van Fluminense. Hij tekende op 18 oktober 2018 een vijfjarig contract bij Watford, maar zou pas in januari 2020 ook echt de overstap maken. Hij debuteerde op 29 april 2019 voor Fluminense in de Série A, als invaller thuis tegen Goiás. Hij veroverde datzelfde jaar nog een basisplaats.[3] In 25 competitieduels maakte de aanvaller vier doelpunten voor Fluminense. Op 30 oktober 2019 werd bekend dat hij een werkvergunning had gekregen voor het Verenigd Koninkrijk.
In januari 2020 sloot de Braziliaan zich aan bij de selectie van Watford. João Pedro stond er niet meteen bij Watford. In zijn eerste halfjaar mocht hij vijf keer spelen, waarvan vier keer keer als invaller. Zijn club degradeerde dat seizoen uit de Premier League. João Pedro veroverde in 2020/21 vroeg in het seizoen een basisplaats en stond die niet meer af. Hij behoorde zo tot de kern van spelers die Watford via een tweede plaats in de Championship terugbrachten naar het hoogste niveau. Hierin speelde hij aanzienlijk minder en volgde meteen weer degradatie. Op het tweede niveau werd hij opnieuw basisspeler. Zijn ploeggenoten en hij eindigden deze keer op de elfde plaats in de Championship. Zelf scoorde hij elf keer, zijn hoogste seizoensaantal tot dan toe.
Voor João Pedro ontstonden er andere mogelijkheden dan nog een seizoen op het tweede niveau. Hij had zich in de aandacht gespeeld van Brighton & Hove Albion, de nummer zes van de Premier League in 2022/23. Hij tekende er in mei 2023 een vijfjarig contract en sloot zich twee maanden later aan bij zijn nieuwe club. Hij maakte op 12 augustus tegen Luton Town met een doelpunt zijn eerste doelpunt voor Brighton. In drie competities scoorde hij er lustig op los. Hij scoorde vijf keer in twee FA Cup-wedstrijden tegen Stoke City en Sheffield United en scoorde zes keer in zes groepsfasewedstrijden van de Europa League, waaronder twee keer in zijn Europese debuut tegen AEK Athene. In de Premier League scoorde hij tweemaal in een 3-2 overwinning op Nottingham Forest en opnieuw in een 4-2 overwinning op Tottenham Hotspur.