Charlie Adam’s header put the hosts ahead before Steven N’Zonzi capitalised on a defensive mix-up to give Stoke a two-goal lead at the break.
Vlad Chiriches was then dismissed for a second yellow card and Mame Biram Diouf wrapped up the result late on.
Jack Butland turned Marc Muniesa’s header on to the crossbar, while Adam was denied a second goal after a good save by Hugo Lloris and Jonathan Walters missed a glorious chance.
Stoke have now matched their final points tally of 50 from last season with two games to spare, while Spurs are seven points behind fourth place with only two of their fixtures remaining.
Mark Hughes’ men started far stronger and almost took the lead inside four minutes when Marc Muniesa fired a stunning volley from the edge of the box, prompting Hugo Lloris into a fingertip save.
The hosts continued to control proceedings with Spurs’ forwards denied any space on the ball by some impressive pressing by the Stoke midfield and defence. Marko Arnautovic was having plenty of joy down the left for Stoke, and he had a good chance saved as his drilled effort from 20 yards was saved by Lloris.
But Stoke got the lead they deserved in the 21st minute. Mame Biram Diouf collected the ball on the right and whipped in an excellent cross, which was unwittingly flicked on by Jan Vertonghen for Adam to head in at the far post.
Spurs were almost level within minutes as Erik Lamela’s floated free-kick was headed toward his own goal by Muniesa, Butland producing an excellent to stop to prevent an own-goal.
The hosts were still the better side, though, and on 32 minutes they profited from a defensive error to make it 2-0. Lloris and Eric Dier both went for Adam’s high ball into the area, and it came off the goalkeeper before landing for Nzonzi, who fired the ball low into the net with a good finish from a tight angle.
The game went from bad to worse for Spurs at the start of the second half after Chiriches – who had already been booked – hauled down Diouf on 51 minutes to pick up a second booking and leave the visitors a man short.
Adam soon took the advantage of the extra space, striding past two players before racing into the box and curling a low effort across goal, forcing a fine save from Lloris.
Tottenham introduced Roberto Soldado to give the isolated Harry Kane support up front, but Stoke’s organisation and pressing meant the visitors still struggled to fashion any clear-cut chances.
It should have been 3-0 when substitute Stephen Ireland played the ball out to the left for Ryan Shawcross, whose low cross was met by Walters, but the Republic of Ireland international could only fire straight at Lloris from point-blank range.
At the other end, Christian Eriksen went close with a 30-yard free kick which whistled just over the crossbar but the result was put beyond doubt with four minutes left as Arnautovic again picked the ball up on the left-hand side, and his low ball was turned in at the near post by Diouf.
Soccer Saturday analysis – Matt Le Tissier
“On their day Stoke can live with the very best. They have the ability to cope with the big sides but Spurs weren’t really at the races today in all honesty. That’s not to take anything away from Stoke. They started the game well; very positive, got themselves in front early on and never looked back from that moment.
“With 10 men Tottenham struggled to create anything really. Jack Butland made one decent save. Tottenham have played the most games out of any team in the Premier League so it did look a fairly tired performance even before they went down to 10 men.”
Stoke: Butland (7), Cameron (7), Shawcross (7), Muniesa (7), Pieters (6), N’Zonzi (7), Whelan (7), Walters (6), Adam (8), Arnautovic (9), Diouf (7).
Used subs: Ireland (7), Odemwingie (6), Sidwell (6).
Tottenham: Lloris (7), Dier (4), Chiriches (3), Fazio (5), Vertonghen (6), Bentaleb (5), Mason (5), Lamela (5), Eriksen (7), Chadli (5), Kane (5).
Used subs: Dembele (6), Soldado (5).
Man of the match: Marko Arnautovic