◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/ビジネス
⟐ ビジネス/2026-04-11上級

Rork アプリの継続率と LTV — 二つの「継続」を分けて測り直す設計

インストール継続率とサブスクリプション継続率は別の分母を持つ数字です。混同したまま LTV を計算していた失敗を起点に、Day1/Day7/Day30 の読み方、生成クレジットを含めた原価の見方、チャーンの先読みまでを個人開発の視点で組み直します。

リテンション17LTV6グロース5個人開発217マネタイズ12プッシュ通知20オンボーディング10計測設計3

✦ プレミアム記事

ダッシュボードを二つ並べて、私は自分のアプリが壊れていると思い込んでいました。Firebase 側の Day30 継続率は4%台。RevenueCat 側の継続率は78%。同じアプリの同じ月の数字です。

しばらく、後者の計測が間違っていると疑っていました。実際に間違っていたのは、二つを同じ物差しの上に並べた私の読み方のほうでした。片方はインストールした全員を分母にしていて、もう片方は課金を始めた人だけを分母にしています。重なる部分はありますが、別の質問に答えている数字です。

この取り違えは、そのまま LTV の計算に流れ込みます。分母の違う継続率を一つの式に入れると、出てくる金額は数倍ずれます。ここでは、その二つを分けて置き直すところから、Rork で作ったアプリの継続率と LTV の設計を組み直していきます。

二つの「継続率」を、同じ物差しで見ていた

まず、混ざりやすい二つを並べます。

— インストール継続率 サブスクリプション継続率
分母 その日にインストールした全ユーザー その月に課金を開始したユーザー
数える対象 X日後にアプリを起動したか 次の請求日に更新されたか
主な出所 Firebase Analytics / App Store Connect RevenueCat / App Store Connect の購読レポート
典型的な水準 Day30 で 4〜8% 月次で 70〜85%
改善に効く打ち手 オンボーディング・習慣化・通知 価格・解約導線・請求失敗の回収

数字の桁が違うのは当然でした。インストール継続率は「無料で入ってきた人が居続けるか」を測っていて、サブスク継続率は「お金を払うと決めた人が払い続けるか」を測っています。後者の母集団は、前者をくぐり抜けた後の人たちです。

実務上いちばん困るのは、LTV の式に後者を入れるべき場面で前者を入れてしまうことです。私はこれをやりました。Day30 が4%だからと平均継続月数を極端に短く見積もり、「サブスクは自分のアプリには向いていない」という結論を一度出しています。実際には、課金まで到達した人の継続は悪くありませんでした。向いていなかったのはサブスクではなく、課金に至るまでの導線のほうでした。

active の中身を数え直す — 更新見込み率という一列

78%という数字を疑いきれなかったのは、それが「いま使えている人」の割合だったからです。月末に RevenueCat のイベントログを日付順に並べ直して、ようやく内訳を見ました。active のまま残っている人のなかに、性質の違う三つの状態が混ざっていました。

一つは、翌期も更新される見込みの人です。二つ目は、すでに解約を押したうえで期限日まで使い続けている人です。三つ目は、請求に失敗したまま猶予期間でアクセスを保っている人です。後ろの二つは、アプリの中では何ひとつ制限されていません——そして数字の上でも、区別されていませんでした。

手元の1本で、期末の active を三つに割って3か月分並べてみました。

月 期末の active 更新見込み 解約予約済み 請求失敗(猶予中) 更新見込み率
6月 141 114 22 5 80.9%
7月 136 110 19 7 80.9%
8月 128 98 24 6 76.6%

解約予約が毎月2割前後そこに居続けるという形は、私の予想と違いました。しかも落ちるときは期限日に一度にまとまって落ちますから、月次の平均だけを追っていると「先月は良かったのに今月だけ悪い」と読み違えます。そう気づいたのは、解約予約のまま3週間残っていた方々が同じ日にそろって消えた月でした。

継続率は「いま使えている人」の数で、更新見込み率は「来月も払う人」の数です。 LTV の式に入れるべきは後者でした。入れ替えて計算し直したところ、私がそれまで見ていた金額は8割ほどに下がりました。

SDK 側で三つを分けるのは、数行で足ります。

// RevenueCat の EntitlementInfo から「更新の見込み」だけを取り出します。
import analytics from '@react-native-firebase/analytics';
import Purchases, {
  CustomerInfo,
  EntitlementInfo,
} from 'react-native-purchases';
 
export type RenewalState =
  | 'renewing'         // 翌期も更新される見込み
  | 'cancel_scheduled' // 解約済みで、期限日までは使える
  | 'billing_issue'    // 請求失敗中で、猶予期間がアクセスを保っている
  | 'trial';           // 無料期間中(初回請求をまだ通っていない)
 
export function classifyRenewal(e: EntitlementInfo): RenewalState {
  if (e.periodType === 'TRIAL' || e.periodType === 'INTRO') return 'trial';
  if (e.billingIssueDetectedAt) return 'billing_issue';
  if (e.unsubscribeDetectedAt || e.willRenew === false) return 'cancel_scheduled';
  return 'renewing';
}
 
export async function tagRenewalState(entitlementId = 'pro') {
  const info: CustomerInfo = await Purchases.getCustomerInfo();
  const e = info.entitlements.active[entitlementId];
  if (!e) return null; // 非課金者はここで抜けます
 
  const state = classifyRenewal(e);
  // アクセス権の判定には使いません。集計のための目印だけを付けます。
  await analytics().setUserProperty('renewal_state', state);
  return { state, expiresAt: e.expirationDate };
}

判定の置き場所で一つ決めたことがあります。アクセス権の可否は isActive のままにして、数字の分類だけを renewal_state に持たせる、という分け方です。猶予期間の人からアクセスを取り上げると、請求が通れば戻ってきたはずの方を自分から追い出すことになります。使わせるかどうかは isActive が決め、数えるときだけ状態を分ける——この順番を一度逆にしてしまった月があり、問い合わせで気づきました。

月末に一度取るよりも、webhook の CANCELLATION・BILLING_ISSUE・RENEWAL を日次で積むほうがぶれません。SDK 側の判定はアプリを開いた人しか拾えませんから、開かなくなった方の解約予約は取りこぼします。両方を残したまま、日次の集計は webhook、画面内の出し分けは SDK と使い分けています。

解約予約を不満の合図だと決めつけないほうがよい、とも感じています。次の請求日まで使い切ってから離れるのは、落ち着いた判断です。ここへ割引を差し込むのは、その落ち着きを崩すだけかもしれません。解約予約の方には何も送らず、期限日を過ぎた後に一度だけ、新しく増えた内容のお知らせを出すようにしています。

✦

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

この記事の続きを読む

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

この記事で得られること
✦インストール継続率(分母=インストール数)とサブスク継続率(分母=課金開始数)を取り違えたまま LTV を計算していた失敗と、二つを分けて置き直す手順
✦LTV/CAC の C に生成クレジットとツール月額を乗せる原価の組み方、そして「次のアプリを作るか、今の1本を直すか」を決める配分の基準
✦@react-native-firebase/analytics の予約語で計測イベントが落ちていた実例と、purchase 系イベントの正しい送り方
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⟐ ビジネス2026-05-11
Rorkで作る引き寄せ・運勢系アプリ — 3日で離脱される日課アプリを立て直す日替わり配信設計
占い・引き寄せ・運勢系アプリは初日のDLは取れても3日で離脱されがちなジャンルです。日替わりコンテンツ配信・通知タイミング・ウィジェットを統合した、Rorkでの実装パターンを実体験ベースで整理しました。
⟐ ビジネス2026-04-29
Rork で作ったアプリを『削除されない』ものにする — 個人開発のための継続率設計
Rork で作ったアプリが削除されるのは、ほとんどが最初の3日です。削除率をどこから取るか(Firebase では取れません)という測定の話から、D0・D1・D3・D7 それぞれで何を見せるかまで、初週の設計を実装コードとともに整理します。
⟐ ビジネス2026-04-17
Rork 個人開発、最初の収益までの1年 — アイデア検証からリテンション改善までの実務ロードマップ
Rorkで作ったアプリが収益を生むまでの1年間を、アイデア検証、MVP開発とストア申請、初期グロース、スケールとリテンションという4つのフェーズに整理しました。プラン費用の設計や収益モデルの選定まで、個人開発者が手を動かせる粒度でまとめています。