John made his Professional Debut for Millwall in September 2009.
He joined Staines Town on loan in 2010 for whom he scored six goals in his first six games, later gaining valuable experience on loan spells at Portsmouth, Torquay, Northampton, Cheltenham, Gillingham and Leyton Orient.
John spent seven years at Millwall, making 65 appearances. However, his time at The Den was beset with injury and consequently his opportunities limited.
John permanently Doncaster Rovers in 2016 and excelled at the Club, quickly establishing himself in the First Team. John netted 26 goals in 40 appearances, helping the side to promotion and winning the Sky Bet League Two Golden Boot for 2016/17. He was rewarded with a contract extension.
John’s efforts in the 2016/17 season were recognised as he was voted Club Player of the Season, Player’s Player, awarded Goal of the Season and was named in the EFL League Two PFA Team of the Year.
John continued to impress at the Club.In the 2018/19 campaign he scored 26 goals in 54 appearances and was named League One Player of the Month for September. In the same month he made his 100th appearance for the Club and scored his 50th goal for Doncaster. In total he made 153 appearances for the Club, scoring 66 goals and making 19 assists.
John joined League One side Portsmouth in Summer 2019.