Set 169 for victory, Bangladesh looked to be cruising at 120 for one before three wickets in five balls set them back. They still managed to make a tight game of it, though, needing 10 runs off the final over.
After Zimbabwe won the toss, their opener Hamilton Masakadza blasted 59 from 48 balls and skipper Brendan Taylor added 40 from 25 deliveries to give the hosts a solid score.
Malcolm Waller showed good power-hitting at the end to finish on 26 not out from 14 balls as the home batsmen found the boundary with regularity.
All the Bangladesh bowlers suffered except Shakib Al Hasan, whose four overs went for just 20 and took the wickets of Masakadza and Taylor.
Shamsur Rahman (53) and Shakib Al Hasan (65) added 118 in just 85 balls for Bangladesh's second wicket but the visitors lost four batsmen for the addition of just 10 runs.
Prosper Utseya did the damage, removing both the half-centurions within three balls to turn the match in his side's favour.
Excellent hitting from Bangladesh captain Mushfiqur Rahim (28 from 14 balls) kept his side in the game, but when he fell to Tinashe Panyangara off the first ball of the final over, Zimbabwe were able to close out the win.
The second and final Twenty20 international will be played at the same venue on Sunday.