配送業者の追跡ステータスの正規化:配送業者のイベントを1つのステータスモデルにマッピングする方法
配送業者の追跡ステータスの正規化とは、元の証拠を保持しながら、配送業者固有のスキャンコードやメッセージを一貫した配送モデルに変換することです。信頼性の高い実装を行うには、各イベントを正規ステータスと理由にマッピングし、イベントの発生時刻、配送情報のコンテキスト、明示的な遷移ルールを用いて配送の現在状態を計算します。最も新しく受信したメッセージを、自動的に配送の現在ステータスとして扱わないでください。

このガイドは、注文管理システム、サポートダッシュボード、顧客通知ワークフローに追跡機能を組み込む開発者、物流業務チーム、プロダクトオーナーを対象としています。以下のモデルは提案された実装パターンであり、公式の配送業者標準や、いずれかの追跡プロバイダーのステータス分類を再現したものではありません。
配送業者のイベントと配送状態を分離する
追跡イベントは、ラベルが作成された、荷物が施設に到着した、配達の試みが失敗したなど、配送について報告された事実を表します。配送状態は、特定の時点における関連証拠をアプリケーションが解釈したものです。これらの概念は分けて保存してください。
たとえば、荷物に配達試行イベントがあり、その後に施設到着イベントが発生する場合があります。到着は業務上有用な履歴ですが、失敗した試行の状態が解決されたことを必ずしも意味しません。逆に、配達完了の確認後に遅延したスキャンが到着しても、荷物を自動的に輸送中へ戻すべきではありません。
実用的なアーキテクチャは、次の3つの層で構成されます。
- 生の証拠: コード、テキスト、タイムスタンプ、識別子を含む、配送業者またはプロバイダーからの元のペイロード。
- 正規化イベント: バージョン管理されたマッピングルールを用いた、各個別イベントの解釈。
- 現在の配送投影: イベント履歴から選択された状態に、アクティブな条件と顧客対応を加えたもの。
この分離により、元の記録を破棄せずにマッピングを修正し、配送状態を再構築できます。
条件を分離した簡潔なステータスモデルを定義する
物理的な移動、通関処理、配達上の問題、返品を同時に表現する必要がある場合、単一のステータスフィールドは維持が難しくなります。小規模なライフサイクルモデルを使用し、より具体的な条件と理由を付加してください。
| 正規ステータス | 推奨される意味 | 保持すべき境界 |
|---|---|---|
| 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が、午前中のスキャンを示している場合があります。ポーリングの応答にも、新しいイベントが1件ではなく、複数の過去イベントが含まれることがあります。
時刻とオフセットが分かっている場合は、RFC 3339などの文書化されたタイムスタンプ形式を使用してください。情報源が信頼できるオフセットなしの現地時刻を提供する場合は、偽のUTC指定を追加せず、その制限を保持してください。日付のみのイベントは、正確なスキャン時刻を作り出さず、日付のみの証拠として保存してください。
生のペイロードは、適切なアクセス制御と保存期間のルールの下で保管してください。そこには、広くアクセス可能な分析テーブルには含めるべきでない受取人の詳細やその他の情報が含まれる場合があります。
まず配送業者コードをマッピングし、テキストは慎重に使用する
特定の情報源と配送業者に限定したルールから始めてください。01のようなコードは、文書化されたコンテキストの外では信頼できる意味を持ちません。情報源がサービス、地域、配送区間を区別している場合は、解釈に影響する限り、それらの要素を含めてください。
実装のデフォルトとして、次のマッピング順序を使用してください。
- 文書化された構造化イベントコードと、必要な修飾子を照合する。
- 処理対象のイベントを明確に説明している場合は、文書化された情報源のステータスまたはサブステータスを使用する。
- 十分な構造化フィールドがない既知のメッセージには、範囲を限定したテキストルールを適用する。
- 解決できないイベントは未マッピングのままにし、繰り返し発生するケースをレビューに回す。
まず、プロバイダーのステータスフィールドが個別のイベントを表すのか、配送の現在の概要を表すのかを確認してください。配送レベルの概要をすべての過去イベントにコピーすると、以前のスキャンが配達完了の確認に見えてしまう可能性があります。
「contains 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」: 引き渡しを記録し、受取人への配達完了とはせず、適切な輸送中ステータスを保持する。
各ルールには、簡潔な根拠と担当者を設定してください。業務担当者がマッピングに異議を唱えた場合、チームは顧客向けラベルから逆算するのではなく、正確なルールを特定できる必要があります。
決定論的なリデューサーで現在状態を計算する
リデューサーは、正規化されたイベントを評価して現在の配送投影を生成する関数です。同じ証拠とルールバージョンに対しては、入力を何度再生しても同じ結果を返す必要があります。
意味のあるスキャンを削除せずに重複排除する
存在する場合は、安定した情報源のイベント識別子を優先してください。それ以外の場合は、配送の識別情報、配送業者、コード、発生時刻、場所など、利用可能な属性から重複排除キーを作成します。タイムスタンプの精度と情報源の挙動を考慮してください。同一の説明を持つ2つのスキャンが、特に荷物が同じ施設を再訪している場合に、必ずしも重複とは限りません。
完全な時計を前提とせずにイベントを並べ替える
利用可能な場合は、信頼できる発生時刻と文書化された順序情報を使用してください。受信時刻は同時刻の解決に役立ちますが、通常はそれより早い発生時刻を上書きすべきではありません。タイムスタンプが矛盾している、または信頼できる比較ができない場合は、確実性を作り出さず、曖昧さを保持してください。
共通の順位を割り当てるのではなく遷移を検証する
ステータスを単純な数値順に並べるだけでは、すべての配送経路を表現できません。配達中から、配達失敗後に輸送中へ戻ることがあります。引き取り可能状態が期限切れになることもあります。明示的な訂正によって、配達完了の確認が無効になる場合もあります。
許可される遷移と、それぞれに必要な証拠を定義してください。配達完了は通常の古いスキャンから保護しますが、文書化された訂正や承認済みの業務上の上書きは許可してください。上書きの理由と情報源を記録してください。
アクティブな条件を独立して追跡する
後続の移動スキャンは進行を示すことがありますが、支払いや住所の問題が解決したことを証明するものではありません。明示的な解決、論理的に解決を示すイベント、承認済みの手動対応など、条件ごとの解除ルールを定義してください。別のイベントが到着したというだけで、すべての条件を解除しないでください。
また、配送業者が報告した遅延と、自社の非アクティブ警告を区別してください。新しいスキャンがないことはデータの鮮度に関する観測であり、荷物が紛失した証拠ではありません。
配送業者間の引き渡しと返品を関連付けられた経路として扱う
国際配送の追跡には、複数の配送業者と識別子が関与することがあります。内部配送IDを保持し、配送業者固有の追跡参照を該当する配送区間に紐付けてください。参照の関連付けには、単に似た配送先や近いタイムスタンプを使うのではなく、情報源が提供した関係や検証済みの業務データを使用してください。
配送区間レベルの配達イベントは、コンテキストに基づいて解釈する必要があります。集約施設やパートナーネットワークへの配達によって、その区間は完了しても、購入者への配達が完了するとは限りません。配送投影では、イベントがどの配送先を表しているかを把握する必要があります。
同様に、「返品依頼」、「返品輸送開始」、「販売者への返送完了」を分けてください。これらは異なる節目です。返品依頼は荷物が物理的に返送中であることを証明せず、返送経路の配達完了確認では返品先を特定する必要があります。
ビジネスルールを手放さずに追跡APIを使用する
マルチキャリア統合は共通の取り込みポイントを提供できますが、共有レスポンス形式があっても、明確な内部契約は必要です。17TRACK Tracking APIを評価する際は、実装に関連するフィールドとインターフェースの意味を確認するために公式ドキュメントを使用してください。このガイドで提案しているステータスが、そのネイティブ分類と一致すると想定しないでください。
APIを顧客通知や業務自動化に接続する前に、次の事項を確立してください。
- どのフィールドが個別イベントを表し、どのフィールドが配送の現在概要を表すか。
- 元の配送業者のどの詳細が公開され、保持できるか。
- タイムスタンプ、欠損値、訂正、繰り返し更新がどのように表現されるか。
- 返品経路と中間パートナーへの配達をどのように区別できるか。
- 未知のコードや将来のスキーマ変更に対して統合がどのように対応するか。
外部レスポンスと正規モデルの間に薄いアダプターを置いてください。これにより、アプリケーションの他の部分は、上流のすべてのフィールド名に依存せず、1つの追跡ステータス契約を使用できます。通知ルールは別の層として扱ってください。新しい正規化イベントが到着したからといって、自動的に顧客メッセージを送信すべきではありません。
個別のマッピングだけでなくイベント履歴をテストする
マッピング単体では正しくても、誤った配送状態を生成することがあります。発生時刻とは異なる順序で更新が配信されるケースを含め、完全な履歴をテストしてください。
- 遅延した履歴: 古い輸送中スキャンより先に配達完了確認が到着する。配送は配達完了のままとなる。
- 繰り返し取り込み: 同じイベントが再度処理される。顧客通知は重複送信されない。
- 配達失敗: 配達中の後に配達失敗が続く。裏付けとなる証拠なしに、現在も配達が進行中であると約束する投影にはならない。
- 引き取り準備: 利用可能であることが確認される前に、荷物が受取施設に到着する。早すぎる引き取り案内は発行されない。
- 未知のイベント: 新しいコードが出現する。生の記録は保持され、以前に確立された配送状態が自動的にunknownへ置き換えられることはない。
- 返品輸送: 返送経路が販売者のもとで終了する。元の購入者への配達は成功としてマークされない。
- 訂正: 監査可能な遷移を通じて、明示的な情報源の訂正が結果を変更する。
配送業者および情報源ごとに、未マッピングイベント、テキストフォールバックの使用、無効な遷移、重複通知の試行を監視してください。マッピングの完全性と正確性を区別してください。すべてのコードを認識できても、解釈が間違っていれば有用ではありません。
マッピング変更を本番導入する前に、代表的な履歴を再生し、旧投影と新投影を比較してください。配達完了確認、引き取り案内、返品完了、顧客対応に影響する差異をレビューしてください。ルールをバージョン管理し、サポート担当者がシステムが特定の結果を出した理由を説明できるようにしてください。
FAQ
すべての追跡イベントに必ず1つのステータスを設定すべきですか?
各イベントには1つの主要な正規化解釈を設定できますが、条件、理由、配送経路のコンテキストも必要になる場合があります。すべての意味を1つの平坦なステータス一覧に押し込むと、モデルは使いにくく、維持も難しくなります。
未知のイベントで現在の配送ステータスを置き換えるべきですか?
通常は置き換えません。最後にサポートされた配送状態を保持しながら、イベントのマッピングは未解決のままにしてください。データの鮮度は別途表示し、古い確認済み状態を最新の更新とユーザーが誤解しないようにします。
配達完了した配送を輸送中に戻すことはできますか?
古い輸送中スキャンによって、その変更が起きてはいけません。検証済みの訂正であれば正当化できる場合がありますが、新たに開始された返品経路は通常、別途表現すべきです。遷移には、後の受信タイムスタンプだけでなく、明示的な理由が必要です。
追跡更新が欠落している場合、どのように表現すべきですか?
内部の鮮度指標または非アクティブ警告を使用してください。配送業者が報告した遅延、紛失、例外ステータスとは分けて保持します。エスカレーションのしきい値は、普遍的な想定ではなく、自社のサービス約束と運用方針を反映すべきです。
誰がマッピング変更を承認すべきですか?
エンジニアリングは実装と再生テストを担当し、物流業務は配送上の意味を検証し、カスタマーエクスペリエンスの責任者はメッセージングへの影響を承認すべきです。曖昧なイベントが無期限に未解決のままにならないよう、決定責任者を明確に任命してください。
参考資料
- RFC 3339: Date and Time on the Internet: Timestamps — タイムスタンプ表現と数値オフセットの参考資料。
- 17TRACK Tracking API — 上記で説明した追跡API統合の公式エントリーポイント。
- 17TRACK API documentation — プロバイダーの契約を確認するための実装リファレンス。本記事の正規モデルとマッピング例は提案された設計パターンであり、プロバイダー固有の定義ではありません。


