计全宋州
刘昌出身行伍,少时学习骑射。天宝十四载(755年),范阳、平卢、河东节度使安禄山起兵叛乱,年未弱冠的刘昌跟随河南防御使张介然御敌,被任命为易州遂城府左果毅。
宝应元年(762年),叛军首领史朝义派兵围攻宋州(今河南商丘),城中粮食耗尽,即将失陷。当时,刘昌也在城中,为宋州刺史李岑谋划道:“如今河阳有李太尉(李光弼)克敌制胜,况且江、淮地区兵力充足,本城府库中尚有数千斤酒曲,可以弄碎后食用。估计援兵不到二十日就应该会抵达。城东南角的敌军,大家认为最为危险,我请求前往守卫。”刘昌于是披甲持盾登城,向叛军陈述逆顺的道理,使其畏服。十五天后,河南副元帅李光弼果然率援军抵达,大破史朝义。李光弼听说刘昌的计谋后,将他召至军中,破格试用为左金吾卫郎将。
广德二年(764年),李光弼去世,宰相王缙出任河南副元帅。王缙让刘昌回到宋州,任牙门将。后转为太仆卿,兼任许州别驾。
屡立功勋
大历十一年(776年),汴宋都虞候李灵曜占据汴州(今河南开封)谋反。汴宋兵马使李僧惠是李灵曜的谋主,刘昌暗中派僧人神表劝说李僧惠归顺。李僧惠召来刘昌,向他问计,刘昌哭着陈说逆顺的道理。李僧惠深为感动,于是让神表携奏章前往京师,请求讨伐李灵曜,成功剪除了叛军的左翼。十月,汴州被收复,叛乱平定。当时,淮西节度使李忠臣击杀了与自己争功的李僧惠,又想杀害刘昌。刘昌闻讯后,马上逃走,这才幸免于难。
大历十二年(777年),永平军牙将刘玄佐出任宋州刺史,将刘昌复职。后来,刘昌又改任太常卿兼华州别驾。
唐德宗建中二年(781年),刘玄佐升任宋亳颍节度使(宣武节度使),建号宣武军。刘昌自下级军官一跃升为左厢兵马使。同年,平卢节度使李正己死后,其子李纳匿丧谋叛。刘昌领偏师收复考城,加官行营诸军马步都虞候、检校太子詹事兼御史中丞。
建中三年(782年),刘玄佐进攻李纳治下的濮州,授刘昌为摄(代理)濮州刺史。
固守宁陵
建中四年(783年)十二月,叛乱的淮西节度使李希烈攻陷汴州,旋即再陷襄邑(今河南睢县)。刘洽所派精兵五千人全军覆没,自宋州至江、淮地区,人心大为震恐。李希烈率五万大军乘胜进攻宁陵(今河南宁陵),引河水灌城。刘昌当时率三千人(一作两千人)保卫宁陵,他深挖壕沟以防叛军由地道入城。在四十五日内,刘昌不解甲胄,亲自激励士卒坚守。至兴元元年(784年)二月,镇海军节度使韩滉派部将王栖曜等率军救援。王栖曜先派数千名强健的弩手游过汴水,乘夜入城。次日,弩手从城上射击李希烈,箭矢射至叛军帐幕中。李希烈大惊道:“宣、润的弩手到了!”便解除宁陵之围,自行离去。
解围陈州
此后,李希烈又派部下骁将翟崇晖帅兵围攻陈州,陈州刺史李公廉束手无策。兴元元年(784年)闰十月,刘玄佐派刘昌与陇右、幽州行营节度使曲环领兵三万援救陈州。十一月,刘昌至陈州之西五十里处,与翟崇晖相遇。刘昌趁清晨逼近敌阵,趁其阵势不整,一举发动进攻,斩杀叛军三万五千人,生擒翟崇晖。李希烈闻讯后,只得退保蔡州,不敢再行入侵。此役后,刘昌因功被加授为检校左散骑常侍。不久后,刘昌又随刘玄佐收复汴州,再加检校工部尚书,增加实封食邑至二百户。适逢母亲去世,刘昌离职服丧。丧期未满,又被起复为金吾卫大将军。朝廷追赠其母为梁国夫人。
久镇泾原
贞元二年(786年)十一月,刘昌随刘玄佐入朝觐见。次年,德宗选取宣武士卒八千人,命刘昌率其北出五原,参与防秋。军中有人退缩不前且阻碍行进,刘昌相继斩杀三百人,才得以顺利前行。不久后,朝廷命刘昌以原职兼任京西北行营节度使。此后,因吐蕃退去,刘昌奉诏将五千宣武士卒遣还汴州,其余三千人编属于京西北行营。
贞元四年(788年),刘昌升任泾州刺史,充任四镇、北庭行营兼泾原节度、支度、营田等使(泾原节度使)。刘昌就任后,先重筑了此前被吐蕃破坏的连云堡,以防固泾州边备。
贞元七年(791年)二月,刘昌奉命修筑平凉城,拓地二百里(《读史方舆纪要》作三百里),以控扼弹筝峡口。又西筑保定堡,捍卫青石岭。十二日之内,便已完工。三月,刘昌又于平凉西部三十五里处另筑胡谷堡,取名为彰义堡。平凉地处地方交集的要地,刘昌分兵驻守,控制交通要道,为安定边境立下功劳。刘昌在任内,共建成七城、二堡。又亲自率领士兵耕作三年,使军粮丰足有余,声名远扬至朝中。
贞元十二年(796年),德宗为表嘉赏,下诏加授刘昌为检校右仆射,累封南川郡王。
贞元十四年(798年),归化堡发生兵变,大将张国诚被驱逐。刘昌奉命讨伐,诛杀乱兵数百人,重新让张国诚统领此堡。
病逝军镇
刘昌镇守泾原十五年,强本节用,使军储富裕、兵械锋锐,边境安宁。贞元十九年(803年)四月,刘昌请求将原州的州治移至平凉城,德宗允准。此年,刘昌患病。德宗允其赴京求医,尚未成行,已于五月十五日(6月7日)病逝,享年六十五岁(《旧唐书》误作六十四)。德宗闻讯后,为其辍朝一日,追赠司空。十月,刘昌归葬于京师长安。