Sean Goss scored a second-half equaliser to earn League One Shrewsbury an FA Cup third-round replay following a deserved 1-1 draw at Championship side Bristol City.
The hosts took the lead against the run of play on the half hour when Niclas Eliasson's far-post cross from the left was headed back across goal and into the net by Famara Diedhiou.
But impressive Shrewsbury were back in it three minutes after the interval, Goss guiding a perfectly-placed shot from the edge of the box past goalkeeper Niki Maenpaa after a Diedhiou clearance had fallen into his path.
Out-of-sorts City were fortunate to earn a second chance after an error-ridden display against inspired opponents.
Lee Johnson made six changes to the team hammered 4-0 at home by Brentford on New Year's Day and handed young centre-back Taylor Moore the captain's armband.
Shrewsbury were sharper to the ball from the outset. Josh Laurent's shot brought an early save from Maenpaa, who also had to tip over a Ryan Giles cross.
Dan Udoh fired just wide from the edge of the box, with the visitors, backed by a large contingent of vociferous travelling fans, dominating and threatening an upset.
Marley Watkins went close with a couple of headers as City began to find some rhythm, but at other end Goss had a shot blocked following a corner.
Shrewsbury played the better football for half an hour, but Diedhiou's goal sent some confidence through his team and Kasey Palmer twice went close to doubling their advantage after 41 minutes.
First the midfielder saw a sweetly-struck volley parried by the diving Joe Murphy and from the resulting corner the Shrews goalkeeper did even better to keep out Palmer's close-range header.
When the visitors began the second period as they had done the first, Goss applied the finishing touch to equalise.
Seconds earlier a Giles cross had flashed across goal with Udoh just failing to get on the end of it, and it was the Shrews fans making all the noise.
Johnson responded on the hour, sending on Callum O'Dowda and Andreas Weimann for Jay Dasilva and Watkins. Weimann almost made an immediate impact, forcing another good save from Murphy.
Still the Shrews looked dangerous. Laurent hit a post with an audacious chip from the corner of the box and Aaron Pierre fired over.
A mistake by Adam Nagy saw substitute Shaun Whalley put through on goal only for Tomas Kalas to make a saving tackle. Moments later the centre-back hobbled off to be replaced by Nathan Baker.
Weimann shot wide in the closing stages but Shrewsbury ended up on top, as they had been for most of the game.