Mason Bennett's sixth goal of the season secured Millwall's 2-1 win at Stoke in the Sky Bet Championship.
Bennett was the beneficiary of Danny Batth's slip as he tapped in Jed Wallace's pass after 71 minutes.
Earlier, Jacob Brown had cancelled out Murray Wallace's opener at the bet365 Stadium.
The Lions' victory made it a hat-trick of wins on the bounce as they remained within touching distance of the play-offs.
Stoke will likely have to settle for a place in the second tier next season after their own three-match unbeaten streak was ended by Gary Rowett's team, with Michael O'Neill's side now 11 points off the top six.
Despite enjoying most of the possession and the chances in the first half, Stoke found themselves behind to Wallace's first goal of the season.
The defender had already gone close with a header that he glanced wide and set-pieces looked to be Millwall's most likely route to goal.
A corner fell to Jake Cooper, after being wedged between a group of players, in the box and his hanging cross found George Evans.
Evans cushioned his header into the path of the 27-year-old to scramble home past Adam Davies, but the lead was not to last.
Stoke would have felt aggrieved to be behind after Bartosz Bialkowski had been forced into saves from Brown and Nick Powell.
Powell had been at the heart of all of Stoke's good play with intricate passing and clever thinking, and his raking pass set Steven Fletcher free five minutes after Millwall's opener.
The Scot's scuffed shot found its way through to Brown, who coolly slotted his fourth goal of the season under Bialkowski at the near post.
Rowett's decision to bring on Maikel Kieftenbeld at the break gave Millwall much more control in the second half and they deservedly got their winner 19 minutes from time.
An innocuous ball down the left looked to be comfortable for Batth, but his untimely slip let in Wallace and he kept his composure to square the ball for Bennett, who could not miss from close range.
What the managers said...
Stoke's Michael O'Neill: "I'm very disappointed with the result, very disappointed with the second-half performance really. We showed two sides of our character today, first half we were excellent, really good play, but we conceded a poor goal after three clean sheets and conceded another poor goal in the second half.
"It was a defensive error that cost us, I didn't think we'd lose the game to be honest, but the second half our tempo dropped, our energy dropped and ultimately these are the situations we've faced a lot of the season, where we've not been able to play at the same level for long enough."
Millwall's 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. I felt first half they were the better side, we played Jed Wallace around John Obi Mikel thinking that he could run off him and get into good positions, but Mikel's experience dragged Jed away into areas he didn't want to be.
"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."