Match ends, Stoke City 0, Bristol City 2.
Bristol City made it seven points out of nine over the festive period with their first league victory at Stoke since 1959.
Famara Diedhiou headed them in front in the first half and Callum O'Dowda ended the home side's hopes of salvaging a draw with a right-footed shot.
Stoke paid the price for not taking their chances, the best of which came early when Diedhiou fouled Bruno Martins Indi in the box, and Benik Afobe saw his penalty saved by keeper Niki Maenpaa.
Substitute Saido Berahino came closest to a reply late on when he fired against the crossbar from Tom Ince's cut-back.
Despite the win, Lee Johnson's Robins remained 11th in the table, but only five points outside the top six, while Stoke slipped two places to 14th with a result and performance that saw the home fans boo their own side.
The Potters had 70% of possession in the opening half, but although Afobe found a way past Maenpaa after his penalty save, his header was cleared off the line by Bailey Wright, brought on as a sub when Adam Webster went off following a clash of heads with team-mate Marlon Pack.
Diedhiou's goal - just a couple of days after the birth of a new baby son - came from Jack Hunt's cross, and the right-back provided another ball into the box for the second, which O'Dowda drove home after Stoke failed to clear.
Afobe was withdrawn on the hour, with Peter Crouch sent on to lead the Stoke line, but although the former England striker tested Maenpaa with a header from Bruno Martin's Indi's cross, it was flagged for offside and he has still not scored since August.
Stoke City boss Gary Rowett told BBC Radio Stoke:
"When the crowd boo and join in with the songs that the opposition fans are singing, it's not the ideal way to spend a New Year's Day afternoon.
"The reality is I have to stand there and accept it. We're not winning enough games, we're not in the position we want to be in, it is what it is.
"I'm the manager, I'll take it on the chin, and if the players go out there and don't perform, it's my fault. I'm pretty thick-skinned and determined, and this is probably the first job I've had where things haven't gone as well as I'd have liked quickly enough. The reality is I've got to sort it out."
Bristol City manager Lee Johnson:
"Stoke are a good side with good individuals. They have spent a lot of money and have a Premier League squad so we had to win the one-v-one battles.
"We are unbeaten in eight. It has been a great festive period for us to get the points we have.
"More important is the level of the performances that we have put in. We showed a great work-rate and desire today.
"We were up against it inside the first half and the penalty save was a key turning point so early on."
- 23MartinaBooked at 61mins
- 5WilliamsBooked at 90mins
- 15Martins IndiSubstituted forClucasat 78'minutes
- 38WoodsBooked at 45minsSubstituted forBerahinoat 63'minutes
- 9AfobeSubstituted forCrouchat 60'minutes
- 4WebsterSubstituted forWrightat 38'minutes
- 21PackBooked at 45mins
- 14WeimannSubstituted forAdelakunat 90'minutes
- 20PatersonSubstituted forTaylorat 84'minutes
- Paul Tierney
- Shots on Target
Second Half ends, Stoke City 0, Bristol City 2.
Attempt missed. Peter Etebo (Stoke City) right footed shot from outside the box is close, but misses to the left from a direct free kick.
James McClean (Stoke City) wins a free kick in the attacking half.
Foul by Hakeeb Adelakun (Bristol City).
Attempt missed. Tom Ince (Stoke City) left footed shot from outside the box misses to the right following a set piece situation.
Ashley Williams (Stoke City) is shown the yellow card.
Peter Etebo (Stoke City) wins a free kick in the defensive half.
Foul by Famara Diedhiou (Bristol City).
Attempt saved. James McClean (Stoke City) left footed shot from the centre of the box is saved in the bottom left corner. Assisted by Ryan Shawcross.
Peter Crouch (Stoke City) wins a free kick on the left wing.
Foul by Josh Brownhill (Bristol City).
Substitution, Bristol City. Hakeeb Adelakun replaces Andreas Weimann.
Foul by Peter Etebo (Stoke City).
Matty Taylor (Bristol City) wins a free kick on the left wing.
Tom Ince (Stoke City) wins a free kick in the defensive half.
Foul by Lloyd Kelly (Bristol City).
Substitution, Bristol City. Matty Taylor replaces Jamie Paterson.
Saido Berahino (Stoke City) hits the bar with a right footed shot from the centre of the box.
Attempt missed. Famara Diedhiou (Bristol City) left footed shot from outside the box is high and wide to the left. Assisted by Andreas Weimann following a fast break.