Bates joined his hometown club Newcastle United at the age of 8 in 1993. He worked his way through the ranks, setting several junior goalscoring records during that time and playing alongside good friend and fellow academy graduate Steven Taylor. With a view to progressing all the way to the first team, Bates played in the Newcastle Youth team until 2004, with his goal taking the team to the final 16 in the 2003–04 FA Youth Cup. The following season, Bates found a regular spot in the Reserves team, making 15 appearances and scoring 6 goals in the 2004–05 season. Promotion into the first team proved significantly more difficult for Bates, however, as he was fighting for a place behind established strikers such as Alan Shearer, Shola Ameobi and Patrick Kluivert.
The lack of opportunities for Bates led him to seek a release from Newcastle and head to Australia in January 2005, where he had a trial with Newcastle United Jets. Two months later, in March, Bates signed a two-year deal with the newly established club, and spoke publicly about the possibility of a long-term stay in Australia. Bates played and scored regularly in the Jets' pre-season campaign, but did not make his A-League debut until round 4 of the competition, playing 64 minutes in a 4–0 victory over New Zealand Knights. The match was one of just three appearances Bates made in the 2005–06 season, and in November 2005, Bates was released by the club by mutual agreement, citing a lack of match time for wanting to leave. Bates returned home to England in the hope of joining another club during the European January transfer window.
Bates trialled at both English League Two club Darlington and Belgian club K.V. Mechelen, receiving an offer from the latter after scoring a hat-trick in a trial game. He turned it down however, to play in his home country with Darlington, for whom he had already scored for in a trial match against Hartlepool United. Bates officially joined Darlington on 3 February 2006, signing a short-term deal until June 2006. Bates made his Darlington league debut the day after signing, coming on as a substitute in the team's 0–0 draw with Boston United. Despite being unable to find the back of the net in that match, it took Bates just 10 minutes into his next appearance to score his first Darlington goal, in a 2–0 reserves win against Hull City. Over the remainder of the season, Bates could not find a regular starting spot in the Darlington line-up, and played just nine games for one goal as the team finished 8th in the league. Bates was released by the club in May 2006,. He then played for KV Oostende in the Belgian Second Division.
On 7 July 2012, Bates signed a one-year contract with Irish League side Glenavon. Throughout the 2013–14 season, Bates enjoyed a good run of form, scoring over 20 goals, securing a top-6 finish for the Lurgan club along with the club's first Irish Cup since 1997. Despite earlier signing a two-year contract extension, Bates was to leave Glenavon on 31 August 2014 in order to emigrate to Australia. Bates played his last match for Glenavon on 31 August 2014 as a late sub in a 2–1 victory over Ballymena United but remained in contract with the club until June 2016 and therefore could rejoin the club when he returned to Northern Ireland.
However, in June 2015 Linfield bought out the rest of Bates contract with Glenavon, becoming their fourth signing of the summer. Linfield manager Warren Feeney said Bates was a player he always admired, however Glenavon manager Gary Hamilton said he was let down by the player's decision to renege on the verbal agreement he had made. Bates found first-team opportunities at Linfield limited after David Healy succeeded Feeney as manager, and on 22 June 2016, it was announced that Bates' contract would be terminated by mutual consent.
Second spell at Glenavon
Bates resigned for the Lurgan Blues on a one-year deal on 19 July 2016, the same day former Celtic and Northern Ireland winger Paddy McCourt signed for the club. Bates left the club at the end of his contract.