取り組みの背景:Mixpanelがアプリ成長の鍵を握る理由
アプリを公開した後、「ユーザーがどこで離脱しているのか」「どの機能が本当に使われているのか」を把握することは、改善サイクルを回すうえで不可欠です。ダウンロード数だけを見ていても、なぜユーザーが定着しないのかは分かりません。そこで役立つのが、Mixpanelというプロダクトアナリティクスツールです。
Mixpanelはユーザー単位でのイベントトラッキング、ファネル分析、コホート分析を強力にサポートするツールで、世界中のスタートアップから大企業まで幅広く採用されています。無料プランでも月間2万件のイベントを計測できるため、個人開発者でも導入しやすい点が魅力です。
Mixpanelの基本と料金プラン
Mixpanelには3つのプランが用意されており、個人開発の初期フェーズであれば**Starterプラン(無料)**から始めることができます。主な特徴をまとめると以下のとおりです。
- Starter(無料): 月間20,000件のイベント、コアレポート機能、無制限のユーザー数
- Growth: 月間$28〜(イベント数に応じて変動)、A/Bテストやより詳細な分析機能
- Enterprise: 大規模向け。SSO・カスタムSLAなど
Rorkアプリの初期ローンチでは無料プランで十分です。ユーザーが増えてきた段階でGrowthプランへ移行するのがおすすめです。
Step 1:Mixpanelアカウントの作成とプロジェクト設定
まず Mixpanel公式サイト からアカウントを作成し、新しいプロジェクトを作成します。
プロジェクトを作成すると、プロジェクトトークンが発行されます。このトークンはSDKの初期化に必要になるので、安全な場所に控えておいてください。
ダッシュボードの「Project Settings」→「Overview」から確認できます。
Step 2:RorkプロジェクトへのMixpanel SDK導入
パッケージのインストール
Rorkのプロジェクトでは、Expo(React Native)環境が前提となります。Mixpanelの公式Expo対応ライブラリを使用します。
# Mixpanel React Native SDK をインストール
npx expo install mixpanel-react-nativeRorkでプロジェクトを開き、プロンプトに以下のように指示することでも追加できます:
mixpanel-react-nativeパッケージを追加して、
Mixpanel Analytics を初期化するコードを実装してください。
トークンは環境変数 EXPO_PUBLIC_MIXPANEL_TOKEN から読み込んでください。
初期化コードの実装
app/_layout.tsx(またはエントリポイント)にMixpanelの初期化処理を追加します:
import { Mixpanel } from 'mixpanel-react-native';
import { useEffect } from 'react';
// Mixpanelインスタンスをシングルトンとして管理
const trackAutomaticEvents = true;
export const mixpanel = new Mixpanel(
process.env.EXPO_PUBLIC_MIXPANEL_TOKEN ?? '',
trackAutomaticEvents
);
export default function RootLayout() {
useEffect(() => {
// アプリ起動時に初期化
mixpanel.init();
// 開発環境ではデバッグログを有効化
if (__DEV__) {
mixpanel.setLoggingEnabled(true);
}
}, []);
// ... 以下にナビゲーション等の設定
}.env.localファイルに環境変数を追加します:
# .env.local(Gitにコミットしないこと)
EXPO_PUBLIC_MIXPANEL_TOKEN=YOUR_MIXPANEL_PROJECT_TOKENStep 3:イベントトラッキングの実装
Mixpanelの核心はイベントトラッキングです。ユーザーがアプリ内で行ったアクションをイベントとして記録し、後から分析できます。
基本的なイベント送信
import { mixpanel } from '../app/_layout';
// シンプルなイベント送信
mixpanel.track('Button Tapped', {
screen: 'HomeScreen',
button_name: 'Start Free Trial',
});
// ユーザーがサブスクリプションを開始した場合
mixpanel.track('Subscription Started', {
plan: 'pro_monthly',
price_usd: 2.99,
trial_days: 7,
});
// 記事の閲覧イベント
mixpanel.track('Article Viewed', {
article_id: 'rork-mixpanel-guide',
category: 'analytics',
reading_time_seconds: 0, // スクロール完了時に更新
});カスタムフックで再利用可能なトラッキング
アプリ全体で一貫したトラッキングを行うために、カスタムフックを作成するのがベストプラクティスです:
// hooks/useTracking.ts
import { useCallback } from 'react';
import { mixpanel } from '../app/_layout';
type EventProperties = Record<string, string | number | boolean>;
export function useTracking() {
const track = useCallback((eventName: string, properties?: EventProperties) => {
try {
mixpanel.track(eventName, properties);
} catch (error) {
// トラッキングエラーでアプリをクラッシュさせない
console.warn('[Tracking] Failed to track event:', eventName, error);
}
}, []);
const trackScreenView = useCallback((screenName: string) => {
track('Screen Viewed', { screen_name: screenName });
}, [track]);
return { track, trackScreenView };
}使い方はシンプルです:
// screens/PremiumScreen.tsx
import { useTracking } from '../hooks/useTracking';
export function PremiumScreen() {
const { track, trackScreenView } = useTracking();
useEffect(() => {
// 画面表示時のトラッキング
trackScreenView('PremiumScreen');
}, [trackScreenView]);
const handleUpgrade = () => {
// ボタンタップ時のトラッキング
track('Upgrade Button Tapped', {
source: 'premium_screen',
current_plan: 'free',
});
// ... 決済処理
};
return (
// ... UIコンポーネント
);
}Step 4:ユーザー識別とユーザープロパティの設定
Mixpanelの強みの一つは、ユーザー単位での分析です。ログイン後にユーザーIDを紐付けることで、同一ユーザーの行動を横断的に追跡できます。
import { mixpanel } from '../app/_layout';
// ログイン成功時にユーザーを識別
function onLoginSuccess(userId: string, userProfile: UserProfile) {
// ユーザーIDを設定(以降のイベントはこのIDに紐付く)
mixpanel.identify(userId);
// ユーザープロパティを設定
mixpanel.getPeople().set({
$name: userProfile.displayName, // Mixpanel予約プロパティ($付き)
$email: userProfile.email,
$created: userProfile.createdAt,
plan: userProfile.subscriptionPlan, // カスタムプロパティ
country: userProfile.country,
app_version: '1.2.0',
});
// ログインイベントをトラッキング
mixpanel.track('User Logged In', {
method: 'email', // or 'apple', 'google'
});
}
// ログアウト時のリセット
function onLogout() {
mixpanel.track('User Logged Out');
// 匿名IDをリセット(次のセッションは別ユーザーとして扱う)
mixpanel.reset();
}数値の増減トラッキング(People Analytics)
サブスクリプション収益やセッション数など、累積値をトラッキングするにはincrementメソッドが便利です:
// セッションカウントを1増やす
mixpanel.getPeople().increment('session_count', 1);
// 課金額の累積(LTV計算に使用)
mixpanel.getPeople().increment('total_revenue_usd', 2.99);Step 5:ファネル分析でコンバージョンを可視化する
Mixpanelのファネル分析を使うと、「ユーザーがサブスクリプション購入に至るまでのステップで、どこで離脱しているか」を一目で把握できます。
設計例:サブスクリプションファネル
ファネルを構成するイベントは以下のように定義します:
- ステップ1:
App Opened(アプリ起動) - ステップ2:
Onboarding Completed(オンボーディング完了) - ステップ3:
Premium Screen Viewed(プレミアム画面表示) - ステップ4:
Upgrade Button Tapped(アップグレードボタンタップ) - ステップ5:
Subscription Started(購入完了)
Mixpanelダッシュボードの「Funnels」機能で、上記イベントを順番に選択するだけでファネルが可視化されます。各ステップの離脱率が数値とグラフで表示されるため、改善ポイントが一目瞭然です。
Step 6:コホート分析でリテンションを改善する
コホート分析とは、同じ時期に獲得したユーザーグループ(コホート)がどの程度アプリを継続して使っているかを計測する手法です。
Mixpanelでは「Retention」レポートで、以下のような分析が可能です:
- Day 1リテンション: アプリをインストールした翌日も起動したユーザーの割合
- Day 7リテンション: 7日後も使い続けているユーザーの割合
- Day 30リテンション: 30日後の継続利用率
一般的なアプリのDay 1リテンションは25〜40%、Day 7は10〜20%程度とされています。コホート分析を定期的に確認し、改善施策の効果測定に活用しましょう。
ユーザー行動データを活用したグロース戦略の全体設計については、Rork アプリのグロース戦略 — ユーザー獲得からリテンションまでの実装パターン完全ガイド で詳しく解説しています。
Step 7:よくあるエラーと対処法
イベントがMixpanelダッシュボードに表示されない
原因として最も多いのは、プロジェクトトークンの設定ミスです。環境変数EXPO_PUBLIC_MIXPANEL_TOKENが正しく設定されているか確認してください。また、Mixpanelはイベントをバッチ処理で送信するため、リアルタイムビュー(「Live View」)で確認するとすぐに届いているかどうかわかります。
ExpoGo でSDKが動作しない
mixpanel-react-nativeはネイティブモジュールを使用するため、Expo Goでは動作しない場合があります。expo-dev-clientを使った開発ビルドで動作確認してください:
# 開発ビルドの作成
npx expo run:ios
# または
npx expo run:androidユーザーIDがundefinedになる
mixpanel.identify()を呼ぶタイミングがログイン前になっている可能性があります。認証状態が確定してからidentifyを呼ぶよう、実装順序を確認してください。
まとめ
ここではRorkアプリへのMixpanel導入を以下のステップで解説しました。
- Mixpanelのプランと無料枠の活用
- SDK導入と初期化コードの実装
- イベントトラッキングとカスタムフックの設計
- ユーザー識別とPeople Analyticsの設定
- ファネル分析・コホート分析による改善サイクル
分析基盤を整えることで、「感覚」ではなく「データ」に基づいた改善が可能になります。まずは無料プランでイベント設計から始め、ユーザー行動の可視化を体験してみてください。PostHogとの比較や機能フラグの活用については、Rork × PostHog でユーザー行動を可視化する:プロダクトアナリティクス完全導入ガイド もあわせてご覧ください。