Oates began his career at Barnsley since joining them at six and in May 2013, Oates signed his first professional contract during his second-year scholars, for one year. This came after Oates was awarded for the "Academy Scholar of the Year". After spent pre-season in Spain with Barnsley's first team and to get first football, Oates was loaned out to Conference North side Gainsborough Trinity on a one-month deal. Oates made his Gainsborough Trinity debut against Telford United the next day. he then scored a brace, in a 2–2 draw against Worcester City. After making five appearance and scoring twice, Oates returned to his parent despite the club attempted to extend his loan at Gainsborough Trinity. On 31 January 2014, Oates joined another Conference North sideStockport County in the 2013–14 season. By the end of February, Oates had loan at Stockport County extended for another month. Oates then scored his first Stockport County goal and earned himself "Man of the Match", in a 2–2 draw against Barrow on 5 March 2014. Oates made his return to his parent club after scoring once in twelve appearance. Following this, Oates signed a new one-year contract with Barnsley in May 2014. After making his Barnsley debut, coming on as a substitute for Sam Winnall in the 89th minutes against Crewe, Oates signed for Conference Premier team Grimsby Town on a one-month loan on 19 September 2014. Oates scored on his debut for Grimsby Town, coming on as a 63rd-minute substitute for Jack Mackreth in a Conference Premier match against Kidderminster Harriers, firing in from 20 yards on 85 minutes. Just only making six appearance and scoring once, Oates returned to his parent club despite Grimsby Town keen to extend for another month. Oates signed for Conference Premier team Chesteron loan until 20 December 2014. Oates made his Chester debut the same day, coming on as a substitute for Craig Hobson in the 65th minutes, in a 3–1 loss against Macclesfield Town. Oates then scored two goals in two consecutive games against Bristol Rovers and Dartford. After scoring twice in seven appearances in all competitions, Oates' loan spell with Chester finished and returned to his parent club. Upon returning to Barnsley, Oates played his first match for Barnsley on 26 December 2014 since returning from a loan spell, coming on as a substitute for Kane Hemmings in the 67th minutes, in a 1–0 loss against Preston North End. Oates then provided two assist in separate matches against Crawley Town in a 5–1 loss on 14 February 2015 and another was against Rochdale in a 5–0 win on the last game of the season. After this, Oates was among seven players released by the club.
Hartlepool United
After being released by Barnsley, Oates joined League Two side Hartlepool United on 28 May 2015, though the contract details yet known. Oates was released on 17 May 2018 after making 109 appearances for the club.
In June 2018 it was announced that he would sign for Morecambe on a two-year contract on 1 July 2018, alongside Zak Mills. Oates was released at the end of the 2019-20 season.
Hartlepool United
Oates signed for Hartlepool for a second time on 1 August 2020 following his release from Morecambe.