Born in Cambridge, Morris began his career in the youth system at Norwich City at the age of 11. He became an academy scholar in the summer of 2012 and won the FA Youth Cup with Norwich in May 2013. In December 2013, he signed a professional contract until the summer of 2016.
2014–15
On 4 August 2014, Morris joined Oxford United on loan until 1 January 2015. He made his debut on 9 August 2014, starting in a 1–0 defeat to Burton Albion in League Two. He scored his first goal in professional football in his next appearance on 12 August 2014, starting again as Oxford defeated Bristol City in the first round of the League Cup. After 10 appearances, he was recalled by Norwich on 23 October 2014. On 27 November 2014, Morris joined another League Two club, York City, on loan until 4 January 2015. He made his debut two days later as a 77th-minute substitute for Wes Fletcher in York's 1–1 away draw with Plymouth Argyle. His loan was extended for another month in January 2015 before returning to Norwich on 9 February having made eight appearances for York.
2015–16
On 15 July 2015, Morris joined Hamilton Academical on a six-month loan, shortly after signing a contract extension with Norwich to 2017. He made his Scottish Premiership debut on 1 August in Hamilton's 0–0 home draw with Partick Thistle. On 18 August 2015, Morris scored his first goal for Hamilton in a 4–0 home victory over Dundee United. On 2 January 2016, he extended his stay with Hamilton until the end of the 2015–16 season. Morris returned to Norwich in May 2016, following 10 months on loan at Hamilton having featured in 33 matches, scoring eight goals.
After featuring for Norwich under-23s in the EFL Trophy, Morris joined Championship club Rotherham United on 31 January 2017 on loan until the end of 2016–17. He was unable to link up with Rotherham until mid-March due to injury, but did sign a contract to 2020 with Norwich earlier in the month. He made his Rotherham debut as a substitute in the 5–1 defeat away to Queens Park Rangers on 18 March 2017.
On 11 July 2017, Morris joined League One club Shrewsbury Town on a season-long loan, becoming their ninth summer signing. He scored his first goal for the club in a 3−2 victory over Rochdale at New Meadow on 19 August. Morris suffered a torn anterior cruciate ligament in Shrewsbury Town's League One play-off final defeat to Rotherham United.
2018–19
Morris missed almost the entire season while recovering from his ACL injury, only making a few appearances for Norwich City's Under-23 squad.
2019–20
In May 2019 Morris signed a contract extension with Norwich to 2021 and was simultaneously loaned out to League One side Rotherham United, for whom he'd previously played in the 2016–17 season. The loan was cut short after Morris scored three league goals for them in the first half of the season. Morris then signed for Milton Keynes Dons on 7 January 2020 on a loan deal for the rest of the season.