Coles began his career at Bristol City. He made his debut for the club on 24 April 2000 in a 2-2 home draw against Oxford United. He became a regular fix in the squad at Ashton Gate Stadium two seasons later during the 2001-02 campaign. He scored his first goal for the club in December 2001 in a 2-0 away win over Wrexham.
In January 2003, he helped Bristol City to the third round of the FA Cup and played the full 90 minutes in a 2-0 away defeat against Leicester City. Later that year, he was named Young Player of the Year at the club for the 2002–03 season.
He played a central role in the Bristol City side that reached the Division Two play-off final in May 2004, only to lose 1-0 against Brighton & Hove Albion at the Millennium Stadium in Cardiff in front of 65,167 spectators.
In July 2005, he was arrested and charged for being drunk and disorderly during a pre-season trip. In February 2005, he was placed on the transfer list at Ashton Gate Stadium.
On 26 July 2005, Coles was signed by Hull City manager Peter Taylor for a fee of £200,000. He made his debut for Hull on 6 August 2005 in a goalless home draw against QPR.
After a promising start having agreed a two-year contract at the club, he suffered an anterior cruciate ligament knee injury which ruled him out for the remainder of the 2005–06 season. He returned to full fitness in October 2006, coming on as a half time substitute in a 2-0 away defeat against Burnley at Turf Moor.
Struggling to break into the first team at Hull at the start of the 2007-08, on 1 October 2007 he signed for League One side Hartlepool United on a one-month loan deal. He made his debut for Hartlepool five days later in a 2-1 away defeat against Nottingham Forest.
On 1 November 2007, Coles joined Bristol Rovers in League One on a 3-month loan from Hull City. The move became permanent on 8 January 2008 when he moved for an undisclosed fee, signing a two-and-a-half-year contract with The Pirates.
On 6 January 2008, he scored his first goal for Bristol Rovers in a third round FA Cup tie away to Premier League outfit Fulham. On 12 August 2008, he ended speculation about his future by signing a new two-year contract extension with The Pirates, despite interest in him from Plymouth Argyle.
On 11 October 2008, he scored in a 2-1 home win over Leyton Orient however suffered a serious knee injury. He visited American specialist Bill Knowles during the off-season and returned to The Pirates' squad for the 2009–10 season. In just his second game back from injury, at the start of the 2009-10 season, he scored alongside Joe Kuffour on 15 August 2009 in a 2-0 away victory against Stockport County.
In early June 2011, rumours circulated of a potential move for Coles to Exeter City. A few days later, on 11 June 2011, he moved to League One Exeter. His debut for the Grecians came on 6 August 2011 in a goalless draw away at Stevenage. Later that month, on 24 August 2011, he was a part of the Exeter side that hosted Liverpool in the second round of the League Cup, suffering a 3-1 defeat against the Premier League club.
On 12 March 2012, he suffered a fractured spine in a collision with goalkeeper Artur Krysiak during training, an injury that caused him to miss the remainder of the 2011–12 season. As a result, he was unable to help Exeter avoid relegation into League Two.
On his return from injury, he was named team captain by manager Paul Tisdale for the 2012–13 season. On 25 October 2012, he signed a new contract with Exeter City.
In June 2014, he was disciplined by Exeter over offensive comments he made on Twitter. The tweet in question was Coles' response to a tweet he had been sent, with his response including two expletives. He was fined two weeks' wages by Exeter, stripped of the captaincy and transfer-listed by the club.
On 5 August 2014, Coles joined Forest Green Rovers on a one-year contract from Exeter City. He made his debut for the club only four days later on 9 August 2014 in a 1–0 away win over Southport. His first goal for the club came on 18 October 2014 as he scored the only goal of the game in a 1–0 away victory over his former club, Bristol Rovers, at the Memorial Stadium.
In January 2015, he signed a contract extension ensuring he would remain at Forest Green until the summer of 2016. On 31 March 2015, following the departure of assistant manager Dave Kevan to Notts County, he stepped up to fill a player-coach role until the end of the 2014-15 season.
On 3 May 2015, he featured in the second leg of Forest Green's Conference National play-off clash with former club Bristol Rovers, although he couldn't prevent a 2-0 defeat which saw Bristol Rovers win the tie 3-0 on aggregate. It proved to be his last game for the club as his contract was cancelled by mutual consent in August 2015. Coles stated at the time that he has "no real plans to play anymore", effectively signalling his retirement.As of 19 October 2013
Bristol CityFootball League Trophy: 2002–03