Roberts was born in Watford, Hertfordshire. He started his career in the youth team of Peterborough United as a first year scholar but was released in the summer of 2011. Roberts completed his second year of his scholarship with Football League Two side Aldershot Town. On 21 February 2012, Roberts signed his first professional contract, on a two-and-a-half-year deal. Four days later he made his professional debut coming on as a late substitute for Guy Madjo in a 4–1 win over Barnet. On 1 October 2012, Roberts joined Conference South side Havant & Waterlooville on a one-month loan deal. On 6 October 2012, Roberts made his Havant & Waterlooville debut in a 2–2 draw with AFC Hornchurch, replacing Steve Ramsey in the 70th minute. On 10 January 2013, Roberts signed for Tamworth on loan until 9 February. On 12 January 2013, Roberts made his Tamworth debut in a 2–1 defeat against Gainsborough Trinity in a FA Trophy tie. In February 2013, Roberts joined Bishop's Stortford on loan for the remainder of the season. On 16 February 2013, Roberts made his Bishop's Stortford debut in a 1–1 draw against Hinckley United, replacing Alli Abdullahi in with 30 minutes remaining. On 27 February 2013, Roberts scored his first Bishop's Stortford goal in a 2–2 draw against Corby Town. On Roberts return to Aldershot Town, he became a key figure between the years of 2014 and 2015, netting eleven times in over seventy games.
On 7 July 2015, Roberts joined Scottish side Inverness Caledonian Thistle. On 16 July 2015, Roberts made his Inverness Caledonian Thistle debut in a UEFA Europa League qualifier tie against Astra Giurgiu, in which he played nine minutes in their 1–0 defeat. On 30 April 2016, Roberts scored his first Inverness Caledonian Thistle goal in a 4–1 victory over Partick Thistle, netting in the 85th minute. Roberts went on to score another goal a week later in a 3–2 defeat against Dundee United.
Crawley Town
On 28 June 2016, Roberts joined League Two side Crawley Town on a free transfer. He scored his first goal for Crawley in an FA Cup tie against Bristol Rovers on 15 November 2016. On 14 May 2018, it was announced that Roberts would leave Crawley at the end of his current deal in June. He made 62 appearances during two seasons at the club, scoring 11 goals.
Ipswich Town
On 28 June 2018, following his release from Crawley, Roberts agreed to join Championship side Ipswich Town on a two-year deal. He scored his first goals for Ipswich when he scored twice in an EFL Trophy win against Tottenham Hotspur U21 on 3 September 2019. He scored in his next appearance on 8 October 2019, netting in a 4–0 win over Gilligham in an EFL Trophy group stage match.
Lincoln City (loan)
On 23 January 2019, Roberts signed for Lincoln on loan from Ipswich until the end of the season. He found his first team chances limited during his loan spell at Sincil Bank, only making 5 substitute appearances as Lincoln won the League Two title and promotion to League One.
On 9 January 2020, Roberts joined Gillingham on loan for the remainder of the 2019–20 season. He scored his first goals for the club as he scored both in a 2–2 away league draw at Rochdale. He scored twice during 10 appearances before returning from his loan on 6 May. He returned to Ipswich following football's suspension due to the COVID-19 pandemic. It was later announced on 18 May 2020 that the club had decided not renew his contract or take up the 12-month extension in his current contract - though the club left the door open to a potential new deal once football had resumed.