К трем часам ночи четыре колонны шведской пехоты подошли к русским позициям, но кавалерия в темноте заблудилась и эффект неожиданности был потерян. Русские заметили врага и открыли по нему огонь. Шведы бросились на укрепления и взяли некоторые штурмом, истребив всех защитников, но в результате их боевые порядки были разорваны, а пройдя наконец линию редутов, они оказались лицом к лицу с русской кавалерией. Отбив несколько атак, драгуны стали отступать, а шведы понеслись вслед за ними.
План короля был полностью сорван. К тому же шесть пехотных батальонов генерала Рооса (2600 человек, треть вышедшей в бой шведской пехоты!) увлеклись осадой одного из редутов, так и не сумели его взять и заблудились. Они долго плутали по лесу, отбиваясь от русских отрядов, и, потеряв 85% личного состава, сложили оружие.
Основные силы шведов тем временем давали главный бой на поле перед русским лагерем. Шведская кавалерия оказалась зажатой между своей пехотой и Будищенским лесом и не успела восстановить порядок в рядах. Петр I решил взять инициативу в свои руки — русская армия вышла из лагеря и построилась в боевой порядок. Теперь преимущество было огромным. Против двух русских линий из 42 батальонов (17 800 человек) шведы выстроили только одну (около 6000 человек). Но в девятом часу утра они все же вновь пошли в атаку. На огонь 127 разного типа орудий отвечать было нечем — артиллерии у шведов не было, а ружейный порох был плох, поэтому Левенгаупт стремился как можно ближе подвести свои батальоны к русским линиям.
Когда между рядами синих и зеленых мундиров осталось примерно 50 метров, шведы выдер жали русский залп и продолжали упорно идти вперед. На расстоянии 25—30 метров Левенгаупт крикнул: «Пли!» Каролины сдвоили ряды и произвели залп по русским солдатам. На правом фланге и ближе к центру они стали теснить противника. Погиб командир Новгородского полка, шведы захватили несколько знамен и пушек и из одной из них даже успели несколько раз выстрелить по отступавшим. Хотя рассказ о том, что Петр лично возглавил полк и спас положение, видимо, позднейшая легенда, но он несомненно участвовал в бою: в Зимнем дворце хранятся пробитая шведской пулей шляпа монарха и нагрудный щиток с глубокой вмятиной от второй.
Как бы то ни было, наступление шведов захлебнулось. На левом фланге, несмотря на присутствие короля, они так и не смогли потеснить русских. Не помогла и кавалерия — на нее обрушились русские драгуны и обратили в бегство. Пехоту же просто окружили — слишком короткой была линия шведов. Тут и был захвачен в плен фельдмаршал Реншёльд.
Ядра русских пушек разбили качалку, в которой драбанты возили короля. Не успели его посадить на лошадь, как она была убита. Тогда король потребовал коня у своего лейтенанта Юхана Ёртты, который и сам был ранен. Каким-то чудом Ёртта тоже спасся и впоследствии получил дворянство. Правда, грамота утверждала, что он сам предложил королю своего скакуна.
Тем временем шведы бросились в бегство. Остатки армии сумели пробраться через Будищенский лес и добраться до войскового обоза. На поле осталось 9234 погибших (по шведским данным — 6900, в том числе 204 офицера; возможно, остальные были казаками) и еще 2977 человек попали в плен, в том числе почти весь Генеральный штаб. Русская армия в этот день потеряла 1494 человека убитыми и 3292 ранеными.
Чудом спасшийся король не унывал: он заявил, что соберет пополнение и скоро снова пойдет на Москву. В лагере же тем временем царил беспорядок, и если бы русские решили немедленно атаковать, вряд ли они встретили бы серьезное сопротивление. Однако никто шведов не преследовал. Они смогли пообедать, дождаться беглецов и на закате отправились на юг — с артиллерией, обозом и сидящим в карете королем, который решил укрыться в Крыму или в Турции. Историки до сих пор спорят, проявил ли Петр осторожность или же, упиваясь победой, попросту забыл про шведов. Впрочем, русское командование вскоре исправило свою ошибку, и вслед за отступавшими поскакал Александр Меншиков, взяв с собой не только кавалерию, но и отборную пехоту, которая, чтобы не терять времени, тоже была посажена на коней.
Лишь сам Карл XII и Мазепа с несколькими сотнями шведов и казаков сумели переправиться через Днепр и уйти от преследования. Вся остальная шведская армия во главе с Левенгауптом (16 000 человек) 30 июня сдалась в плен 12-тысячному войску Меншикова у Переволочны.
Триумф был абсолютным. Генералы и офицеры получили множество наград и новых званий (в том числе сам Петр I был произведен в генерал-лейтенанты), а солдаты — серебряные медали, чтобы носить на голубой ленте в петлице. Пленным было предложено перейти на русскую службу с обещанием, что их не пошлют воевать против шведов — и многие согласились.