Jadon Sancho and Erling Haaland scored late goals to give Borussia Dortmund a much-needed win in their Champions League group.
Dortmund were beaten 3-1 by Lazio last week and were poor for large parts of the game against a diligent Zenit side led brilliantly by former Liverpool defender Dejan Lovren.
But Sancho, 20, kept his cool to convert after Thorgan Hazard was fouled at the far post.
And Haaland then ran on to make it two.
Lazio drew 1-1 with Club Bruges to leave Group F tight after two games.
Lovren, who would surely be playing for Liverpool had he stayed in the absence of Virgil van Dijk and Joel Matip, made eight clearances and four interceptions in a fine display at centre-half for the visitors.
But his good work was undone when Vyacheslav Karavaev needlessly grabbed Hazard around the neck and Sancho scored the penalty.
Haaland, 20, then ran on to substitute Jude Bellingham’s pass to score his 12th goal in just 10 Champions League appearances.
- 8DahoudSubstituted forT Hazardat 67′minutes
- 7SanchoSubstituted forDelaneyat 84′minutes
- 11ReusSubstituted forBrandtat 74′minutes
- 32ReynaSubstituted forBellinghamat 84′minutes
- 10T Hazard
Zenit St Petersburg
- 15KaravaevBooked at 77mins
- 3dos Santos Justino de Melo
- 5BarriosSubstituted forSutorminat 81′minutes
- 14KuzyaevBooked at 26minsSubstituted forOzdoevat 71′minutes
- 20Valle da Silva
- 11DriussiSubstituted forZhirkovat 74′minutes
- 22DzyubaSubstituted forMostovoyat 45′minutes
Match ends, Borussia Dortmund 2, Zenit St Petersburg 0.
Second Half ends, Borussia Dortmund 2, Zenit St Petersburg 0.
Julian Brandt (Borussia Dortmund) wins a free kick in the defensive half.
Foul by Aleksey Sutormin (Zenit St Petersburg).
Goal! Borussia Dortmund 2, Zenit St Petersburg 0. Erling Haaland (Borussia Dortmund) left footed shot from the centre of the box to the centre of the goal. Assisted by Jude Bellingham with a headed pass.
Attempt missed. Erling Haaland (Borussia Dortmund) left footed shot from outside the box is high and wide to the left. Assisted by Jude Bellingham.
Substitution, Borussia Dortmund. Jude Bellingham replaces Giovanni Reyna.
Substitution, Borussia Dortmund. Thomas Delaney replaces Jadon Sancho.
Attempt missed. Yaroslav Rakitskiy (Zenit St Petersburg) left footed shot from more than 35 yards misses to the right. Assisted by Magomed Ozdoev.
Foul by Thorgan Hazard (Borussia Dortmund).
Wendel (Zenit St Petersburg) wins a free kick in the defensive half.
Substitution, Zenit St Petersburg. Aleksey Sutormin replaces Wilmar Barrios.
Corner, Borussia Dortmund. Conceded by Dejan Lovren.
Goal! Borussia Dortmund 1, Zenit St Petersburg 0. Jadon Sancho (Borussia Dortmund) converts the penalty with a right footed shot to the bottom right corner.
Vyacheslav Karavaev (Zenit St Petersburg) is shown the yellow card for a bad foul.
Penalty Borussia Dortmund. Thorgan Hazard draws a foul in the penalty area.
Penalty conceded by Vyacheslav Karavaev (Zenit St Petersburg) after a foul in the penalty area.
Axel Witsel (Borussia Dortmund) wins a free kick in the defensive half.
Foul by Aleksandr Erokhin (Zenit St Petersburg).
Corner, Zenit St Petersburg. Conceded by Mats Hummels.