Cates’ shot from below the goal line banked off the skate of Anaheim defenseman Jackson LaCombe and into the net.
The play was reviewed for a possible offside, but the goal was upheld after a review.
Luke Glendening and Owen Tippett scored and Dan Vladar made 34 saves for the Flyers (32-23-12), who extended their point streak to four games (3-0-1).
Cutter Gauthier had a goal and an assist, Leo Carlsson scored and Lukas Dostal made 24 saves for the Ducks (37-27-4), who have lost three of four.
The Ducks pulled Dostal for the extra skater with about three minutes left and Carlsson scored on a rebound off a shot from Gauthier to tie it 2-2 at 18:06.
Glendening scored his first goal in 78 games to give the Flyers a 1-0 lead at 2:51 of the first period.
Garnet Hathaway won a battle for the puck against John Carlson in the corner of the Anaheim zone and slid it to Cam York, who passed to Glendening in front of the crease, where he chipped the puck high into the net.
The Ducks couldn't take advantage of two power plays in the first six minutes of the second period before the Flyers extended their lead to 2-0 at 7:53.
Travis Sanheim took a one-timer from the left point that hit the skate of Anaheim defenseman Olen Zellweger at the left hash marks. The puck was redirected to Tippett in front of the crease and he spun and scored.
Both teams had just finished skating 4-on-4 when Gauthier scored on the ensuing Anaheim power play to cut it to 2-1 with 38 seconds left in the second period.
Pavel Mintyukov checked Rasmus Ristolainen off the puck in a corner of the Anaheim zone and then passed it to Gauthier, who brought the puck to the front of the crease before scoring with a backhand for his Ducks-leading 35th goal of the season.