Toa Đô và Ô Mã Nhi ở Thanh Hoá, Nghệ An giao chiến với quân Trần do Trần Quang Khải chỉ huy mấy lần đều bị đẩy lui. Lương thực gần cạn, tới mùa hè nóng bức, quân Nguyên không hợp thời tiết, hai tướng bèn bỏ ý định truy tìm vua Trần mà vượt biển ra bắc để hội binh với Thoát Hoan.
Trần Quang Khải thấy quân Nguyên rút ra bắc bèn báo với vua Trần. Vua Trần cùng các tướng nhận định rằng: Quân Nguyên nếu còn mạnh, ắt truy kích vua Trần từ hai mặt nam bắc; nay cánh phía bắc không tới, cánh phía nam rút đi tức là đã mỏi mệt. Nhà Trần xác định đây là thời cơ phản công.
Trần Nhân Tông sai Trần Nhật Duật làm chánh tướng, Chiêu Thành Vương và Trần Quốc Toản làm phó tướng đi cùng với Nguyễn Khoái mang 5 vạn quân ra bắc đuổi đánh Toa Đô. Trong quân Trần Nhật Duật có tướng người Trung Quốc của nhà Tống cũ là Triệu Trung theo hàng.
Trần Nhật Duật gặp binh thuyền Toa Đô ở bến Hàm Tử, bèn chia quân ra đánh. Hai bên chống nhau ác liệt. Toa Đô đi đường xa, giao chiến lâu ngày đã mỏi mệt, trông thấy cờ hiệu Tống của Triệu Trung, lo lắng tưởng rằng nhà Tống đã khôi phục sang giúp Đại Việt. Nhóm quân người Hoa trong hàng ngũ quân Trần đều muốn trả thù nên đánh rất hăng.
Trong khi đó quân Trần lại dùng kế ly gián, bắn tên gắn giấy sang bên quân Nguyên, nói rằng chỉ đánh người Thát Đát chứ không đánh người Hoa. Điều đó khiến nhiều tướng sĩ người Hoa trong quân Nguyên không tận lực chiến đấu hoặc trở giáo sang hàng quân Trần. Toa Đô bị thua to.
Sử liệu dẫn khác nhau về các tướng tham chiến. Có tài liệu cho rằng Trần Nhật Duật cùng Trần Quốc Toản, Nguyễn Khoái và Triệu Trung cùng đánh trận Hàm Tử , có tài liệu dẫn rằng chỉ có Nhật Duật và Triệu Trung đánh Hàm Tử, còn Nguyễn Khoái và Trần Quốc Toản đánh trận Tây Kết