RORK LABEN
DEADLINE — 8月31日から、Google Play の新規アプリとアプリ更新はすべて Android 16(API レベル36)を対象にする必要があります。残り8日ですEXTENSION — 条件を満たす開発者は Play Console のフォームから11月1日までの延長を申請できます。申請そのものは締切前に済ませておく必要がありますEXISTING — 更新を出さない既存アプリも、新しい Android を載せた端末で新規ユーザーに見つけてもらうには最低 API レベル35 が必要です。静かに新規流入だけが止まる構造ですEXPO — Expo SDK 57 は React Native 0.85 から 0.86 への更新で、破壊的変更なしの1コマンド移行を狙った小さなリリースです。React は SDK 56 と同じ 19.2 のままですMEMORY — expo@57.0.9 が React Native 0.86.2 へ更新し、reanimated や worklets を読み込むアプリでメモリが大きく増える Hermes V1 の回帰を解消しましたPREBUILD — expo prebuild が既定でネイティブディレクトリを破棄して再生成するようになりました。API 36 対応で手を入れた設定と衝突しやすい部分ですDEADLINE — 8月31日から、Google Play の新規アプリとアプリ更新はすべて Android 16(API レベル36)を対象にする必要があります。残り8日ですEXTENSION — 条件を満たす開発者は Play Console のフォームから11月1日までの延長を申請できます。申請そのものは締切前に済ませておく必要がありますEXISTING — 更新を出さない既存アプリも、新しい Android を載せた端末で新規ユーザーに見つけてもらうには最低 API レベル35 が必要です。静かに新規流入だけが止まる構造ですEXPO — Expo SDK 57 は React Native 0.85 から 0.86 への更新で、破壊的変更なしの1コマンド移行を狙った小さなリリースです。React は SDK 56 と同じ 19.2 のままですMEMORY — expo@57.0.9 が React Native 0.86.2 へ更新し、reanimated や worklets を読み込むアプリでメモリが大きく増える Hermes V1 の回帰を解消しましたPREBUILD — expo prebuild が既定でネイティブディレクトリを破棄して再生成するようになりました。API 36 対応で手を入れた設定と衝突しやすい部分です
記事一覧/開発ツール
開発ツール/2026-07-09上級

Amplitude のファネルが一晩で改善したように見えたとき — イベントのスキーマ崩れを自己監査で炙り出す運用メモ

Rork で作ったアプリの Amplitude ファネルで、課金転換率が8%から19%へ跳ね上がったのに売上が動かない。原因はプロパティ名の崩れによる二重計上でした。イベント契約と実行時バリデータで崩れを計測し、段階的に締め直した運用メモです。

Amplitudeアナリティクス3React Native229イベント設計データ品質Expo179ファネル分析2

プレミアム記事

ある朝ダッシュボードを開くと、登録から課金までのファネルで転換率が 8.1% から 19.4% へ跳ね上がっていました。前夜に大きな施策を打った覚えはありません。胸のあたりが少しざわつきました。売上を確認すると、Stripe 側の数字はほとんど動いていません。

転換率だけが二倍になり、入金は横ばい。この食い違いこそ、イベント計測が静かに壊れているときの典型的な兆候でした。

この記事は、Rork で作った React Native / Expo アプリの Amplitude 計測で起きた「スキーマ崩れ」を、実行時のバリデータで炙り出し、崩れ率を計測しながら段階的に締め直した記録です。SDK の入れ方ではなく、入れた後に計測が嘘をつき始めたときにどう気づき、どう立て直すかに絞っています。

数字が嘘をつくとき、SDK はエラーを出さない

Amplitude を含むプロダクトアナリティクスの厄介なところは、壊れても例外が飛ばない点にあります。track('Purchase Completed', { price: '¥580' }) と書いても、price が数値ではなく文字列でも、SDK はそのまま受け取って送信します。ダッシュボードには何食わぬ顔で行が増えていきます。

このときファネルの内部で何が起きていたか、後から追ってみると単純でした。課金完了イベントのプロパティ名が、あるアップデートを境に plan_id から planId(キャメルケース)へ揺れていたのです。Amplitude は両者を別プロパティとして扱います。そしてファネルの定義側は古い plan_id を条件にしていたため、条件に合致しないイベントが「完了扱いされない」――のではなく、この件では逆に、重複した起動経路から Purchase Completed が二回飛んでいて、ユニークではなく総数で数えていた区間が水増しされていました。

崩れは一種類ではありません。私が実際に踏んだものを整理すると、次の四つに分類できました。

崩れの種類症状ファネルへの影響
プロパティ名の揺れplan_idplanId が混在条件フィルタが半分すり抜ける
型の崩れprice が数値だったり文字列だったり金額の集計・平均が壊れる
二重発火画面復帰とマウントで同じイベントが2回転換率が実数より高く出る
イベント名の表記揺れPurchase Completed と purchase_completed片方がファネルから消える

どれも SDK からは正常に見えます。だからこそ、計測の正しさは自分で計測しなければ守れない、というのがこの一件で腹落ちした点でした。

イベント契約を先に決める

立て直しの起点は、飛ばしてよいイベントとそのプロパティを一枚の「契約」として固定することでした。コードのあちこちに散った track() を眺めても崩れは見えません。あるべき姿を先に宣言し、実行時にそこと突き合わせる。この順序が要です。

契約は型として書きました。TypeScript の型は実行時には消えるため、型定義とバリデーション用のスキーマを一つのオブジェクトから導きます。

// analytics/contract.ts
// イベント契約 — 飛ばしてよいイベントとプロパティの正本
export const EVENT_CONTRACT = {
  'Purchase Completed': {
    plan_id: 'string',
    price: 'number',
    currency: 'string',
  },
  'Registration Completed': {
    auth_method: 'string', // 'email' | 'apple' | 'google'
  },
  'Paywall Viewed': {
    source: 'string',
  },
} as const;
 
export type EventName = keyof typeof EVENT_CONTRACT;
export type PropSpec = Record<string, 'string' | 'number' | 'boolean'>;

ここで大切なのは、契約に載っていないイベント名やプロパティを「間違い」として扱うと決めることです。新しいイベントを足したいときは、まず契約に追記する。この一手間が、命名の揺れとプロパティの取りこぼしを入口で止めます。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
イベントは飛んでいるのに数字が嘘をつく「スキーマ崩れ」を、実行時バリデータで違反イベントとして可視化する具体的な実装
崩れ率(contamination rate)を計測し、8%→19%と跳ねた偽の転換率を実数に戻すまでの段階的な締め直し手順
Rork/Expo のアップデートで壊れやすいイベント契約を CI で凍結し、リリース前に検出するチェックの組み方
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-04-04
Rork × PostHog でユーザー行動を可視化する — 離脱地点が見えるまでの導入手順
RorkアプリにPostHog(プロダクトアナリティクス)を導入してユーザー行動を可視化する方法を解説。イベントトラッキング・ファネル分析・フィーチャーフラグの実装手順を初心者にもわかりやすくご紹介します。
開発ツール2026-08-23
Android 16 の予測型「戻る」を、8月31日までに直すか後回しにするか
targetSdk 36 では予測型「戻る」が既定で有効になり、onBackPressed が呼ばれなくなります。期限までに必要な作業と、切り離してよい作業を分ける判断と、opt-out を config plugin に置くまでを書きました。
開発ツール2026-08-22
一括置換は全ファイル成功しました。壊れたのは、消さなかった行のほうです
生成コードに一括置換をかけると、一致した行ではなく隣の行が壊れます。運用中のプロジェクトで実際に起きた破損と、置換の不変条件を検査する20行のガードスクリプトをまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →