Elias Lindholm and Dillon Dube scored, and Jonathan Huberdeau had two assists for the Flames (12-10-3), who have won two in a row and three of their past four. Dan Vladar made 18 saves for his third straight win.
"If we want to take the next step and climb into a playoff spot, we've got to put a couple together. We can't just be around .500 all the time and lose one, win one, lose one, and go that way," Lindholm said. "We've got to put a couple together here and honestly, tonight wasn't our best performance but we got the two points and we'll be better next game."
Jakob Chychrun and Shayne Gostisbehere each had a goal and an assist, and Karel Vejmelka made 24 saves for the Coyotes (7-12-4), who have lost five in a row and are 4-6-3 on a 14-game road trip which concludes Wednesday against the Edmonton Oilers.
"It's frustrating," Arizona forward Nick Bjugstad said. "Obviously, we gave a good push. We thought we played pretty well. That seems to be a bit of a trend with us lately where we're hanging in some close games. We've got to find ways to win these tight games. It's frustrating, but we've got to stay optimistic and know what we do well and continue to learn from our mistakes."
Vladar made a right-pad save on Christian Fischer's one-timer from the slot with 1:14 remaining to preserve the win.
"'Vladdy's' been great," Kadri said. "He's always made that timely save and sometimes that's what it's about."