The German side went top of the group, ending a long unbeaten streak for the visitors in the process.
Zenit's long unbeaten run came to an end as Bayer Leverkusen won 2-0 to move to the summit of UEFA Champions League Group C.
Giulio Donati put the German side ahead just after halftime at the BayArena on Wednesday before Kyriakos Papadopoulos doubled the advantage with his first touch five minutes later.
Bayer's efforts were enough to ensure Zenit tasted defeat for the first time in 17 games, with the Germans moving top of the pool thanks to Monaco's goal-less stalemate with Benfica.
Zenit held first place at the start of the night having begun its campaign with a 2-0 win at Benfica and 0-0 draw with Monaco. Yet the Russian side did not show the same quality against a Leverkusen side which got its campaign back on track with a 3-1 win over Benfica on matchday two.
The hosts made one switch from the XI that beat Benfica: Donati replaced Roberto Hilbert at right back, a decision from Roger Schmidt which proved inspired. Zenit's sole alteration saw Axel Witsel come back into the starting lineup in place of Oleg Shatov.
The visitors enjoyed the better start, although the Bundesliga side created the first chance when Emir Spahic's glancing header flew just wide. But that proved a rare early opening, as the sides largely canceled each other out.
Indeed, the only drama in the initial stages was provided by referee Bjorn Kuipers, who showed several questionable yellow cards - with Hulk, Viktor Fayzulin and Javi Garcia all cautioned for Zenit in a nine-minute spell.
Leverkusen took a 58th-minute lead when Donati rifled a strike into the bottom corner from 20 yards.
And the Germans doubled their advantage almost immediately as Papadopoulos rose highest to nod Calhanoglu's superb curling free kick beyond a helpless Yuri Lodigin.
The chances of a twist in the tale seemed greater when Wendell picked up his second yellow card for hand ball, leaving the home side with 10 men.
But, if anything, the hosts kept pressing in the final stages and could have scored again with Donati seeing two strong shouts for a penalty waved away.
It mattered little, however, as Leverkusen cruised through to maintain its unbeaten start at home under Schmidt.