Fly-half Rhys Priestland kicked six penalties as Bath finally managed to held on to a lead to topple second-placed Saracens 18-9 in the Gallagher Premiership.
The champions were missing their England contingent, but it was their indiscipline that let them down on a wet night at the Recreation Ground, as well as a patchy goal-kicking display by Alex Lozowski.
The result resurrected Bath's hopes of a top-six finish after last-minute defeats in their last two games.
Priestland opened the scoring after five minutes after a Zach Mercer offload to Elliott Stooke got Bath behind the visitors' defence and Saracens gave away a penalty under their posts.
Lozowski hooked a fairly straightforward kick at the other end soon after, but quickly made amends with an 11th-minute strike from 40 metres.
In steady rain, there were many more rucks than line-breaks and Saracens began to build pressure ominously with their driving play until Nathan Catt ripped the ball free on his own 22. The Bath loosehead was as busy as anyone in defence, helping to hold the Saracens runners on the gain-line.
When presented with a kickable penalty at the other end, Priestland opted for a kick to touch. Stooke's take was clean enough and the visitors infringed again at the breakdown. Priestland made the score 6-3 from close range.
With full-back Tom Homer, solid under the high ball despite the conditions, Bath began to play more expansively, although Priestland hit the post with another penalty attempt on the half-hour.
Surprisingly, it was the visitors' handling skills that were suspect. Will Skelton spilled the ball in a tackle just inside the Bath 22 and Alex Goode dropped a simple pass from his scrum-half Ben Spencer.
Bath began to get the upper hand in the scrum and Priestland kicked a third penalty to earn a 9-3 half-time lead.
However, the Saracens front row turned the tables immediately after the break, earning a penalty that Lozowski landed from 30 metres.
Presented with another straightforward kick, Lozowski hooked it wide, but Priestland's 22 drop-out was charged down by Skelton. Bath won the scrum, but Lozowski brought the scores level.
As the rain cleared away, Bath struggled at first to match the visitors' intensity, but clawed their way back upfield on the back of their opponents' indiscipline. Finally, replacement back row Ben Earl was sent to the bin just after the hour and Priestland booted Bath back in front.
But their discipline began to fray too, and a needless block off the ball by replacement hooker Ross Batty saw the home side reduced to 14 men for the last 10 minutes.
Lozowski was wide again with the kick, but Priestland made no mistake when presented with a difficult chance at the other end to put Bath 15-9 ahead after 75 minutes. The Welsh fly-half put the result beyond doubt with his sixth penalty two minutes from time.