In August 2001 Hartson joined Celtic in a £6m transfer. He played for the Scottish Premier League club for five seasons. In March 2004, he dropped out for the remainder of the football season for surgery to his back; however, he recovered in time for Wales’ unsuccessful qualifying campaign for the 2006 World Cup.
In April 2005 he shared the Scottish PFA Players’ Player of the Year award with Fernando Ricksen and a short time later in May he was voted the Scottish Football Writers’ Association Player of the Year.
On 6 November 2005 Hartson scored his 100th goal for Celtic against Falkirk. He scored the only goal against Hearts, on 5 April 2006, (his 31st birthday) to clinch the title for Celtic.
Hartson was sent off on a number of occasions, one being a notable dismissal towards the end of an Old Firm derby, when he was sent-off for violent conduct along with Celtic team-mate Johan Mjällby and Rangers player Fernando Ricksen. Hartson’s dismissal was overturned on appeal.
In December 2002, Celtic defeated Celta Vigo in the first leg of a third round UEFA Cup tie 1-0. Celtic were beaten 2-1 in Vigo, thus progressing on the “away goals” rule to the next round due to John Hartson’s turn and strike. This was the first time that Celtic had remained in European competition after Christmas since the 1970s. In March 2003, Celtic faced Liverpool in the UEFA Cup at the quarter final stage, with the first leg ending in a 1-1 draw in Glasgow. In the return leg at Anfield, John Hartson fired the club’s goal of the season with a strike past Jerzy Dudek into the top corner from over 25 yards out. Celtic won this match 2-0, progressing to the semi-final, where they knocked out Boavista of Portugal to progress to the final. Unfortunately for John Hartson, after playing a major role in getting Celtic all the way through the tournament, most notably with his strikes in Liverpool and Vigo, as well as many assists, he was ruled out of the final through injury. Celtic were defeated 3-2 in the final after extra time by Jose Mourinho’s FC Porto