Oxford clinched the final League One play-off place and can look forward to facing Peterborough after a 2-1 win at Exeter.
The U’s knew they had to rely on results elsewhere and Lincoln’s home defeat to Portsmouth and Barnsley’s draw with Northampton opened the door for them to finish in fifth place, which they did.
Oxford went in front in the 13th minute after a horrendous error by Pierce Sweeney, who gave the ball straight to Mark Harris and he ran in on goal before slotting past Vili Sinisalo.
The Finnish goalkeeper then made an outstanding reactive save to keep out Ciaron Brown’s point-blank header before more awful defending – this time from Will Aimson – led to an Oxford penalty after 40 minutes as the Exeter defender tripped Josh Murphy in the penalty box.
Cameron Brannagan drilled the ball to Sinisalo’s right to double Oxford’s lead.
Exeter were far better after the break and pulled one back in the 52nd minute when Millenic Alli headed in from a Tom Carroll corner before Ilmari Niskanen missed a great chance to equalise when he scuffed a shot wide from 10 yards.
Alli’s deflected cross then struck the post and Aimson headed over, but Exeter could not find the equaliser they deserved on the balance of play.
League One play-off schedule
All games will be LIVE on Sky Sports Football...
Semi-final first legs
Barnsley vs Bolton (7.30pm) – Friday May 3
Oxford vs Peterborough – (7.45pm) – Saturday May 4
Semi-final second legs
Bolton vs Barnsley (8pm) – Tuesday May 7
Peterborough vs Oxford (8pm) – Wednesday May 8
Final
Saturday May 18 (5.30pm)