Born in Kirkcaldy, Fife, Spence played for Cowdenbeath-based Blue BrazilBoys Club, before playing youth football with Heart of Midlothian and Rangers. In 2012, he joined Dunfermline Athletic, playing for their under-20 squad during the 2012–13 season. In the next season, Spence began to become involved with the Dunfermline first team. He appeared on the substitutes' bench on a number of occasions, before making his debut as an 89th-minute substitute for Ryan Williamson in a 0–4 defeat to Rangers at East End Park. His first starting appearance came in Scottish League One against Ayr United, with Spence playing 78 minutes of the 1–1 draw, before being replaced by Andy Geggan. In total, Spence made six appearances for Dunfermline during the 2013–14 season, with more than half being made as a substitute. Spence played in Dunfermline's first match of the 2014–15 season, a 5–1 win over Annan Athletic in the Scottish League Cup. He scored his first goal for the club in a loss to St Mirren at St Mirren Park, also in the League Cup. Spence played 31 times for Dunfermline during the season, scoring once, as the team finished in seventh position in League One. Following John Potter's resignation as manager and the appointment of Allan Johnston, Spence found himself on the fringes of the first team squad and made just one appearance for the club in the 2015–16 season, coming on as an 80th-minute substitute for Geggan in a 4–1 victory over Arbroath in August 2015. In January 2016, Spence was sent to fellow Scottish League One team Brechin City on a development loan to provide him with more game time. He made 13 appearances for Brechin and scored 3 goals, including an "outstanding" 35-yard lob against Airdrieonians, which was nominated in April 2016 as one of the club's goals of the season. His contribution helped Brechin avoid relegation, after they had been bottom of the league for the majority of the season. At the end of the 2015–16 season, Spence signed a new one-year contract with Dunfermline which would see him remain at the club until the end of the 2016–17 season. After making a handful of appearances for the first-team, Spence returned to Brechin on a one-month loan in September 2016, which was subsequently extended for an additional month. Returning to Dunfermline, Spence made only seven appearances in the two seasons in which Johnston was in charge. He left the club in May 2017 when his contract expired, having made 45 appearances in his five years with Dunfermline.
Dundee
On 22 June 2017, Spence signed a one-year contract with Scottish Premiership club Dundee, under manager Neil McCann who had previously coached him at Dunfermline. After impressing in his first season, Spence signed a two-year contract extension in April 2018, which was due to keep him at the club until summer 2020. McCann was replaced as manager by Jim McIntyre during the 2018–19 season, and Spence was released from his contract in January 2019.
Ross County
After his release by Dundee, Spence signed for Scottish Championship club Ross County.