Fulham striker Aleksandar Mitrovic scored a dramatic late winner as Serbia booked their place at next year’s World Cup and condemned Portugal to the play-offs.
Hosts Portugal only needed a draw to qualify and looked to have done enough, with Renato Sanches’ opener cancelled out by Dusan Tadic’s equaliser.
Mitrovic, who started the game on the bench, was sent on at half-time but Portugal were wise to his threat and kept him largely quiet.
However, the home side let their concentration slip in the final seconds and Mitrovic pulled away from his marker to meet Tadic’s deep ball and send a downward header into the back of the net.
The goal prompted wild celebrations on the bench and on the pitch from the Serbia players and staff while the Portuguese team stood in disbelief with the home crowd silenced.
Serbia finish top of Group A with 20 points, three more than Portugal, whose hopes of playing in Qatar next year rest on two rounds of play-offs in March.
The defeat also ended Portugal’s unbroken winning run in home World Cup qualifiers which had stretched back to October 2013.
It had looked like being a long night for the visitors after they fell behind inside just two minutes when Sanches finished confidently after Bernardo Silva had won possession.
But Serbia did not let their heads drop and deservedly equalised when Rui Patricio failed to keep out Tadic’s shot, which crept over the line.
Cristiano Ronaldo, himself familiar with scoring late goals with Manchester United this season, was quiet and came closest with a free-kick in the first half.
Instead it was Mitrovic who provided the drama in the closing stages as his header secured a famous win for Serbia.
20Cancelo6José Fonte4Rúben Dias5Tavares Mendes
16Renato Sanches13Danilo8João Moutinho
10Bernardo Silva7Cristiano Ronaldo21Jota
Match ends, Portugal 1, Serbia 2.
Second Half ends, Portugal 1, Serbia 2.
Corner, Serbia. Conceded by Bruno Fernandes.
Attempt missed. Cristiano Ronaldo (Portugal) left footed shot from outside the box is too high. Assisted by João Cancelo.
Substitution, Portugal. André Silva replaces Danilo Pereira.
Aleksandar Mitrovic (Serbia) is shown the yellow card for excessive celebration.
Goal! Portugal 1, Serbia 2. Aleksandar Mitrovic (Serbia) header from the centre of the box to the top left corner. Assisted by Dusan Tadic with a cross following a corner.
Corner, Serbia. Conceded by Danilo Pereira.
Attempt saved. João Palhinha (Portugal) header from the right side of the box is saved in the top centre of the goal. Assisted by Bruno Fernandes with a cross.
Substitution, Serbia. Luka Jovic replaces Filip Kostic.
Corner, Portugal. Conceded by Uros Spajic.
Substitution, Portugal. Rúben Neves replaces Renato Sanches.
Substitution, Portugal. João Félix replaces Diogo Jota.
Attempt missed. Aleksandar Mitrovic (Serbia) header from the centre of the box misses to the right. Assisted by Filip Kostic with a cross.
Corner, Serbia. Conceded by João Palhinha.
Dusan Vlahovic (Serbia) wins a free kick on the left wing.
Foul by João Cancelo (Portugal).
Corner, Serbia. Conceded by Nuno Mendes.
Foul by Sergej Milinkovic-Savic (Serbia).
Renato Sanches (Portugal) wins a free kick in the attacking half.