Sergio Aguero and Nolito scored twice as Manchester City resisted Stoke’s second-half comeback to continue their winning start under Pep Guardiola.
City led when Aguero converted from the spot – despite missing two penalties on Tuesday – with his second deftly nodded in from Kevin de Bruyne’s free-kick.
Bojan lifted the hosts with the game’s second penalty – both awarded for tugging in the box.
But Nolito came on to score two late goals and seal City’s win.
The Spanish forward tucked in fellow sub Kelechi Iheanacho’s cut-back from close range with four minutes to play, before punishing Stoke again in the fifth minute of stoppage time when played through by Raheem Sterling.
It was a deserved victory for the away side, who were totally dominant in the first half and rarely seriously threatened after the break.
Stoke manager Mark Hughes was furious after referee Mike Dean awarded City a penalty in the first half and Ryan Shawcross’s shirt pull on Nicolas Otamendi was the kind of challenge at a corner that regularly gets ignored.
But he had a rather different reaction when Dean punished Sterling for the same offence, with Shawcross the victim this time.
City followed up their opener from the spot with a slickly taken second, but Stoke failed to build on the momentum that followed Bojan’s conversion.
The final scoreline in Guardiola’s third game in charge was perhaps slightly flattering on City, who were excellent in the first half but sloppier for much of the second.
The obsession and intensity
City began with the two Guardiola trademarks in abundance. Careful in possession and quick to close the opposition down, it was an impressive start.
But the one position where Guardiola has clearly already identified room for improvement is in goal. Joe Hart was again left out in favour of Willy Caballero and the England international appears set to leave the club.
In Friday’s news conference, Guardiola said Hart will improve if he stays at City but added that he was “obsessive” about build-up play and wants his keeper to play a significant part.
There was a clear grimace from the Spaniard when Caballero fluffed a clearance out of play, but the Argentine was otherwise solid.
And with Barcelona’s Claudio Bravo a reported target, Hart faces the prospect of becoming Guardiola’s third choice.
Man of the match – Sergio Aguero (Manchester City)
The Argentina striker showed character to convert from the spot after missing two penalties in Tuesday’s Champions League play-off first leg. The 28-year-old scored a hat-trick in that 5-0 victory, and his two goals against Stoke take him to six from the first three games of the season.
What the managers said
Stoke City boss Mark Hughes: “The penalties were key, especially the one that went against us in the first half when we were in the match. There’s a new directive as there often is at this time of the season. It went against us and knocked the wind out of our sails.
“Our penalty probably would not have been given this time last year, but we got back into the game until that third goal took it away from us. But I don’t think the score was a true reflection of the game.
“City are clearly a top team this year, but we didn’t get the key details right and it went against us.”
Manchester City boss Pep Guardiola: “I realise how good the players are, I am a lucky guy because the quality of the players here is amazing.
“They run and fight for each other, and today we played in one of the toughest places of the season. It was a pity we created a lot in the second half but the last pass was not correct.
“Often we arrived in the right moment which is what we are looking for but we didn’t finish. It’s OK, we are going to improve. Our back four was very good but everyone was excellent.”
Man City are back in European action on Tuesday in the second leg of their Champions League play-off with Romanian side Steaua Bucharest – and could rest players after winning the first leg 5-0.
Stoke also play on Tuesday – away to League Two club Stevenage in the EFL Cup second round.
Match ends, Stoke City 1, Manchester City 4.
Second Half ends, Stoke City 1, Manchester City 4.
Goal! Stoke City 1, Manchester City 4. Nolito (Manchester City) right footed shot from the centre of the box to the centre of the goal. Assisted by Raheem Sterling.
Attempt saved. Bojan (Stoke City) right footed shot from outside the box is saved in the bottom left corner.
John Stones (Manchester City) is shown the yellow card for a bad foul.
Foul by John Stones (Manchester City).
Mame Biram Diouf (Stoke City) wins a free kick on the right wing.
Foul by Nolito (Manchester City).
Glenn Whelan (Stoke City) wins a free kick in the defensive half.
Substitution, Manchester City. Fabian Delph replaces Kevin De Bruyne.
Substitution, Stoke City. Ramadan Sobhi replaces Marko Arnautovic.
Goal! Stoke City 1, Manchester City 3. Nolito (Manchester City) right footed shot from the left side of the six yard box to the bottom right corner. Assisted by Kelechi Iheanacho.
Attempt missed. David Silva (Manchester City) left footed shot from the left side of the box is close, but misses to the left. Assisted by Kelechi Iheanacho.
Substitution, Manchester City. Kelechi Iheanacho replaces Sergio Agüero.
Foul by Nicolás Otamendi (Manchester City).
Mame Biram Diouf (Stoke City) wins a free kick in the defensive half.
Attempt blocked. Aleksandar Kolarov (Manchester City) left footed shot from outside the box is blocked.
Raheem Sterling (Manchester City) wins a free kick on the right wing.
Foul by Erik Pieters (Stoke City).
Corner, Manchester City. Conceded by Ryan Shawcross.
Substitution, Stoke City. Jonathan Walters replaces Giannelli Imbula.
Foul by Pablo Zabaleta (Manchester City).
Marko Arnautovic (Stoke City) wins a free kick in the defensive half.
Joe Allen (Stoke City) is shown the yellow card for a bad foul.
Pablo Zabaleta (Manchester City) wins a free kick in the attacking half.
Foul by Joe Allen (Stoke City).
David Silva (Manchester City) wins a free kick in the defensive half.
Foul by Mame Biram Diouf (Stoke City).
Substitution, Manchester City. Nolito replaces Jesús Navas.
Kevin De Bruyne (Manchester City) is shown the yellow card for a bad foul.
Foul by Kevin De Bruyne (Manchester City).
Philipp Wollscheid (Stoke City) wins a free kick in the defensive half.
Foul by Fernandinho (Manchester City).
Phil Bardsley (Stoke City) wins a free kick in the defensive half.
Corner, Manchester City. Conceded by Ryan Shawcross.
Attempt blocked. Kevin De Bruyne (Manchester City) left footed shot from outside the box is blocked. Assisted by Sergio Agüero.