Server-to-Server - Web S2S 実装ガイド

概要

Web Server-to-Server(Web S2S)は、モバイル V2 連携と同じ EVENT エンドポイントを使用して、Web のコンバージョンイベントおよびエンゲージメントイベントをサーバーから直接 Singular に送信します。Web パスは、platform パラメーター p=Web によって区別されます。

Web S2S は ブラウザー支援型アーキテクチャ です。アトリビューションに関連するいくつかの値は、ブラウザーでのみ取得可能です。 location.hrefdocument.referrer 、およびブラウザーの userAgent は、バックエンドで再構築することはできません。軽量なクライアントサイドスニペットがこれらの値を収集し、エンドポイントを直接呼び出すか、またはそれらをバックエンドに転送し、バックエンドが S2S 呼び出しを行う必要があります。

Web には SESSION エンドポイントはありません 。最初の __PAGE_VISIT__ コンバージョンイベントがモバイルの launch 呼び出しに代わり、その訪問のアトリビューションのベースラインを確立します。

Web S2S は、認証、エンコーディング、および共通パラメーターの規約を、S2S スイートの他の部分と共有します。認証と共通パラメーターについてはEVENT エンドポイントリファレンスを、S2S の中核的な概念についてはS2S 基本ハブを参照してください。


エンドポイント

Web S2S は、モバイル V2 EVENT エンドポイントと同じホスト、パス、POST メソッドを使用します。リクエストをウェブアトリビューションパスにルーティングするには、p=Web を設定します。

POST https://s2s.singular.net/api/v2/evt

2026年7月15日よりV2が必須。 2026年7月15日以降に作成されたアカウントは、Event Endpoint V2(SDIDベース)を使用する必要があります。新規アカウントではV1は利用できません。すでにV1で連携済みの既存のお客様は影響を受けません。V2への移行をご希望の場合は、担当のSingular Customer Success Managerにお問い合わせください。

必須ヘッダー:

Content-Type: application/x-www-form-urlencoded

SDID の生成と永続化

Singular デバイス ID( sdid )は、1 つのブラウザーからのすべてのイベントを 1 台の Web デバイスに紐付けます。最初のページ読み込み時に、 localStorageglobal_singular_id が存在しない場合は、UUID v4 を生成して保存します。 localStorage がクリアされるまで、そのブラウザーからのすべてのイベントで同じ値を sdid として再利用します。

ページ上に Web SDK が存在する場合は、新しい値を生成するのではなく、Web SDK が global_singular_id にすでに設定した値を再利用してください。

function getOrCreateSDID() {
  var KEY = 'global_singular_id';
  var sdid = localStorage.getItem(KEY);
  if (!sdid) {
    sdid = crypto.randomUUID(); // UUID v4
    localStorage.setItem(KEY, sdid);
  }
  return sdid;
}

__PAGE_VISIT__ パターン

新しい訪問の最初のイベントは、必ず conversion_event=true を指定した __PAGE_VISIT__ でなければなりません。これにより、後続のイベントが継承するアトリビューションのベースラインが確立されます。

同じブラウザーが 別のキャンペーン (異なる UTM またはパートナー)から戻ってきた場合は、そのたびに conversion_event=true を指定した新しい __PAGE_VISIT__ を送信してください。同じ sdid を再利用し、その訪問の他のイベントよりも前に __PAGE_VISIT__ を送信してください。

非コンバージョンイベント(例えば sng_registration_completesng_purchase )は、 conversion_event=false を使用し、 attribution_data 省略します 。これらは、直近の __PAGE_VISIT__ からアトリビューションを継承します。

コンバージョンイベントより前に到着した非コンバージョンイベントは、バックエンドがマッチを待つ間、1 分間遅延されます。

custom_user_id のルール

  • 登録またはログイン後、およびそれ以降のすべてのイベントに custom_user_id を含めてください。
  • これを localStorage またはファーストパーティ Cookie に永続化してください。
  • ログアウト時には削除してください。
  • PII は決して含めないでください。ハッシュ化された ID または内部 ID を使用してください。

パラメーター

Web SDK は __PAGE_VISIT__ でおよそ 40 個のパラメーターを送信しますが、そのほとんどは SDK 内部のテレメトリであり、S2S の開発者が再現すべきものではありません。以下の表では、必須および推奨のパラメーターセットのみを扱います。

認証(a)およびその他の共有規約は、ここで再度記載するのではなく、EVENTエンドポイントリファレンスで定義されています。

必須パラメーター

パラメーター 詳細
a

タイプ: String
ダッシュボードから取得できる Singular API キーです。
例: myapikey_123

p

タイプ: String
プラットフォーム。Web S2S では常に Web です。この値により、リクエストが Web アトリビューションパス経由でルーティングされます。
例: Web

i

タイプ: String
Singular における Web アプリ/サイトのバンドル ID。Web SDK の Product ID と一致している必要があります。Settings > Apps > 該当の Web アプリを展開 > Bundle ID で確認できます。
例: com.example.site

n

タイプ: String
イベント名。訪問の最初のイベントは __PAGE_VISIT__ でなければなりません。
例: __PAGE_VISIT__

sdid

タイプ: UUIDv4
Singular デバイス ID。Web SDK が設定した値( global_singular_id )を使用してください。自身で設定する場合は、UUID v4 を生成し、そのブラウザーからのすべてのイベントで再利用してください。
例: 3730aecb-47ba-4d13-bd17-52b4b700956f

conversion_event

タイプ: Boolean
アトリビューションイベント( __PAGE_VISIT__ )の場合にのみ true を設定します。コンバージョンイベントより前に到着した非コンバージョンイベントは、バックエンドがマッチを待つ間、1 分間遅延されます。
例: true

attribution_data

タイプ: JSON
広告ネットワークからのクリックスルーデータ。URL エンコードされた JSON です。 __PAGE_VISIT__ では必須です。非コンバージョンイベントでは省略してください。 attribution_data を参照してください。
例: %7B%22partner_name%22%3A%22Snapchat%22%2C%22is_attributed%22%3A%22true%22%7D

custom_user_id

タイプ: String
自社の内部ユーザー ID。PII は含めないでください。登録/ログイン後、およびそれ以降のイベントに含め、ログアウト時には削除してください。
例: pid123abc

ip

タイプ: String
イベント発生時のデバイスの IP。
例: 104.220.23.123

web_url

タイプ: String
マーケティングパラメーターを含む、コンバージョンのランディングページ URL。これはマーケティングパラメーターを含んでいた最後の URL であり、SDID と同様に保存され再利用されます。バックエンドがアトリビューションのタッチポイントを作成するために使用します。 web_page_url とは異なります。
例: http://my.landing.page/?utm_campaign=test&utm_source=test

パラメーター 詳細
device_user_agent

タイプ: String
ブラウザーのユーザーエージェント( navigator.userAgent )。ブラウザーでのみ取得可能です。クライアントサイドで収集してください。
例: Mozilla/5.0 ...

web_page_referrer

タイプ: String
現在のページのリファラー( document.referrer )。取り込まれ、アトリビューション(オーガニックのソース/タイプ分類)に使用されます。ブラウザーでのみ取得可能です。クライアントサイドで収集してください。イベントログのみに使用される document_referrer とは異なります。
例: https://www.google.com/

timezone

タイプ: String
デバイスのタイムゾーン。
例: America/New_York

os

タイプ: String
デバイスのオペレーティングシステム。
例: iOS

screen_width

タイプ: Integer
画面の幅(ピクセル単位)。
例: 390

screen_height

タイプ: Integer
画面の高さ(ピクセル単位)。
例: 844

utime

タイプ: Integer
イベント時刻(UNIX 時間、秒単位)。
例: 1751500800

URL とリファラーのパラメーター — 混同しないでください。 web_urlweb_page_referrer はアトリビューションに関連し、パイプラインで使用されます。 web_page_url (現在のページ、 window.location.href )と document_referrer イベントログのみ に使用され、アトリビューションのためには黙って破棄されます。 web_page_urldocument_referrer を、アトリビューションに影響することを期待して送信しないでください。

デバイス識別情報や上記に記載されていないその他の共有パラメーターについては、ここで再度記載するのではなく、EVENT エンドポイントリファレンスを参照してください。


attribution_data

attribution_data パラメーターは、広告ネットワークからのクリックスルーデータを URL エンコードされた JSON として保持します。 __PAGE_VISIT__ コンバージョンイベントでのみ送信してください。

{
  "partner_name": "Snapchat",
  "is_attributed": "true",
  "touch_timestamp": "",
  "partner_campaign_id": "",
  "partner_campaign_name": "Snap_campaign_1234",
  "partner_creative_id": "",
  "partner_creative_name": "",
  "partner_keyword": "",
  "partner_site": "",
  "partner_site_id": "",
  "partner_site_name": "",
  "partner_sub_site": "",
  "partner_sub_site_name": "",
  "partner_subcampaign_id": "",
  "partner_subcampaign_name": "",
  "_p": ""
}

必須フィールド

フィールド 詳細
partner_name

タイプ: String
Web パラメーター wpsrc または utm_source からマッピングされます。
例: Snapchat

is_attributed

タイプ: String
アトリビューションされたイベントには true を設定します。
例: true

partner_campaign_name

タイプ: String
Web パラメーター wpcn または utm_campaign からマッピングされます。
例: Snap_campaign_1234

任意フィールド

フィールド 詳細
touch_timestamp

タイプ: Integer
タッチポイント時刻(UNIX 秒)。
例: 1751500800

partner_campaign_id

タイプ: String
Web パラメーター wpcid からマッピングされます。

partner_creative_id

タイプ: String
Web パラメーター wpcrid からマッピングされます。

partner_creative_name

タイプ: String
Web パラメーター wpcrn からマッピングされます。

partner_keyword

タイプ: String
Web パラメーター wpkwn からマッピングされます。

partner_site_id

タイプ: String
Web パラメーター wpsid からマッピングされます。

partner_site_name

タイプ: String
Web パラメーター wpsn からマッピングされます。

partner_sub_site_name

タイプ: String
Web パラメーター wpssn からマッピングされます。

partner_subcampaign_id

タイプ: String
Web パラメーター wpscid からマッピングされます。

partner_subcampaign_name

タイプ: String
Web パラメーター wpscn からマッピングされます。

e パラメーターでの Web クリック ID

パートナー Conversion API のサポート: SingularのConversion API連携を通じてこれらのイベントを広告ネットワークパートナーに転送するには、標準のオプションイベント属性(eventIdehashなどのハッシュ化されたファーストパーティデータ)を含めてください。Conversion API連携のための標準イベント属性を参照してください。

ネットワークのクリック ID は、各パートナーが期待する JSON キーを使用して、イベントの e ペイロードで渡します。

パートナー クリック ID キー
Snapchat ScCid
TikTok ttclid
Google gclidgbraidwbraid
DV360 dclid
Facebook fbclid
Reddit rdt_uuid

マーケティングパラメーターの検出。 ランディング URL が次のいずれかを含む場合、それをタッチポイントとして扱います。 utm_* 、Singular の wp*wpsrcwpcnwpcid など)、Singular の pc* / p*pcidpcnpsrc など)、 clid 、または kw / an / ud 。マッチした場合は、完全な URL を web_url として保存し、コンバージョンイベントを発火します。


Web-to-App アトリビューション

Web キャンペーンのコンテキストをモバイルクリックに引き継ぐには、ランディングページから Singular Link を構築し、取得したランディングのクエリ文字列を追加します。これにより、マーケティングパラメーターがモバイルクリックに転送され、アプリのインストールをアトリビューションできるようになります。

ランディング時に、マーケティングパラメーターを含む場合は window.location.search (およびフラグメント)を取得し、永続化します。アプリストアリンクまたはスマートバナーリンクをレンダリングする際には、次のように構築します。

function buildWebToAppLink(baseLink, webUrl, deeplink, passthrough, deferredDeeplink) {
  var url = new URL(baseLink); // preserves existing base-link params
  if (webUrl) {
    var q = new URL(webUrl);
    var captured = q.search.slice(1) + (q.hash || ''); // landing query string (+fragment)
    url.searchParams.set('_web_params', captured); // URL-encoded on serialization
  }
  if (deeplink)         url.searchParams.set('_dl', deeplink);
  if (passthrough)      url.searchParams.set('_p', passthrough);
  if (deferredDeeplink) url.searchParams.set('_ddl', deferredDeeplink);
  return url.toString();
}
追加するパラメーター 詳細
_web_params

取得したランディング web_url の URL エンコードされたクエリ文字列(およびフラグメント)。UTM / wp* / pc* / clid のキャンペーンパラメーターをモバイルクリックに転送します。

_dl

ディープリンク引数。任意。

_p

パススルー引数。任意。

_ddl

遅延ディープリンク引数。任意。

正確性: SDID はリンクに 追加されません _dsid_sdid もありません)。これはキャンペーンパラメーターの転送であり、決定論的な SDID デバイススティッチングではありません。


クリップボードアトリビューション(遅延ディープリンク)

クリップボードアトリビューションは、遅延ディープリンクに対して決定論的なマッチを提供します。Web スニペットが一意のトークンをクリップボードに書き込み、新しくインストールされたアプリがそれを読み戻し、トークンの一致でマッチングします。

function openAppWithClipboardDdl(baseLink, deeplink, passthrough, deferredDeeplink) {
  // 1. Build the web-to-app link (see Web-to-App Attribution).
  var link = buildWebToAppLink(baseLink, capturedWebUrl, deeplink, passthrough, deferredDeeplink);

  // 2. Generate a UUID v4 and form the token.
  var uuid = crypto.randomUUID();
  var tokenUrl = location.protocol + '//' + location.hostname + '/__singular_ddl__/' + uuid;

  // 3. Write ONLY the token to the clipboard (execCommand fallback).
  copyToClipboard(tokenUrl);

  // 4. Append the token to the click as ecid.
  var url = new URL(link);
  url.searchParams.set('ecid', tokenUrl);

  // 5. Open the app / store.
  window.open(url.toString());
}

function copyToClipboard(text) {
  if (navigator.clipboard && navigator.clipboard.writeText) {
    navigator.clipboard.writeText(text);
    return;
  }
  var ta = document.createElement('textarea');
  ta.value = text;
  document.body.appendChild(ta);
  ta.select();
  document.execCommand('copy');
  document.body.removeChild(ta);
}

正確性: クリップボードが保持するのはトークン のみ です。SDID も、 _web_params も、ディープリンクも保持しません。マッチはトークンの一致(クリックの ecid がクリップボードのトークンと等しい)であるため、新しくインストールされたアプリは決定論的にマッチします。

クリップボードへの書き込みは、 ユーザージェスチャーハンドラー (クリック)内で実行する必要があります。そうしないとブラウザーがブロックします。iOS Safari のクリップボード制約に注意してください。

初回起動時にクリップボードを読み取ることは、この Web スニペットではなく、アプリ側(アプリ独自のモバイル SDK/S2S 連携)の担当です。


イベントシーケンスの例

初回訪問と登録

  1. ユーザーが Google Ads から到着します。最初のページ訪問を送信します。

    • n=__PAGE_VISIT__
    • conversion_event=true
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f
    • attribution_data={ "partner_name": "googleadwords_int", "is_attributed": "true", "partner_campaign_name": "brand_us_en" }
  2. ユーザーが登録します。登録イベントを送信します。

    • n=sng_registration_complete
    • conversion_event=false
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f (同じ SDID)
    • custom_user_id=user_12345abc
    • attribution_data なし

新しいキャンペーンから戻ってきたユーザー

  1. 同じブラウザーが別のキャンペーンから戻ってきます。新しいページ訪問を送信します。

    • n=__PAGE_VISIT__
    • conversion_event=true
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f (同じ SDID)
    • attribution_data={ "partner_name": "facebook", "is_attributed": "true", "partner_campaign_name": "retargeting_Q1" }
  2. ユーザーが購入します。購入イベントを送信します。

    • n=sng_purchase
    • conversion_event=false
    • sdid=3730aecb-47ba-4d13-bd17-52b4b700956f (同じ SDID)
    • 永続化された custom_user_id
    • attribution_data なし