サーバー間 - 統合ガイド
SingularのREST APIを導入することで、SDK統合に代わる完全なサーバーサイドトラッキングを実現し、データ収集、送信、アトリビューションワークフローを完全にコントロールすることができます。
概要
サーバー間の使用例
サーバー間(S2S)統合は、クライアントアプリケーションにSingular SDKを組み込むことなく、バックエンドインフラから完全なアトリビューションと分析ソリューションを構築するためのREST APIエンドポイントを提供します。
統合のアプローチ
- 純粋なS2S:100%サーバーサイドでセッションとイベントのトラッキングを行います。
- ハイブリッド:Singular SDKがセッションを管理し、サーバーサイドがイベントトラッキングを処理します。
ハイブリッド統合パターン
ハイブリッドインテグレーションは、セッション管理のためのSingular SDKとバックエンドのイベントトラッキングのためのサーバーサイドのEVENT APIを組み合わせ、実装の容易さとサーバーサイドの柔軟性のバランスを取ります。
ハイブリッドの利点
- SDKは複雑なセッションロジック、ディープリンク、デバイスデータ収集を自動的に処理します。
- サーバーは、バックエンドシステムで処理されるトランザクションのイベントを送信します。
- クライアント側の実装の複雑さを軽減
- SESSIONエンドポイントは不要-SDKがセッション・ライフサイクルを管理
デバイス・データ取得方法:
- クライアント管理フロー:クライアントで必要なデータポイントをキャプチャし、Singular EVENT エンドポイントを使用するために内部 API を介してサーバーに転送します。
- 内部 BI ポストバック:インストール後、再エンゲージメント後、またはイベント後にデバイス識別子を含むリアルタイムのJSONペイロードを受信するように、Singular内部BIポストバックを設定します(セットアップガイド)。
デバイスグラフのメンテナンス:どちらの方法も、デバイス グラフを維持するためにサーバー側のロジックが必要です。SDKがデバイス識別子の変更を検出したら、それに応じてサーバーを更新し、正確なトラッキングを確保します。
実装リソース:
- EVENTエンドポイント必須パラメータ
- デバイスデータの取得ガイド(iOS/Androidコードサンプル
主な統合原則
| 原則 | 説明 |
|---|---|
| 柔軟性 | データ収集と送信のタイミングを完全に制御 |
| 機能パリティ | 適切なデータが提供された場合、すべてのSDK機能をサポート |
| 統合パス | クライアント → お客様のサーバー → Singular API |
| リアルタイム処理 | 一度に一つのリクエスト、バッチ処理はサポートしない |
| シーケンシャルフロー | イベントは時系列に処理される |
| 重複排除なし | Singularは重複排除を行いません-サーバーサイドで重複排除を実装します。 |
| データの永続性 | デバイスレベルのデータはインジェスト後に削除できない。 |
統合要件
純粋なS2S統合には、セッションとイベント追跡のための包括的なデータパイプラインの実装が必要です。
- データ収集クライアントアプリケーションから必要なデータポイントを収集する
- デバイスグラフ:データをサーバーに転送し、デバイス識別子を保存する。
- セッション要求 SESSION API経由でセッション通知を送信
- レスポンス処理:Singular レスポンスを処理し、クライアントアプリにリレーする。
- イベントリクエスト: EVENT API経由でイベントを転送する
REST API エンドポイント
Singular はサーバー間のセッションとイベントのトラッキングのために二つの主要な REST API エンドポイントを提供します。
セッションエンドポイント
セッショントラッキング API
SESSION エンドポイントは、アトリビューションとリテンショントラッキングのためのユーザーセッションを初期化するために、アプリを開いたイベントを Singular に通知します。
GET https://s2s.singular.net/api/v1/launch
完全なリファレンス:SESSION エンドポイント API リファレンス
イベントエンドポイント
イベントトラッキング API
EVENT エンドポイントは、アトリビューション分析とキャンペーン最適化のためにアプリ内イベントと収益をトラッキングします。
GET https://s2s.singular.net/api/v1/evt
実装フェーズ
S2S統合を成功させるには、データ品質とアトリビューション精度を最適化するために、4つの主要な実装フェーズを順次実行する必要があります。
フェーズ1:データ収集
必要なデータポイント
Singularプラットフォームの機能に必要な全パラメータを収集する強固なデータ収集戦略を確立する。
すべての必須パラメータは必須です:必要なパラメータを省略すると、データの不一致やアトリビューションエラーが発生します。 オプションのパラメータはありません。
非同期関数処理:サーバー送信のためにクライアントサイドのデータを収集する場合、非同期関数が完了するのを待ち、エッジケースを処理します。データの欠落や部分的な帰属を引き起こす一般的な問題。
実装リソース:
- SESSIONエンドポイント必須パラメータ
- EVENTエンドポイント必須パラメータ
- デバイスデータの取得ガイド(iOS/Android コードサンプル
- SKAdNetwork 4実装ガイド(iOS特有のデータポイント
フェーズ2:リアルタイムストリーミング
重要なタイミング要件
リアルタイムのデータストリーミングはアトリビューションの精度を維持し、SKAdNetworkのコンバージョン値の更新のような時間に敏感な機能を可能にします。
アトリビューションへの影響
- セッションの遅延:アトリビューション精度に深刻な影響-システムはキャンペーン関連付けのために正確な時間データを必要とします。
- SKAdNetwork タイマー:コンバージョン値のための厳しいオンデバイス・タイマー・ウィンドウにより、リアルタイムのストリーミングが重要になります。コンバージョン値の更新が遅れ、キャンペーンデータが不完全になる。
ベストプラクティス
- アプリのセッション開始のためにサーバー側のイベントリスナーを実装する
- すべての必要なパラメータを使用してセッションデータを直ちに転送する
- アプリ内イベント用にサーバーサイドイベントリスナーを実装する
- すべての必要なパラメータを使用してイベントデータを即座に転送
- 信頼性の高いデータ転送のためにWebhookアーキテクチャを使用する
- 失敗したリクエストに対するリトライ・メカニズムの実装
- 品質保証のためにデータフローを監視する
フェーズ3:レスポンス処理
双方向通信
レスポンス・ハンドリングは、サーバーサイドのAPIインタラクションとクライアントサイドの機能の橋渡しをし、ディファード・ディープ・リンクとコンバージョン値の更新を可能にする。
主なレスポンス・タイプ
- 遅延ディープリンク:APIレスポンスには、ユーザールーティングとパーソナライゼーションのためにアプリへの即時リレーを必要とする保留中のディープリンクデータが含まれています。
- コンバージョン値:iOS SKAdNetworkのコンバージョン値は、正確なキャンペーン測定のためにアプリに迅速に転送される必要があります。
ベストプラクティス
- サーバーインフラでのレスポンス処理の実装
- Singular API レスポンスの解析と検証
- 関連するレスポンスデータをクライアントアプリに転送(iOS SKAdNetworkでは必須)
- クライアント側のレスポンス処理の実装
- 適切なHTTPステータスコードで優雅にエラーを処理する
- リトライメカニズムのために失敗したレスポンスを記録する
フェーズ4:テストと検証
データフローの検証
テスト・フェーズでは、本番展開の前に、完全なデータ・パイプラインの機能と属性の正確性を検証します。
セッション帰属プロセス
- 最初のセッション(新規インストール):Singularが新規インストールを認識し、インストールアトリビューションプロセスをトリガーします。
- リエンゲージメント認定:Singularがリエンゲージメントアトリビューションプロセスをトリガーします(リエンゲージメントFAQ
- 標準セッション:Singularはユーザーアクティビティとリテンションメトリクスのためにセッションを記録します。
重要なタイミング要件
- イベント前のセッション:イベントの前にセッションを受信する必要があります。SDKはアプリを開いたときにセッションをトリガーし、その後アプリ内イベントを送信します。1分以上のバックグラウンドの後、セッションはタイムアウトします。アプリがフォアグラウンドに戻ると新しいセッションが送信される。セッション管理にはアプリのライフサイクルイベントとタイマーを使用。
- リアルタイム・イベント:アプリ内で発生したイベントは、それぞれのセッションの後にリアルタイムで送信されなければならない。
検証チェックリスト:
- セッション・データ・フローをテストし、最初のセッションとその後のセッションに正しいデータ・ポイントと値があることを確認する。
- セッションがSingularに報告された後にのみイベントを受信することを確認する(セッション前のイベントはオーガニックなアトリビューションを作成する
- セッションレスポンスが処理され、クライアントアプリに渡されることを確認する(ディファードディープリンクには重要
統合完了:
- データの収集と保存の検証
- Singular へのリアルタイムストリーミングの検証
- レスポンスの処理とロギングの検証
- 全てのテストデータフローの検証
テストガイド:S2S統合テストガイド
高度な機能
高度なアトリビューション処理、ディープリンク、クロスデバイストラッキング、プラットフォーム固有の機能により、S2S統合を強化します。
Apple検索広告アトリビューション
iOS検索広告統合
Apple Search AdsはSelf-Attributing Network (SAN)であり、Appleフレームワークによるプラットフォーム固有のアトリビューション実装が必要です。
フレームワークのサポート
- iOS 14.2以下: iAdフレームワーク
- iOS 14.3以上: AdServicesフレームワーク(推奨
デュアル実装:iAdが非推奨になるまで、iAdとAdServicesフレームワークの両方を実装する。Singularは、アトリビューションとレポート作成において、iAdシグナルよりもAdServicesを優先します。
完全ガイド:Apple Search Ads Integration ドキュメント
iAdフレームワークの実装
iOS14.2以下のiAdフレームワークを使用して、Apple Search Adsのアトリビューションデータを取得および送信します。
ステップ 1: アトリビューションデータの取得
#import <iAd/iAd.h>
Class ADClientClass = NSClassFromString(@"ADClient");
if (ADClientClass) {
id sharedClient = [ADClientClass performSelector:@selector(sharedClient)];
if ([sharedClient respondsToSelector:@selector(requestAttributionDetailsWithBlock:)]) {
[sharedClient requestAttributionDetailsWithBlock:^(NSDictionary *attributionDetails, NSError *error) {
if (attributionDetails && attributionDetails.count 0) {
// REPORT attributionDetails FROM YOUR APP TO YOUR SERVER
}
}];
}
}
遅延の処理:検索広告をクリックしたユーザーは、すぐにアプリをダウンロードして開く可能性があります。以下の方法でアトリビューションタイミングの問題を防ぎましょう:
- アトリビューションデータを取得する前に数秒の遅延を設定する。
- レスポンスがFalseまたはエラーコード(0、2、3)の場合、リトライロジックを実装する。2秒後にリトライ
ステップ2:Singularへの送信
e パラメータとしてアトリビューション JSON を渡し、EVENT エンドポイントを介して予約名__iAd_Attribution__ でイベントを報告する。
タイミング要件:
-
iOS 13+: インストール/再インストール後の最初のセッションの直後に
__iAd_Attribution__イベントを送信。そうでない場合、Apple Search Adsのデータはアトリビューションとして考慮されません。 -
iOS 14+:アトリビューションのレスポンスは特定の条件下でのみ利用可能で、ATT ステータスが
ATTrackingManager.AuthorizationStatus.deniedの場合は利用できません。
AdServicesフレームワークの実装
iOS14.3以上の場合、AdServicesフレームワークを使用してアトリビューショントークンを取得および送信します。
ステップ1:アトリビューショントークンの取得
#import <AdServices/AdServices.h>
NSError *error = nil;
Class AAAttributionClass = NSClassFromString(@"AAAttribution");
if (AAAttributionClass) {
NSString *attributionToken = [AAAttributionClass attributionTokenWithError:&error];
if (!error && attributionToken) {
// Handle attributionToken
}
}
トークンの特徴
- デバイス上で生成
-
5分間キャッシュされ、
attributionToken()を呼び出すと、有効期限が切れた後に新しいトークンが生成されます。 - 24時間有効
ステップ2:Singularに送信
トークンをURLエンコードし、SESSIONエンドポイントに attribution_token パラメータとして追加します。
Google Play インストールリファラー
Android インストールのアトリビューション
Google Play Install Referrer は、Play ストアに到着する前のユーザーに関する情報を含む、最も正確な Android インストール帰属情報を提供します。
必須
- ユーザーレベルのエクスポートにおけるFacebookデータ
- データ送信先との共有
- ポストバックの送信
詳細:Google Install Referrer ドキュメント
実装ステップ
- Play Install Referrer API を使用して、アプリを最初に開いたときにインストールリファラーを取得する。
-
必要な属性を含む
install_refJSON パラメータを含むSESSION エンドポイント経由でセッションを報告します。
install_ref 属性:
| 属性 | 属性 |
|---|---|
referrer
|
Play Install Referrer API からのリファラー値 (JSON オブジェクトを文字列としてエンコード) |
referrer_source
|
"サービス" を指定 |
clickTimestampSeconds
|
API からのクリックタイムスタンプ (例: "1550420123") |
installBeginTimestampSeconds
|
API からのインストール開始時間 |
current_device_time
|
現在のデバイスの時刻(ミリ秒単位)(例:「1550420454906 |
メタインストールリファラー
Facebookアトリビューションの強化
2025年6月18日現在:MetaのAdvanced Mobile Measurement(AMM)により、Meta Install Referrerを実装する必要がなくなりました。AMMが有効な場合は推奨されません。
Meta Referrerは、Google Play Install ReferrerとMeta Install Referrerのテクノロジーを組み合わせた、アプリインストールの詳細なユーザーレベルのアトリビューションデータを提供するAndroid専用の測定ソリューションです。
実装ステップ
- Metaのドキュメントに従って、最初のアプリ開封時にMetaインストールリファラーを取得する。
-
meta_refJSON パラメータに必要な属性を含むSESSION エンドポイント経由でセッションを報告します。
meta_ref 属性:
| 属性 | 説明 |
|---|---|
is_ct
|
is_ct from Meta Install Referrer (0 または 1) |
install_referrer
|
メタインストールリファラーからの install_referrer |
actual_timestamp
|
Meta Install Referrerからのactual_timestamp (例: 1693978124) |
Singularリンクとディープリンク
キャンペーンから特定のアプリ内コンテンツへのシームレスなユーザー体験を可能にするために、シンギュラートラッキングリンクのディープリンクとディファードディープリンクのサポートを実装します。
ディープリンクは、ユーザーをアプリ内の特定のコンテンツに導くクリック可能なリンクです。アプリがインストールされたデバイスでユーザーがディープリンクをクリックすると、アプリが開き、特定の商品や体験が表示されます。
リソース:ディープリンクFAQ|シンギュラーリンクFAQ
前提条件
プラットフォーム設定
クライアントアプリがSingular LinksをiOSユニバーサルリンクまたはAndroidアプリリンクとして認識する必要があります。
設定ガイド:シンギュラーリンクの前提条件
ディープリンクの実装
ディープリンクのキャプチャ
ディープリンク経由でアプリが開くと、openuri パラメータに URL 値を追加することで、openURL をキャプチャし、SESSION リクエストに追加します。 シンギュラーリンクを使用する場合は必須です。
シンギュラーリンクのパラメータ:
-
_ios_dlおよび_android_dl: プラットフォームごとに異なるディープリンク値でリンクが生成された場合に存在します。 -
_dliOSとAndroidでディープリンクの値が同じ場合に存在。 -
_pパススルーパラメータが含まれている場合に必要。
ディープリンクハンドラコード
アプリには、openURL を解析し、シンギュラーリンクパラメータを適切に処理するハンドラコードが必要です。
class DeepLinkHandler {
func handleURL(_ url: URL) {
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else {
return
}
var params: [String: String] = [:]
// Parse query parameters
if let queryItems = components.queryItems {
for item in queryItems {
switch item.name {
case "_dl":
params["deeplink"] = item.value
case "_ios_dl":
params["ios_deeplink"] = item.value
case "_p":
params["passthrough"] = item.value
default:
break
}
}
}
// Handle the parsed parameters
processDeepLinkParameters(params)
}
private func processDeepLinkParameters(_ params: [String: String]) {
// Process the parameters as needed
print("Processed parameters: \(params)")
}
}
// In SceneDelegate or AppDelegate
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let url = URLContexts.first?.url else { return }
let handler = DeepLinkHandler()
handler.handleURL(url)
}
class DeepLinkHandler {
fun handleDeepLink(intent: Intent) {
val data: Uri? = intent.data
data?.let { uri ->
val params = mutableMapOf<String, String>()
// Parse query parameters
uri.queryParameterNames?.forEach { name ->
when (name) {
"_dl" -> params["deeplink"] = uri.getQueryParameter(name) ?: ""
"_android_dl" -> params["android_deeplink"] = uri.getQueryParameter(name) ?: ""
"_p" -> params["passthrough"] = uri.getQueryParameter(name) ?: ""
}
}
processDeepLinkParameters(params)
}
}
private fun processDeepLinkParameters(params: Map<String, String>) {
// Process the parameters as needed
println("Processed parameters: $params")
}
}
// In your Activity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Handle deep link if activity was launched from a deep link
intent?.let { DeepLinkHandler().handleDeepLink(it) }
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
// Handle deep link if app was already running
intent?.let { DeepLinkHandler().handleDeepLink(it) }
}
}
遅延ディープリンク
初回インストール時のディープリンク
インストール後初めてアプリを開いたとき、Singularにセッションを報告するときにパラメータを追加することで、遅延ディープリンクを有効にします。
必須パラメータ:
-
install=true -
ddl_enabled=true
Singularはアプリが遅延ディープリンクのトラッキングリンクを通してインストールされたかどうかをチェックします。もしそうなら、SESSIONリクエストが返されます:
-
deferred_deeplinkユーザーに正しい製品/体験を表示するためのディープリンクのアドレスパース -
deferred_passthroughディープリンクに追加されたパススルーパラメータ
サンプルレスポンス:
{
"deferred_deeplink": "myapp://deferred-deeplink",
"status": "ok",
"deferred_passthrough": "passthroughvalue"
}
動的パススルーパラメータ
Singular的なトラッキングリンクには、ユーザー体験をカスタマイズするための動的パススルー・パラメータを含めることができます。
組織がリンクに動的パススルーを設定した場合、ディープリンクの URL には、コンテンツ/エクスペリエンスのルーティング用に URL エンコードされた JSON 文字列値または構造化されていない文字列を持つ_p パラメータが含まれます。
ショートリンクの解決
短縮されたSingularリンクからアプリを開く場合、SESSIONリクエストにパラメータを含めて、短いリンクを長いリンクに解決します。
必須パラメータ: singular_link_resolve_required=true
リンクハンドラでディープリンクとパススルーパラメータを解析するために、Singularは短縮されていないロングリンクを返します。
サンプルレスポンス:
{
"status": "ok",
"resolved_singular_link": "https://myapp.sng.link/A59c0/nha7?_dl=myapp%3A%2F%2Fdeeplink&_ddl=myapp%3A%2F%2Fdeferred-deeplink&_p=passthroughvalue"
}
その他の機能
クロスデバイス追跡、収益追跡、アンインストール監視、包括的な分析のためのデータプライバシーコンプライアンスを実装します。
クロスデバイストラッキング
カスタムユーザーIDの実装
custom_user_id パラメータを活用して、ユーザーをデバイスレベルのセッションに関連付け、クロスデバイスのレポートとユーザーレベルの分析を行います。
プライバシー・コンプライアンス: custom_user_id に個人を特定できる情報(PII)を記載しないことで、データ・プライバシー・ポリシーを遵守します。一意のユーザー識別子として、ハッシュ化されたユーザー名、電子メール、またはランダムに生成された文字列を使用します。
ユーザーのプライバシーを維持しながら、包括的なクロスデバイスレポート、ユーザーレベルのデータエクスポート、内部BIポストバックを可能にします。
収益トラッキング
アプリ内課金レポート
ROI分析、キャンペーンパフォーマンス測定、エクスポート/ポストバックの充実のために、アプリ内購入からの収益を追跡します。
収益パラメータで EVENTエンドポイントを使用します:
-
is_revenue_eventイベントを収益イベントとしてマーク(イベント名が__iap__または金額> 0の場合はスキップ)。 -
purchase_receiptAndroid/iOS In-App Purchaseオブジェクト-トランザクションの詳細とレポートの充実化のために強く推奨されます。 -
receipt_signature(Android):トランザクションの検証と不正防止に強く推奨 -
amt例:"amt=1.99")。 -
curISO 4217 通貨コード (例: "cur=USD")
実装ガイド:サブスクリプション状態の管理
アンインストール追跡
サイレントプッシュ通知のセットアップ
セッション通知ごとにプッシュトークンを送信することで、デバイスのサイレントプッシュ通知を使用してアンインストールを追跡します。
セットアップ要件:
- プラットフォーム固有のアンインストール追跡セットアップに従ってください:
-
SESSION リクエストにプラットフォーム固有のトークンを追加します:
-
iOS:
apns_token(APNsデバイストークン) -
Androidの場合
fcm(FCMデバイストークン)
-
iOS:
iOSインストールレシート
レシートの検証
iOSセッションを報告するときに install_receipt
パラメータを渡す。
import Foundation
import StoreKit
class ReceiptManager {
static func getInstallReceipt() - String? {
if #available(iOS 18.0, *) {
let semaphore = DispatchSemaphore(value: 0)
var result: String?
Task {
do {
let transaction = try await AppTransaction.shared
result = transaction.jwsRepresentation
semaphore.signal()
} catch {
debugPrint("Failed to get app transaction: \(error.localizedDescription)")
semaphore.signal()
}
}
semaphore.wait()
return result
} else {
guard let receiptURL = Bundle.main.appStoreReceiptURL else {
debugPrint("Receipt URL not found")
return nil
}
do {
let receiptData = try Data(contentsOf: receiptURL, options: .uncached)
return receiptData.base64EncodedString(options: [])
} catch {
debugPrint("Failed to read receipt: \(error.localizedDescription)")
return nil
}
}
}
}
データプライバシーコンプライアンス
ユーザーの同意処理
GDPR、CCPA、その他のプライバシー規制に準拠するために、データ共有に関するエンドユーザーの同意をSingularに通知します。
次のパラメータを使用します。 data_sharing_options
パラメータを使用します:
-
{"limit_data_sharing":false}情報の共有に同意(オプトイン)したユーザー -
{"limit_data_sharing":true}情報の共有を拒否したユーザー
Singularはユーザープライバシーポストバックで limit_data_sharing 、コンプライアンスを必要とするパートナーに情報を渡します。
オプションだが推奨:パラメータは任意ですが、一部のアトリビューション情報は、ユーザーが明示的にオプトインした場合にのみ、パートナーによって共有されます。