3PL事業者のための配送追跡統合ガイド
サードパーティロジスティクス(3PL)事業者は、独自の課題を抱えています。数十社の配送業者と取引しながら、クライアントには統一された追跡体験を提供しなければなりません。本ガイドでは、すべての配送パートナーを横断的にカバーする包括的な追跡システムの構築方法をご紹介します。
3PLが抱える追跡の課題
3PL事業者は、一般的に以下のような配送業者と連携しています。
- 5〜20社の国内配送業者 — ラストマイル配送向け
- 3〜5社の国際貨物キャリア — 越境配送向け
- 複数の郵便サービス — エコノミー配送向け
- 特殊輸送業者 — 大型貨物、精密機器、温度管理品向け
各業者がそれぞれ独自の追跡システムを持っており、クライアントはそのすべてを御社のプラットフォームから一元的に追跡できることを期待しています。
よくある課題
- クライアントの期待値 — どの配送業者を使っていても、一つのダッシュボードですべての荷物を追跡したいという要望
- 連携コストの増大 — 20社以上の配送業者との個別連携を構築・保守するコスト
- データの不一致 — 配送業者ごとにステータスの報告形式が異なり、集約が困難
- SLAモニタリング — SLA達成のために、全業者の配送パフォーマンスを横断的に把握する必要性
3PL追跡のアーキテクチャ
システム概要
クライアントポータル ← 3PLプラットフォーム ← WhereParcel API ← 500社以上の配送業者
↑
Webhookイベント
(ステータス変更通知)
↓
通知サービス → クライアントへのアラート
SLAモニター → 社内アラート
分析エンジン → パフォーマンスダッシュボード
実装手順
ステップ1:出荷時に追跡を登録する
荷物を配送業者に引き渡した時点で、追跡登録を行います。
async function registerShipment(shipment) {
const response = await fetch('https://api.whereparcel.com/v2/track', {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.WHEREPARCEL_API_KEY}:${process.env.WHEREPARCEL_SECRET_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
trackingItems: [{ carrier: shipment.carrierCode, trackingNumber: shipment.trackingNumber }],
webhook: {
url: 'https://your3pl.com/webhooks/tracking',
events: ['status_changed', 'delivered', 'exception'],
},
}),
});
const result = await response.json();
// 自社システムに追跡情報を保存
await db.shipments.update(shipment.id, {
trackingRegistered: true,
lastTrackingStatus: result.data?.status,
});
return result;
}
ステップ2:Webhookイベントを処理する
受信した追跡イベントを適切に振り分けます。
app.post('/webhooks/tracking', async (req, res) => {
res.status(200).json({ received: true });
const { event, data } = req.body;
const shipment = await db.shipments.findByTracking(data.trackingNumber);
if (!shipment) return;
// 出荷ステータスを更新
await db.shipments.update(shipment.id, {
lastTrackingStatus: data.status,
lastTrackingEvent: data.events[0],
lastUpdated: new Date(),
});
// SLAコンプライアンスを確認
await checkSLACompliance(shipment, data);
// クライアントにアラートが有効な場合は通知
await notifyClient(shipment, data);
});
ステップ3:クライアントダッシュボードを構築する
クライアントにすべての荷物を一覧できる統合ビューを提供します。
app.get('/api/client/:clientId/shipments', async (req, res) => {
const { clientId } = req.params;
const { status, carrier, dateFrom, dateTo } = req.query;
const shipments = await db.shipments.find({
clientId,
...(status && { lastTrackingStatus: status }),
...(carrier && { carrierCode: carrier }),
...(dateFrom && { createdAt: { $gte: new Date(dateFrom) } }),
...(dateTo && { createdAt: { $lte: new Date(dateTo) } }),
});
res.json({
total: shipments.length,
shipments: shipments.map(s => ({
id: s.id,
trackingNumber: s.trackingNumber,
carrier: s.carrierCode,
carrierName: s.carrierName,
status: s.lastTrackingStatus,
lastEvent: s.lastTrackingEvent,
origin: s.origin,
destination: s.destination,
createdAt: s.createdAt,
lastUpdated: s.lastUpdated,
})),
});
});
SLAモニタリング
追跡を一元管理する最大のメリットの一つが、SLAに対するキャリアパフォーマンスのモニタリングです。
SLAルールの定義
const slaRules = {
domestic_standard: {
maxDays: 3,
warningAt: 2, // 2日目で未配達ならアラート
},
domestic_express: {
maxDays: 1,
warningAt: 0.5, // 12時間経過でアラート
},
international_standard: {
maxDays: 14,
warningAt: 10,
},
international_express: {
maxDays: 5,
warningAt: 3,
},
};
コンプライアンス確認
async function checkSLACompliance(shipment, trackingData) {
const sla = slaRules[shipment.serviceLevel];
if (!sla) return;
const daysSinceShip = getDaysSince(shipment.shippedAt);
if (trackingData.status === 'delivered') {
// 配送パフォーマンスを記録
await db.slaMetrics.insert({
shipmentId: shipment.id,
carrier: shipment.carrierCode,
serviceLevel: shipment.serviceLevel,
daysToDeliver: daysSinceShip,
withinSLA: daysSinceShip <= sla.maxDays,
});
} else if (daysSinceShip >= sla.warningAt && !shipment.slaWarned) {
// 警告アラートを送信
await sendInternalAlert({
type: 'sla_warning',
shipment,
message: `荷物 ${shipment.trackingNumber} がSLA期限に近づいています(${daysSinceShip}/${sla.maxDays}日)`,
});
await db.shipments.update(shipment.id, { slaWarned: true });
}
}
分析・レポーティング
データに基づいた意思決定のために、キャリアパフォーマンス指標を追跡しましょう。
追跡すべき主要指標
| 指標 | 説明 | 目標値 |
|---|---|---|
| SLA遵守率 | SLA期限内に配達された割合 | 95%以上 |
| 平均輸送日数 | 出荷から配達までの日数 | サービスにより異なる |
| 例外発生率 | 配送例外が発生した割合 | 5%未満 |
| 初回配達成功率 | 初回の配達で受け取られた割合 | 85%以上 |
| 追跡データ鮮度 | 最新イベントの平均経過時間 | 30分未満 |
キャリア比較レポート
async function generateCarrierReport(dateRange) {
const metrics = await db.slaMetrics.aggregate([
{ $match: { createdAt: { $gte: dateRange.from, $lte: dateRange.to } } },
{
$group: {
_id: '$carrier',
totalShipments: { $sum: 1 },
onTimeCount: { $sum: { $cond: ['$withinSLA', 1, 0] } },
avgDaysToDeliver: { $avg: '$daysToDeliver' },
},
},
]);
return metrics.map(m => ({
carrier: m._id,
totalShipments: m.totalShipments,
onTimeRate: (m.onTimeCount / m.totalShipments * 100).toFixed(1) + '%',
avgTransitDays: m.avgDaysToDeliver.toFixed(1),
}));
}
ホワイトラベル追跡ページ
クライアントのエンドユーザー向けに、ブランドカスタマイズされた追跡ページを提供しましょう。
https://your3pl.com/track/{clientSlug}/{trackingNumber}
各クライアントに専用のブランド体験を提供できます。
- クライアント固有のロゴとカラー
- クライアント専用のサポート連絡先
- クライアントの希望言語にローカライズ
- オプション:独自ドメイン(track.clientbrand.com)
はじめ方
- 新規登録 — WhereParcel BusinessまたはEnterpriseプランにお申し込みください
- Webhookを設定 — リアルタイムの追跡更新を受信できるようにします
- クライアントダッシュボードを構築 — 標準化された追跡データを活用します
- SLAモニタリングを設定 — キャリアのパフォーマンスを継続的に追跡します
- ホワイトラベル追跡を開始 — クライアントのエンドユーザー向けに展開します
3PL向けの連携サポートについては、エンタープライズチームまでお問い合わせください。