Был продуман четкий план действий, согласно которому к Новгороду должны были подойти с запада и востока два сильных отряда, а с юга наносился главный удар под командованием самого Ивана III.
Из Москвы в Устюг в мае 1471 года Иваном III были посланы двое бояр и воевода Василий Образец, чтобы организовать отряд из устюжан и вятчан. Это давало возможность «воевать» Заволочье и тем самым отвлечь силы новгородцев ослабить их в материальном и моральном плане. Этот план удался.
Князь занял и сжег старый город и стал ждать соединения с отрядом псковичей, чтобы затем наступать на Новгород с юго-запада. По свидетельству летописи, Холмский и Федор Пестрый «распустили воинов своих в разные стороны жечь, и пленить, и в полон вести, и казнить без милости жителей за их неповиновение своему государю великому князю». (Памятники литературы Древней Руси: Вторая половина XV в. М., 1982. С. 389.)
В середине июня отряд под командованием князя Оболенского Стриги и татарского царевича Даньяра выступил из Москвы на Вышний Волочек и далее двинулся вниз по течению р. Мета на Новгород с Востока.
20 июня главные силы московской рати выступили из Москвы и двинулись через Тверь, где к ним присоединился тверской полк, и заняли Торжок к южному берегу озера Ильмень.
Новгород также готовился к бою. Новгородские бояре собирали в боеспособных горожан и насильно гнали в войско. Они имели также судовую рать. Но, несмотря на большую численность, боеспособность; новгородского войска была низкой, и война с Москвой была не популярна.
Новгородцы хотели разобщить московское войско и уничтожить его по частям. Главные силы (конницу) новгородцы направили по западному берегу озера Ильмень и далее по левому берегу р. Шелонь на псковскую дорогу. Они стремились не допустить соединения псковичей с отрядом князя Холмского и разбить их. Судовая рать (пехота) по плану должна была высадиться на южном берегу у села Коростына и разбить отряд князя Холмского. Третий отряд под командованием князя Василия Шуйского шел на Заволочье и действовал вне связи с главными силами новгородцев. Несмотря на план, новгородцы действовали разобщено. Московские отряды также не организовали общего взаимодействия, псковичи медлили, главные силы были далеко, вследствие чего вся тяжесть борьбы легла на отряд князя Холмского. Исход войны решался на берегах р. Шелонь.
У села Коростына новгородцы решили воспользоваться изолированным положением отряда Холмского и уничтожить его. Для этого судовая рать высадилась у села Коростына и разделилась на два отряда: один отряд должен был ударить по правому флангу москвичей, второй, поднявшись на судах по р. Полысть до Старой Руссы, — нанести удар с тыла. Коннице новгородцев необходимо было, переправившись вброд и вплавь через Шелонь, одновременно с отрядами пехоты атаковать отряд Холмского. Но силы новгородцев оказались разбросанными, отсутствовали взаимодействие отрядов и взаимная выручка.
Князь Холмский, воспользовавшись медлительностью новгородцев, двинулся к селу Коростыну и внезапно атаковал находившуюся там пехоту противника. Новгородцы были разбиты. После этого отряд Холмского отступил к Старой Руссе, ожидая подхода основных сил. Там находилось новое новгородское войско, подошедшее на судах по реке Поле. Холмский вновь стремительно напал на новгородцев и вновь одержал победу. В течение всего этого времени конница новгородцев бездействовала.
Дальнейшие самостоятельные действия могли вызвать гнев Ивана III. Понимая это, Холмский отошел южнее к городку Демону и отослал к Ивану III гонца с донесением о победе и запросом о дальнейших действиях. (Борисов Н. С. Русские полководцы XIII–XVI веков. М., 1993. С. 125.)
После этого 13 июля 1471 года Иван III велел отряду Холмского двинуться к р. Шелонь и соединиться с отрядом псковичей. Все эти успехи обошлись москвичам недешево. Отряд Холмского потерял к тому времени половину своего войска: «Бысть бо наших всех осталося 4 тысящи или мало больши».
Конница новгородцев появилась на берегу р. Шелонь после того, как была разбита новгородская пехота. Отряд под командованием Холмского двинулся вверх по Шелони. Противников разделяла только река.
Новгородское войско, которым командовали виднейшие бояре — Дмитрий Исаакович Борецкий, Василий Казимир, Кузьма Григорьев, Яков Федоров и другие, расположилось на ночлег у устья р. Дрянь (приток Шелони). 14 июля, утром, началась перестрелка через реку. Тогда отряд под командованием Холмского решил внезапно атаковать противника. Небольшое, но дружное, закаленное, в боях с литовцами и татарами московское войско, воодушевленное решимостью своего предводителя, с воем и свистом обрушилось на растерявшихся и оробевших новгородцев. Воеводы подавали пример воинам и первыми бросались через реку на новгородцев. Москвичи вброд и вплавь переправлялись через Шелонь и атаковали противника стрелами и копьями. Бой был упорный. По приказу князя Холмского отряд татар нанес противнику удар с тыла. Новгородцы были поражены смелостью действий московского отряда, не выдержали натиска и «побегоши вси». Примечательно, что в суматохе бегства новгородцы сводили счеты друг с другом: так велика была тайная ненависть всех ко всем, словно чума, поразившая жителей великого города. (Борисов Н. С. Русские полководцы XIII–XVI веков. М., 1993. С. 125.) Бой был выигран московским войском.