3PL事業者のための配送追跡統合ガイド

サードパーティロジスティクス(3PL)事業者は、独自の課題を抱えています。数十社の配送業者と取引しながら、クライアントには統一された追跡体験を提供しなければなりません。本ガイドでは、すべての配送パートナーを横断的にカバーする包括的な追跡システムの構築方法をご紹介します。

3PLが抱える追跡の課題

3PL事業者は、一般的に以下のような配送業者と連携しています。

  • 5〜20社の国内配送業者 — ラストマイル配送向け
  • 3〜5社の国際貨物キャリア — 越境配送向け
  • 複数の郵便サービス — エコノミー配送向け
  • 特殊輸送業者 — 大型貨物、精密機器、温度管理品向け

各業者がそれぞれ独自の追跡システムを持っており、クライアントはそのすべてを御社のプラットフォームから一元的に追跡できることを期待しています。

よくある課題

  1. クライアントの期待値 — どの配送業者を使っていても、一つのダッシュボードですべての荷物を追跡したいという要望
  2. 連携コストの増大 — 20社以上の配送業者との個別連携を構築・保守するコスト
  3. データの不一致 — 配送業者ごとにステータスの報告形式が異なり、集約が困難
  4. 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)

はじめ方

  1. 新規登録 — WhereParcel BusinessまたはEnterpriseプランにお申し込みください
  2. Webhookを設定 — リアルタイムの追跡更新を受信できるようにします
  3. クライアントダッシュボードを構築 — 標準化された追跡データを活用します
  4. SLAモニタリングを設定 — キャリアのパフォーマンスを継続的に追跡します
  5. ホワイトラベル追跡を開始 — クライアントのエンドユーザー向けに展開します

3PL向けの連携サポートについては、エンタープライズチームまでお問い合わせください。