Scorecard: Click here
Faf du Plessis hit his third century in four games as he carried South Africa to a 63-run against Zimbabwe win to book a date with Australia in Saturday's tri-series final in Harare.
Du Plessis' 121 carried the Proteas to 6-271 after they were put in to bat by the home side, before JP Duminy picked up three wickets to see Zimbabwe bowled out for 208.
Zimbabwe, who shocked Australia last Sunday to put themselves in with a chance of making Saturday's final, needed to chase down their target in 25.2 overs to get a bonus point and move ahead of the Proteas and improve their net run rate sufficiently to knock South Africa out.
Brendan Taylor played a superb knock of 79 but sadly for the host nation it was a lone hand.
Du Plessis paced his innings superbly on another turning pitch to score 121 from 140 deliveries, which allowed the Proteas to recover from the early loss of their openers.
Quick Single: Duck-free Du Plesssis' slice of history
The No.3 batsman only scored his maiden one-day hundred last Wednesday against Australia, but followed it up with 126 against the same opposition in a losing cause on Tuesday before adding a third century on Thursday.
Du Plessis' innings made it almost impossible for Zimbabwe to qualify for Saturday's final, where Australia lie in wait.
The hosts must chase their target in 25.2 overs in order to gain a bonus point and improve their net run rate sufficiently to knock South Africa out.
Although the game began promisingly for Zimbabwe after they won the toss and inserted South Africa before reducing them to 2-26, Du Plessis added 70 for the third wicket with Rilee Rossouw.
While Rossouw was bowled for 36 by left-arm spinner Sean Williams and AB de Villiers was run out in bizarre circumstances when John Nyumbu dropped a return catch onto the stumps at the non-striker's end, a savvy 103-run stand between Du Plessis and JP Duminy put the Proteas back on track.
As Zimbabwe's spinners whirled away, the pair manoeuvred a succession of ones and twos to set the innings up for a big push at the end.
Although both batsmen departed attempting big shots, with Duminy out for 51, the Proteas added 61 in the last five overs to leave Zimbabwe with a huge task.
Zimbabwe XI: Elton Chigumbura (capt), Sirkandar Raza, Vusi Sibanda, Hamilton Masakadza, Brendan Taylor (wk), Sean Williams, Malcolm Waller, Neville Madziva, Prosper Utseya, John Nyumbu, Tendai Chatara.
South Africa XI: AB de Villiers (capt), Hashim Amla, Quinton de Kock (wk), Faf du Plessis, Rilee Rossouw, JP Duminy, David Miller, Wayne Parnell, Dale Steyn, Aaron Phangiso, Morne Morkel.