Jimmy Howard made 23 saves for the Red Wings (8-10-1), who have lost four straight.
"Obviously when we aren't scoring goals in bunches, I can't give up three," Howard said. "I've got to go out there and make saves for the guys, and they got three past me tonight. That's tough."
WATCH: All Flames vs. Red Wings highlights
Detroit's problem, though, is on the other end of the ice; the Red Wings have scored 19 goals in the past 11 games, going 2-8-1 over that stretch.
"We better pick ourselves up and come to work on Monday to get better," Red Wings coach Jeff Blashill said. "We have to pick ourselves up in a hurry and focus on winning a hockey game on Wednesday."
Detroit took a 1-0 lead 8:06 into the game on Tomas Tatar's third goal of the season. Tatar was hit by Justin Abdelkader's shot between the faceoff circles, but he gathered the loose puck and slid a shot past Johnson.
But Hamilton set up the next two goals with slap shots from the point.
Calgary tied it at 3:40 of the second on Garnet Hathaway's first NHL goal when he deflected Hamilton's shot past Howard.
"I saw the puck going back to Dougie, so I just headed to the net," Hathaway said. "It was an amazing feeling to score my first goal, but I'll probably tell people that I sniped it instead of a tip from a couple feet."