Morris began his career at Middlesbrough, having joined the club when he was eleven and made progress through the academy.[6] He made his first-team debut on 5 January 2013 in an FA Cup tie away to Hastings United, a match that Middlesbrough won 4–1.[8] He made his league debut on 4 May in a 2–0 defeat away to Sheffield Wednesday.[8] Two months after making his debut, Morris signed his first professional contract with the club, which would keep him until 2016.[9]
On 21 November 2014, Morris signed for League Two club Burton Albion on a one-month loan.[10] One day later, Morris made his debut, where he came on as a substitute for Adam McGurk, in a 1–0 victory over Luton Town.[11] His impressive displays at Burton Albion prompted manager Jimmy Floyd Hasselbaink to tip him for greatness.[12] On 13 December 2014, Morris provided an assist for Shane Cansdell-Sherriff to score the third goal in a 4–0 win over Hartlepool United.[13] Despite Burton being keen to extend the loan[14] it never materialised, and Morris returned to Middlesbrough, having made five appearances for Burton Albion.[15]
On 6 August 2015, Morris signed for Coventry City on a season-long loan, linking up again with Tony Mowbray, the manager under whom he had made his professional debut.[16] He made six appearances, the last coming against Rochdale, for Coventry before being recalled by Middlesbrough on 26 October 2015.[17]
On 27 October 2015, Morris signed for League Two club York City on a one-month loan.[18] On 28 January 2016, Morris signed for League One club Walsall on a two-month loan.[19]
Shrewsbury Town
Morris was released from his Middlesbrough contract in order to join League One club Shrewsbury Town on 20 January 2017 on a contract until the end of 2016–17.[20] He made his debut for the club the following day, as an 88th-minute substitute in a 1–0 home victory over Oldham Athletic.[21] After featuring regularly to help the club escape relegation, he signed a two-year contract extension in June 2017.[22]
Morris joined Shrewsbury's League One rivals Wycombe Wanderers on 7 August 2018 on loan until 3 January 2019.[23]
Portsmouth
Morris signed for League One club Portsmouth on 14 January 2019 on a two-and-a-half-year contract for an undisclosed fee.[24] He scored his first goal for Portsmouth in a 3–3 draw against Southend United on 16 February 2019.[25] Morris was cup-tied for Portsmouth's win in the 2019 EFL Trophy final.[26]
On 18 January 2021, Morris signed for Northampton Town on a loan deal until the end of the season.[27]
Burton Albion
Following his release from Portsmouth, Morris signed for League One side Burton Albion in June 2021.[28] With his game time at Burton limited, Morris joined his hometown club Hartlepool United on loan on 31 January 2022.[29] He made his debut for Pools in an FA Cup fourth round defeat away to Crystal Palace.
Grimsby Town
On 15 July 2022, Morris signed for Grimsby Town on a one-year deal.[30]
Morris was part of the Grimsby team that reached the FA Cup quarter-finals for the first time since 1939, he came on as a substitute in the 2–1 win away at Premier League side Southampton that secured that achievement.[31][32]
On 9 May 2023, it was announced that Morris would not be retained for the 2023–24 season and would be leaving the club when his contract expired on 30 June.[33]
Newport County
On 23 June 2023, it was announced that Morris would join Newport County on a two-year contract when his contract with Grimsby Town expired.[34] He made his debut for Newport on 5 August 2023 in the starting line-up against Accrington Stanley.[35][36] Morris scored his first goal for Newport on 30 September 2023 in the 2–1 League Two defeat against Salford City.[37][36] In January 2024 Morris scored Newport's first goal with a long range shot in their 4–2 FA Cup fourth round defeat to Manchester United of the Premier League.[38]