承運商追蹤狀態標準化:如何將承運商事件對應至單一狀態模型
承運商追蹤狀態標準化,是指將各承運商特有的掃描代碼及訊息轉換為一致的貨件模型,同時保留原始證據。要可靠地實現這一點,請將每個事件映射至標準狀態及原因,然後根據事件時間、貨件背景及明確的狀態轉換規則,計算貨件目前所處的狀態。不要自動將最新收到的訊息視為貨件目前的狀態。

本指南適用於在訂單管理系統、支援儀表板或客戶通知流程中建立追蹤功能的開發人員、物流營運團隊及產品負責人。以下模型是建議的實作模式,並非官方承運商標準,也不是任何追蹤服務提供商的狀態分類法複製版本。
分開處理承運商事件與貨件狀態
追蹤事件描述貨件中發生的某項已報告事情:標籤已建立、包裹抵達某個設施,或派送嘗試失敗。貨件狀態則是你的應用程式在特定時間點,根據相關證據作出的解讀。這兩個概念應分開儲存。
例如,包裹可能先出現派送嘗試事件,之後再出現抵達設施事件。抵達事件是有用的營運歷史,但不一定表示派送失敗的情況已經解決。相反,在派送確認之後才收到的延遲掃描,也不應自動將包裹重新轉為運送中。
實際的架構可分為三層:
- 原始證據:原始承運商或服務提供商的資料,包括代碼、文字、時間戳及識別碼。
- 標準化事件:使用具版本的映射規則,對每個個別事件作出的解讀。
- 目前貨件投影:從事件歷史中選出的狀態,加上任何有效條件及客戶操作。
這種分離方式讓你可以修正映射並重新建立貨件狀態,而不必捨棄原始記錄。
建立精簡的狀態模型,並分開處理條件
當單一狀態欄位必須同時表示實體運送、海關處理、派送問題及退貨時,便會難以維護。請使用小型的生命週期模型,再附加更具體的條件及原因。
| 標準狀態 | 建議含義 | 需要保留的界線 |
|---|---|---|
| UNKNOWN | 無法有信心地映射證據。 | 不等同於遺失或延誤。 |
| PRE_TRANSIT | 已有電子貨件資料,但尚未確認承運商已實際接收。 | 建立標籤並不代表承運商已持有包裹。 |
| IN_TRANSIT | 貨件正在配送網絡中運送,或正在網絡內接受處理。 | 不代表貨件會在當天送達。 |
| OUT_FOR_DELIVERY | 來源明確報告貨件已派出,準備進行派送嘗試。 | 抵達本地設施並不足以作此判定。 |
| READY_FOR_PICKUP | 貨件已明確可供收件人領取。 | 單純抵達自取地點,未必足以確認貨件已可領取。 |
| DELIVERED | 已明確確認相關貨件路段完成派送。 | 承運商之間的交接不一定等同於送達收件人。 |
| CANCELED | 來源明確確認貨件記錄已取消。 | 訂單取消並不代表包裹已停止運送。 |
請將 CUSTOMS_PROCESSING、DELIVERY_ATTEMPT_FAILED、ADDRESS_ISSUE 或 DELAY_REPORTED 等條件置於主要生命週期欄位之外。貨件可以維持 IN_TRANSIT,同時存在需要處理的地址問題。除非來源報告扣留、問題或需要採取行動,否則不要將例行海關處理標記為例外。
請使用例如 journey_type 的欄位,分開表示運送方向。退貨可以有自己的運送中及已送達狀態。這樣可避免將送回寄件人的派送,誤解為成功送達買家。
在編寫映射規則前先建立事件記錄
標準化記錄應包含足夠背景,以解釋映射方式並重現結果。可從以下架構開始:
- 識別資料:內部貨件 ID、承運商識別碼、追蹤號碼、來源及貨件路段。
- 原始證據:原始事件代碼、原始描述、來源提供的事件 ID,以及原始資料的參照。
- 時間資料:事件發生時間、時區資料、接收時間及時間戳精確度。
- 解讀資料:標準狀態、條件、原因代碼、運送類型及所需行動。
- 可追溯性:映射規則 ID、映射版本及信心類別。
請將事件發生時間與系統收到更新的時間分開儲存。下午收到的 webhook 可能描述早上的掃描。輪詢回應也可能包含多個歷史事件,而不是一個新事件。
當已知時間及偏移量時,請使用 RFC 3339 等有文件記錄的時間戳格式。如果來源提供的是沒有可靠偏移量的本地時間,請保留這項限制,而不要添加虛假的 UTC 標示。只有日期的事件,應以只有日期的證據儲存,不要自行虛構精確的掃描時間。
請按照適當的存取控制及保留規則儲存原始資料。原始資料可能包含收件人詳情或其他不應放入廣泛可存取分析表格的資訊。
先映射承運商代碼,再謹慎使用文字
請從針對特定來源及承運商的規則開始。01 等代碼在其已記錄的背景之外,沒有可靠的含義。如果來源區分服務、地區或路段,且這些維度會影響解讀,請將其納入。
請將以下映射次序作為預設實作方式:
- 匹配有文件記錄的結構化事件代碼及任何必要限定條件。
- 在清楚描述正在處理的事件時,使用有文件記錄的來源狀態或子狀態。
- 對缺乏足夠結構化欄位的已知訊息,套用範圍狹窄的文字規則。
- 對未能解決的事件保持未映射,並將重複出現的個案交由審核。
首先確認服務提供商的狀態欄位描述的是個別事件,還是貨件目前的摘要。將貨件層級摘要複製到每個歷史事件上,可能會令較早的掃描看起來像是派送確認。
避免使用例如「包含 delivered」的全域關鍵字規則。「not delivered」也會被匹配,描述向物流合作夥伴派送的訊息也可能被匹配。文字規則需要處理否定、語言背景及排除條件。機器翻譯可以協助審核人員理解訊息,但翻譯後的措辭不應在不知情的情況下成為權威的事件定義。
示例映射及其限制
以下例子使用虛構訊息來示範規則設計,並非經核實的承運商代碼,也不是特定承運商的準確訊息。
- 「Shipment details submitted」:當來源定義表示只有電子資料時,映射至
PRE_TRANSIT。 - 「Accepted at origin facility」:當事件確認已實際接收貨件時,映射至
IN_TRANSIT。 - 「Recipient unavailable; attempt unsuccessful」:記錄
DELIVERY_ATTEMPT_FAILED,並根據周邊證據評估生命週期。不要推斷貨件已可供領取。 - 「Available for collection」:當來源確認收件人可以領取時,映射至
READY_FOR_PICKUP。 - 「Transferred to delivery partner」:記錄交接並保留適當的運送中狀態,而不是標記為已完成送達收件人。
每條規則都應有簡短的理由及負責人。當營運專員質疑某項映射時,團隊應能找出確切規則,而不是反向推測面向客戶的標籤。
使用確定性的 reducer 計算目前狀態
reducer 是評估標準化事件並產生目前貨件投影的函數。對於相同的證據及規則版本,無論輸入被重播多少次,它都應返回相同結果。
去除重複,但不要刪除有意義的掃描
如有穩定的來源事件識別碼,應優先使用。否則,請根據可用屬性建立去重鍵,例如貨件識別資料、承運商、代碼、發生時間及地點。請考慮時間戳精確度及來源行為。兩次描述相同的掃描不一定是重複事件,尤其當包裹再次經過同一設施時。
排序事件時不要假設時鐘完全準確
在可用的情況下,請使用可信的發生時間及有文件記錄的順序資料。接收時間可以協助解決同一時間的情況,但不應例行地覆蓋較早的發生時間。如果時間戳互相衝突或無法可靠比較,請保留不確定性,而不要製造確定性。
驗證狀態轉換,不要指定通用排名
簡單的狀態數值排序無法表示每一種貨件旅程。包裹可能在派送嘗試失敗後,由派送中返回運送中。領取可用性可能會失效。明確的更正可能會使派送確認失效。
請定義允許的狀態轉換,以及每種轉換所需的證據。對一般較舊的掃描,應保護已送達狀態,但允許有文件記錄的更正或獲授權的營運覆寫。請記錄任何覆寫的原因及來源。
獨立追蹤有效條件
較後的運送掃描可能顯示進度,但不能證明付款或地址問題已解決。請定義針對不同條件的清除規則:明確解決、邏輯上可推斷為已解決的事件,或獲授權的手動操作。不要因為收到另一個事件,就清除所有條件。
此外,請區分承運商報告的延誤與你自行發出的無活動警示。沒有新掃描是對資料新鮮度的觀察,並不代表包裹已遺失。
將承運商交接及退貨處理為相關聯的運送旅程
跨境追蹤可能涉及多個承運商及識別碼。請保留內部貨件識別資料,並將承運商專用的追蹤參照附加至相關路段。請使用來源提供的關係或已核實的營運資料來連結參照,而不要只根據相似目的地或接近的時間戳。
路段層級的送達事件應在背景中解讀。送達集運設施或合作夥伴網絡可能完成該路段,但不代表已完成送達買家。你的貨件投影需要知道該事件所代表的目的地。
同樣地,請分開處理「已要求退貨」、「已開始退貨運送」及「已退回寄件人」。這些代表不同里程碑。退貨要求不代表包裹已實際運回,而逆向旅程的送達確認應標明退貨目的地。
使用追蹤 API,但不要放棄你的業務規則
多承運商整合可以提供共同的資料接收點,但共用的回應格式並不會消除清晰內部契約的需要。在評估 17TRACK Tracking API 時,請使用其官方文件,以核對與你的實作相關的欄位及介面含義。不要假設本指南提出的狀態與其原生分類法一致。
在將任何 API 連接至客戶通知或營運自動化之前,請先確立:
- 哪些欄位描述個別事件,哪些欄位描述目前貨件摘要。
- 哪些原始承運商詳情會被提供及可以保留。
- 時間戳、缺失值、更正及重複更新如何表示。
- 如何區分退貨旅程及送達中間合作夥伴。
- 整合如何回應未知代碼或未來的結構描述變更。
請在外部回應與標準模型之間保留一個精簡的介面轉接層。這讓應用程式的其餘部分可以使用一套追蹤狀態契約,而不必依賴每個上游欄位名稱。請將通知規則視為另一層:新的標準化事件不應自動觸發客戶訊息。
測試事件歷史,而不只是個別映射
某項映射單獨來看可能正確,但仍可能產生錯誤的貨件狀態。請測試完整歷史,包括以不同於發生時間的順序送達的更新。
- 延遲歷史:派送確認早於較舊的運送中掃描抵達。貨件仍維持已送達。
- 重複接收:同一事件再次被處理。不會發送重複的客戶通知。
- 派送嘗試失敗:派送中之後出現不成功的嘗試。在沒有支援證據的情況下,投影不再表示正在進行中的派送。
- 可領取準備:包裹在確認可領取之前抵達領取設施。不要過早發出領取指示。
- 未知事件:出現新代碼。保留原始記錄,不要自動以未知狀態取代先前已確立的貨件狀態。
- 退貨運送:逆向旅程在寄件人處結束。不要將原本送往買家的派送標記為成功。
- 更正:明確的來源更正透過可審計的轉換改變結果。
按承運商及來源監察未映射事件、文字後備規則使用情況、無效狀態轉換及重複通知嘗試。請區分映射完整性與映射正確性:識別出每個代碼,如果解讀錯誤,也沒有實際價值。
在部署映射變更前,請重播具代表性的歷史並比較新舊投影。檢查會影響派送確認、領取指示、退貨完成或客戶操作的差異。為規則設定版本,讓支援人員可以解釋系統為何產生特定結果。
常見問題
每個追蹤事件都應該只有一個狀態嗎?
每個事件可以有一個主要的標準化解讀,但也可能需要條件、原因及運送背景。將所有含義強行放入一個扁平的狀態清單,會令模型更難使用及維護。
未知事件應否取代目前貨件狀態?
通常不應。保留事件的未解決映射,同時保留最後一個受支援的貨件狀態。請另外顯示資料新鮮度,讓使用者不會將舊有的已確認狀態誤認為最近更新。
已送達的貨件可以返回運送中嗎?
較舊的運送中掃描不應導致這種變更。經核實的更正可能足以支持變更,而新開始的退貨旅程通常應分開表示。狀態轉換需要明確原因,而不只是較後的接收時間戳。
應如何表示缺失的追蹤更新?
請使用內部新鮮度指標或無活動警示。將其與承運商報告的延誤、遺失或例外狀態分開。任何升級門檻都應反映你的服務承諾及營運政策,而不是通用假設。
誰應該批准映射變更?
工程團隊應負責實作及重播測試;物流營運團隊應驗證運送含義;客戶體驗負責人應批准對訊息傳達的影響。請指定一名具名決策負責人,避免含糊事件無限期保持未解決。
來源
- RFC 3339: Date and Time on the Internet: Timestamps — 時間戳表示方式及數值偏移量的參考資料。
- 17TRACK Tracking API — 上述追蹤 API 整合的官方入口。
- 17TRACK API documentation — 用於核對服務提供商契約的實作參考;本文的標準模型及映射示例是建議的設計模式,並非服務提供商專屬定義。


