キャンセル分析とリテンション実験を行うWebアプリを作る
サブスクリプションの解約を追跡して要因を分析し、安全にリテンション実験を実行するウェブアプリの計画・構築・ローンチ方法を学びます。

作るものと重要性
解約はサブスクリプションビジネスにおける非常に高い信号を持つ瞬間です。顧客は明確に「もう価値がない」と伝えています。多くの場合、それは摩擦、期待はずれ、または価格/価値のミスマッチの直後に起きます。解約を単なるステータス変更として扱うと、何が壊れているのかを学び、修正する貴重な機会を失います。
解決しようとしている問題
多くのチームはチャーンを月次の数値としてしか見ていません。それでは物語が隠れてしまいます。
- 誰が解約しているのか(新規ユーザーか長期顧客か、プラン種別、セグメント)
- いつ解約するのか(1日目、トライアル後、値上げ後、支払い失敗後)
- なぜ解約するのか(高すぎる、機能が足りない、バグ、競合に移行、「使っていない」)
これが実務における「サブスクリプション解約分析」です:解約のクリックを、信頼できて絞り込み可能な構造化データに変えることです。
「リテンション実験」が意味するもの
パターンが見えるようになったら、推測ではなく効果を測れる変更をテストできます。リテンション実験はプロダクト、価格設定、メッセージなどの変更で、例えば:
- 解約フローの改善(選択肢を明確にし、適切なダウングレード経路を提示する)
- 適切なセグメントに対する一時停止プランや割引の提示
- 早期解約と相関するオンボーディングのギャップ修正
重要なのは、きれいで比較可能なデータ(例:A/Bテスト)で影響を測ることです。
このガイドで作るもの
このガイドでは、次の3つの連結パーツを持つ小さなシステムを構築します:
- トラッキング:サブスクリプションのライフサイクルと解約フローに関するイベント(理由を含む)
- ダッシュボード:ファネル、コホート、セグメントでチャーンの発生箇所を明示するビュー
- 実験ループ:ターゲットを絞ったテストを実行し、チャーンが実際に減るかを確認する仕組み
最後には「解約が増えている」から「特定のセグメントが2週目にXが原因で解約しており、この変更でY%減った」に至るワークフローを持つことが目標です。
成功の定義
成功は見た目の良いチャートではなく、速度と確信です:
- より早い洞察(数日で結論に至ること)
- 特定の変更に紐づく測定可能なチャーン削減
- 学習の再現性:すべての解約が行動につなげられる学びになること
MVPの目標、指標、スコープを設定する
画面、トラッキング、ダッシュボードを作る前に、このMVPでどの判断を可能にするかを明確にします。解約分析アプリは、すべてを測ることよりも、価値の高い質問に素早く答えることで成功します。
行動を促す質問から始める
最初のリリースで答えたい質問を書き出します。良いMVPの質問は具体的で明らかな次のアクションにつながるものです。例えば:
- トップの解約理由は何か、プラン別・地域別・登録チャネル別でどう違うか?
- 顧客が解約するまでの時間(time-to-cancel)はどれくらいか、最初の7/30/90日でどんなパターンが出るか?
- どのプラン(や請求サイクル)が最も高い解約率を持ち、ユーザーは解約前にダウングレードしているか?
もし質問がプロダクト変更、サポートの手順、または実験に影響しないなら、後回しにします。
3–5個の「ノーススター」MVP指標を選ぶ
週次でレビューする短い指標リストを選びます。定義は曖昧さがないようにして、プロダクト/サポート/経営が同じ数字を話せるようにします。
一般的な開始指標:
- 解約率(定義した期間:週次/月次など)
- セーブ率(解約試行のうち保持に至った割合)
- 再アクティベーション率(解約後に戻ってきた顧客)
- time-to-cancel(開始から解約までの中央値日数)
- 理由分布(件数と収益影響での上位理由)
各指標について、正確な計算式、時間窓、除外条件(トライアル、返金、支払い失敗など)を文書化します。
所有者と制約を決める
このシステムを使い、維持する人を特定します:プロダクト(意思決定)、サポート/カスタマーサクセス(理由の品質とフォロー)、データ(定義と検証)、エンジニアリング(計測と信頼性)。
次に事前に合意する制約を決めます:プライバシー要件(PII最小化、保持期間制限)、必須統合(請求プロバイダ、CRM、サポートツール)、スケジュール、予算。
機能の肥大化を止める1ページのスコープを書く
短くまとめます:目標、主要ユーザー、3–5の指標、必須統合、明確な非ゴール(例:「フルBIスイートは含めない」「v1でのマルチタッチアトリビューションは行わない」)。新しい要求が来たときにこの1ページがMVP契約になります。
サブスクリプションとライフサイクルイベントのモデル化
解約を分析する前に、顧客が実際にどのようにプロダクトを移動するかを反映するサブスクリプションモデルが必要です。現在のステータスのみを保存していると、「解約前にどれだけ活動していたか」や「ダウングレードがチャーンを予測したか」など基本的な質問に答えられません。
測定するライフサイクルをマップする
まずチーム全員が合意できるシンプルで明確なライフサイクルマップから始めます:
トライアル → アクティブ → ダウングレード → 解約 → 再獲得
後で状態を増やせますが、このチェーンだけでも「アクティブとは何か(有料か?猶予期間内か?)」や「再獲得とは何か(30日以内の再アクティベーションか?いつでもか?)」の定義が必要になります。
コアエンティティを定義する
最低でも、イベントと収益を一貫して紐づけられる次のエンティティをモデル化します:
- User: アプリを使う個人(時間とともに変わる可能性あり)
- Account: 課金/顧客のコンテナ(多くの場合、チャーンの適切な単位)
- Subscription: 開始、更新、切替、終了があり得る契約
- Plan: プロダクトの階層(名前、価格、請求間隔)
- Invoice: いつ請求され、支払い・返金がどうなったか
- Cancel event: 解約が要求された時点と有効になった時点
安定した識別子を選ぶ(account_id vs user_id)
チャーン分析では、account_idが通常は最も安全な主識別子です。ユーザーは入れ替わる可能性があるため。user_idはアクションの帰属に使えますが、集計はアカウント単位で行うべきです(個人向けサブスクリプションでない限り)。
ステータス履歴を保存する(単なるステータスではなく)
過去の状態を確実にクエリできるように、status history(effective_from / effective_to)を実装します。これによりコホート分析や解約前の行動分析が可能になります。
エッジケースを事前に計画する
これらを明示的にモデル化してチャーン指標を汚さないようにします:
- 一時停止(キャンセルではない一時的な停止)
- 返金/チャージバック(支払いの逆転と任意のチャーンを区別する)
- プラン切替(アップグレード/ダウングレードはイベントとして扱う)
- 猶予期間(支払い失敗と真の解約を区別する)
解約フローの計測(イベントと理由)
チャーンを理解し(改善し)たいなら、解約フローをプロダクトのサーフェスとして計測してください。フォームとしてではなく、各ステップが明確で比較可能なイベントを出すようにします。
主要なステップを計測し(スキップ不可にする)
最低でも、後でファネルを作れるように次のシーケンスを取得します:
cancel_started— ユーザーが解約体験を開いたoffer_shown— セーブオファー、一時停止、ダウングレード経路、または「サポートに相談する」CTAが表示されたoffer_accepted— ユーザーがオファー(一時停止、割引、ダウングレード)を受け入れたcancel_submitted— 解約が確定した
これらのイベント名はWeb/モバイルで一貫させ、時間を通じて安定させます。ペイロードを進化させる場合は、意味を黙って変えずにスキーマバージョン(例:schema_version: 2)を上げてください。
発生の文脈(なぜ起きたか)をキャプチャする
すべての解約関連イベントには同じコアなコンテキストフィールドを含め、後で推測せずにセグメント化できるようにします:
- plan、tenure、price
- country、device
- acquisition channel
これらはイベントのプロパティとして保持し、他のシステムが変わったときに帰属が壊れないようにします。
解析に使える解約理由を収集する
チャート用の定義済み理由リスト(集計可能)とオプションの自由記述(ニュアンス用)を併用します。
cancel_reason_code(例:too_expensive、missing_feature、switched_competitor)cancel_reason_text(任意)
理由はcancel_submittedに保存し、選択時にもログすることを検討してください(躊躇や行き来を検出するのに役立ちます)。
解約で終わらせず、結果を追跡する
リテンション介入を測るために、下流の結果もログします:
reactivateddowngradedsupport_ticket_opened
これらがあれば、解約意思と結果を結びつけ、データをめぐる議論なく実験を実行できます。
データパイプラインと保存設計
良いチャーン分析は、イベントの居場所、クレンジング方法、そして「解約とは何か」を皆が合意することから始まります。
保存先の選択:OLTP +(必要なら)データウェアハウス
ほとんどのMVPでは、まず生のトラッキングイベントを主要アプリDB(OLTP)に保存します。シンプルでトランザクション性があり、デバッグしやすいです。
高負荷や重いレポートが見込まれる場合は、後で分析用のウェアハウス(Postgresリードレプリカ、BigQuery、Snowflake、ClickHouse)を追加します。一般的なパターンは:OLTPを「ソースオブトゥルース」に、ウェアハウスを高速ダッシュボードに使うことです。
コアテーブル
「何が起きたか」に基づくテーブル設計をします。最小構成は:
events:トラッキングされたイベントごとの行(例:cancel_started、offer_shown、cancel_submitted)にuser_id、subscription_id、タイムスタンプ、JSONプロパティを含むcancellation_reasons:理由選択を正規化した行、任意の自由記述を含むexperiment_exposures:誰がどのバリアントをいつどのコンテキストで見たか(機能フラグ/テスト名)
この分離により、理由や実験を解約に結合してもデータを重複させずに済みます。
遅延イベント・重複・冪等性
解約フローはリトライ(戻るボタン、ネットワーク問題、更新)を生みます。idempotency_key(またはevent_id)を追加して重複を防ぎ、同じイベントが二重にカウントされないようにします。
モバイル/オフラインの遅延イベントのポリシーも決めます:通常は受け入れますが、解析にはイベントの元のタイムスタンプを使い、インジェスト時刻はデバッグ用に残します。
レポーティング性能のためのETL/ELT
フルウェアハウスがなくても、日次集計やファンネルステップ、コホートスナップショットを作る軽量ジョブを作り、ダッシュボードを高速に保ち、生のイベントに対する高価なジョインを減らします。
定義を文書化してメトリクスの一貫性を保つ
イベント名、必須プロパティ、指標計算式(例:「チャーン率はcancel_effective_atを使用する」)を短いデータ辞書に書き、リポジトリや内部ドキュメントに置いてプロダクト・データ・エンジニアリングで解釈を揃えます。
ダッシュボードを作る:ファネル、コホート、セグメント
良いダッシュボードはあらゆる質問に答えようとしません。「何かがおかしい」を「どのグループのどのステップが原因か」に数クリックで移せることが重要です。
週次で使うコアビュー
実際の調査方法を反映した3つのビューから始めます:
- 解約ファネル:
cancel_started→ 理由選択 →offer_shown→offer_acceptedまたはcancel_submitted。ここでどこで人が離脱しているか、セーブフローが効いているかがわかります。 - 理由分布:選択された解約理由の内訳と「その他(自由記述)」バケツをサンプル表示。件数と割合の両方を示して急増を見つけやすくします。
- 開始月別コホート:登録月別のリテンションや解約率。コホートは季節性や獲得チャネルの変化による誤判断を防ぎます。
実行可能なインサイトにするセグメント
すべてのチャートはチャーンやオファー受諾に影響する属性でフィルタできるべきです:
- プラン/階層
- 在籍期間(例:0–7日、8–30日、31–90日、90+)
- 地域/国
- 獲得ソース(オーガニック、有料、パートナー、営業)
- 支払い方法(カード、請求書、PayPalなど)
デフォルトは「全顧客」にしておきますが、目的は「どのスライスが変化しているか」を見つけることです。
時間コントロールとセーブフローのパフォーマンス
高速な日付プリセット(過去7/30/90日)とカスタム範囲を追加します。ビュー間で同じ時間コントロールを使い、比較不整合を避けます。
リテンション作業では、セーブフローをミニファネルとしてビジネスインパクト(オファー閲覧数、オファー受諾率、純保持MRR)で追います。
信頼を壊さずにドリルダウンする
集計チャートは影響を受けたアカウント一覧(例:「'Too expensive'を選び14日以内に解約した顧客」)にドリルダウンできるべきです。プラン、在籍期間、最終請求書などの列を含めます。
ドリルダウンは権限(ロールベース)で制御し、敏感なフィールドはデフォルトでマスクすることを検討します。ダッシュボードは調査を促進しつつプライバシーと内部アクセスルールを尊重するべきです。
実験フレームワーク追加(A/Bテストとターゲティング)
解約を減らしたければ、変更(文言、オファー、タイミング、UI)を信頼してテストする仕組みが必要です。実験フレームワークは誰が何を見たかを決め、記録し、結果を特定のバリアントに結びつけます。
1) 実験ユニットを定義する(交差汚染を避ける)
割り当てをアカウントレベルにするかユーザーレベルにするか決めます。
- アカウントレベルはSaaSでは通常安全:同じワークスペースの全員が同じバリアントを見て混在したメッセージを防げます。
- ユーザーレベルはコンシューマ向けで機能しますが、共有デバイスや複数ログイン、チームアカウントに注意が必要です。
実験ごとにこの選択を書き残し、分析の一貫性を担保します。
2) 割り当て方法を選ぶ
いくつかのターゲティングモードをサポートします:
- ランダム(古典的なA/B):デフォルトとして最適
- 重み付き(例:90/10):慎重にロールアウトする際に有用
- ルールベースターゲティング:特定のセグメント(プラン、国、在籍期間、“解約しようとしている”状態)にのみ表示。ルールはシンプルにしてバージョン管理する
3) 実際に表示されたときに露出をログする
「割り当て済み」を「露出済み」としてカウントしないでください。ユーザーが実際にバリアントを見たときに露出をログします(例:解約画面がレンダリングされた、オファーモーダルが開いた)。保存する情報:experiment_id、variant_id、ユニットID(account/user)、タイムスタンプ、関連コンテキスト(プラン、シート数)
4) 指標を定義する:主要指標+保護指標
セーブ率(cancel_started →保持結果)など1つの主要成功指標を選びます。敗北の判定を防ぐためにガードレールを追加します:サポート連絡数、返金リクエスト、苦情率、time-to-cancel、ダウングレードによるチャーンなど。
5) 期間とサンプルサイズの前提を決める
ローンチ前に次を決めます:
- 最小実行期間(サブスクリプション挙動の場合は1–2請求周期が多い)
- 現在のセーブ率と検出したい最小リフトに基づく最小サンプルサイズ
これによりノイズで早期に打ち切ることを防ぎ、ダッシュボードが「まだ学習中」か「統計的に有用」かを示せます。
テストするリテンション介入の設計
リテンション介入は解約時に表示/提示するもので、ユーザーをだますことなく心変わりさせる可能性があります。目的は信頼を保ちつつチャーンを減らす何が効くかを学ぶことです。
よく試される介入バリアント
小さなパターンのメニューから始めて組み合わせて試します:
- 代替オファー:期間限定割引、1か月無料、延長トライアル
- 一時停止オプション:1–3か月の課金停止を許可し、再アクティベーションの期待値を設定
- プランダウングレード:完全解約の代わりに安価な階層や人数を減らす
- メッセージ文言:価値を思い出させる短く具体的な文言(「いつでもデータはエクスポートできます」)と、一般的な文言(「ご利用ありがとうございました」)の比較
ユーザーを閉じ込めないオファー設計
選択は明確で、可能な限り元に戻せるようにします。「解約」パスは目に見える場所にあり、探し回らせてはいけません。割引を提示するなら期間と終了後の価格を正確に示します。一時停止を提供するならアクセスと請求日の扱いを明示します。
良いルール:ユーザーは自分が選んだものを一文で説明できるべきです。
プログレッシブディスクロージャーを使う
フローを軽く保ちます:
-
理由を聞く(ワンタップ)
-
理由に応じた応答を表示(「高すぎる」なら一時停止や割引、「使っていない」ならダウングレード、「バグ」ならサポート)
-
最終結果を確認(一時停止/ダウングレード/解約)
これにより関連性を保ちながら摩擦を減らせます。
結果ページとチェンジログを追加する
社内向けの実験結果ページを作り、次を示します:保存成果へのコンバージョン、チャーン率、コントロールに対するリフト、および信頼区間か単純な意思決定ルール(例:「リフト≥3%かつサンプル≥500なら出荷」)。
テストと出荷のチェンジログを保ち、将来同じアイデアを繰り返さないようにし、リテンションの変化を特定の変更に結びつけられるようにします。
プライバシー、セキュリティ、アクセス制御
解約データは最もセンシティブなプロダクトデータの一つです。課金情報や識別子、自由記述には個人情報が含まれ得ます。プライバシーとセキュリティは後付けではなくプロダクト要件として扱ってください。
認証とロール
可能ならSSOを使い、認証アクセスのみとします。そして簡潔で明示的なロールを追加します:
- Admin:設定、データ保持、ユーザーアクセス、エクスポートの管理
- Analyst:ダッシュボード参照、セグメント作成、実験実行
- Support:顧客対応に必要な履歴の閲覧(限定フィールド)
- Read-only:集計ダッシュボードを閲覧、ドリルダウン不可
ロールチェックはUIだけでなくサーバーサイドで行ってください。
敏感データの露出を最小化する
顧客レベルのレコードを見られる人を限定します。デフォルトは集計にし、ドリルダウンは強い権限の背後に置きます。
- UIで識別子(メール、顧客ID)をマスクする
- ジョインや重複除去のために識別子をハッシュ(例:シークレットソルト付きSHA-256)して、生のPIIを見ずに分析できるようにする
- 課金/IDテーブルをイベント分析テーブルから分離し、ハッシュキーで接続する
データ保持ルール
保持方針を事前に定義します:
- イベントデータはコホート分析に必要な期間だけ保持(例:13–18か月)
- 自由記述の解約理由は短めに保持または消去(個人情報が混入する可能性があるため)
- ユーザー要求や内部ポリシーを満たす削除ワークフローを用意する
監査ログ
ダッシュボードのアクセスとエクスポートをログに残します:
- 誰が顧客レベルのページを見たか
- 誰がいつどのフィルタでデータをエクスポートしたか
- 保持や権限に対する管理者の変更
ローンチ前のセキュリティチェックリスト
出荷前に基本を確認します:OWASP上位リスク(XSS/CSRF/インジェクション)、常時TLS、最小権限のDBアカウント、シークレット管理(コードにキーをベタ書きしない)、認証エンドポイントのレート制限、バックアップ/復元手順のテスト。
実装設計図(フロントエンド、バックエンド、テスト)
ここではビルドをバックエンド、フロントエンド、品質の3つに分け、MVPを一貫して、十分に速く、安全に進化できるようにします。
バックエンド:サブスクリプション、イベント、実験
まずサブスクリプションのCRUD(作成、ステータス更新、一時停止/再開、解約)をサポートする小さなAPIから始め、主要なライフサイクル日付を保存します。書き込み経路はシンプルにし、検証を入れます。
次に「キャンセルページを開いた」「理由を選んだ」「解約を確定した」などのアクションを追跡する**イベント受け口(ingestion endpoint)**を追加します。可能ならサーバーサイドで送信して広告ブロッカーや改ざんを減らします。クライアントイベントを受ける場合は署名とレート制限をしてください。
リテンション実験では、実験割り当てをサーバーサイドで行い、同じアカウントが常に同じバリアントを得るようにします。典型的なパターンは:対象実験を取得 → ハッシュ(account_id, experiment_id) → バリアント割り当て → 割り当てを永続化、です。
素早くプロトタイプしたければ、Koder.aiのようなvibe-codingプラットフォームが短い仕様から基盤(Reactダッシュボード、Goバックエンド、PostgreSQLスキーマ)を生成し、ソースをエクスポートしてデータモデルやイベント契約、権限を適用できます。
フロントエンド:ダッシュボード、フィルタ、エクスポート
いくつかのダッシュボードページを作ります:ファネル(cancel_started → offer_shown → cancel_submitted)、コホート(登録月別)、セグメント(プラン、国、獲得チャネル)。フィルタはページ間で一貫させます。
共有管理のためにCSVエクスポートを用意します:デフォルトは集計結果のみ、行レベルのエクスポートは昇格した権限で許可し、エクスポートは監査ログに残します。
パフォーマンスの基本
イベントリストはページネーションを使い、一般的なフィルタ(日付、subscription_id、plan)にインデックスを張り、重いチャートは事前集計(日次集計、コホートテーブル)を行います。「過去30日」サマリは短いTTLでキャッシュします。
テストと信頼性
指標定義(例:「解約開始」とは何か)と割り当て一貫性(同じアカウントは常に同じバリアント)についてユニットテストを書きます。
インジェスト失敗に対してはリトライとデッドレターキューを実装し、データ欠損が静かに起きないようにします。エラーはログと管理画面で可視化し、意思決定が歪む前に修正できるようにします。
デプロイ、監視、データの信頼性維持
解約分析アプリを出すのは半分の仕事で、残りはプロダクトと実験が週ごとに変わっても正確さを保つことです。
デプロイ方式の選択
チームの運用スタイルに合う最もシンプルなオプションを選びます:
- マネージドホスティング(PaaS):最速で本番へ。デプロイ、ログ、スケーリングが内蔵されている
- コンテナ(Docker + オーケストレータ):再現可能なビルドと依存管理が必要な場合に有利
- サーバーレス:イベントインジェストやスケジュールジョブのスパイクに向くが、コールドスタートやベンダー制限に注意
どれを選ぶにしても、分析アプリを本番システムとして扱い、バージョン管理、デプロイ自動化、設定は環境変数で管理します。
初日に全パイプラインを持ちたくない場合、Koder.aiはデプロイやホスティング(カスタムドメイン含む)、スナップショットやロールバックをサポートしているので、敏感なフローで高速に反復するのに便利です。
環境の分離(とデータの分離)
dev、staging、production環境を明確に分離します:
- テストイベントが指標を汚さないようにデータベースとストレージバケットを分ける
- 本番スキーマとルーティングを模した専用のstaging環境
- 非本番での「幽霊バリアント」を防ぐために実験IDをプレフィックスするなどの名前空間分離
意思決定を守る監視
可用性だけでなく「真実」を監視します:
- API、バックグラウンドワーカー、ダッシュボードの稼働状況
- インジェスト遅延(イベント時刻 vs 処理時刻)と逸脱時のアラート
- 実験割り当てエラー:未割当ユニットの急増、バリアントの不均衡、同一アカウントの割当変化
自動データ検証ジョブ
軽量チェックを定期実行し、重大な問題は大きく失敗させます:
- 期待される主要イベントが欠けている(例:期待される場所で
cancel_startedはあるがcancel_submittedがない) - スキーマ変更(新しい/削除されたプロパティ、型の変化、想定外の列挙値)
- ボリューム異常(リリース後にイベントがほぼゼロになる)
実験UI変更のロールバック計画
解約フローに触れる実験は事前にロールバック計画を立てます:
- バリアントを即座に無効化できる機能フラグ
- 既知の良好なビルドへすぐに戻せるデプロイ経路
- ロールバック期間をダッシュボードに注記して分析者が誤読しないようにする
システムを運用する:洞察から継続的な実験へ
解約分析アプリが価値を生むのは、単発のレポートではなく習慣になったときです。目的は「チャーンに気づいた」から「洞察 → 仮説 → テスト → 決定」の継続ループにすることです。
シンプルな週次運用を回す
毎週同じ時間に30–45分の軽い儀式を行います:
- ダッシュボードで主要指標(全体チャーン、プラン別チャーン、在籍期間別チャーン、上位解約理由)の変化を確認
- 調査に値する異常を1つ挙げる(例:年次更新時のチャーン急増、理由が突然1位になったなど)
- 次週にテストする仮説を1つだけ選ぶ
仮説を1つに限定すると明確になります:何を信じているか、誰が影響を受けるか、どのアクションで結果が変わるか。
実験の優先順位付け(影響×工数)
同時に多くのテストを走らせ過ぎないでください。特に解約フローは重なった変更で結果が信用できなくなります。
シンプルなグリッドを使います:
- 高影響/低工数:まずやる(文言変更、サポートへ誘導、年次切替オファー)
- 高影響/高工数:計画する(請求柔軟性、プロダクト修正)
- 低影響:保留
実験に不慣れなら、出荷前に基本と意思決定ルールを揃えてください: /blog/ab-testing-basics
定性情報でループを閉じる
数値は何が起きているかを教えますが、サポートノートや解約コメントはなぜ起きているかを語ります。毎週、セグメントごとに最近の解約を数件サンプリングしてテーマを要約し、それをテスト可能な介入にマッピングします。
「成功した介入」プレイブックを作る
何が、誰に、どの条件で効いたかを記録します。短いエントリを保存します:
- セグメント定義(プラン、在籍期間、利用状況)
- 仮説と実施した変更
- 結果と信頼度
- フォローアップ(ロールアウト、改良、戻す)
オファーを標準化してアドホックな割引を避けたい段階では、プレイブックをパッケージや制限に結び付けて運用します: /pricing
よくある質問
解約分析アプリでは何を追跡すべきですか?
解約済みという最終ステータスだけでなく、解約に至るまでの流れを追跡します。解約を開始した時点、理由を選んだ時点、オファーを見た時点、代替案を受け入れた時点、解約を確定した時点を記録します。
解約レポートではアカウントIDとユーザーIDのどちらを使うべきですか?
SaaSの解約率では、デフォルトの単位として請求アカウントを使います。ユーザーは役割を変えたりワークスペースを離れたりしますが、通常はアカウントがサブスクリプションと支払い履歴を管理しています。
MVPで最も重要な解約指標は何ですか?
まずは解約率、引き留め率、再開率、解約までの時間の中央値、解約理由を追跡します。各指標の計算式を定義し、トライアル、返金、支払い失敗をどう反映するか決めます。
解約理由はどのように収集すべきですか?
「高すぎる」「必要な機能がない」「バグがある」「使っていない」「競合他社に乗り換えた」など、短い固定リストを提示します。任意のテキスト欄も用意し、顧客が自分の言葉で詳細を説明できるようにします。
解約ファネルは何を示しますか?
有用なファネルは cancel_started から始まり、理由の選択、offer_shown、offer_accepted、cancel_submitted を追います。顧客がプロダクト、オファー、またはフローの摩擦のどれを理由に離脱するかを示します。
リテンション実験では、バリアントをアカウント単位とユーザー単位のどちらで割り当てるべきですか?
同じアカウント内の全員に同じバリアントを表示します。これによりオファーが混在せず、実験結果も解釈しやすくなります。
A/Bテストでは、いつ実験への露出を記録すべきですか?
顧客が実際にバリアントを見た後にのみ露出を記録します。たとえば、オファー画面が表示されたときです。割り当て記録だけでは、顧客がその体験を受け取った証拠にはなりません。
引き留めオファーで顧客を不快にさせないにはどうすればよいですか?
解約への導線を見えやすく保ち、各代替案を明確に説明します。割引を提示する場合は、適用期間とその後の料金を明記します。一時停止を提示する場合は、その期間中の請求とアクセスについて説明します。
最初に構築すべきダッシュボードビューは何ですか?
まず、解約理由、解約ファネル、サブスクリプション開始月別のコホートを用意します。各ビューで、プラン、利用期間、地域、獲得元、支払い方法による絞り込みを可能にします。
機密性の高い解約データはどのように保護しますか?
顧客単位の詳細表示を制限し、可能な場合は識別子をマスクし、サーバー側でロールを適用します。顧客が個人情報を含めることがあるため、自由記述の理由は短い期間だけ保持します。