The Bulls were given a wake-up call ahead of their Super Rugby semi-final as they succumbed 30-13 to the Stormers.
Having edged past the Sharks last time out, largely due to their opposition's poor kicking, the Bulls were not offered such favours in Cape Town on Saturday.
Despite having their place in the semi-finals assured, the Bulls had plenty to play for at Newlands, with top spot on the overall table in the offering and with it a possible home final.
It was the Stormers who appeared the team with a lot on the line though, as Allister Coetzee's troops came out firing from the word go, dominating the physical collisions in a manner which one would usually expect the Bulls to do so.
The Bulls showed early signs that they would look to the boot of Morne Steyn to control the scoring, with the fly-half attempting a drop goal inside the first minute. The opportunity was missed and it the Stormers soon stamped their authority on proceedings.
The host's backs and forwards combined well early on and they were rewarded for their pressure with a line-out just short of the Bulls lines. The men from Pretoria denied them at first, though illegally, but could do nothing when the Stormers went to the front of the line-out for a second time from where Eben Etzebeth dived over.
Steyn opened the Bulls account with a three-pointer after the industrious Deon Fourie was pinged for not rolling away but the Stormers soon extended their lead.
Playing in his final match before joining Toulon in France, Bryan Habana would have been hopeful of making an impact and he did just that in the 15th minute, slicing through the Bulls defence on the angle after being brought into play by an inside pass from Jean de Villiers.
Contrary to their usual tactics, the Bulls turned down a straightforward chance for three points on their next foray into the Stormers half, instead setting up an attacking line-out. While Dean Greyling was initially held up short, the visitors were rewarded for their decision to go for the try when Zane Kirchner stretched over from the resulting scrum.
Crucially for the Stormers, they began to put points on the ball every time they made it into the Bulls' 22, with Gary van Aswegen converting three penalty chances.
The Stormers were dealt a heavy blow on the stroke of half-time when de Villiers was yellow carded for a late tackle without arms and Steyn added three points to see the sides head into the break with the Stormers 23-13 ahead.
Frans Ludeke may have read his side the riot act at half-time, but there was little the Bulls could do early in the second period as they came under heavy pressure despite initially having a numerical advantage.
The second half proved to be an arm wrestle of titanic proportions, with both sides giving it everything. However, it was the Stormers who were able to add to their tally, with de Villiers sneaking over after 10 phases of hard graft from the hosts.
The try saw a host of replacements stream on from both sides, but while some of the second stringers may have been introduced, the intensity did not drop.
The Bulls began to find more of a foothold in terms of territory, but they were met by fierce defence from the Stormers. A yellow card to Martin Bezuidenhout didn't change this as immediately following his temporary exit, the hosts propelled an almighty rolling maul.
Indeed, it was the Stormers who got closest to scoring next, with a Gio Aplon touchdown ruled out for a knock on from Habana as the pair chased down a clearing kick on the counter attack.
The Bulls continued to probe but they could not breach the Stormers defence and will now head into their week off with plenty to ponder while the Stormers end their campaign on a high.
For the Stormers:
Tries: Etzebeth, Habana, de Villiers
Cons: van Aswegen 3
Pens: van Aswegen 3
For the Bulls:
Pens: Steyn 2
Yellow cards: De Villiers, Bezuidenhout (both Stormers)
Stormers: 15 Gio Aplon, 14 Gerhard van den Heever, 13 Juan de Jongh, 12 Jean de Villiers (captain), 11 Bryan Habana, 10 Gary van Aswegen, 9 Louis Schreuder, 8 Nizaam Carr, 7 Rynhardt Elstadt, 6 Deon Fourie, 5 De Kock Steenkamp, 4 Eben Etzebeth, 3 Brok Harris, 2 Scarra Ntubeni, 1 Steven Kitshoff.
Replacements: 16 Martin Bezuidenhout, 17 Pat Cilliers, 18 Gerbrandt Grobler, 19 Don Armand, 20 Nic Groom, 21 Elton Jantjies, 22 Damian de Allende.
Bulls: 15 Zane Kirchner, 14 Akona Ndungane, 13 JJ Engelbrecht, 12 Francois Venter, 11 Bjorn Basson, 10 MornÃ© Steyn, 9 Jano Vermaak, 8 Dewald Potgieter (capt), 7 Jacques Potgieter, 6 Deon Stegmann, 5 Grant Hattingh, 4 Flip van der Merwe, 3 Werner Kruger, 2 Chiliboy Ralepelle, 1 Dean Greyling.
Replacements: 16 Callie Visagie, 17 Frik Kirsten, 18 MornÃ© Mellet, 19 Jacques du Plessis, 20 Jono Ross, 21 Rudy Paige, 22 JÃ¼rgen Visser.
Referee: Craig Joubert