The Bulls missed the chance to take the top spot in the Super Rugby standings by losing 30-13 to the Stormers in Cape Town.
The result means that the Bulls finish the regular season in second place and the Chiefs in first place.
The Bulls and Chiefs get a bye next week for finishing in the top two but if they both win their Semi-finals the Chiefs will host the final as they finished higher than the Bulls.
The Chiefs and Bulls will both have home Super Rugby Semi-finals against the winners of next week's qualifiers.
The Stormers finally delivered the performance that they have been promising all season and out played the Bulls in just about every facet of the game.
The question Stormers fans will be asking is why they left it until the last match of the season to show what they are capable of.
The Stormers' three-try to one victory sees them finish the season in seventh place on the overall Super Rugby standings.
Bulls flyhalf Morne Steyn looked for an opening-minute score via a dropped goal but his effort flew left of the posts.
Moments later he did, however, put the Bulls in an attacking position with a tactical kick which took play to within 10 metres of the Stormers' tryline.
The Stormers adventurously counter-attacked from their own tryline and it was an early indication of how the Stormers were going to approach the game.
Twice in the space of five minutes the Stormers split the Bulls' defence with tries by lock Eben Etzebeth and Bryan Habana.
Flyhalf Gary van Aswegen added both conversions and in between the Stormers' touchdowns, Steyn kicked a penalty .
The Bulls shrugged off the setback with a 20th minute try by fullback Zane Kirchner, and with Steyn adding the conversion, the Stormer's lead was cut to just four points
The Stormers managed a territorial advantage as the first half wound towards the halftime mark and looked set to score on at least two occasions but handling errors thwarted their efforts.
Instead, the unerring boot of Van Aswegen kept the scoreboard ticking over with a succession of three penalties.
On the stroke of halftime, Stormers captain Jean de Villiers was yellow carded for a pointless late shoulder charge and the decision by referee Craig Joubert didn't go well down with the strong crowd of 45,416 whose reaction suggested it was a harsh call.
Steyn kicked the resultant penalty which turned out to be the last time the Bulls scored.
The 14-man Stormers returned from the break determined to continue to run hard at the Bulls defence and there were several promising raids on the tryline.
But, as it turned out, it was no more than promising during this passage of play.
The Bulls managed to weather this 'storm' in the opening 12 minutes after the restart but the pressure took its toll in the 55th minute when De Villiers crashed over after fine inter-play between backs and forwards. Van Aswegen was on target again.
The Bulls found a second wind in the final 15 minutes of the match but against one of the most organised Super Rugby defences they came up short three times in the space of seven frantic minutes at the death.
The match was Bryan Habana's final game for the Stormers as he is on his way to play in France now but celebrated a try and his general performance showed in the match that he will be sorely missed by the Stormers next season.
Final Score Stormers 30 (23) Bulls 13 (13)
Tries - E.Etzebeth, B.Habana, J.De Villiers
Pen - G. van Aswegen 3
Con - G. van Aswegen 2
Cards -J. De Villiers (39th min yellow), M. Bezuidenhout (68th min yellow)
Tries - Z.Kirchner
Pen - M.Steyn 2
Con - M.Steyn
Referee: Craig Joubert
Assistant Ref 1:Marius v/d Westhuizen
Assistant Ref 2:Linston Manuels
TMO : Deon van Blommenstein
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 (vice-captain), 5. De Kock Steenkamp, 4. Eben Etzebeth, 3. Brok Harris, 2. Scarra Ntubeni, 1. Steven Kitshoff
Reserves:, 16. Martin Bezuidenhout, 17. Pat Cilliers, 18. Gerbrandt Grobler, 19. Don Armand, 20. Nic Groom, 21. Elton Jantjies, 22. Damian de Allende.
15 Zane Kirchner, 14 Akona Ndungane, 13 JJ Engelbrecht, 12 Francois Venter, 11 Bjorn Basson, 10 Morne Steyn, 9 Jano Vermaak, 8 Dewald Potgieter (c), 7 Jacques Potgieter, 6 Deon Stegmann, 5 Grant Hattingh, 4 Flip vd Merwe, 3 Werner Kruger, 2 Chiliboy Ralepelle, 1 Dean Greyling
Replacements : 16 Callie Visagie, 17 Frik Kirsten, 18 Jacques du Plessis, 19 Jono Ross, 20 Rudy Paige, 21 Jurgen Visser, 22 Morne Mellet