宋忠將兵3萬,駐軍開平,是防備燕王的重要軍事力量。燕王舉事後,宋忠未敢貿然進軍,而是移軍懷來。朱棣控制了北京城,招降守備通州的通州衛指揮僉事房勝,攻取薊州。居庸關被朱棣攻破,守將率敗軍歸附宋忠。宋忠為調動士氣,謊稱原來燕王府守衛的家屬被燕王殺害了。燕王知道這一情況後,特意讓那些士兵的親屬打前鋒。原燕王府守衛看到家人沒有死,惱怒宋忠欺騙他們,就臨陣倒戈。宋忠頓時陣腳大亂,燕王趁機麾軍過河,直撲過來。宋忠由是大敗,逃回城內,結果城破被捉於廁所內。

懷來擊敗宋忠,是朱棣起兵後第一次大規模的戰鬥。這次戰鬥,斬首數千人,繳獲戰馬八千餘匹和大量的軍械。更為重要的是,懷來之戰解除了北平周圍的軍事威脅,提高了軍威。不久開平、龍門、上谷、雲中、永平等處守軍紛紛投降,壯大了朱棣的力量。

八月,建文帝命老將耿炳文率兵13萬征討燕王。由於朱元璋幾次藉故大殺功臣後,

朝廷中已經沒有幾個能征慣戰的武將了,所以儘管耿炳文當時已經65歲了,也只能披掛出征。耿炳文駐軍真定,派前鋒9000人據守雄縣。朱棣探知清楚後,於八月十五日悄然來到雄縣。

正值中秋之夜,守城士兵飲酒賞月,放鬆了警惕。當發現燕兵時,朱棣的軍隊已經攀上了城牆,守軍倉促應戰。這支部隊是南軍的精銳,戰鬥力很強,直到第二天破曉之時,朱棣才攻佔縣城,南軍全部力戰而死。

離雄縣50裡的莫州,由潘忠、楊松率軍駐守。朱棣料定二人會來援救,命千餘勇士埋伏在必經之路的月漾橋下的水中。潘忠果然帶兵來援,見雄縣已失,想退回莫州,不料燕兵突然從水中冒出來,佔據了月漾橋。這樣前後夾擊,南軍大敗,許多人掉進河裡淹死了,潘忠被俘。朱棣乘勝追擊,招降了莫州留守的萬餘人。一天之內,南軍損失了3萬人馬。

這時南軍尚有10萬人馬,駐兵真定,分為兩營,列於河兩岸,互相聲援。耿炳文擔心燕軍勢盛,下令移營合兵。朱棣趁機率軍猛攻,南軍倉促應戰。戰鬥十分慘烈,最終南軍不敵燕軍鐵騎,退守真定城,不再出戰。耿炳文長於固守,而所率軍兵多步兵;燕軍多騎兵,擅長野戰。朱棣認為耿炳文是富有作戰經驗的老將,不好對付,擔心時間一長,士氣低落,遂圍城三日後退回北平。

真定一戰,南軍損失數萬人馬,但主力尚存。如果堅持固守策略,朱棣還真沒有什麼好辦法。然而建文帝對戰事甚不滿意,命李景隆接替耿炳文,意圖從速殲滅燕王朱棣。臨陣換將,本是兵法大忌,何況李景隆然而缺乏作戰經驗,是一個紙上談兵的紈絝子弟。

李景隆放棄了耿炳文穩健的策略,率軍直撲北平,分兵三處:一軍攻打北平九門;一軍攻打通州;自己駐紮鄭村壩(北平東20裡)。當時朱棣赴大寧尋求救兵,北平守備空虛。攻打北平的戰鬥十分激烈,正陽門情勢岌岌可危。燕王妃徐氏親率婦女登城,投擲石塊,幫助守衛城門。主攻彰義門的瞿能父子驍勇善戰,率領精騎一度攻入城內,然而李景隆卻命令等待大隊人馬,結果貽誤戰機,守軍以水潑城,一夜成冰,第二天已經難以攀爬了。守軍並沒有一味死守,而是在夜裡不斷派遣小股部隊騷擾南軍,弄得南軍精疲力竭,人心不寧。

十一月,朱棣已經收編了寧王的部隊歸來,包括能征慣戰的朵顏三衛騎兵,實力大為增加。李景隆派陳暉率一萬騎兵東行,尋找機會迎擊燕軍,不