Massimiliano Allegri’s side had needed just a point to claim their eighth Scudetto in a row with a record six games to spare, and they looked on track to seal the title when young gun Moise Kean stuck his foot out to direct a Joao Cancelo effort home after half an hour in Ferrara.
However Kevin Bonifazi and Sergio Floccari responded with two precious second-half goals which moved lowly SPAL seven points clear of the relegation zone.
“Making records is very difficult, it takes energy and there is also Europe to concentrate on,” said Allegri, who rested key players including Cristiano Ronaldo ahead of Tuesday’s Champions League quarter-final decider against Ajax in Turin.
“If we had put all our regulars in it would have been easier to win it, but there is also the goal to obtain on Tuesday.”
Juventus have a 20-point advantage on second-placed Napoli and can still seal the title in record time on Sunday if Carlo Ancelotti’s side fail to win at bottom club Chievo.
Ronaldo was rested for the second time this season and the club fell to just their second defeat of the campaign.
The five-time Ballon d’Or winner returned from a thigh injury during the week to score an away goal in the first leg of their tie with against Ajax, which ended 1-1 on Wednesday.
Defender Leonardo Bonucci was also rested along with Blaise Matuidi, Alex Sandro, Mario Mandzukic and Miralem Pjanic, with forward Federico Bernardeschi coming off the bench late in the game.
Mattia Perin replaced Wojciech Szczesny in the Juventus goal with Kean getting his second start alongside Paulo Dybala up front.
Seventeen-year-old defender Paolo Gozzi and midfielder Grigoris Kastanos, 21, were given their first starts.
“We paid a little for our inexperience,” said Allegri. “We played with a lot of youngsters. I regret this defeat because I think the match deserved more a draw than a loss.”
Kean broke the deadlock when he redirected a tame Cancelo drive, thrusting out his right boot to turn the ball beyond Emiliano Viviano.
The Italy international became the youngest player to score in four consecutive Serie A matches, having scored six in as many games, and played in just eight this season.
But Bonifazi pulled SPAL level three minutes after the break when he connected with a corner to head past Perin.
Floccari fired in the winner on 74 minutes, prompting Allegri to send on Bernardeschi to try and salvage a point.
But SPAL held on to move up to 13th after a fine run of recent form that has seen them win four of their last five and beat Champions League-chasing Lazio and Roma and now runaway leaders Juve.
It was just the second time that SPAL have beaten Juventus, with the last time back in 1957.
– Roma ‘miracle’ –
The battle for Europe remains tight with Kessie’s penalty after 79 minutes ending Milan’s four-match winless run as they moved back into fourth.
Claudio Ranieri’s Roma had temporarily moved into the Champions League places with Edin Dzeko scoring the only goal against Udinese.
But Milan are now one point clear of Roma with Lazio dropping to eighth, six points off the elite European places, but with a game in hand.
In heavy rain in Rome, Dzeko scored his first home league goal in nearly a year.
The Bosnian connected with a Stephan El Shaarawy cross to finish off from close range.
“For the season we’ve had it’s already a miracle that we’re here,” said Dzeko of their Champions League challenge. “Now that we’re there, we have to play every game the way we did in this second half (Saturday).”
Champions League contenders Torino and Atalanta host Cagliari and Empoli on Sunday and Monday respectively.
Download our app and read this and other great stories on the move. Available for Android and iOS.