Match ends, Stoke City 1, Millwall 2.
Millwall kept their faint play-off challenge alive with a third straight win to all but end Stoke's hopes of a top-six finish.
Murray Wallace poked the Lions ahead from a scramble after Jake Cooper turned Jed Wallace's far-post corner back into the box.
City soon levelled as Nick Powell's raking pass found Steven Fletcher who cut the ball back for Jacob Brown to squeeze a low shot under goalkeeper Bart Bialkowski.
Danny Batth's poor challenge allowed Jed Wallace to skip past, draw keeper Adam Davies and square a pass for Mason Bennett to slot into an empty net.
A 10th away league win of the campaign moved Millwall up to ninth, and kept the gap to sixth-placed Reading at eight points with six games left, while Stoke are now 11 points adrift of the play-off spots in 11th.
The Potters made most of the first-half running with Fletcher, Powell and Brown all testing Bialkowski, but Wallace poked home the opener with the visitors' only attempt on target of the first half.
The lead came against the run of play and was short-lived as Bialkowski failed to keep out Brown's strike - Stoke's fifth goal-bound effort of the half.
Michael O'Neill's side, with Powell pulling the strings, maintained their momentum after the break, but quickly faded while the visitors gradually came out of their shells, with Jed Wallace heavily involved.
Gary Rowett spent less than eight months as Stoke manager before his dismissal in January 2019, but Batth's wayward sliding challenge and Brown's finish helped make his return to the Potteries a happy one.
Potters boss Michael O'Neill told BBC Radio Stoke:
"The two goals were extremely poor. The first goal from a corner which we don't defend well enough. We should do a lot better in that situation, particularly as we were totally dominant at that point.
"And the second goal is an individual error which was the deciding factor in the game, but our second-half performance wasn't acceptable.
"We let the tempo of the game drop and weren't able to get back up to a level and give ourselves a chance to win the game.
"It's disappointing because I didn't think it was a game we were going to lose, but certainly our performance in the second half showed the two sides of our character at this minute in time."
Millwall manager Gary Rowett:
"I'm really pleased, it's a difficult place to come. Stoke are not only a very physical side, but they've got some really good players as well.
"To go in at 1-1 at half-time, I was displeased because were were one-up and we conceded a very poor goal, but I couldn't really complain because I could see it coming.
"I thought second half was completely different. We made the change to get an extra midfielder in there and I thought we controlled the game second half and we were the better side. It looked like we had more energy and we moved the ball around."
- 6BatthBooked at 37minsSubstituted forMatondoat 76'minutes
- 14SmithSubstituted forVokesat 86'minutes
- 34ThompsonSubstituted forMcCleanat 76'minutes
- 18BrownSubstituted forClucasat 70'minutes
- 3M WallaceBooked at 90mins
- 23McNamaraSubstituted forRomeoat 90+2'minutes
- 7J WallaceSubstituted forBradshawat 90'minutes
- 13ZohoreSubstituted forKieftenbeldat 45'minutes
- 20BennettSubstituted forBödvarssonat 82'minutes
- Gavin Ward
- Shots on Target
Second Half ends, Stoke City 1, Millwall 2.
Murray Wallace (Millwall) is shown the yellow card for a bad foul.
Nick Powell (Stoke City) wins a free kick in the attacking half.
Foul by Murray Wallace (Millwall).
Foul by Harry Souttar (Stoke City).
Jake Cooper (Millwall) wins a free kick in the defensive half.
Corner, Stoke City. Conceded by Alex Pearce.
Attempt blocked. Nick Powell (Stoke City) right footed shot from outside the box is blocked.
Substitution, Millwall. Mahlon Romeo replaces Dan McNamara.
Sam Vokes (Stoke City) wins a free kick in the defensive half.
Foul by Maikel Kieftenbeld (Millwall).
Substitution, Millwall. Tom Bradshaw replaces Jed Wallace.
Foul by James McClean (Stoke City).
Dan McNamara (Millwall) wins a free kick on the right wing.
Substitution, Stoke City. Sam Vokes replaces Tommy Smith.
James McClean (Stoke City) wins a free kick in the defensive half.
Foul by Jed Wallace (Millwall).
Attempt blocked. Rabbi Matondo (Stoke City) right footed shot from outside the box is blocked.
Tommy Smith (Stoke City) wins a free kick on the right wing.