从明万历十九年(1591年)正月开始,努尔哈赤挥师东向,攻取鸭绿江路。
万历二十一年(1593年)末,相继征服珠舍里路和讷殷路,将长白山部纳入自己的势力范围。进而,他出兵夺取东海部。由于努尔哈赤于万历十五年(1588年)六月正式颁定国政,自称淑勒贝勒之后,就引起海西女真的不满。
万历二十一年(1593年)九月,正当努尔哈赤率兵东向,征讨长白山各部的时候,海西女真叶赫部首领卜寨联合乌拉、辉发、哈达及蒙古科尔沁等9部向建州发动进攻。双方战于古勒山。努尔哈赤集中兵力,攻其主力,大败9部联军,阵斩卜寨,生擒乌拉部首领布占泰,从而为其统一战争奠定了基础。由于海西势力强大,难以迅速征服,努尔哈赤遂采取远交近攻、分化瓦解,各个击破的策略。在与明廷深示臣服,与朝鲜、蒙古表示友善的同时,重点拉拢势力较强的叶赫、乌拉二部。
万历二十四年(1596年)七月,努尔哈赤送回布占泰,支持布占泰为乌拉首领,又娶其妹为妻。
万历二十五年(1597年)正月,又与叶赫首领布杨古、锦台失联姻,椎牛刑马为盟,逐步孤立了哈达部和辉发部。
万历二十七年(1599年)九月,努尔哈赤以背盟为由,灭掉哈达部,擒杀猛格孛罗。同年,努尔哈赤采用了蒙古文字而为满语配上了字母。
海西女真的削弱,使努尔哈赤得以全力进攻东海部。从万历二十六年(1598年)正月至万历四十三年(1615年)十一月,努尔哈赤连续进兵东海,相继征服渥集部的瑚叶路、那木都鲁、绥芬、宁古塔、尼马察、雅兰、乌尔古宸、木伦、西林等路,攻占渥集部东额赫库伦城。东海库尔喀部亦纷纷归附。
万历二十九年(1601年),努尔哈赤去北京向明朝朝贡。
万历三十一年(1603年),迁都到赫图阿拉。
万历三十五年(1607年)正月,东海女真瓦尔喀部蜚悠城主策穆特黑前来拜见努尔哈赤,述说其部在投奔乌拉后,屡次遭到布占泰的羞辱,希望可以归附建州。于是,努尔哈赤命令舒尔哈齐、长子褚英、次子代善、以及费英东、扈尔汉、扬古利三员大将率三千兵马即刻赶至蜚悠城收服部众。布占泰闻讯后,派其叔博克多率军一万余兵马前往截击。舒尔哈齐因与布占泰之姻亲关系,同部将常书、纳齐布止步于山上,按兵观望。当时大雪纷飞,扈尔汉、扬古利分兵保护投奔之部民后,率二百兵与乌拉军先锋在乌碣岩展开激战。随后褚英、代善各率兵五百从两翼夹击,乌拉军大败,代善阵斩乌拉主将博克多父子,副将常柱父子和胡里布兵败被俘。此役,建州军斩杀乌拉军三千余众,得马匹五千余、甲三千余,获得大胜。乌碣岩之战进一步地削弱了乌拉的实力,而且也打通了建州通往乌苏里江流域以及黑龙江中下游之路,对后来招抚野人女真起到了作用。
不久,褚英、代善等率五千兵再克乌拉之宜罕山城。万历四十年(1612年)九月,布占泰联合蒙古科尔沁部率兵攻打建州所属的虎尔哈路。同年十二月,努尔哈赤率五子莽古尔泰、八子皇太极亲征乌拉,建州兵沿乌拉河南下,连克河西六城后,兵临乌拉城下。努尔哈赤命令建州军攻乌拉城北门,焚其粮,毁其城门。布占泰见势不妙,再度乞和。他乘独木舟至乌拉河中游向努尔哈赤叩首请罪、请求宽恕。努尔哈赤在痛斥布占泰的种种罪状后撤军返回建州。努尔哈赤返回后,布占泰将怒火转移到了其两位妻子,努尔哈赤之女穆库什和努尔哈赤侄女额实泰等身上。布占泰曾以箭射向穆库什,随后又将她们囚禁。
万历四十一年(1613年)正月,努尔哈赤以背盟、囚妻、送人质于叶赫等理由,率代善、侄阿敏、大将费英东、额亦都、安费扬古、何和礼、扈尔汉等三万大军再征乌拉。建州军势如破竹,连下三城。对布占泰不满的贵族、乌拉孤立无援之部民均望风而降。布占泰率军三万驻守伏尔哈城,决定与努尔哈赤决战。双方厮杀,乌拉大败,兵马十损六七。建州军一鼓作气直奔乌拉城,布占泰令次子达拉穆率兵防守。这时安费扬古一面用云梯攻城、一面命士兵拿出准备好的土包抛向乌拉城下,不久即与城墙高度平齐,建州军登城而入。努尔哈赤坐在西门城楼上,两旁竖起建州旗帜。布占泰大势已去,麾下之兵已不满百,见到建州旗帜夺路而逃。途中又被代善截击,布占泰仅以身免,单骑投叶赫而去。建州攻占乌拉城,乌拉灭亡。努尔哈赤在乌拉停留十天,将包括布占泰诸子在内的众乌拉降民编成万户一同带回建州。
万历四十一年(1613年),努尔哈赤在吞并哈达、辉发的基础上再灭乌拉,乌拉贝勒布占泰单骑脱逃至叶赫。努尔哈赤三次向叶赫索要布占泰,均遭到拒绝。九月,努尔哈赤率领四万大军攻打叶赫。建州军连克吉当阿、兀苏、呀哈、黑儿苏等大小城寨十九座,直逼叶赫东西二城。叶赫遂向明朝求援,明朝派游击马时楠、周大歧领兵千人带火器进驻叶赫。努尔哈赤见叶赫有备,于是焚其庐舍,携带降民返回建州。
万历四十三年(1615年)五月,叶赫布扬古贝勒把东哥许配给蒙古暖免的儿子蟒古儿大,并捕捉建州6人。七月,努尔哈赤乘叶赫老女与蒙古成婚之机,发兵三千,屯驻南关旧地,准备一举荡平叶赫,由于明廷的再次干涉,努尔哈赤只好暂时息兵。
<script type='text/javascript'>try{ggauto;} catch(ex){}</script>