Stuttgart were still looking for their first win after coming from two goals behind to draw 2-2 at Werder Bremen while Borussia Moenchengladbach drew 1-1 at Bayer Leverkusen in the day's other game.
Bremen's Assani Lukimya came on as an 89th minute substitute and contrived to get sent off less than two minutes later for a foul on Georg Niedermeier.
Stuttgart's Martin Harnik was also dismissed for a second yellow card.
Hoffenheim conceded 11 goals in losing their first three games and appeared to be on course for another unhappy afternoon when Matthieu Delpierre, under no real pressure, stooped to head Konstantin Rausch's low cross into his own goal at the near post in the 26th minute.
However, one minute later Fabian Johnson got away down the left and neatly clipped the ball past goalkeeper Ron-Robert Zieler to level the score and give the hosts a much-needed morale boost.
Hoffenheim kept pressing forward but left it late before scoring twice in the last 10 minutes, both set up by 20-year-old Kevin Volland who came on as a substitute in the 81st minute.
Volland provided a cross from near the corner flag which was headed in by Bosnia forward Sejad Salivhovic in the 82nd minute, then led a counter-attack in stoppage time and laid the ball off for Daniel Williams to make the game safe.
Bremen appeared to be coasting to victory when Belgian forward Kevin de Bruyne and Austria midfielder Zlatko Junuzovic gave them a 2-0 halftime lead.
Junuzovic's compatriot Harnik pulled one back five minutes after the re-start and Stuttgart grabbed only their second point in four games when Cacau diverted Niedermeier's shot into the net with nine minutes remaining.
In the other game, Patrick Hermann gave Gladbach an early lead, converting Juan Arango's 40-metre pass, but Michael Kadlec levelled after 12 minutes for Leverkusen. Andre Schuerrle missed a 70th minute penalty for Leverkusen, striking his effort against the post.