Nắm được kế hoạch và cách bố trí lực lượng của địch, Quang Trung đã chia quân Tây Sơn ra làm 5 đạo chính và đêm giao thừa Tết Kỷ Dậu (25/1/1789), đạo quân chủ lực do Quang Trung chỉ huy đã vượt sông Gián Thuỷ, mở màn cuộc đại phá quân Thanh. Các đồn tiền tiêu của địch như Gián Khẩu, Thanh Quyết, Nhật Tảo... lần lượt bị hạ. Không một tên lính nào chạy thoát.
Nửa đêm mùng 3 Tết Kỷ Dậu (ngày 28/1/1789), quân Tây Sơn bí mật bao vây đồn Hạ Hồi (cách Thăng Long khoảng 20 km), uy hiếp địch và bắt sống hàng vạn quân Thanh. Mùng 4 Tết (ngày 29/1/1789), quân Tây Sơn tiếp cận Ngọc Hồi. Lúc này, đạo quân thứ ba do Đại đô đốc Bảo chỉ huy cũng tập kết tại phía Tây Nam Ngọc Hồi, cùng chuẩn bị tiến công.
Sáng mùng 5 Tết Kỷ Dậu (ngày 30/1/1789), quân Tây Sơn bất ngờ tấn công với thế xung trận mạnh như triều dâng, bão cuốn đã phá huỷ các chiến luỹ và toàn bộ trận địa phòng thủ mặt Nam đồn Ngọc Hồi…
Đạo quân thứ hai do Đô đốc Đặng Tiến Đông chỉ huy cũng đồng thời mở cuộc tiến công hết sức bất ngờ vào đồn Đống Đa. Bằng khí thế áp đảo, quân Tây Sơn với đội hình bày sẵn, xông thẳng vào đồn trại địch, đốt phá các doanh trại phía ngoài rồi nhanh chóng đánh thọc sâu vào sở chỉ huy của địch. Chỉ trong chốc lát, số quân Thanh bị chết và bị thương đã lên đến 5.000 người.
Trước thế cùng, lực kiệt, Sầm Nghi Đống đã phải thắt cổ tự tử ngay tại sở chỉ huy. Tiếp tục thế tiến công, đạo quân Tây Sơn đã thừa thắng, tiêu diệt luôn các đồn Yên Quyết, Nam Đồng rồi nhanh chóng thọc sâu vào Thăng Long, đồng thời uy hiếp vào đại bản doanh của Tôn Sĩ Nghị.
Quang Trung đưa đạo quân chủ lực tiếp tục tiến đánh đồn Ngọc Hồi và cho đội voi chiến chia làm 2 cánh tả, hữu, đánh vào 2 bên sườn. Quân Tây Sơn ào ạt tiến lên, bất chấp đại bác, cung tên và hoả mù của giặc và tiêu diệt hoàn toàn đồn Ngọc Hồi. Tàn quân Thanh tháo chạy về phía Đầm Mực nhưng bị đạo quân thứ ba do Đại đô đốc Bảo chỉ huy tiêu diệt hoàn toàn.
Tại đại bản doanh đóng ở cung Tây Long bên bờ sông Nhị, Tôn Sĩ Nghị vội vàng qua cầu phao, nhằm hướng Bắc chạy trốn. Đại Nam chính biên liệt truyện viết "Tôn Sĩ Nghị đóng trên bãi cát, được tin bại trận vội vàng cưỡi ngựa một mình chạy về Bắc. Tướng sĩ thấy vậy tranh nhau qua cầu mà chạy, cầu đứt, lăn ngã cả xuống sông, chết đến vài vạn người, làm cho nước sông không chảy được".