Conor McCarthy’s dramatic injury-time winner ended Rangers’ 27-game unbeaten start to the season and sent St Mirren through to a Scottish League Cup semi-final against Livingston.
The hosts rallied from Connor Goldson’s early opener to lead after two Jamie McGrath goals – one from the penalty spot – either side of half-time.
Steven Davis looked to have forced extra time in the 88th minute after James Tavernier’s free-kick hit a post, but McCarthy converted when Allan McGregor parried a Richard Tait header.
St Mirren manager Jim Goodwin was sent off for over-zealous celebrations amid the late bedlam, but his side were deserving of the stunning upset over their Premiership rivals.
Victory sends the Paisley side – now undefeated in 10 games – through to the semi-final for the first time since they lifted the trophy in 2013.
They face Livingston at Hampden on the weekend of 23-24 January, with St Johnstone meeting Hibernian in the other last-four tie.
Rangers came to Paisley on the back of 10 consecutive domestic victories and Goldson had them ahead in a dominant opening spell when the centre-back broke into the box and drilled into the far corner.
Steven Gerrard’s side looked in the mood for more, but the only serious scare St Mirren faced before the break was when McCarthy had to nod a Cedric Itten header off the line.
Having weathered the storm, a rare venture into the Rangers box brought an equaliser as Calvin Bassey bundled into the back of Dylan Connolly and McGrath sent his spot-kick low and straight.
The goal galvanised St Mirren and they were terrific in the second half, with Connolly’s cross bouncing off the top of the crossbar before a superbly crafted strike gave them the lead.
Bassey – deputising for Borna Barisic at left-back – was again suspect as he was beaten by Connolly, who squared for Jon Obika. The striker laid the ball back and McGrath skipped past a challenge to coolly fire past McGregor for his fifth goal in four games.
Bassey was replaced by Barisic moments later and Rangers became increasingly desperate, with Ryan Kent booked for a dive in the box.
Tavernier had an equaliser disallowed as the ball had crept out of play before Kemar Roofe crossed for the captain to convert.
St Mirren had defended brilliantly, but were undone when Tavernier’s free-kick off an upright fell to substitute Davis to bounce a volley into the turf and up over the despairing grasp of Jak Alnwick.
It was cruel on the hosts, yet they poured forward and were rewarded when McGregor could only parry Tait’s header and McCarthy slid in to hammer home the rebound.
- 2TaitBooked at 89mins
- 21ConnollySubstituted forMacPhersonat 82′minutes
- 17McGrathBooked at 88mins
- 7Doyle-HayesBooked at 55mins
- 25ErhahonBooked at 23mins
- 9ObikaSubstituted forErwinat 90+4′minutes
- 6GoldsonBooked at 88mins
- 26BalogunSubstituted forHagiat 84′minutesBooked at 89mins
- 3BasseySubstituted forBarisicat 57′minutes
- 37ArfieldSubstituted forDavisat 57′minutes
- 15ZunguSubstituted forKamaraat 72′minutes
- 11IttenBooked at 61minsSubstituted forDefoeat 72′minutes
- 14KentBooked at 63mins
- Andrew Dallas
Match ends, St. Mirren 3, Rangers 2.
Second Half ends, St. Mirren 3, Rangers 2.
Attempt saved. James Tavernier (Rangers) right footed shot from the centre of the box is saved in the top centre of the goal.
Substitution, St. Mirren. Lee Erwin replaces Jonathan Obika.
Attempt missed. Joe Aribo (Rangers) header from the centre of the box is close, but misses the top right corner.
Goal! St. Mirren 3, Rangers 2. Conor McCarthy (St. Mirren) right footed shot from the left side of the six yard box to the top right corner.
Attempt saved. Richard Tait (St. Mirren) header from the centre of the box is saved in the bottom right corner.
Corner, St. Mirren. Conceded by Ryan Kent.
Corner, St. Mirren. Conceded by James Tavernier.
Ianis Hagi (Rangers) is shown the yellow card.
Richard Tait (St. Mirren) is shown the yellow card.
Connor Goldson (Rangers) is shown the yellow card.
Goal! St. Mirren 2, Rangers 2. Steven Davis (Rangers) left footed shot from the centre of the box to the top left corner.
James Tavernier (Rangers) hits the left post with a right footed shot from outside the box from a direct free kick.
Jamie McGrath (St. Mirren) is shown the yellow card.
Ryan Kent (Rangers) wins a free kick in the defensive half.
Foul by Jamie McGrath (St. Mirren).
Hand ball by Jamie McGrath (St. Mirren).
Substitution, Rangers. Ianis Hagi replaces Leon Balogun.
Substitution, St. Mirren. Cameron MacPherson replaces Dylan Connolly.