Tries from wing Ryan Conbeer and scrum-half Dane Blacker gave the hosts a 15-6 half-time lead.
Zebre battled back through a try from Pierre Bruno and Antonio Rizzi’s boot to take the Italians within sight of a late win.
Scarlets fly-half Angus O’Brien stepped up to kick the winning 77th minute penalty.
It was a second Scarlets win in five league games, but the squad will know they will need to improve their performances dramatically if they are to even think about competing with the Pro14’s top teams.
This dire display was a far cry from 12 months ago when Scarlets powered to a 54-10 win over Zebre. The shapeless Scarlets attack will be the main concern although boss Glenn Delaney will be happy they managed to grind out this ugly win.
There will not be many more positives to take from this sorry spectacle although victory was managed with so many young players involved with internationals away with Wales.
Wales prop Rob Evans made his first Pro14 start of the season having made replacement appearances after recovering from neck surgery.
He came in for Phil Price at loose-head in one of three changes to the team narrowly beaten by Edinburgh.
Jac Price came in for suspended second-row Josh Helps, while Conbeer replaced Tyler Morgan.
Conbeer opened the scoring following a well-worked backline move, with Johnny McNicholl giving the scoring pass before Rizzi and O’Brien exchanged penalties.
Flanker Jac Morgan appeared to have produced an inspirational individual score, but his 25-metre effort was ruled out by the television match official because of a forward pas from Javan Sebastian.
Scarlets eventually celebrated their second try when scrum-half Blacker latched on to a clever kick from centre Paul Asquith to score with O’Brien converting.
Rizzi reduced the half-time deficit to 15-6 with his second penalty. Scarlets second-row Price was forced off the field early in the second-half after being injured giving away a penalty which Rizzi slotted over.
O’Brien and Rizzi both missed efforts during a messy period punctuated by mistakes on both sides.
Zebre came within a point when McNicholl’s pass was intercepted by wing Bruno for an unconverted opportunist try.
Scarlets seemed clueless in how to break down the Italian defence and had to rely on a rare breakout from Wales wing Steff Evans to relieve the pressure with Rizzi almost giving away a try with an outlandish offload behind his own posts.
Wales Under-20s fly-half Sam Costelow was introduced for his competitive debut in the final 10 minutes, while McNicholl running into his own man typified the hosts’ hapless second-half display.
Zebre took the lead for the first time in the 75th minute with a fourth Rizzi penalty before O’Brien’s match-winning intervention a couple of minutes later.
Scarlets: Johnny McNicholl; Ryan Conbeer, Steff Hughes (capt), Paul Asquith, Steff Evans; Angus O’Brien, Dane Blacker; Rob Evans, Taylor Davies, Javan Sebastian, Jac Price, Morgan Jones, Uzair Cassiem, Jac Morgan, Sione Kalamafoni.
Replacements: Dom Booth, Kemsley Mathias, Werner Kruger, Danny Drake, Ed Kennedy, Will Homer, Sam Costelow, Tyler Morgan.
Zebre: Junior Laloifi; Pierre Bruno, Giulio Bisegni (capt), Enrico Lucchin, Giovanni D’Onofrio; Antonio Rizzi, Joshua Renton; Paolo Buonfiglio, Marco Manfredi, Eduardo Bello, Leonard Krumov, Ian Nagle, Nardo Casolari, Antoine Koffi, Lorenzo Masselli.
Replacements: Oliviero Fabiani, Andrea Lovotti, Matteo Nocera, Gabriele Venditti, Massimo Ceciliani, Nicolo Casilio, Paolo Pescetto, Michelangelo Biondelli.