Город расположен в юго-восточной части Алтайского края в долине реки Белокуриха на высоте 240—250 метров над уровнем моря у подножия горы Церковки.
Ближайшие крупные города: Бийск — 65 км, Барнаул — 236 км. Город связан также автобусным сообщением с Кемерово, Новокузнецком и Новосибирском.