The Bantams led inside three minutes thanks to Tyler Smith’s penalty but it was cancelled out by Will Boyle’s second half header to take the tie to penalties.
Dan Oyegoke’s effort was saved by Mark Howard, but Luke Young’s miss and James Jones’s penalty was stopped by Harry Lewis to send the Bantams through.
Bradford’s early spot kick followed Aaron Hayden bringing down Jamie Walker and Smith buried to give the Bantams the lead.
Smith forced Howard to deny Bradford’s second before 10 minutes, but Wrexham rallied as Jake Bickerstaff’s effort landed inches wide on the quarter-hour.
Lewis parried Ryan Barnett’s fiercely struck 39th-minute effort and Harry Lewis tipped Ben Tozer’s header over from the resulting corner.
Brad Halliday blocked Sam Dalby’s header on the line as Wrexham went close, before Bickerstaff’s low effort fizzed inches wide.
Halliday forced Howard into action early in the second half, and Walker’s good work dispossessing Jacob Mendy found Emmanuel Osadebe whose glorious effort curled over before the hour.
Halliday could have doubled Bradford’s lead with a one-on-one from Bobby Pointon’s through-ball but his effort trickled just wide.
And the Dragons drew level when Boyle rose highest to nod home Luke Young’s corner with fewer than 20 minutes left as penalties followed at full-time.
Wrexham: Howard, Hayden (O’Connell, 61), Tozer, Boyle, Barnett, Young, Cannon (Lee, 61), Jones, Mendy (McClean, 61), Dalby (Waters, 87), Bickerstaff (Palmer, 70). Unused substitutes: McNicholas, Forde, O’Connor, McAlinden.
Bradford City: Lewis, Halliday, Platt, Stubbs, Kelly, Ridehalgh, Smallwood, Osadebe (Oyegoke, 73), Pattison (Pointon, 46), Walker (Wilson, 83), Smith (Derbyshire, 73). Unused substitutes: Doyle, Hendrie, Odusina, Youmbi, Richards.
Referee: Benjamin Speedie (Merseyside)