SocialHub.AI
開発者センター · Web トラッキング

自分のサイトでの行動を追跡します。

マーケティング サイトや電子商取引サイトにファーストパーティ ビーコンを 1 つドロップすると、そのページ ビューがメール、ロイヤルティ ポータル、アプリと同じメンバー行動タイムラインに流れ込みます。キーも依存関係もありません。数行のバニラ JS をパブリック エンドポイントに投稿するだけです。 Flash は、サーバー側でデバイス、地域、ボット検出を解析します。

01 — 仕組み

ホストされた 1 行、または自己完結型スニペット

単一のスクリプト タグを使用してホスト型トラッカーを追加するか、外部依存関係を望まない場合は自己完結型スニペットを貼り付けます。いずれの方法でも、識別子が生成され、プライバシー シグナルが尊重され、1 つのエンドポイントにページビューが POST 送信されます。

POST https://flash.socialhub.ai/api/v1/tracking/pageview

クライアントビットを送信します

URL、タイトル、リファラー、ID、画面、言語、タイムゾーン、UTM — それだけです。

Flash はサーバー側を強化します

デバイス、OS、ブラウザはユーザー エージェントから解析されます。 IP からの国。ボットが検出され、フラグが付けられます。これらに関してクライアントを信頼する必要はありません。

常に 204 を返します

ボット、GPC、不正な形式、または受け入れられた場合、エンドポイントは静かに応答します。トラッキングによってページにエラーがスローされることはありません。

独自のドメインでは、動作は匿名です。 サイトには Flash セッション Cookie がないため、ページ ビューは既知のメンバーではなく、生成した anonymous_id に関連付けられます。メンバーの帰属は、Flash が所有するサーフェス (ロイヤルティ ポータルおよびアプリ内メンバー センター) で行われ、セッションによってメンバーが解決されます。一貫した anonymous_id を使用して、訪問者のオンサイト行動が少なくとも訪問者自身のセッション全体で統一されるようにします。

02 — インストール

2 つの方法があります。 YOUR_TEAM_ID を設定すると、ライブになります。

推奨

オプション A · ホスト型 — 1 行

</body> の前にスクリプト タグを 1 つ削除します。シングルページアプリのルート変更を自動追跡し、window.flashTrack() を公開します。他に接続する必要はありません。

index.html
<!-- SocialHub web tracking — one line, before </body> -->
<script src="https://flash.socialhub.ai/sdk/flash-tracker.js"
        data-team-id="YOUR_TEAM_ID" defer></script>
↓ flash-tracker.jsをダウンロードソースを見る ↗依存関係はありません。必要に応じて独自のオリジンからセルフホストします。

オプション B · インライン — 外部スクリプトなし

外部リクエスト (厳密な CSP または独自のバンドル内のコード) をゼロにしたいですか?代わりに、この自己完結型スニペットを貼り付けてください。 window.shTrack() を公開します。シングルページ アプリでルートが変更されるたびに呼び出します。

index.html
<!-- SocialHub web tracking — paste before </body> on every page -->
<script>
(function () {
  var TEAM_ID = "YOUR_TEAM_ID";                                  // Settings → API
  var ENDPOINT = "https://flash.socialhub.ai/api/v1/tracking/pageview";

  // Honor Global Privacy Control / Do Not Track — no signal sent.
  if (navigator.globalPrivacyControl === true || navigator.doNotTrack === "1") return;

  function uid() {
    return (window.crypto && crypto.randomUUID)
      ? crypto.randomUUID()
      : (Date.now() + "-" + Math.random().toString(16).slice(2));
  }
  function persist(store, key) {
    try { var v = store.getItem(key); if (!v) { v = uid(); store.setItem(key, v); } return v; }
    catch (e) { return uid(); }
  }
  function utm() {
    var p = new URLSearchParams(location.search), o = {};
    ["source", "medium", "campaign", "term", "content"].forEach(function (n) {
      var val = p.get("utm_" + n); if (val) o[n] = val;
    });
    return Object.keys(o).length ? o : undefined;
  }
  function track() {
    var body = JSON.stringify({
      v: 1,
      page_url: location.href,
      page_title: document.title,
      referrer: document.referrer || undefined,
      anonymous_id: persist(localStorage, "sh_anon"),       // stable per browser
      session_id: persist(sessionStorage, "sh_session"),    // resets per tab session
      team_id: TEAM_ID,
      utm: utm(),
      screen: screen.width + "x" + screen.height,
      language: navigator.language,
      timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
      timestamp: Date.now()
    });
    try {
      if (navigator.sendBeacon) navigator.sendBeacon(ENDPOINT, body);
      else fetch(ENDPOINT, { method: "POST", body: body, keepalive: true }).catch(function () {});
    } catch (e) { /* never break the page */ }
  }

  window.shTrack = track;   // for SPAs: call window.shTrack() after each route change
  track();                  // initial page view
})();
</script>
spa-router.js
// Single-page apps: after each client-side route change
router.afterEach(function () { window.shTrack && window.shTrack(); });
03 — ペイロード契約

ビーコン本体

application/json (または sendBeacon 経由のプレーン文字列) を送信します。 4 KB を超えるもの、または検証に失敗したものは、サイレントに削除されます。

分野タイプ注意事項
vnumberスキーマのバージョン。常に 1。
page_urlstringページの完全な URL (≤ 2048)。必須。
page_titlestring?ドキュメントのタイトル (≤ 500)。
referrerstring?document.referrer (≤ 2048)
anonymous_idstring生成するブラウザごとの安定した ID (≤ 36)。必須。
session_idstring生成するセッションごとの ID (≤ 36)。必須。
team_idstringSocialHub チーム ID (≤ 36) — ブランドを識別します。必須。
utmobject?クエリ文字列から解析された { ソース、メディア、キャンペーン、用語、コンテンツ }。
screenstring?「1920×1080」。
languagestring?ナビゲーター.言語。
timezonestring?IANA tz、例:アメリカ/ロサンゼルス。
timestampnumberクライアントエポックms。必須。
04 — 保護

なりすましトラフィックに対抗するように構築

team_id はページ ソース内に存在し、他のアナリティクス ID と同様に公開されます。したがって、エンドポイントはサーバー側でサイレントに自身を防御します (エンドポイントは常に 204 に応答するため、攻撃者は調査するためのフィードバックを取得できません)。

ベースライン レート制限 · 常時オン

すべてのチームはデフォルトで設定なしで保護されています。エンドポイントは、1 つのソースが送信できるビーコンの数を制限します。 team_id 分析データを過負荷状態にしたり、データを汚染したりすることはありません。フェイルオープン設計なので、一時的な障害が発生しても実際のトラフィックが途絶えることはありません。

オリジン許可リスト · オプション

[設定] → [トラッキング保護] で、受け入れられるビーコンを独自のドメインに制限できます。監視プレビューを使用して、強制する前に誤検知をチェックできます。これにより、ブラウザで SDK を使用する他のサイトがシャットアウトされます。

限界について正直に

レート制限とホワイトリストにより基準が引き上げられ、被害に上限が設けられますが、キーレス クライアントは、決められたスクリプトによるリクエストの偽造を完全に阻止することはできません。高機密の取り込みの場合は、代わりに認証された API を介してサーバー間で送信します。

下流のクリーンな数値

不正行為対策は何かが保存される前に実行されるため、フィルタリングされたトラフィックがメンバーのタイムライン、セグメント、ダッシュボードに到達することはありません。また、[追跡防止] ページには、どの程度が遮断されたかが表示されます。

05 — プライバシー

訪問者を尊重した施工を心がけます

GPC と追跡禁止

このスニペットは、navigator.globalPrivacyControl と navigator.doNotTrack をチェックし、どちらかが設定されている場合は何も送信しません。その警備員を守ってください。

生の PII はありません

識別子とページ コンテキストのみを送信します。ビーコン内の名前、電子メール、フォームの内容は送信しないでください。メンバー ID は、サイトではなく Flash サーフェス上で解決されます。

まずは同意バナーを

サイトで同意マネージャーを使用している場合は、同意の背後にあるスニペットをゲートします。訪問者が分析を受け入れた場合にのみトラッカーを呼び出します。

ボットフィルター済み

サーバー側のボット検出は人間以外のトラフィックにフラグを立てるため、メンバーのタイムラインや統計が汚染されることはありません。

旅の残りを記録する

ウェブは 4 つの表面のうちの 1 つです。電子メール、ロイヤルティ ポータル、アプリがどのように同じメンバーのタイムラインにフィードを提供するかをご覧ください。