Despite leading at half-time, Ulster conceded 21 second-half points and had to be content with a losing bonus point.
Zebre took an early lead through a Carlo Canna penalty, but Ulster responded with an Andrew Trimble try that John Cooney converted.
A second Canna strike narrowed the gap, but Ulster appeared to have a degree of breathing space by half-time as two Cooney penalties opened up a 13-6 advantage.
Zebre, though, began the second period in blistering fashion, with flanker Giovanni Licata claiming a try that Canna converted, then wing Mattia Bellini posted a touchdown converted by Marcello Violi.
Ulster had it all to do entering the final quarter, but although a Cooney penalty narrowed the gap, Zebre made the game safe when number eight Renato Giammarioli scored his team’s third try, with Violi again adding the extras.
The visitors had the final say through a Darren Cave try that he also converted.
Tries: Licata, Bellini, Giammarioli. Cons: Canna, Violi 2. Pens: Canna 2.
Minozzi, Bisegni, Boni, Castello, Bellini, Canna, Violi, Lovotti, Fabiani, Chistolini, Sisi, Biagi, Licata, Meyer, Giammarioli.
Venditti for Boni (64), Bordoli for Canna (75), Panico for Lovotti (41), Luus for Fabiani (68), Bello for Chistolini (63), Krumov for Sisi (49), Sarto for Giammarioli (74).
Tries: Trimble, Cave. Cons: Cooney, Cave. Pens: Cooney 3.
Piutau, Trimble, Cave, L. Marshall, Ludik, Lealiifano, Cooney, Black, Andrew, Ah You, Browne, Henderson, Rea, Reidy, Deysel.
Lyttle for Ludik (50), Shanahan for Cooney (64), Warwick for Black (50), McBurney for Andrew (78), Herbst for Ah You (50), Treadwell for Browne (28), Timoney for Deysel (55).