技術情報

サーバーサイド・トラッキングを使用して、Eコマース・インタラクションを100%測定

 

Matomoで100%正確なeコマースレポートを取得する方法を説明する上級者向けのテクニカルガイドです。

これを達成するために、Matomoですべてのeコマース注文を測定し、eコマースプラットフォームのレポートとMatomoのレポートの間ですべての収益指標が一貫していることを確認します。これには、オフラインの売上だけでなく、オンライン注文も含まれます。

なぜこのガイドなのか?

通常、EコマースMatomoガイドに記載されているように、JavaScriptでEコマースの注文を追跡するだけですが、100%のEコマース追跡精度が必要な場合もあります。JS でのトラッキングリクエストは、広告ブロッカーやその他の理由でブロックされる可能性があります。その結果、Matomoはすべての注文を追跡することができなくなり、eコマースレポートの信頼性を欠くことになります(eコマースプラットフォームのレポートと一致しないため)。

このガイドでは、Eコマースプラットフォームにサーバーサイドモジュールを実装し、Matomoインスタンス内のすべてのEコマースインタラクションを正確に追跡するための全体的な手順を説明します。

このガイドは、Matomoでオフラインの売上やオフラインのコンバージョンをトラッキングする場合にも適用されます。

前提条件

ここで説明する解決策は、あなたのウェブサイトとEコマースサイトがすでにデフォルトのMatomo JavaScriptトラッキングコードでタグ付けされているが、Eコマーストラッキングをまだセットアップしていないことを前提としています。

したがって、ハイブリッド・アプローチということになる:

  • すべての標準的なユーザーインタラクション(ページビュー、イベント、ヒートマップ、フォームなど)は、JavaScriptタグを使ってトラッキングされます。
  • すべてのeコマースインタラクション(カートの更新と注文、場合によってはオフラインインタラクションを含む)は、eコマースプラットフォーム内のサーバーサイドから追跡されます。

必要条件

1. Matomo 最新バージョン

2. Eコマースプラットフォーム上でコードを実行するための特別な許可:

  • カートが変更されたとき、または新規注文が記録されたときにカスタムコードを実行する。
  • また、eコマースの注文記録に新しいメタデータを記録し、トラブルシューティングや監査のために各注文に監査ログを残します。

3. E コマースプラットフォームから Matomo インスタンスに HTTPS リクエストを送信する機能。

4. 秘密のAPI認証トークン(token_auth) を使用して Matomo Tracking API に接続します。

  • token_authの取得方法:Matomoで、Tracking APIリクエスト専用に新しいユーザーを作成する。例えば、”Tracking API (Ecommerce) “というユーザーです。そして、この新しいユーザーにウェブサイトへのアクセス権 “Admin “を与える。このユーザのtoken_authを取得するには、こちらのfaqを参照してください。

5. eコマースサイトに、標準の、非eコマースの、Matomo JavaScriptトラッキングコードをタグ付けしています。

6. Eコマースデータを追跡したいサイトのウェブサイト管理で、Eコマースが有効になっている。

注意: サーバーサイドでPHP言語を使用している場合、eコマースインタラクションをトラッキングするために弊社の PHP SDKを使用してください。または、 その他のSDKもご覧ください。他にも非公式SDKがあります。

Eコマース・プラットフォームへのサーバーサイドの実装

A.新しいeコマース注文があった場合

新しい注文が処理されると、Eコマース・プラットフォームは次のことを行う必要がある:

1.この注文がまだMatomoに記録されていないことを確認する。

  • これは、新規注文を処理する際に matomoTracked などのフラグをチェックすることで、Matomo で注文が二重にカウントされないようにします。
    (このフラグを設定するタイミングは以下を参照)。

2.注文と一緒に顧客に関するいくつかのメタデータを保存する。

  • ipAddress:お客様のIPアドレス
  • userAgent:顧客のユーザーエージェント
  • matomoVisitorId:Matomo ID ビジター
  • attributionInfo:この注文のリファラーアトリビューション情報(獲得チャネル
  • matomoTracked:この注文がすでにMatomoで追跡されているかどうか

弊社のPHP SDKを使用する場合、コードは以下のようになります:

// it is assumed that $order->setMetadata() will record a new metadata 
// for this ecommerce order in the ecommerce DB

$order->setMetadata(`ipAddress`, $tracker->getIp());
$order->setMetadata(`userAgent`, $tracker->getUserAgent());
$order->setMetadata(`matomoVisitorId`, $tracker->getVisitorId());
$order->setMetadata(`attributionInfo`, $tracker->getAttributionInfo());

3.HTTPS Tracking APIリクエストを送信することで、Eコマースの注文とすべての商品をMatomoに記録します。

注:送信されるデータの種類のため、これらのリクエストはHTTPSを使用して送信する必要があります。

Tracking APIリクエストには以下が含まれる:

  1. 注文に保存された訪問者のメタデータ(IPアドレス、ユーザーエージェント、訪問者ID、リファラー属性情報)
  2. 注文の詳細と収益
  3. 注文の商品のリスト (そして、それぞれについて: SKU、名前、カテゴリのリスト、価格、数量)
  4. あなたの秘密token_auth

弊社のPHP SDKを使用する場合、コードは以下のようになります:

// it is assumed that $order is an array/object which contains
// this ecommerce order's metadata as well as product details

$tracker = new Tracker($matomoIdSite, $matomoUrl);

// Specify an API token_auth with at least Write permission, so the Visitor IP address can be recorded
$tracker->setTokenAuth('my_token_auth_value_here');

$tracker->setVisitorId($order['matomoVisitorId']);
if (!empty($order['userAgent'])) {
   $tracker->setUserAgent($order['userAgent']);
}

if (!empty($order['ipAddress'])) {
   $tracker->setIp($order['ipAddress']);
}

if (!empty($order['attributionInfo'])) {
   $tracker->setAttributionInfo($order['attributionInfo']);
}

// Only confirmed orders should be tracked in Matomo (recommended)
if( in_array( $order['orderStatus'], array('cancelled', 'failed', 'pending', 'refunded')) ) {
   $this->log('Ignoring ecommerce order ' . $orderId . ' becauses of status: ' . $orderStatus);
   return;
}

foreach ($order->getProducts() as $product) {
   $sku = $product['sku'];
   $price = $product['total'];
   $title = $product['title'];
   $categories = $product['categories']; // an array of category names
   $quantity = $product['qty'];

   try {
       $tracker->addEcommerceItem($sku, $title, $categories, $price, $quantity);
   } catch (\Exception $e) {
       $this->log(sprintf('Failed to add ecommerce item: %s', $title));
   }

}

$tracker->setRequestTimeout($PURCHASE_REQUEST_TIMEOUT_IN_SECONDS = 7);

$tracker->doTrackEcommerceOrder(
   $order['orderId'],
   $order['revenueTotal'],
   $order['revenueSubtotal'],
   $order['revenueTax'],
   $order['revenueShipping'],
   $order['revenueDiscount']
);

// Important: before logging the tracking URL we make sure to remove the secret token_auth:
$debug_TrackingUrlWithoutToken = str_replace('token_auth=' . $TOKEN_AUTH, 'token_auth=XYZANONYMIZED', PiwikTracker::$DEBUG_LAST_REQUESTED_URL);

$this->log(sprintf('Tracked ecommerce order %s: URL was %s', $order['orderId'], $debug_TrackingUrlWithoutToken));

// we set the flag that this order has been tracked in Matomo
$order->setMetadata(`matomoTracked`, 1);

// we also record in the order a flag with the Tracking URL which was used to track the request
$order->setMetadata(`matomoTrackingUrl`, $debug_TrackingUrlWithoutToken);

B.新しいカートの更新があった場合

カートから商品が追加されたり削除されたり(または商品の数量が変更されたり)、商品やサービスが購入のために選択されたり(実際のカートがない場合)、特別なクーポンが適用されたり削除されたりした場合、Eコマースプラットフォームは次のことを行う必要があります:

1.HTTPS Tracking APIリクエストを送信することで、Eコマースカートの更新とすべての商品をMatomoに記録します。

Tracking APIリクエストには以下が含まれる:

  1. 注文の商品のリスト (そして、それぞれについて: SKU、名前、カテゴリのリスト、価格、数量)
  2. あなたの秘密token_auth

弊社のPHP SDKを使用する場合、コードは以下のようになります:

// it is assumed that $cart is an array/object which contains
// this cart's product details

$tracker = new Tracker($matomoIdSite, $matomoUrl);

// Specify an API token_auth with at least Write permission, so the Visitor IP address can be recorded
$tracker->setTokenAuth('my_token_auth_value_here');

foreach ($cart->getProducts() as $product) {
   $sku = $product['sku'];
   $price = $product['total'];
   $title = $product['title'];
   $categories = $product['categories']; // an array of category names
   $quantity = $product['qty'];

   try {
       $tracker->addEcommerceItem($sku, $title, $categories, $price, $quantity);
   } catch (\Exception $e) {
       $this->log(sprintf('Failed to add ecommerce item: %s', $title));
   }
}

$tracker->setRequestTimeout($CART_UPDATE_REQUEST_TIMEOUT_IN_SECONDS = 2);

$tracker->doTrackEcommerceCartUpdate($cart['revenueTotal']);

// Important: before logging the tracking URL we make sure to remove the secret token_auth:
$debug_TrackingUrlWithoutToken = str_replace('token_auth=' . $TOKEN_AUTH, 'token_auth=XYZANONYMIZED', PiwikTracker::$DEBUG_LAST_REQUESTED_URL);

$this->log(sprintf('Tracked ecommerce cart update: URL was %s', $debug_TrackingUrlWithoutToken));

おめでとうございます、上記のステップをすべて踏んだのであれば、サーバーサイドEコマーストラッキングのセットアップは成功したはずです。

注意Eコマースのトラッキングに100%のデータ精度を必要とせず、オフラインでの売上やコンバージョンをトラッキングする必要がない場合は、弊社のJavaScriptによるEコマース追跡ガイドに従って下さい。

制限事項

  • サーバー側でeコマースのカート更新をトラッキングする場合、若干の遅延が発生し、その後のページ表示が若干遅くなる可能性があります。Matomo (Piwik) Tracking APIは500ms未満で応答するはずなので、ユーザーエクスペリエンスにそれほど影響を与えないはずです。上記のコード例では、カートの更新を追跡するために最大2秒、eコマースの注文を追跡するために最大7秒の遅延を設定しています。同期リクエストの代わりに非同期 HTTP リクエストを送信することで、これを回避することは可能でしょう。
  • 払い戻しや一部払い戻しはMatomoではまだ完全にサポートされていません。
  • 既知の問題:このソリューションでは、カートが更新されるとすぐに(一度だけ)新しい訪問者が作成される可能性があります。この場合、次のページビューとアクションはすべて新しく作成された訪問者に追跡されます。これは例えば、ユーザーが過去にあなたのショップを訪問し、すべてのクッキーを削除した後、再びあなたのショップを訪問した場合に発生します。また、ブラウザの「インコグニートウィンドウ」でウェブサイトを開いた場合にも発生する可能性があります。