Ngày 30 tháng tháng chạp, vua Quang Trung hạ lệnh tiến quân. Binh linh đều nghiêm chỉnh đội ngũ mà đi. Khi đến núi Tam Điệp, Sở và Lân ra đón xin chịu tội. Vua Quang Trung phân xử xong thì cho mở tiệc khao quân, hẹn đến ngày mồng 7 sẽ vào thành Thăng Long mở tiệc ăn mừng chiến thắng. Vua Quang Trung cho chia quân thành 5 đạo, đúng ngày gióng trống khua chiêng lên đường ra Bắc. Khi quân ra đến sông Gián, nghĩa binh trấn thủ ở đó tan vỡ chạy trước. Khi đến sông Thanh Quyết, quân Thanh do thám đi từ xa thấy bóng cũng chạy nốt, vua cho người đuổi theo đến Phú Xuyên thì bắt sống được hết không để tên nào chạy thoát nên quân Thanh ở Hà Hồi và Ngọc Hồi vẫn không hay biết gì. Nửa đêm ngày mồng 3 tháng Giêng năm Kỉ Dậu (1789), vua Quang Trung tiến đánh đồn Hà Hồi. Ông cho quân vây kín bốn xung quanh rồi bắc loa truyền gọi. Tiếng quân lính luân phiên dạ ran vang vọng khắp không gian khiến quân số của ta như có thêm hàng vạn người. Khí thế quân Tây Sơn mạnh hơn bội phần khiến cho địch rụng rời sợ hãi, liền xin ra hàng, vũ khí bị quân ta lấy hết. Vua Quang Trung chiếm được thành Hà Hồi mà không cần phải khởi dụng binh đao. Tiến vào trận Ngọc Hồi, vua Quang Trung sai người lấy sáu chục tấm ván, ghép liền ba tấm làm một bức, bên ngoài lấy rơm dấp nước phủ kín, tất thảy được hai mươi bức rồi chọn những người lính khỏe mạnh nhất, cứ mười người khênh một bức, lưng giắt dao ngắn, hai mươi người khác cầm binh khí theo sát phía sau, dàn trận thành chữ nhất. Vua cưỡi voi đốc thúc sát phía sau, đến mồng 5 tháng giêng thì đến sát thành Ngọc Hồi. Quân ta khí thế ngút trời, ai nấy đều quyết tâm cao độ tiến vào trận chiến sống mái với kẻ thù. Cuộc chiến ngay từ mở đầu đã vô cùng căng thẳng. Quân Thanh từ trong thành Thăng Long cho nổ súng bắn ra, nhằm vào đội quân nhưng không trúng người nào. Nhân có gió bắc, quân Thanh đã dùng ống phun khói lửa ra, khói tỏa mù trời, cách trong gang tấc không nhìn thấy gì hòng làm quân ta rối loạn, mất tinh thần. Nhưng đúng lúc ấy, trời lại nổi gió nam, thánh ra quân Thanh lại lãnh đủ, tự làm hại mình. Quân Tây Sơn dưới sự lãnh đạo của vua Quang Trung, gấp rút tiến quân, vừa che chắn, vừa xông thẳng lên phía trước. Khi hai bên đã chạm nhau thì quăng ván xuống đất, cầm dao ngắn xông lên chém bừa, những bính linh theo sát phía sau cũng nhất tề xông tới mà đánh. Tiếng gươm giáo va nhau, tiếng người vang đội, tiếng hò hét vang trời. Vua Quang Trung sừng sững ngồi trên voi chỉ huy trận đánh, tiếng vua vang rền như tiếng sấm khiến cho quân ta càng thêm vững vàng, xông tới mà đánh. Quân Thanh không chống đỡ nổi, bỏ chạy tán loạn, giày xéo lên nhau mà chết. Tên thái thú lúc bấy giờ là Sầm Nghi Đống tự thắt cổ mà chết. Quân Tây Sơn được thế chém giết lung tung, thây nằm đầy đống, mái chảy thành suối, quân Thanh đại bại. Giữa trưa hôm ấy, vua Quang Trung tiến binh đến Thăng Long rồi kéo quân vào thành. Tôn Sĩ Nghị sợ mất mật, ngựa không kịp đóng yên, người không kịp mặc áo giáp, dẫn bọn lính kị mã của mình chuồn trước qua cầu phao, rồi nhằm hướng bắc mà chạy. Vua tôi Lê Chiêu Thống cũng hốt hoảng chạy trốn.