Connacht bowed out of the BKT United Rugby Championship after losing their semi-final to the DHL Stormers in Cape Town.
The defeat brings an end to Andy Friend's five-year stint with the Westerners but his side went down fighting.
They took an 8-0 lead early on and were within a converted try with five minutes to play but the holders, helped by 23 points by Manie Libbok and a superb defensive performance, proved too strong and are deservedly back in the final, where they will meet Leinster or Munster.
Fly-half Libbok scored two key first-half tries, as the Stormers rallied from an early 8-0 deficit to claim victory in a thrilling 10-try clash at a windswept DHL Stadium.
The impressive Angelo Davids, Paul De Wet, Marcel Theunissen and Ruhan Nel also crossed for the South African side, with Mack Hansen, Conor Oliver, Shamus Hurley-Langton and Byron Ralston touching down in a losing cause for battling Connacht.
Connacht captain Jack Carty – who kicked his side to victory over Ulster in the quarter-finals – drew first blood when he slotted over a straightforward early penalty as the visitors capitalised on a mistake from Stormers hooker Joseph Dweba and then a collapsed scrum.
More handling errors from the Stormers then laid the foundations for Connacht to score the game's opening try in the 13th minute, Hansen collecting a superb long pass from Carty to dive in at the corner.
Carty missed the touchline conversion and his opposite number Libbok then showed his class as the Stormers hit back in style.
With the champions pushing hard on the left-hand side of the pitch, Libbok picked out the unmarked Davids with a superb cross-field kick and the right winger had the easiest of jobs to touch down.
Libbok, the tournament’s leading points scorer, made light of the difficult kicking conditions to slot over a testing conversion and then put Stormers 10-8 ahead with a penalty.
The home side were starting to move through the gears and Libbok was central again as they scored their second try just before the half-hour.
The South Africa fly-half was heavily involved at the start of the move and then provided the finishing touch after Dan Du Plessis and Herschel Jantjies had combined to put him in under the posts.
The Stormers were now rampant and increased their lead when Davids collected possession from a line-out, sliced through the Connacht defence before sending Libbok in again.
Connacht, looking to reach only their second major final following their 2016 Pro12 triumph, were on the ropes but they rallied and reduced the deficit to 24-13 at half-time when flanker Oliver twisted and turned to touch down.
Carty should have added a simple conversion but Davids was quick to race out and grab the ball after it had fallen off the tee, with referee Mike Adamson pointing out the Connacht skipper had started his run up.
Nevertheless, after a scrappy start to the second half, Connacht did reduce the Stormers’ advantage further in the 59th minute when Hurley-Langton burrowed over after a sustained period of pressure.
Carty’s conversion made it 24-20 and set the stage for a grandstand final quarter.
The Stormers were rocking but the momentum shifted back their way in the 65th minute when they made the most of a penalty advantage to score a try on the counter-attack.
Nel did well on the left before feeding possession to Leolin Zas and he sent replacement scrum-half De Wet charging through unchecked.
Connacht continued to fight and gave themselves a lifeline when Ralston touched down on the right, but the Stormers would not be denied and late scores from Theunissen and Nel clinched a place in the final.
Stormers: Damian Willemse; Angelo Davids, Duhan Nel, Dan du Plessis, Leolin Zas; Manie Libbok, Herschel Jantjies; Steven Kitshoff (capt), Joseph Dweba, Frans Malherbe; Ben-Jason Dixon, Ruben van Heerden; Willie Engelbrecht, Hacjivah Dayimani, Evan Roos.
Replacements: JJ Kotze, Ali Vermaak, Neethling Fouche, Connor Evans, Marcel Theunissen, Paul de Wet, Jean-Luc du Plessis, Sacha Feinberg-Mngomezulu.
Connacht: Tiernan O'Halloran; John Porch, Tom Farrell, Bundee Aki, Mack Hansen; Jack Carty (capt), Caolin Blade; Denis Buckley, Dave Heffernan, Finlay Bealham; Josh Murphy, Niall Murray; Shamus Hurley-Langton, Conor Oliver, Cian Prendergast.
Replacements: Dylan Tierney-Martin, Jordan Duggan, Jack Aungier, Oisín Dowling, Jarrad Butler, Kieran Marmion, Tom Daly, Byron Ralston.
Referee: Mike Adamson (SRU)