Coulthirst was born in Hackney, London. He came from the youth academy of Tottenham Hotspur and in June 2013, Coulthirst signed his first professional contract with the club. Coulthirst made his first-team debut for Tottenham Hotspur on 13 December 2013 in the UEFA Europa Leaguegroup stage against Anzhi Makhachkala. He replaced Roberto Soldado after 78 minutes in a 4–1 home win.
Loan Spells
On 3 January 2014, Coulthirst signed for League One team Leyton Orient on a one-month loan deal. On 11 January he scored his first senior goal on his home debut for the club in a 4–0 win over Carlisle United. He returned to Tottenham on 4 February 2014, after making two appearances and scoring one goal during his time at the Matchroom Stadium. On 28 March 2014, Coulthirst joined League Two club Torquay United on loan until the end of the 2013–14 season. The next day, Coulthirst made his debut for Torquay United, coming on as a substitute for Jayden Stockley in the 60th minutes, in a 1–0 loss against Southend United. Then on 12 April 2014, Coulthirst scored his first goal and assisted the goal for Torquay United, in a 2–1 win over Bristol Rovers. As a result of his performance, Coulthirst was named Football League Team of the Week. Coulthirst later scored his second goal for the club on 26 April 2014, in a 3–1 win over Mansfield Town, in hope of survival relegation. However, Coulthirst suffered an ankle injury, which caused him to miss the last match of the season and returned to his parent club after making six appearances and scoring twice during his time at Plainmoor. As a result of his absence, Torquay United eventually lose 3–0 to Wycombe Wanderers, confirming Torquay United's relegation from the Football League. Coulthirst joined League Two club Southend United on loan until the end of 2014–15. Five days later, Coulthirst made his Southend United debut, making his first start for them, in the opening match of the season, in a 1–0 win over Accrington Stanley Coulthirst scored his first goal for Southend United, just three minutes after coming on as a substitute, in a 2–0 win over Portsmouth. Coulthirst later score three more goals to his tally against Shrewsbury Town, Northampton Town and York City. However, just two months left until the season end, Coulthirst was recalled by Tottenham Hotspur. After his loan spell with Southend United came to an end, Coulthirst quoted: "The loan was the best experience of career so far." Coulthirst joined League Two club York City on loan until the end of 2014–15 on 13 March 2015. The next day, Coulthirst made his York City debut, coming on as a substitute for Jake Hyde in the second half, in a 0–0 draw against Carlisle United. Weeks later on 28 March 2015, Coulthirst then scored his first goals, in a 4–1 win over Mansfield Town. After the match, manager Russ Wilcox praised Coulthirst's performance, as well as his commitment into joining York City. He finished the loan with 11 appearances and two goals. On 14 August 2015, Coulthirst joined League One club Wigan Athletic on loan until 1 November 2015.
On 22 January 2016, Coulthirst signed for League One club Peterborough United on a three-and-a-half-year contract for an undisclosed fee. On 19 January 2017, Coulthirst joined League Two club Mansfield Town on loan until the end of 2016–17, with a view to a permanent transfer.
Barnet
On 26 July 2017, Coulthirst signed for National League club Barnet on an undisclosed-length contract, after being allowed to leave Peterborough by mutual consent. He scored his first goal for Barnet in a 3–1 EFL Cup win against former club Peterborough United on 8 August 2017. He scored his first senior hat-trick in a 4–1 win over. Swindon Town on 2 September 2017. He scored a winning penalty goal in the FA Cup against Sheffield United to send the National League side into the 4th round for the first time in 11 years, and also scored twice against Brentford in the following round. Coulthirst left the Bees at the end of the 2019-20 season, having scored 33 goals in 94 games.
International career
Coulthirst made his debut for the England national under-19 team as 62nd-minute substitute for Max Clayton in a 1–1 draw with Belgium on 26 May 2013. He earned his second and final cap at this level three days later in a 3–0 win over Scotland, opening the scoring in the 17th minute before being substituted for Callum Harriott in the 75th minute.