Святослава застали врасплох, князь оказался совершенно не готов к войне, его войска были разбросаны по всей Восточной Болгарии. Мы не знаем, почему так произошло, но всё случившееся характеризует киевского князя не с самой лучшей стороны. Может быть, Святослава усыпила бездеятельность Иоанна Куркуаса или же князь надеялся, что Цимисхий не сможет так быстро подготовиться к войне. Можно предположить, что за оборону клисур отвечали Сфенкел и Калокир, иначе ничем другим не объяснишь, зачем в Преславе было сосредоточено 10 000 русских воинов. И если это так, то Сфенкел и Калокир проявили преступную халатность. Патрикий не мог не знать о стратегическом значении клисур и должен был любой ценой заставить воеводу перекрыть проходы в горах. В любом случае, главным виновником прорыва ромеев через горы является киевский князь, который как командующий несет полную ответственность за действия подчиненных. Беспечность Святослава обернулась катастрофой.
На рассвете 12 апреля Цимисхий повел армию на Великий Преслав, под пение труб и грохот барабанов ромеи двинулись в сторону города. Как обычно, император возглавил передовые отряды. Командующий русскими войсками воевода Сфенкел не ожидал нападения, для него появление ромеев оказалось совершенной неожиданностью. В это утро воевода вывел большую часть своих людей за город, где дружинники и ратники упражнялись во владении оружием. По свидетельству Скилицы, в маневрах приняло участие 8500 воинов (7, 124–125). Увидев вражеское войско, русские встали плечом к плечу, сдвинули большие щиты и приготовились к битве. Разыгралась ожесточенное сражение, дружинники Сфенкела отразили несколько вражеских атак и удержали позиции. Столкнувшись с яростным сопротивлением противника, Цимисхий ввел в бой гвардию «бессмертных». Тяжеловооруженные всадники мощной атакой смяли левый фланг русского войска и вынудили Сфенкела начать отход к Преславу. Вражеская конница обошла войско противника и отрезала дружинникам путь к городу. В это время ворота Преслава распахнулись, на помощь соотечественникам вышел отряд ратников и атаковал византийцев. Сфенкел воспользовался удобным моментом и повел рать на прорыв, отбиваясь от наседавших «бессмертных», русские пробились к городским воротам и укрылись за стенами Преслава. Вдохновленные успехом, ромеи пошли на штурм, но были отбиты с большими потерями. Ночь прекратила битву. Неудача в полевом сражении не смутила Сфенкела, он был готов продолжать борьбу за город. Патрикий Калокир думал иначе, он видел личный штандарт императора и осознал весь размер опасности. Ночью патрикий покинул Преслав и убежал в город Доростол, где находился Святослав.
Утром 13 апреля подошли главные силы имперской армии, подвезли осадные машины и Цимисхий объявил генеральный штурм Преслава. Метательные машины крушили городские стены и башни, каменные ядра сбивали защитников с боевых площадок. По приставным лестницам ромеи устремились на городские укрепления, дружинники стрелами, копьями и камнями поражали вражеских воинов, удерживая периметр укреплений. Исход противостояния решил численный перевес ромеев. Первым на городскую стену взобрался воин по имени Феодосий Месоникт (7, 71), следом поднялись его товарищи. На стенах и башнях Преслава закипели рукопашные схватки, ромеи пытались прорваться в город, русские сдерживали их натиск. Цимисхий постепенно вводил в бой свежие войска, византийцы спрыгивали со стен внутрь города и спешили к воротам. Сбив петли и открыв засовы, солдаты впустили в город императора с гвардией. Увидев, что враг вошел в Преслав, Сфенкел приказал дружинникам отступить в царский дворец. Пока ромеи были увлечены грабежом, Сфенкелу удалось увести в цитадель 8000 ратников и закрепиться на новых позициях (7, 126). Множество ромеев, проникших во дворец, было перебито, так продолжалось до тех пор, пока к цитадели не прибыл Цимисхий. Поскольку попытка прорваться во дворец закончилась неудачей, император решил лично возглавить атаку. Цимисхий спрыгнул с коня, взял у телохранителя щит и первым бросился на врага. Но русские сражались отчаянно, отразили все атаки и тогда император распорядился поджечь дворец. Сфенкел вывел ратников из дворца, выстроил в колонну и повел на прорыв из города. Вместе с русскими сражались и болгарские воины, не желавшие господства ромеев. Против Сфенкела император отправил магистра Варду Склира с отборными войсками. Бои продолжились на улицах города, почти все русские воины погибли, лишь Сфенкелу с небольшим количеством дружинников удалось вырваться из Преслава и уйти в Доростол. Как отметил Скилица, «город не устоял и был взят за два дня» (7, 126). Ромеи захватили болгарского царя Бориса, проживавшего в Преславе.