St Mirren picked up a rare away win at an unhappy Pittodrie as they beat Aberdeen in wicked conditions to win in the Scottish Premiership.
Mark O'Hara rifled in from close range after 12 minutes, before missing a penalty that would have made the game far more comfortable for the Paisley side.
It didn't matter in the end, as Jonah Ayunga and Greg Kiltie scored late on, the latter from the spot, to make it a comfortable victory for Stephen Robinson's side.
The win ends a dreadful away run St Mirren, who had lost their last six on the road and not won on their travels since mid-September.
They stay fifth, while Aberdeen drop to ninth, albeit with games in hand.
Keep up to date with AberdeenThe latest St Mirren newsIt's been three days since St Mirren played and 10 since Aberdeen took the field. The hosts started brightly, invigorated by the rest, but their confidence was soon rocked when O'Hara scored the first.
The visitors' first attack saw Mikael Mandron's shot blocked at close range, before O'Hara raced in and lashed the ball goalward via a deflection off Slobodan Rubezic.
O'Hara's missed penalty was a shock. Usually reliable from the spot, he was given a chance when Lewis Jamieson's shot hit Richard Jensen's hand. The St Mirren captain skipped and stuttered, and rolled his effort two yards wide.
Despite that reprieve, the Pittodrie crowd booed, unhappy with the fare offered up. Their side reacted, forcing a few good saves from Hemming, but the fans would still jeer the hosts off at half-time.
The weather worsened considerably in the second-half. The rain lashed down, the wind swirled around and St Mirren soaked up the pressure like a sponge.
Corner after corner was whipped in, Aberdeen edged closer and closer, but there was no way through the visiting rearguard.
They were punished for their profligacy when Scott Tanser whipped a delightful ball to the back post, where Jonah Ayunga made the most of the conditions to slide and divert the ball in.
It would get worse for the remaining Aberdeen fans. Stefan Gartenmann brought down Toyosi Olusanya in the box and, after a VAR check, Kiltie slotted away the penalty.
Player of the match - Zach Hemming (St Mirren)
Aberdeen had plenty of chances but they rarely looked like beating the on-loan Middlesbrough goalkeeperEmbarrassing Aberdeen undone by ruthless St Mirren - analysis
The Pittodrie crowd made their feelings clear at the end of either half. This was a disastrous way to end 2023.
They played more passes, sent in more crosses, than they have in any game this season. Despite that, they could not find a route to goal for the ninth time this season.
To make matters worse, the defence looked vulnerable and frail, easily undone by St Mirren who scored with the majority of their chances.
Remember, this is a St Mirren side who hadn't scored in their last three, and yet they were full of confidence and swagger every time they went forward.
The bigger picture looks a little bleak for Barry Robson. He's under pressure, having been beaten comfortably at home. He needs wins quickly.
What's next?
Aberdeen are away to Ross County on Tuesday 2 January (15:00 GMT), while St Mirren host Celtic on the same day (17:00).
Line-ups
Aberdeen
Formation 3-5-2
24Roos6Gartenmann33Rubezic5JensenSubstituted forMorrisat 60'minutes2DevlinBooked at 25minsSubstituted forMilneat 61'minutes7McGrath10Clarkson4ShinnieSubstituted forPolvaraat 60'minutes15McGarrySubstituted forHayesat 81'minutes9Miovski11Henriques de Barros LopesSubstituted forSoklerat 71'minutesSubstitutes
8Barron17Hayes19Sokler20Morris21Polvara23Duncan27MacDonald28Milne31DoohanSt Mirren
Formation 3-4-2-1
1Hemming2Bolton13Gogic5Taylor22Fraser17Baccus6O'HaraSubstituted forBoyd-Munceat 59'minutes3Tanser24JamiesonSubstituted forOlusanyaat 64'minutes11Kiltie9MandronSubstituted forAyungaat 64'minutesSubstitutes
7Ayunga8Flynn15Boyd-Munce16Small18Dunne19Nahmani20Olusanya21Greive27UrminskyReferee:Grant Irvine
Attendance:17,029
Live Text
Match ends, Aberdeen 0, St. Mirren 3.
Second Half ends, Aberdeen 0, St. Mirren 3.
Attempt blocked. Shayden Morris (Aberdeen) right footed shot from outside the box is blocked. Assisted by Leighton Clarkson.
Corner, Aberdeen. Conceded by James Bolton.
Goal! Aberdeen 0, St. Mirren 3. Greg Kiltie (St. Mirren) converts the penalty with a right footed shot to the high centre of the goal.
VAR Decision: Penalty St. Mirren.
Penalty conceded by Stefan Gartenmann (Aberdeen) after a foul in the penalty area.
Penalty St. Mirren. Toyosi Olusanya draws a foul in the penalty area.
Attempt missed. Slobodan Rubezic (Aberdeen) header from the centre of the box is too high. Assisted by Leighton Clarkson with a cross following a corner.
Corner, Aberdeen. Conceded by Alex Gogic.
Hand ball by Toyosi Olusanya (St. Mirren).
Offside, Aberdeen. Jonny Hayes is caught offside.
Jamie McGrath (Aberdeen) wins a free kick on the left wing.
Foul by Marcus Fraser (St. Mirren).
Substitution, Aberdeen. Jonny Hayes replaces James McGarry.
Slobodan Rubezic (Aberdeen) wins a free kick in the defensive half.
Foul by Toyosi Olusanya (St. Mirren).
Corner, Aberdeen. Conceded by Alex Gogic.
Slobodan Rubezic (Aberdeen) wins a free kick in the attacking half.
Foul by Jonah Ayunga (St. Mirren).
How to play
Rate players out of 10 throughout or after the game. The rater will close 30 minutes after the final whistle.
Rating range key1 = Give it up10 = Pure perfection
Aberdeen
Squad number24Player nameRoos
Squad number6Player nameGartenmann
Squad number33Player nameRubezic
Squad number5Player nameJensen
Squad number2Player nameDevlin
Squad number7Player nameMcGrath
Squad number10Player nameClarkson
Squad number4Player nameShinnie
Squad number15Player nameMcGarry
Squad number9Player nameMiovski
Squad number11Player nameDuk
Squad number17Player nameHayes
Squad number19Player nameSokler
Squad number20Player nameMorris
Squad number21Player namePolvara
Squad number28Player nameMilne
St Mirren
Squad number1Player nameHemming
Squad number2Player nameBolton
Squad number13Player nameGogic
Squad number5Player nameTaylor
Squad number22Player nameFraser
Squad number17Player nameBaccus
Squad number6Player nameO'Hara
Squad number3Player nameTanser
Squad number24Player nameJamieson
Squad number11Player nameKiltie
Squad number9Player nameMandron
Squad number7Player nameAyunga
Squad number15Player nameBoyd-Munce
Squad number20Player nameOlusanya