Glasgow Warriors lost their first ever meeting with Stormers and missed the chance to move closer to United Rugby Championship leaders Leinster.
Jack Dempsey crossed for Glasgow but Rikus Pretorius replied and Stormers led 13-7 at the break.
Further tries by Herschel Jantjies and Leolin Zas extended the hosts' advantage.
The visitors had Josh McKay sin-binned and Evan Roos got a bonus-point winning try for Stormers.
The South African side's sixth successive win moves them to within eight points of Leinster and two ahead of Glasgow.
After Manie Libbok's early missed penalty for the hosts, Glasgow continued to come under pressure but held firm and almost led after Johnny Matthews made a burst for the try line on the left.
The hooker was shackled and Warriors were soon forced into a change when Ross Forbes took over from Kyle Steyn.
Glasgow were now in the ascendancy and Zander Fagerson's forcefulness at the line led to Dempsey squeezing over. Ross Thompson added the conversion.
Warriors failed to take advantage of further forays forward and Libbok got Stormers on the board with a penalty before Pretorius gave the hosts the lead for the first time.
The centre picked a good line to receive Damian Willemse's pass and charge across unopposed. Libbok converted and added another penalty before the break.
Forbes could not latch on to Sam Johnson's grubber kick as Glasgow pressed in the second half and Stormers soon extended their advantage.
Hacjivah Dayimani was afforded too much space as he ran from halfway and Jantjies was put in for the score. Libbok missed the conversion.
Warrick Gelant's deft pass sent Zas over in the left corner and Libbok added another two points.
And but for Ollie Smith's impressive intervention, Jantjies would have got his second try on the same side.
After a lengthy TMO review, McKay was yellow carded for his tackle on Ruhan Nel near the line.
Stormers went in search of a bonus point and were rewarded in added time as Roos burst through, Libbock converting again.
Stormers: Willemse, Senatla, Nel, Pretorius, Zas, Libbok, Jantjies; Kitshoff, Ntubeni, Malherbe, Smith, Orie, Pokomela, Dayimani, Roos.
Replacements: Kotze, Vermaak, Harris, Moerat, Dixon, Xaba, de Wet, Gelant.
Glasgow Warriors: Smith, McKay, Tuipulotu, Johnson, Steyn, Thompson, Price; Kebble, Matthews, Z Fagerson, Gray, McDonald, Miller, Darge, Dempsey.
Replacements: Turner, Bhatti, Berghan, Harley, Gordon, Dobie, Weir, Forbes.
Referee: Andrew Brace (Ireland).