Bavuma struck a sublime 171 not out as the Proteas closed out the day on 287-7, an overall lead of 356 that might be bridge too far for the Caribbean side.
It was Bavuma’s second Test ton and it comes more than seven years after his maiden hundred in the longest format against England at Newlands in 2016.
What would make the century even more special is that it came on the back of Bavuma getting a pair of ducks in the first game of the series, also his first Test as captain.
The Proteas skipper came to the crease with hosts teetering on 8-2 following the early dismissals of Dean Elgar (5) and Tony de Zorzi (1).
The lead at that stage was only 77 and it got better for the Windies when Aiden Markram (18) and Ryan Rickelton (10) fell before the lunch break.
At 69-4 at the interval, the Carribean outfit would have been seen as favourites to wrap up the innings and chase the target that would have given them a drawn series.
Heinrich Klaasen (14) though put on 34 with Bavuma to stabilise things somewhat but the wicketkeeper-batter fell to fast bowler Alzarri Joseph going for a pull shot.
Bavuma desperately needed an ally and found one in the form of Wiaan Mulder as the domestic teammates added a match-changing 103 runs for the sixth wicket.
All the while Bavuma was shifting through the gears and after the tea break the 32-year-old brought up his milestone, smashing Joseph over cover for a boundary.
Mulder fell for 42 not long afterwards but Simon Harmer (19) put on a 71-run stand with his skipper to well and truely take the game away from the visitors.
Jason Holder struck a blow late in the day for the Carribean team as he trapped Harmer lbw but most of the damage had already been done.
Bavuma cruised to his maiden Test 150 and will be eyeing up a double-ton on Saturday as the Proteas look to increase the lead closer to the 400-run mark.