錢收完了,該出貨了。這章是系統與實體世界的交界——留言、庫存、金流都活在資料庫裡,但貨是真的紙箱、真的倉庫、真的宅配司機。也因此,這是全系列「系統邊界」劃得最有意識的一章:哪些歸系統管、哪些交給人,當年的答案比我記憶中更聰明。
先把時序擺正:主播直播時跟廠商談好「有多少貨」——這個數字進了庫存章的上限,系統拿它守住不能超賣。但下播之後,採購流程才真正開始;採購本身不在系統內,系統看到的下一個事實,是營運把實際到貨填成入庫單——一筆一筆 append 的紀錄,庫存的每次調整都有 log 可看。
所以這個系統其實有兩本庫存,庫存表上就是分開的兩個欄位、各司其職:
兩本帳天生會歪——談好 100 件、廠商到貨 80 件(短交),或貨損、或規格不符。這不是 bug,是代購這門生意的常態。問題只有一個:歪了之後,誰的單有貨、誰的單要等?
當年的答案是一套配貨系統:把實際到的庫存,分配給承諾過的訂單。

配貨系統有三個設計,每個都值得停一下:
這章最值得學的,其實是系統選擇不做什麼:實際上有很多個倉,系統不管;揀貨怎麼撿、有沒有條碼、短少怎麼辦,系統都不管。系統的責任在「訂單變出貨單」畫上句點,之後——7-11 走 API(客人在網頁選店號)、宅配靠人工匯出 CSV 交給貨運——剩下是營運的世界。運費和條件則設定在檔期層,跟優惠券、結算同一個範疇,檔期第三次證明自己是這個系統天然的設定邊界。
這條線劃的位置有邏輯:它恰好是資訊流和實體流的分界。資訊錯了會超賣、會收錯錢——違約成本高、人眼看不見,系統必須守;實體錯了(撿錯貨、少一箱)現場看得到、當場能修——人比系統更適合守。六個工程師的複雜度預算,再一次花在刀口上。
當年的形狀能跑,但有一個結構性的彆扭:購物車章(Day 9)說 order 按檔期切、是履約單位——於是payment 已經跨檔期了,出貨卻還被檔期綁著。客人買了三個檔期的貨,想一箱寄來?結構不順。重來版分三步,一步比一步深:

當年不做倉儲管理、不做揀貨系統、出貨靠人工 CSV——年輕時我大概會把這些列成「技術債清單」。現在我認為它們是自知:系統守資訊流(錯了會超賣、會錯錢、人看不見),人守實體流(錯了看得見、修得快)。把系統硬伸進倉庫,要處理的是條碼設備、盤點差異、人員操作習慣——每一項都是新的複雜度來源,而它們換來的正確性,人力本來就守得住。邊界不是能力的極限,是責任的極限:劃在你能為錯誤負責的地方,而不是技術能延伸到的地方。
狀態機被主播拔掉、退款讓營運去銀行按、配貨「按他們想要的方式」——同一個哲學在這個系統落地三次,沒有一次是妥協,每一次都是正確的分工:系統擅長記錄與守不變量,人擅長判斷與扛例外。配貨系統最聰明的地方,是它不試圖演算法化「短交時犧牲誰」這種商業判斷,但把每個判斷都變成配貨紀錄表裡可追溯的事件——人自由,帳清楚。這比「全自動配貨引擎」誠實,也比「Excel 裡自己喬」可靠,它站在兩者中間的甜蜜點上。
「履約拆成貨運系統」聽起來像大重構,但仔細看:那個介面(一批可履約的訂單)當年就以人工 CSV 的形式存在,而且一直跑得穩——重來只是把這條人力跑出來的斷面正式化。這是我對架構演進最相信的一件事:好邊界不是設計出來的,是觀察出來的。 系統裡那些「long-lived 的人工流程」——每週固定匯出的報表、營運固定貼給誰的檔案——都是還沒被承認的介面。想知道系統該從哪裡拆,別開白板會議,去看人們已經在哪裡交接。
明天換個視角:替這個平台工作的人——主播、助理、營運、客服——他們看到的系統長什麼樣?
本文改寫自我的部落格系列《Re:從零開始做直播代購電商平台》,本篇完整版:https://blog.aidan.tw/blog/rezero-fulfillment/