Celtic recovered from a shock early deficit to edge past St Mirren and close to within three points of Scottish Premiership leaders Rangers.
But Celtic led at half-time thanks to headers from Shane Duffy – his second in as many games – and James Forrest.
Emergency St Mirren loan signing Zdenek Zlamal, on his second appearance, then saved an Odsonne Edouard penalty.
Neil Lennon’s side overtake Hibernian in second on goal difference, with a game in hand on Rangers, while St Mirren remain seventh.
Celtic were rarely troubled after repairing the damage of their sloppy start, but it was far from a vintage performance as they struggled to kill off a stubborn home side.
St Mirren – who last beat Celtic 10-and-a-half years ago – were still without their first and second-choice keepers after a torrid week of coronavirus controversy. To his credit, Zlamal – preferred to raw 20-year-old Peter Urminsky – excelled with several fine stops.
Few gave Jim Goodwin’s men a hope, but they stunned the champions just three minutes in. Celtic switched off as Jamie McGrath swung in a corner, Joe Shaughnessy glanced it on and Erwin scrambled home from a couple of yards.
Celtic were reeling, with St Mirren comfortably protecting the lead. Edouard fired a warning on the 20-minute mark, heading narrowly wide after Forrest stood up a cross to the back post.
But two goals in a 15-minute spell – both crafted by Ryan Christie – turned the game around. Duffy’s aerial prowess is hardly a secret weapon, yet the Ireland centre-back was left unmarked six yards out to plant a header beyond Zlamal from an inswinging free-kick.
Christie’s next assist was superb, and matched by the quality of finish, as Forrest met the midfielder’s deep cross from the left with an unstoppable header.
St Mirren had a penalty shout ignored when a free-kick struck Duffy’s arm, and Erwin sent a dipping second-half drive narrowly over the bar.
But while Celtic finished with 77% possession, they couldn’t find the comfort of a third goal. Edouard should have provided it after Christie was felled by McGrath, but his poor spot-kick was too close to Zlamal, who got down smartly.
The French striker also had a free-kick parried clear by the Czech keeper, whose final act was to deny Christie’s thumping effort as St Mirren battled to the bitter end.
Man of the match – Ryan Christie
What did we learn?
This was Patryk Klimala’s big chance to impress for Celtic, but he failed to impress. The Polish striker, who scored as a substitute at the weekend, was handed his first start of the season but was largely anonymous before being replaced after 66 minutes.
His lack of striking impact was in stark contrast to on-loan Brighton centre-back Duffy, who followed up his debut goal with another key header. Duffy is already integral to Lennon’s team.
If this was Zlamal’s last appearance for St Mirren, he can return to Hearts with his head held high. The 34-year-old could have buckled after his baptism of fire against Hibs, having signed just hours before Saturday’s 3-0 defeat, but was in inspired form here and kept St Mirren in the game.
What did they say?
St Mirren manager Jim Goodwin: “We spoke about the importance of not giving cheap free-kicks away. From our point of view it’s two very avoidable goals.
“The one in the first half is a penalty. I don’t think Shane Duffy deliberately handballs it, but he loses the flight and it hits his left arm, stopping it landing to Richard Tait.”
Celtic manager Neil Lennon: “We had a poor start, conceding from a set-play is always disappointing. But our reaction was excellent, we played with real intensity and thoroughly deserved to go into half-time with the lead.