---
title: "FirebaseとGoogle Analytics"
description: "AdaptyのサブスクリプションイベントをFirebaseとGoogle Analyticsに送信して、オーディエンス、リモートコンフィグ、Google広告アトリビューション、その他のFirebaseツールを活用しましょう。"
---

Adaptyは、購入・更新・返金・トライアル開始などのサブスクリプションイベントをFirebaseとGoogle Analyticsに送信できます。1つの連携で両方にデータを届けられます。
:::warning
Firebase プロジェクトと、それにリンクされた Google Analytics プロパティの両方が必要です。どちらか一方しか使わない場合でも同様です。Firebase と Google Analytics は、2つのコンソールで表示される同じデータです。
:::

購入と返金のイベントは、収益、通貨、プロダクトの詳細を付加した状態で届きます。同じデータが Firebase のモバイルツール（Audiences、Remote Config など）と Google Analytics のレポートに反映されます。

これはアナリティクス連携であり、Google 広告のアトリビューションツールではありません。詳しくは[制限事項](#limitations)をご覧ください。
## このインテグレーションでできること \{#what-you-can-do-with-this-integration\}

Adapty はユーザーを `subscription_state`（`subscribed`、`active_trial`、`never_subscribed` など）でグループ化し、サブスクリプションのライフサイクルイベントを Firebase および Google Analytics に転送します。
- **オーディエンス**: Firebase と Google Analytics でサブスクライバーオーディエンスを作成し、外部チャネルに活用 — Google Ads リターゲティング、FCM キャンペーン、類似ユーザーモデリング。
- **Google Ads コンバージョン** *(Google Analytics)*: `purchase` および `refund` を Google Ads のコンバージョン目標として使用。
- **Firebase Remote Config**: アプリを更新せずに利用制限、コピー、機能フラグを変更 — サブスクリプション状態を条件として設定。（フロー/ペイウォールのコンテンツを設定する [Adapty リモートコンフィグ](customize-paywall-with-remote-config) とは異なります。）
- **Cloud Messaging**: アプリが閉じているときに離脱したサブスクライバーへプッシュ通知を送信。
- **クロスデバイストラッキング** *(Google Analytics)*: Adapty が `customer_user_id` を Google Analytics に送信することで、Google Ads が同一ユーザーを複数デバイスにまたがって追跡可能に。
- **コンバージョンファネル** *(Google Analytics)*: ユーザーがコンバージョンまたはチャーンに至る前にアプリ内で何を行ったか確認。
- **予測**: 購入履歴を使ってチャーンや支出を予測。
- **A/B テスト**: サブスクライバーコホートを対象にアプリ機能をテスト — たとえば、トライアルユーザーに新しいナビゲーションパターンを展開してセッション長を計測。（ペイウォールのバリアントには [Adapty A/B テスト](ab-tests) を使用してください。）
## インテグレーションの仕組み \{#how-the-integration-works\}
1. ユーザーが初めてアプリを開くと、Firebase SDK はインストールに対して一意の識別子（**Firebase App Instance ID**）を生成します。Firebase と Google Analytics はこの ID を使って、各イベントの発生元となるインストールを特定します。
2. アプリは Firebase App Instance ID を Adapty の SDK に渡します。Adapty はユーザーのプロファイルをこの Firebase インストールに紐づけます。
3. ユーザーが購入を行うと、Adapty のサーバーは Firebase App Instance ID を付与したうえで、イベントを Firebase にサーバー間通信で転送します。このデータのやり取りはアプリの外部で行われます。
4. Firebase は購入をインストールと照合するため、ユーザーがアプリ内で行ったその他のアクティビティと並べて購入状況を確認できます。
:::note
Firebase App Instance ID はデバイス固有の情報です。同じ Adapty ユーザーが別のデバイスでアプリを開くと、新しい Firebase ID が以前の ID を上書きします。デバイスをまたいでユーザーを特定し続けるには、[カスタマーユーザー ID](identifying-users) を使用してください。
:::
### Stripe の購入 \{#stripe-purchases\}

Stripe の購入が Firebase に届くのは、購入者がまず**モバイルアプリを起動した場合**に限られます。Stripe の購入が実行される**前に**、Firebase App Instance ID が設定されている必要があります。

App Store および Play Store の購入では、これは自動的に行われます。これらの購入はモバイルアプリ内から発生し、[`setIntegrationIdentifier`](#configure-your-app-code) の呼び出しと同時に行われます。購入が実行される時点で Firebase ID は既に存在しています。
Stripe の購入はアプリ外、つまりサーバー側で行われます。モバイルアプリは起動時に `setIntegrationIdentifier` を呼び出す必要があります — Stripe の購入が発生する前に。そうしないと、Adapty にアタッチする ID がなく、Stripe の購入が Firebase に届きません。
### 制限事項 \{#limitations\}
- **Google Ads アトリビューションツールではありません。** このインテグレーションは、Adapty のイベントを Firebase および Google Analytics に送信してアナリティクスに活用するものです。Google Ads キャンペーン（UAC / ユニバーサルアプリキャンペーン）へのアプリインストールのアトリビューションや、有料トラフィックとオーガニックトラフィックの区別には対応していません。インストールアトリビューションには、Adapty の組み込み機能である [Adapty アトリビューション](adapty-user-acquisition) をご利用ください。
- **過去データの遡及入力はできません。** Adapty は、インテグレーションを有効にした時点以降のイベントを転送します。過去の購入・更新・返金のデータが Firebase に届くことはありません。（過去のデータは Adapty の [S3](s3-exports) / [GCS](google-cloud-storage) エクスポートに保存されていますが、Firebase へのインポートはこのインテグレーションの対象外です。）
- **Web 専用の購入者は Firebase に届きません。** Adapty は、モバイルアプリが設定した Firebase App Instance ID を使って購入データを Firebase に転送します。アプリをインストールしていない購入者には ID が存在しないため、その購入データは Firebase に届きません。詳細は上記の [Stripe 購入](#stripe-purchases) をご参照ください。Web トラッキングには [FunnelFox の Firebase インテグレーション](https://funnelfox.com/docs/integrations/subscription-management/adapty) または Google Analytics の Web データストリームの利用をご検討ください。
- **Paddle の購入は対象外です。** このインテグレーションは現時点で Paddle に対応していません。Paddle の購入は Adapty アナリティクス内に留まり、このパスを通じて Firebase に届くことはありません。
- **Stripe の購入には Stripe 固有の制限が適用されます。** 詳細は [Stripe インテグレーションの制限事項](stripe#current-limitations) をご確認ください。
## セットアップ手順 \{#setup-instructions\}
### Firebase を設定する \{#configure-firebase\}

1. [Firebase Console](https://console.firebase.google.com/) を開き、プロジェクトを選択または作成します。サンドボックスイベントを本番のアナリティクスに混入させないために、開発ビルド用には別の Firebase プロジェクトを使用してください。
2. プロジェクトを Google Analytics プロパティにリンクします。Firebase ではプロジェクト作成時にリンクを促しますが、後から **Project settings** > **Integrations** > **Google Analytics** で追加することもできます。

    
3. **Project settings** > **General** > **Your apps** で、リリースするプラットフォーム（iOS / Android / Web）ごとにエントリを追加します。Stripe の場合は Web アプリのエントリを追加してください（Stripe 専用のネイティブアプリタイプはありません）。各エントリには固有の **Firebase App ID** が生成され、Google Analytics 上に対応するデータストリームが作成されます。この ID は、セットアップ時に Adapty の Firebase インテグレーション設定に貼り付けます。

    
### Adapty を設定する \{#configure-adapty\}

1. Adapty ダッシュボードで [**Integrations** > **Firebase**](https://app.adapty.io/integrations/firebase) を開きます。

2. **Firebase integration** トグルを有効にします。

3. 対応している各プラットフォームの認証情報を入力します。Adapty は各プラットフォームに対して **Firebase App ID** と **Google Analytics secret** の両方が必要です。各値は iOS、Android、Stripe で異なります。
| Adapty ダッシュボード | Google Analytics | 確認場所 |
   | --- | --- | --- |
   | **Firebase App ID** | **App ID** | Firebase Console > **Project settings** > **General** > **Your apps** |
   | **Google Analytics secret** | **Measurement Protocol API secret** | Google Analytics > **Admin** > **Data streams** > **Measurement Protocol API secrets** > **Create** |

   
4. Adapty がどのように収益とユーザーデータを転送するかを設定します。4つのコントロールはダッシュボードの1行に並んでいます：
- **Revenue definition** ドロップダウン: 総収益、ストア手数料控除後の収益、または[ストア手数料・税金控除後の収益](controls-filters-grouping-compare-proceeds#display-gross-or-net-revenue)。
   - **Send user properties** トグル: オンにすると、イベントに `subscription_state` と `subscription_product_id` が含まれます。レポートやオーディエンスでの活用方法は[レポートでサブスクリプションデータを使用する](#use-subscription-data-in-reports-and-audiences)をご覧ください。
   - **Report user's currency** トグル: オンにすると、Adapty は各トランザクションの現地通貨をアカウントのレポート通貨に変換してから Google Analytics に送信します。
   - **Send trial price** トグル: トライアル開始は重要です。多くの有料ユーザーはトライアルから始めることが多いからです。しかし Google 広告の入札最適化は、収益を伴うイベントのみを追跡対象として扱います。このトグルをオンにすると、各トライアルにダミーの価格が割り当てられ、Google がコンバージョンとして認識し、トライアル開始ユーザーの獲得に向けて広告費を最適化できます。オンにすると **Trial price percentage** フィールドが表示されます。Google が各トライアルの価値として扱うべき、フルサブスクリプション価格に対する割合を設定してください。例えば `50%` と設定すると、トライアル中はサブスクリプション価格の半額がレポートされます。

5. Adapty イベントを Firebase/Google Analytics のイベント名にマッピングします。Adapty では **iOS** と **Android** ごとに個別のイベントマップを用意しているため、プラットフォームごとに異なる名前を使用できます。**Stripe の購入には iOS のイベントマップが使用されます** — Stripe 専用のマップはありません。
Google Analytics は、Measurement Protocol に厳格な制限を設けています。イベント名は40文字、ユーザープロパティ名は24文字、値は36文字が上限です。これらの制限を超えるカスタムイベントは、Google Analytics によって警告なしに破棄されます。

:::warning
一部のイベントは、Firebase および Google Analytics の予約済みeコマース語彙（`purchase` および `refund`）を使用しています。Google 広告のコンバージョンインポート、Google Analytics の収益レポート、予測オーディエンスはこれらの正確な文字列に依存しています。これらの機能が不要な場合にのみ、デフォルト値を変更してください。
:::

6. **Save** をクリックします。数分以内に Adapty が Firebase へのイベント転送を開始します。
### アプリコードの設定 \{#configure-your-app-code\}

:::tip
アプリに <InlineTooltip tooltip="Firebase SDK">[iOS](https://firebase.google.com/docs/ios/setup)、[Android](https://firebase.google.com/docs/android/setup)、[Flutter](https://firebase.google.com/docs/flutter/setup)、[Unity](https://firebase.google.com/docs/unity/setup)、[React Native](https://rnfirebase.io/)、[Capacitor](https://github.com/capawesome-team/capacitor-firebase)</InlineTooltip> が含まれていることを確認してください。
:::
Adaptyが各イベントに**Firebase App Instance ID**を含める必要があります。これがないとFirebaseにデータが届きません（`MISSING_INTEGRATION_ID`）。

`FirebaseApp.configure()`と`Adapty.activate()`の後、Firebase SDKにApp Instance IDを問い合わせ、`setIntegrationIdentifier`経由でAdaptyに渡してください。この処理は購入フローの前に、アプリ起動ごとに1回実行してください。

---
no_index: true
---

import Callout from '../../../components/Callout.astro';

<Callout type="note">
サードパーティSDKはユーザーIDを非同期で生成します。`Adapty.activate()` の実行時にIDがまだ準備できていない場合があります。**Customer User ID** がこれらのSDKのいずれかから取得される場合は、IDなしで `Adapty.activate()` を呼び出してください。IDが取得できたら、`setIntegrationIdentifier()` を呼び出し、次にCUIDで `identify()` を呼び出してください。
</Callout>

<Tabs groupId="current-os" queryString>
<TabItem value="swift" label="iOS (Swift)" default>

<Tabs groupId="sdk-version" queryString>
<TabItem value="v4" label="Adapty SDK v4+">
```swift showLineNumbers

FirebaseApp.configure()

if let appInstanceId = Analytics.appInstanceID() {
    do {
        try await Adapty.setIntegrationIdentifier(.firebaseAppInstanceId(appInstanceId))
    } catch {
        // handle the error
    }
}
```

</TabItem>
<TabItem value="v3" label="Adapty SDK v3" default>
```swift showLineNumbers

FirebaseApp.configure()

if let appInstanceId = Analytics.appInstanceID() {
    do {
        try await Adapty.setIntegrationIdentifier(
            key: "firebase_app_instance_id",
            value: appInstanceId
        )
    } catch {
        // handle the error
    }
}
```

</TabItem>
</Tabs>

</TabItem>
<TabItem value="kotlin" label="Android (Kotlin)">
```kotlin showLineNumbers
// after Adapty.activate()

FirebaseAnalytics.getInstance(context).appInstanceId.addOnSuccessListener { appInstanceId ->
    Adapty.setIntegrationIdentifier("firebase_app_instance_id", appInstanceId) { error ->
        if (error != null) {
            // handle the error
        }
    }
}
```

</TabItem>
<TabItem value="java" label="Android (Java)">
```java showLineNumbers
// after Adapty.activate()

FirebaseAnalytics.getInstance(context).getAppInstanceId().addOnSuccessListener(appInstanceId -> {
    Adapty.setIntegrationIdentifier("firebase_app_instance_id", appInstanceId, error -> {
        if (error != null) {
            // handle the error
        }
    });
});
```

</TabItem>
<TabItem value="flutter" label="Flutter (Dart)">
```dart showLineNumbers

final appInstanceId = await FirebaseAnalytics.instance.appInstanceId;

if (appInstanceId != null) {
    try {
        await Adapty().setIntegrationIdentifier(
            key: "firebase_app_instance_id",
            value: appInstanceId,
        );
    } on AdaptyError catch (adaptyError) {
        // handle the error
    } catch (e) {
        // handle the error
    }
}
```

</TabItem>
<TabItem value="unity" label="Unity (C#)">
```csharp showLineNumbers
using AdaptySDK;
using Firebase.Analytics;

FirebaseAnalytics
    .GetAnalyticsInstanceIdAsync()
    .ContinueWithOnMainThread((task) => {
        if (!task.IsCompletedSuccessfully) {
            // handle the error
            return;
        }

        Adapty.SetIntegrationIdentifier(
            "firebase_app_instance_id",
            task.Result,
            (error) => {
                // handle the error
            }
        );
    });
```

</TabItem>
<TabItem value="rn" label="React Native (TS)">
```typescript showLineNumbers

try {
    const appInstanceId = await analytics().getAppInstanceId();
    if (appInstanceId) {
        await adapty.setIntegrationIdentifier("firebase_app_instance_id", appInstanceId);
    }
} catch (error) {
    // handle `AdaptyError`
}
```

</TabItem>
</Tabs>
### インテグレーションを確認する \{#verify-the-integration\}

イベントが正しく流れているかを確認する最も手軽な方法は、Firebase DebugView です。

1. テストデバイスで、[Firebase デバッグモードを有効にした](https://firebase.google.com/docs/analytics/debugview#enable_debug_mode)状態でアプリを起動します。
2. サンドボックス購入、または Adapty ダッシュボードで有効にしたイベントをトリガーします。
3. Firebase Console > **Analytics** > **DebugView** を開きます。イベントはすべてのパラメーターとともに数秒以内に表示されます。

リアルタイム、レポート、オーディエンスなどの標準レポートは、レポートの種類に応じて数分〜24時間以内に反映されます。リアルタイムで確認できるのは DebugView だけです。
## レポートやオーディエンスでサブスクリプションデータを活用する \{#use-subscription-data-in-reports-and-audiences\}

**Send user properties** を Adapty ダッシュボードで有効にしてください（[Adapty の設定](#configure-adapty)、手順 4）。これを有効にしないと、Adapty は `subscription_state` や `subscription_product_id` を転送しないため、このセクションの内容は機能しません。
デフォルトでは、FirebaseとGoogle Analyticsはユーザープロパティを公開しません。それぞれをカスタムディメンションとして登録することで、`subscription_state`と`subscription_product_id`がレポート、Explorations、オーディエンスで利用できるようになります。ディメンションはGoogle Analytics管理画面で設定します。FirebaseとGoogle Analyticsはバックエンドを共有しているため、両方でクエリを実行できます。

有料ユーザーのGoogle Adsオーディエンスを構築したり、予測モデルへのデータ供給に役立ちます。

設定が完了すると、Adaptyはそれ以降のイベントにこれらのプロパティを付与します。既存のイベントは更新されません。
1. Google Analytics で **Admin** > **Custom definitions** を開きます。
    
2. **Create custom dimensions** をクリックします。
3. 各プロパティに以下を設定します：
   - **Dimension name**：人間が読める任意の名前。例：「Subscription state」。
   - **Scope**：**User**。
   - **User property**：`subscription_state` または `subscription_product_id`。名前は完全に一致している必要があります。Google Analytics は大文字と小文字を区別します。
   
## トラブルシューティング \{#troubleshooting\}
### Firebaseにイベントが表示されない \{#events-dont-appear-in-firebase\}

- Firebaseアプリインスタンスの ID が、**最初の購入が行われる前**に設定されていることを確認してください。Firebase IDが設定されていないイベントはFirebaseに届かず、エラーが発生します。
- Firebase ConsoleでリンクされているGoogle Analyticsプロパティがデータストリームと一致していることを確認してください。
- Adaptyに設定した認証情報（IDとシークレット）がプラットフォームと一致していることを確認してください。
### `access_level_updated` がイベントフィードで失敗と表示される \{#access_level_updated-shows-as-failed-in-the-event-feed\}

`access_level_updated` は **Webhook 専用イベント**です。Adapty は Firebase へのこのイベントの配信を試みません。ただし、イベントフィードには配信失敗として表示されます。この行は無視してください。インテグレーションは正常です。このイベントを使用するには、[Webhook インテグレーション](webhook)を設定してください。
### サンドボックスイベントが本番データを汚染する \{#sandbox-events-pollute-production-data\}

Adapty はサンドボックスと本番のトランザクションを同じ Firebase プロジェクトに転送します。[Firebase の設定](#configure-firebase) を参照してください — 開発ビルド用に別の Firebase プロジェクトを使うことで、この問題を完全に回避できます。
### StoreKit 2 アプリでは Firebase が収益を過小計上する \{#firebase-undercounts-revenue-for-storekit-2-apps\}

Firebase は StoreKit 1 のすべての購入に対して `in_app_purchase` イベントを自動ログに記録します — コード不要です。StoreKit 2 は異なる API を使用しており、Firebase はそれらのトランザクションを認識できません。

その影響として、別の収益パイプラインを持たない SK2 中心のアプリでは、Firebase・Google Analytics・下流のすべての Google 広告キャンペーンで収益が半分以下に過小報告されます。入札の最適化は誤った数値に基づいて動作し、収益レポートには実態の半分しか表示されません。
修正方法：`firebase_app_instance_id` を Adapty に渡してください（[アプリコードの設定](#configure-your-app-code)を参照）。Adapty は Measurement Protocol を通じて、収益・通貨・プロダクトを含むすべての購入データを転送します。
### Adapty アナリティクスと Firebase の数値が一致しない \{#adapty-analytics-and-firebase-numbers-diverge\}
- **StoreKit 2**: 最大の原因はこれです。[StoreKit 2 アプリにおける Firebase の収益過小計上](#firebase-undercounts-revenue-for-storekit-2-apps)をご覧ください。
- **SDK の普及率**: Firebase がイベントをカウントするのは、Firebase App Instance ID を送信しているアプリのユーザーのみです。古いバージョンのアプリはこの呼び出しを行いません。Adapty はそれらのユーザーもカウントしますが、Firebase はカウントしません。
- **サンドボックスイベント**: Adapty はサンドボックスのトランザクションも Firebase に転送します。開発ビルドとの混在を避けるために、開発用には別の Firebase プロジェクトを使用してください。
- **サンプリング**: Google Analytics のエクスプロレーションは大規模なデータセットをサンプリングします。サンプリングなしの数値を確認するには、リアルタイムビューまたは標準レポートを参照してください。
### カスタムイベント名が Google Analytics に拒否される \{#custom-event-names-are-rejected-by-google-analytics\}

Google Analytics のイベント名は、40文字以内、英数字とアンダースコアのみ、かつ先頭が英字である必要があります。これらの制限に違反するカスタム Adapty イベントは、ダッシュボードで名前を変更してください。