Match ends, Stoke City 1, Millwall 0.
Saido Berahino's second-half header was enough to secure all three points for Stoke and extend Millwall's miserable run away from home.
The Potters striker nodded in Tom Ince's cross just after the hour as Gary Rowett's side stretched their unbeaten run to 10 games.
Millwall - who have yet to win on the road this season - might have altered that scenario but for an outstanding save from Jack Butland to prevent a Ryan Shawcross own goal in the first minute.
But the Lions created little after that as the home side dominated possession for much of the game, although they had a strong appeal for a penalty when Lee Gregory went down under a challenge from Bruno Martins Indi.
Millwall thought they had snatched the lead when Jed Wallace's cross was deflected towards goal by defender Shawcross, but Butland flung himself to his left to keep the ball out.
And Stoke gradually took control of the game, with Ince twice going close from distance before setting up what proved to be the winner for Berahino.
There was a late scare for the home side when Lions substitute Steve Morison hooked a chance just wide with three minutes remaining.
Stoke boss Gary Rowett:
"It is a win, it is a clean sheet, we know we can perform better, I've been saying that for a lot of the home games but I am getting to the point if I'm saying this every post-match interview that we've won and I'm disappointed, I'll happily be really disappointed until the end of the season.
"That is three home games that we have won in a row, it is another clean sheet, yes we can play better, yes we can see the game out with a little bit more control and a little bit more composure, but Millwall are the type of team that test you, they are very direct and they make it difficult.
"We still think that we are five or 10 per cent off where we need to be, but we are winning games and we are on a good run."
Millwall manager Neil Harris:
"I've watched it (the penalty incident) from two different angles and Lee not once takes his eye off the ball, he looks to take the ball down and the defender goes into the back of him, anywhere else on the pitch, in our penalty area, the referee jumps to give it.
"I thought Stoke were better with the ball than us, they are a possession-based team, but in the second half, one contact in our penalty area and it ends up in the back of the net.
"We should have had a penalty and on the balance of play, the chances we created, we should have got something from the game.
"I thought it was a really, really strong performance from us, winning games is the business we are in, and today was an excellent away performance for us."
- 3PietersSubstituted forMartins Indiat 79'minutes
- 22ClucasBooked at 83minsSubstituted forCrouchat 86'minutes
- 19BerahinoSubstituted forAfobeat 77'minutes
- 15Martins Indi
- 4HutchinsonBooked at 90mins
- 3MeredithSubstituted forO'Brienat 71'minutes
- 7J WallaceBooked at 89mins
- 28LeonardSubstituted forKaracanat 88'minutes
- 19ElliottBooked at 65minsSubstituted forMorisonat 69'minutes
- 25M Wallace
- Chris Kavanagh
- Shots on Target
Second Half ends, Stoke City 1, Millwall 0.
Ryan Shawcross (Stoke City) wins a free kick in the defensive half.
Foul by Lee Gregory (Millwall).
Attempt saved. Aiden O'Brien (Millwall) right footed shot from outside the box is saved in the top right corner. Assisted by Jed Wallace with a headed pass.
Attempt missed. Joe Allen (Stoke City) left footed shot from the left side of the box is too high. Assisted by James McClean with a cross.
Shaun Hutchinson (Millwall) is shown the yellow card for a bad foul.
Tom Ince (Stoke City) wins a free kick in the attacking half.
Foul by Shaun Hutchinson (Millwall).
Foul by James McClean (Stoke City).
Jem Karacan (Millwall) wins a free kick in the defensive half.
Corner, Millwall. Conceded by Ashley Williams.
Jed Wallace (Millwall) is shown the yellow card for a bad foul.
Tom Ince (Stoke City) wins a free kick in the defensive half.
Foul by Jed Wallace (Millwall).
Corner, Millwall. Conceded by Bruno Martins Indi.
Substitution, Millwall. Jem Karacan replaces Ryan Leonard.
Attempt missed. Steve Morison (Millwall) right footed shot from the centre of the box is close, but misses to the right. Assisted by Jake Cooper with a cross.
Substitution, Stoke City. Peter Crouch replaces Sam Clucas.
Corner, Stoke City. Conceded by Mahlon Romeo.