Simon Grayson's Bantams were left to rue what might have been after falling to defeat against Southend United in their penultimate home fixture of the campaign.
After going close on more than one occasion with the game still goalless, City then conceded two second half goals in the final quarter of the match to condemn them to defeat.
Dominic Poleon - a first half substitute for the injured Kai Bruenker - was denied in two goal-mouth scrambles either side of the break before Southend opened the scoring.
The Shrimpers broke the deadlock thirteen minutes from the end when skipper John White guided a header into the corner from a testing Stephen McLaughlin cross.
With City pushing for a leveller, Southend then doubled their advantage on the break just five minutes later.
After a surging run forward, Dru Yearwood fed the ball out to Marc-Antoine Fortune, who saw his side-footed effort from inside the box deflect up off Nathaniel Knight-Percival and loop into the net over the helpless Colin Doyle.
After Tuesday's home victory over Milton Keynes Dons, Grayson unsurprisingly kept with the same starting XI for the visit of Southend to the Northern Commercials Stadium.
Grayson was sadly forced into a change soon enough, however, when Bruenker went down in agony after appearing to twist his ankle when landing after a header.
Bruenker had to be stretchered off after receiving treatment on the pitch, with Poleon coming on as his replacement.
The loss of the German striker initially didn't seem to effect the Bantams, who went close minutes later when Callum Guy had an effort from outside the box tipped around the post.
Southend did have their moments in the first period - Fortune firing dangerously across goal ten minutes before the break - but City looked the more likely scorers as the game moved nearer to the interval.
Quick thinking from Tony McMahon at a free-kick a minute before the end of regulation time in the opening period saw him play Alex Gilliead into space inside the box.
Gilliead picked out Poleon in the middle but the striker's flick for goal from only yards out was scrambled away.
There was still time in the period for Gilliead to set up Poleon again but the unmarked striker headed over in the fourth minute of first half injury time.
Two minutes after the break and City were threatening again.
McMahon's low corner delivery out to Matthew Lund gave the midfielder the chance to shoot for goal from the edge of the box.
Nathaniel Knight-Percival managed to get his head onto Lund's shot forwards but the defender's effort dropped just past Oxley's near post.
Another set-piece roughly ten minutes would see Grayson's men go even closer.
From McMahon's wide free-kick delivery into the box, Timothee Dieng saw a goal-bound header well saved by Oxley.
City still looked set to score as the ball ran loose deep inside the Southend box, but Oxley somehow got across to crawl a strike from Poleon off the line.
Southend tried to respond with chances of their own but White saw an effort from a McLaughlin corner blocked behind by Knight-Percival.
An unmarked Sam Mantom then hooked wide from McLaughlin's follow-up set-piece delivery to the near post.
With the game still in the balance going into the final twenty minutes, Alex Gilliead - who was constant threat to Southend on City's right flank - did brilliantly to get away from Elvis Bwomono and Mantom to engineer himself enough space for a cross.
Gilliead's ball into the six yard box was a testing one, but it was unfortunately just out of the reach of Matthew Lund in the middle.
At the other end, Colin Doyle's first meaningful save of the match came soon after.
Fortune set up Mantom via a pass from the right towards the edge of the box but the midfielder's low drive was tipped around the post by Doyle.
Southend were able to keep the pressure on from the resulting corner, though, leading to City conceding the opening goal.
With White still up from the set-piece, McLaughlin curled the ball back into the box and the defender headed home.
Grayson tried to force a change in City's fortunes by bringing on Nicky Law for Poleon just after Southend's goal celebrations had died down.
Before City could truly muster up a response, however, Southend hit them on the break to claim a killer second goal.
Yearwood burst forward on the counter-attack, eventually feeding the ball to Fortune inside the box.
Knight-Percival came across to make the block but Fortune's strike looped up off the defender's leg and over Doyle on its way into the goal.
The Bantams kept going until the end but Guy and Charlie Wyke couldn't find the target with chances.
Simon Cox fired over with a strike in injury time, but the final opening of the game fell to the Bantams when sub Shay McCartan headed at Oxley following Knight-Percival's cross from the left.