Graham Carey's wonder strike helped St Mirren leapfrog Hearts and move up to tenth in the Scottish Premier League.
Saints took an early lead in Paisley when Paul McGowan netted from the spot after Darren Barr had fouled Lee Mair.
Carey doubled that advantage with a fantastic dipping effort from 35 yards - his first goal of the season.
Hearts dominated the second half without creating many clear-cut chances, Dylan McGowan and Michael Ngoo going closest.
The encounter served as a dress rehearsal for next month's Scottish Communities League Cup Final.
And if Saints start that Hampden contest as they did in Paisley, they will be more than happy.
Within three minutes, the home side had a spot-kick. Referee Kevin Clancy pointed to the spot when Barr appeared to bundle over Mair at a corner.
McGowan stepped up and scored low to the left corner, sending Jamie MacDonald the wrong way to net his fifth goal of the season.
Not the start Hearts intended, but their young midfielder Jamie Walker despatched an ninth-minute shot goalwards for Craig Samson to deal with and thereby remind the hosts of their threat.
On 37 minutes, Ngoo sprang into life for the visitors to test Samson with a low left-footer from the edge of the box.
Sam Parkin went close for St Mirren soon after, glancing Carey's lovely cross from the left just wide.
But then Carey produced a moment of magic on the stroke of half-time.
The Irish winger picked up the ball in the middle of the park and sent an unstoppable, dipping drive into the back of the net.
Hearts' reaction for the second period was to replace Barr and Arvydas Novikovas with John Sutton and McGowan.
And McGowan was in the thick of the action immediately, heading a corner wide as the visitors began to apply more pressure.
Then on 51 minutes they had a penalty shout of their own when Mair seemed to pull down Sutton, but referee Clancy was unmoved.
With an hour gone, Hearts' Kevin McHattie teed up Walker to fizz in another shot which Samson batted away.
St Mirren were rarely in their opponents half as Ngoo dragged another effort wide in the 71st minute.
But, for all Hearts' possession in the closing stages, none of it was converted into real goalscoring opportunities, allowing St Mirren to get only their second win in 12 games against the Edinburgh side.
- 01 Samson
- 03 Dummett
- 05 Mair
- 14 McAusland
- 23 Barron (van Zanten - 84' )
- 10 McGowan (Mclean - 84' )
- 11 Carey
- 24 Newton
- 19 Parkin
- 27 Guy (Imrie - 81' )
- 29 J McGinn
- 16 Adam
- 02 van Zanten
- 25 Kelly
- 17 Mclean
- 07 Imrie
- 09 Thompson
- 77 Goncalves
Heart of Midlothian
- 01 MacDonald
- 04 Wilson
- 05 Barr Booked (McGowan - 46' )
- 06 Webster
- 14 Walker
- 29 McHattie
- 15 Holt
- 16 Prychynenko (Taouil - 85' )
- 27 Tapping
- 18 Novikovas (Sutton - 46' )
- 21 Ngoo
- 13 Ridgers
- 10 Taouil
- 19 McGowan
- 09 Sutton
- 12 Smith
- 32 B King
- 37 Carrick
Live Text Commentary
Full Time The final whistle goes and the game is over.90:00 +1:36
The ball is sent over by Dylan McGowan, John McGinn manages to make a clearance. Kevin McHattie takes a shot from 30 yards. Craig Samson makes a save.88:51
Sam Parkin concedes a free kick for a foul on Andy Webster. Free kick taken by Danny Wilson.87:32
Jamie Walker has an effort at goal from outside the box which goes wide left of the goal.83:30
Graham Carey crosses the ball in from the free kick.83:30 Substitution
Substitution Mehdi Taouil comes on in place of Denis Prychynenko.83:30 Substitution
Substitution David van Zanten replaces David Barron.83:30 Substitution
Substitution Kenny McLean joins the action as a substitute, replacing Paul McGowan.83:30
Free kick awarded for an unfair challenge on Dougie Imrie by Denis Prychynenko.80:34
Craig Samson restarts play with the free kick.80:34 Substitution
Substitution Dougie Imrie replaces Lewis Guy.80:34
Kevin McHattie challenges David Barron unfairly and gives away a free kick.80:04
Kevin McHattie takes a shot. Blocked by Paul McGowan.76:17
Lee Mair concedes a free kick for a foul on Jamie Walker. Jamie Walker produces a shot on goal direct from the free kick, save by Craig Samson.74:46
The ball is sent over by Paul McGowan, Andy Webster makes a clearance.72:29
Graham Carey crosses the ball.72:17
The ball is sent over by David Barron, clearance made by Andy Webster.71:21
Callum Tapping challenges Paul Dummett unfairly and gives away a free kick. Craig Samson restarts play with the free kick.70:10
Michael Ngoo has an effort at goal from outside the box missing to the wide left of the goal.69:43
Shot from just outside the area by Paul McGowan misses to the right of the target.
Free kick awarded for an unfair challenge on Sam Parkin by Jamie Walker. Conor Newton takes the direct free kick.69:00
The ball is sent over by Jamie Walker, Lee Mair makes a clearance.67:51
Dylan McGowan is caught offside. Craig Samson takes the free kick.66:59
Free kick awarded for an unfair challenge on Michael Ngoo by David Barron. Free kick crossed right-footed by Jamie Walker from left wing, Paul Dummett manages to make a clearance.66:09
Jamie Walker has an effort at goal from outside the box which goes wide left of the goal.65:53
Dylan McGowan produces a cross, Marc McAusland makes a clearance.64:33
A cross is delivered by Graham Carey, clearance made by Andy Webster.63:39
Michael Ngoo delivers the ball, clearance by Marc McAusland. The ball is delivered by Michael Ngoo, Marc McAusland manages to make a clearance.62:38
Paul Dummett crosses the ball, Denis Prychynenko makes a clearance.61:52
The ball is swung over by Jamie Walker, David Barron makes a clearance. Corner taken right-footed by Jamie Walker to the near post, clearance by John McGinn.61:11
A cross is delivered by Paul Dummett, clearance by Danny Wilson.61:03
The ball is delivered by David Barron.60:51
Centre by Graham Carey.60:01
Michael Ngoo fouled by David Barron, the ref awards a free kick. Callum Tapping takes the free kick.59:01
Denis Prychynenko gives away a free kick for an unfair challenge on Lewis Guy. Craig Samson restarts play with the free kick.58:38
Jamie Walker produces a drilled right-footed shot from 18 yards. Save made by Craig Samson.56:50
The ball is delivered by Danny Wilson, Marc McAusland fouled by Michael Ngoo, the ref awards a free kick. Craig Samson takes the direct free kick.55:32
The ball is swung over by Jamie Walker, David Barron makes a clearance.54:01
Centre by Graham Carey, Danny Wilson manages to make a clearance. Graham Carey takes a short corner. Graham Carey has a curled shot. Save made by Jamie MacDonald.52:37
The ball is sent over by Jamie Walker, clearance by David Barron. Short corner worked by Jamie Walker.52:02
A cross is delivered by Michael Ngoo, blocked by Paul Dummett. Corner taken by Jamie Walker played to the near post, John McGinn manages to make a clearance.50:40
Free kick awarded for a foul by Michael Ngoo on Lee Mair. Direct free kick taken by Craig Samson.50:20
Foul by Sam Parkin on Dylan McGowan, free kick awarded. Free kick taken by Dylan McGowan.48:33
Corner taken right-footed by Jamie Walker to the near post, Headed effort from inside the area by Dylan McGowan misses to the left of the target.47:54
Michael Ngoo gives away a free kick for an unfair challenge on Lee Mair. Craig Samson takes the direct free kick.45:01
The referee gets the second half started.45:01 Substitution
Substitution John Sutton comes on in place of Arvydas Novikovas.45:01 Substitution
Substitution (Hearts) makes a substitution, with Dylan McGowan coming on for Darren Barr.45:00 +1:15 Half time
Half Time It is the end of the first-half.44:45 Goal scored
Goal! - Graham Carey - St Mirren 2 - 0 Hearts Graham Carey scores from 35 yards. St Mirren 2-0 Hearts.42:30
David Barron concedes a free kick for a foul on Jason Holt. Direct strike on goal from the free kick comes in from Denis Prychynenko. Jason Holt takes a shot from deep inside the box clearing the bar.41:53
Graham Carey produces a cross, Headed effort from inside the penalty area by Sam Parkin misses to the right of the target.39:56
Paul McGowan crosses the ball.38:12
Paul McGowan gives away a free kick for an unfair challenge on Kevin McHattie. Shot comes in from Denis Prychynenko from the free kick.37:15
Shot by Michael Ngoo. Craig Samson makes a save.36:08
Graham Carey crosses the ball, clearance by Jason Holt.35:14
Graham Carey crosses the ball, Danny Wilson makes a clearance.29:47
Foul by Michael Ngoo on Paul McGowan, free kick awarded. Direct free kick taken by Craig Samson.28:43
Denis Prychynenko gives away a free kick for an unfair challenge on John McGinn. Lee Mair takes the direct free kick.27:38
Direct free kick taken by Lee Mair.27:38 Booking
Booking Darren Barr is shown a yellow card.27:21
Darren Barr concedes a free kick for a foul on Graham Carey.27:13
The ball is crossed by Arvydas Novikovas.24:50
Andy Webster concedes a free kick for a foul on Sam Parkin. Paul Dummett restarts play with the free kick.22:54
The referee blows for offside. Kevin McHattie restarts play with the free kick.21:57
Unfair challenge on Michael Ngoo by Lee Mair results in a free kick. Andy Webster takes the free kick.18:41
The ball is delivered by Arvydas Novikovas, David Barron gets a block in. Inswinging corner taken by Jamie Walker from the left by-line, save made by Craig Samson.17:41
The ball is delivered by David Barron, save by Jamie MacDonald.17:27
Darren Barr challenges John McGinn unfairly and gives away a free kick. Paul Dummett restarts play with the free kick.13:05
The ball is delivered by Graham Carey. The offside flag is raised against Lewis Guy. Free kick taken by Jamie MacDonald.9:38
Sam Parkin is ruled offside. Free kick taken by Danny Wilson.9:05
Jamie Walker takes a shot. Craig Samson makes a save.8:13
Jamie Walker crosses the ball, Marc McAusland manages to make a clearance.3:43
Lee Mair provided the assist for the goal.3:43 Goal scored
Goal! - Paul McGowan - St Mirren 1 - 0 Hearts Paul McGowan scores a placed penalty. St Mirren 1-0 Hearts.2:13
The ball is sent over by David Barron, Kevin McHattie manages to make a clearance. Inswinging corner taken left-footed by Graham Carey from the right by-line, Darren Barr makes a clearance. Corner taken by Graham Carey from the right by-line, Darren Barr concedes a Penalty for a foul on Lee Mair.1:33
Andy Webster gives away a free kick for an unfair challenge on Sam Parkin. Lee Mair restarts play with the free kick.1:21
Darren Barr crosses the ball.0:00
The match has kicked off.
Live data and text provided by our data suppliers