Juventus only needed a point and seemed all but certain of that when teenager Moise Kean gave it the lead in the first half, but Kevin Bonifazi and Sergio Floccari scored after the break to keep the champagne on ice.
It was a first top-flight win over Juventus for Spal which has gone through bankruptcy and been refounded twice — in 2005 and 2012. "We wanted to close it today," Juventus coach Massimiliano Allegri said. "The boys' performance was good and the young players competed with such authority ... Everyone did well, we're only sorry for the defeat, but we paid for inexperience."
Juventus remains 20 points above second-placed Napoli, which visits last-placed Chievo Verona on Sunday. Anything but a win for Napoli would hand Juventus the title. There will then be six matches remaining and Juventus has the better head-to-head record, which is the tiebreaker in Italy.
With the second leg of the Champions League quarterfinal against Ajax on Tuesday — after a 1-1 away draw in the first leg — Allegri rested a number of players, including Cristiano Ronaldo. He also handed defender Paolo Gozzi, 17, his Serie A debut.
"If we had put all our starters in, it would have been easier to win it," Allegri said. "But there is the goal to obtain on Tuesday." All appeared to be going to plan on Saturday when Kean stuck out a boot to divert Joao Cancelo's shot into the opposite side of the net and past Spal goalkeeper Emiliano Viviano in the 30th minute.
Bonifazi headed in a corner at the near post four minutes into the second half, and that would still have been enough for Juventus to clinch the title, but Floccari scored the winner in the 74th off Alessandro Murgia's cross.
Spal moved into 13th, seven points clear of the relegation zone. TIGHT FIGHT The title chase might be all but over but the race for Champions League places continues to get tighter. AC Milan consolidated fourth place with a 1-0 win over Lazio.
The result saw Milan move back a point above fifth-placed Roma, which had earlier beaten Udinese 1-0. There were several chances in an entertaining match at San Siro and Ciro Immobile hit the post in the first half for Lazio.
But Franck Kessie converted a penalty 11 minutes from time after Mateo Musacchio had been barged over by Lazio defender Riza Durmisi. That came moments after Milan had a penalty awarded — and then revoked — when referee Gianluca Rocchi reviewed the incident on the pitchside monitor and decided that Francesco Acerbi's handball was involuntary.
A brawl between both sets of players broke out at the end of the game, with several members of the bench also joining in. Lazio felt it should have had a penalty of its own late on and sporting director Igli Tare claimed the decisions were influenced by discussions which arose after disputed refereeing decisions in Milan's defeat at Juventus last week.
"What happened was what we feared, and what we expected," Tare said. "We're disappointed to lose a match in which we really played well." It was Lazio's third league match without a win and left the capital club six points behind Milan, although it has played a match less.
Tare was the only representative from Lazio to speak after the match. "(Coach) Simone Inzaghi is also very upset, we hoped the match would be decided on the pitch, and not by certain incidents," Tare added. "There is a lot of tension ... We decided to not make the coach and players speak to calm things down.
"We still believe in the Champions League, until it's mathematically impossible for us we'll believe we can do it right until the end." Atalanta can move level on points with Milan with a win over Empoli on Monday.
Roma had briefly occupied fourth spot after Edin Dzeko scored his first goal at home in a year, following a fine flick from Stephan El Shaarawy. Dzeko's previous seven goals this season had come away from the Stadio Olimpico.
Roma has a crucial match next week as it travels to third-placed Inter Milan. Udinese remained four points above the bottom three.
More AP soccer: https://apnews.com/apf-Soccer and https://twitter.com/AP_Sports