The result left Sporting third on three points from as many games while Besiktas remained bottom with none. Ajax Amsterdam were at home to Borussia Dortmund in the late fixture with both teams on a maximum six points from two matches.
Coates headed the visitors into a 15th-minute lead and, after Canadian Cyle Larin equalised in the 24th, the former Liverpool defender restored Sporting's advantage with another superb header three minutes later.
Pablo Sarabia scored Sporting's third with a 44th-minute penalty, netting his first goal for the Portuguese champions since last month's loan move from Paris St Germain.
Besiktas were undone twice in quick succession by VAR checks, showing Domagoj Vida handled a Coates header for the penalty and then scrapping a spectacular Alex Texeira effort for fractional offside on the stroke of halftime.
Sporting continued to dominate after the break through swift counter-attacking as their striker Paulinho twice hit the woodowork before he curled home a delightful shot from 20 metres in the 89th minute to put the icing on the cake.