Bangladesh strolled to a historic first victory in South Africa in the first of three ODIs at Centurion.
The tourists set their opponents a target of 315 thanks to three players making half-centuries, but South Africa never really looked like reaching it as they were beaten by 38 runs.
Openers Tamim Iqbal (41) and Litton Das (50) gave Bangladesh a strong start from which to build their innings with a partnership of 95.
Andile Phehlukwayo (1-63) finally made a breakthrough in the 22nd over, before Litton Das was dismissed by Keshav Maharaj (2-56) an over after reaching his half-century
After Mushfiqur Rahim (nine) had hit a Maharaj delivery high in the air for David Miller to catch, the next big partnership came from Shakib Al Hasan, who hit a dazzling 77, and Yasir Ali (50), who added 115 before the former was trapped leg before wicket to Lungi Ngidi (1-75).
Yasir was out soon after, but Mahmudullah (25), Afif Hossain (17) and Mehidy Hasan Miraz (19 not out) helped Bangladesh reach 314-7 from 50 overs.
South Africa's reply started badly when Janneman Malan edged a Shoriful Islam delivery through to Mushfiqur, though major damage came in the ninth over as Kyle Verreynne (21) and Aiden Markram (0) both fell to Taskin Ahmed.
Temba Bavuma and Rassie van der Dussen did well to rebuild the innings, putting on 85 together before the Proteas' skipper clipped one from Shoriful to Mushfiqur on 31.
Taskin took the key wicket of Van der Dussen, who played it straight to Yasir 14 runs short of his century.
Miller gave his all with a resilient 79 that included three sixes, but the spin of Mehidy (4-61) cleaned up the tail as the Proteas slumped to 276 all out.
Shakib shows his class
The world number one ranked all-rounder was at his best with the bat here, plundering 77 from 64 balls as he added significant gleam to the hard work put in by the openers.
Shakib hit 10 boundaries, with seven fours and three sixes as he achieved his best ODI score against South Africa in 15 matches, and his highest score of 2022 so far.
Taskin clinical
Mehidy took more wickets but it was Taskin who initially kept the hosts down. His figures of 3-36 from his 10 overs meant that by the time Mehidy was taking late wickets, the job was more or less done.
Like Shakib, this was also Taskin's best ODI performance against the Proteas, albeit only from four meetings.