姉妹記事の Rork で作るモバイルアプリの収益化入門 では、収益化モデルの全体像と判断軸を整理しました。本記事はその先、つまり「実際に月10万円の壁を超えるために何を実装し、何を運用するか」の具体的な戦略です。
私はモバイルアプリの個人開発を 2014 年から続けていて、AdMob の月収が一時期 150 万円を超えていました。今でも月 50 万円規模の収益を維持しています。この記事は、そこに至るまでの試行錯誤の中で「これは効いた」「これは効かなかった」と判断できた施策を、Rork 時代に再現可能な形で整理したものです。
月10万円の壁の正体
最初に共有したいのは、「月10万円」という数字には意味があるということです。これは個人開発で「副業として成立する」最初のラインで、ほとんどの個人開発者がここで止まります。理由は単純で、月1万円から月10万円までは「同じやり方の延長」では到達できないからです。
月1万円までは、Rork でアプリを作って AdMob を組み込めば運次第で到達できます。私の最初のヒット作も、特に何もしなくて月1万円に届きました。しかしそこから月10万円までの 10 倍の伸びは、戦略的なチューニングがなければ絶対に起きません。
私が「月10万円の壁」と呼んでいるのは、以下のような状態のことです。アプリは作れる、ストアにも出してる、ある程度ダウンロードもされている、でも収益は月3,000円から1万円の間で停滞しています。この状態から抜け出すには、収益化を「実装」から「運用」のフェーズに切り替える必要があります。
戦略マップ — 4 つのレバー
月10万円超えに使える主要なレバーは 4 つです。それぞれを順番に深掘りします。
ひとつめは「広告 eCPM の最大化」。同じ表示回数でも、eCPM(1,000 表示あたりの収益)が 2 倍になれば収益も 2 倍になります。
ふたつめは「IAP の価格と訴求の最適化」。商品ラインナップ・価格・購入導線のチューニングで、課金率と ARPU を倍増させます。
みっつめは「サブスクの継続率向上」。月次解約率を 10% から 5% に下げるだけで、LTV は 2 倍になります。
よっつめは「ASO による自然流入の増加」。同じアプリでもストア最適化で DL 数が 3〜5 倍になることは珍しくありません。
私の経験上、これら 4 つを同時並行で改善するのではなく、自分のアプリの状況に応じて 1 つずつ深掘りするのが最も効率的でした。
広告 eCPM 最大化の実装戦略
広告モデルで月10万円を超えるには、eCPM の改善が最も効果的です。私が実際に効果を確認できた戦略を 3 つ共有します。
ひとつめは「メディエーションの活用」。AdMob 単独ではなく、Meta Audience Network・Unity Ads・AppLovin など複数の広告ネットワークを Mediation で組み合わせると、各表示で最も入札額が高い広告が選ばれて eCPM が 30〜80% 改善します。
// AdMob Mediation の基本設定
import mobileAds, {
AdsConsent,
AdsConsentStatus,
MaxAdContentRating,
} from "react-native-google-mobile-ads";
// 起動時に一度だけ実行
mobileAds()
.setRequestConfiguration({
maxAdContentRating: MaxAdContentRating.PG,
tagForChildDirectedTreatment: false,
tagForUnderAgeOfConsent: false,
})
.then(async () => {
// GDPR 同意取得(EU 圏ユーザーには必須)
const consentInfo = await AdsConsent.requestInfoUpdate();
if (consentInfo.status === AdsConsentStatus.REQUIRED) {
await AdsConsent.showForm();
}
// SDK 初期化
await mobileAds().initialize();
});
// メディエーション設定は AdMob ダッシュボードで行う
// ローカルコードは標準の AdMob 実装そのままふたつめは「ハイブリッド入札(Bidding)の有効化」。従来のウォーターフォール方式から、リアルタイム入札への切り替えで eCPM がさらに 15〜25% 上がります。AdMob ダッシュボードで「ビディング」を有効化するだけで設定可能です。
みっつめは「広告フォーマットの組み合わせ最適化」。私の壁紙アプリ(『綺麗な壁紙』など)での最適解は「ホーム画面下部にバナー(常時)」「画像詳細表示で 5 回に 1 回インタースティシャル」「壁紙設定時にリワード(任意)」でした。リワード広告の eCPM は通常のバナーの 10〜30 倍になることが多く、これを「設定時の任意操作」と紐付けることで UX を損なわずに高 eCPM を獲得できました。
IAP 価格と訴求の最適化
IAP モデルで月10万円を超えるには、課金率と ARPU の両方を上げる必要があります。私が試した中で効果が大きかった施策を共有します。
ひとつめは「価格段階を 3 つ用意する」。1 商品しかないと「買うか買わないか」の判断になりますが、3 つあると「どれを買うか」の判断に変わります。心理学的には Decoy Effect と呼ばれる現象で、私のアプリでは中位プランの選択率が最も高く、結果的に客単価も上がりました。
const TIER_PRODUCTS = [
{ sku: "starter", price: "¥240", features: ["広告非表示"] },
{ sku: "standard", price: "¥480", features: ["広告非表示", "Pro 機能", "テンプレート 50 種"], recommended: true },
{ sku: "deluxe", price: "¥980", features: ["広告非表示", "Pro 機能", "テンプレート 200 種", "クラウドバックアップ"] },
];
function PricingScreen() {
return (
<View>
{TIER_PRODUCTS.map((tier) => (
<View key={tier.sku} style={tier.recommended ? styles.recommended : styles.normal}>
{tier.recommended && <Badge text="おすすめ" />}
<Text style={styles.price}>{tier.price}</Text>
{tier.features.map((f) => <Text key={f}>✓ {f}</Text>)}
<Button title="購入" onPress={() => handlePurchase(tier.sku)} />
</View>
))}
</View>
);
}ふたつめは「タイムリミット付きオファーの導入」。「初回起動から 24 時間以内なら 50% OFF」のような期間限定オファーを出すと、未購入ユーザーの 5〜10% が課金してくれます。ただし「ダーク UX」と紙一重なので、本当に時間制限のあるオファーだけに使い、フェイクのカウントダウンは絶対に避けてください。
function useFirstLaunchTimer() {
const [secondsLeft, setSecondsLeft] = useState<number>(0);
useEffect(() => {
const init = async () => {
const firstLaunch = await AsyncStorage.getItem("first_launch_at");
const firstLaunchAt = firstLaunch ? parseInt(firstLaunch) : Date.now();
if (!firstLaunch) {
await AsyncStorage.setItem("first_launch_at", String(Date.now()));
}
const offerEndsAt = firstLaunchAt + 24 * 60 * 60 * 1000; // 24 時間
const interval = setInterval(() => {
const remaining = Math.max(0, offerEndsAt - Date.now());
setSecondsLeft(Math.floor(remaining / 1000));
}, 1000);
return () => clearInterval(interval);
};
init();
}, []);
return secondsLeft;
}みっつめは「購入前のサンプル体験」。「広告を消すとどうなるか」を 5 分間だけプレビュー体験できる機能を入れたら、課金率が 1.8 倍になりました。「未購入だから機能が使えない」ではなく「使ってみて気に入ったら買える」という体験設計に変えるだけで、変換率が大きく変わります。
サブスク継続率を 95% にする方法
サブスクモデルで月10万円を超えるには、月次解約率(Monthly Churn Rate)を 5% 以下に保つ必要があります。10% と 5% では LTV が 2 倍違います。
私が継続率改善で効果を確認できた施策を 3 つ共有します。
ひとつめは「決済失敗時のリカバリ自動化」。クレジットカードの有効期限切れや与信エラーで自動失敗する解約は、全解約の 30% 以上を占めます。これは「ユーザーの意思」ではなく「事務的な失敗」なので、適切にフォローすればほぼ全て救えます。
// Stripe Webhook での決済失敗時の自動リカバリフロー
async function handleInvoicePaymentFailed(invoice: Stripe.Invoice) {
const userId = invoice.metadata?.userId;
const subscription = await stripe.subscriptions.retrieve(invoice.subscription as string);
// 1. ユーザーへすぐ通知(リトライまでの時間を稼ぐ)
await sendEmail(userId, {
template: "payment_failed_retry",
data: {
retryUrl: invoice.hosted_invoice_url,
nextAttemptAt: new Date(invoice.next_payment_attempt! * 1000),
},
});
// 2. アプリ内バナーを表示するフラグを立てる
await db.user.update({
where: { id: userId },
data: {
paymentIssue: true,
paymentIssueResolveBy: new Date(invoice.next_payment_attempt! * 1000),
},
});
// 3. Stripe の Smart Retries が 3 回までリトライしてくれる
// それでも失敗したら subscription.deleted イベントが来る
}ふたつめは「価値提供の継続的な可視化」。ユーザーが「今月もこの金額を払う価値があるか」を判断するタイミングは、毎月の請求通知のタイミングです。その直前に「今月あなたが達成したこと」のような利用サマリーを送ると、解約率が下がります。私のアプリでは「今月のあなたの利用統計」をメールで送るようにしてから、月次解約率が 8% から 4% に半減しました。
// 毎月 25 日に送信する月次サマリーの例
async function sendMonthlySummary(userId: string) {
const monthStart = startOfMonth(new Date());
const monthEnd = endOfMonth(new Date());
const usageStats = await db.usageEvent.aggregate({
where: {
userId,
occurredAt: { gte: monthStart, lte: monthEnd },
},
_count: { _all: true },
_sum: { quantity: true },
});
await sendEmail(userId, {
template: "monthly_value_summary",
data: {
totalActions: usageStats._count._all,
timeSavedMinutes: estimateTimeSaved(usageStats),
topFeatures: await getTopFeatures(userId, monthStart, monthEnd),
},
});
}みっつめは「解約フローでの引き止めオプション」。解約ボタンを押した瞬間に、「今月だけ 50% OFF で継続しませんか」「次の請求まで 1 か月だけ機能無料で使えますか」などのオプションを提示します。これで解約予定者の 15〜25% が引き止められます。重要なのは、これを「ダークパターン」にしないこと。1 タップで解約できる経路は必ず残しつつ、追加オプションを提示する形にします。
ASO で自然流入を 3 倍にする
月10万円を超えるには、有料広告に頼らず ASO(App Store Optimization)で自然流入を増やすことが必須です。広告費を払って DL を増やすのは ROI が悪く、個人開発では最終的に消耗します。
私が効果を確認できた ASO 施策を 3 つ。
ひとつめは「サブタイトルとキーワードの徹底最適化」。アプリ名・サブタイトル(30 文字)・キーワードフィールド(100 文字)の合計 130 文字に、検索されるキーワードを最大密度で詰め込みます。Sensor Tower や App Annie のようなツールで「DL 数が多くて競合の少ないキーワード」を探し、それを優先的に組み込みます。
ふたつめは「スクリーンショットの A/B テスト」。Apple/Google ストアにはスクリーンショットの A/B テスト機能があります。1 ペア変えるだけで CVR(ストア訪問→DL の変換率)が 2 倍になることもあります。私のアプリでは「機能スクリーンショット」よりも「ベネフィットを文字で書いたスクリーンショット」の方が CVR が高いことが分かりました。
みっつめは「多言語対応で対象市場を広げる」。日本語と英語だけのアプリを 16 言語対応させると、DL 数が 2〜4 倍になることが珍しくありません。Rork なら翻訳作業もかなり自動化できるので、多言語化のハードルが大きく下がっています。
よくある落とし穴
ひとつめは「収益化施策を一度に複数試す」こと。一度に複数の変更を入れると、何が効いたか分からなくなります。1 つずつ試して 2 週間以上の効果測定をする規律が、結局は最短ルートです。
ふたつめは「短期的な収益最大化に走る」こと。広告を増やしたり、課金強要 UI を入れたりすると、短期的には収益が上がっても、レビュー評価が下がって長期的にはランキングが落ち、結果的に総収益が減ります。私はこれを 3 回繰り返してから学びました。
みっつめは「データ計測を疎かにする」こと。Firebase Analytics や Amplitude などで、ユーザーの行動を細かく計測しないと「どこで離脱しているか」が分かりません。月10万円超えを目指すなら、データ計測の整備は最優先タスクです。
よっつめは「成功した 1 本のアプリに過度に依存する」こと。1 本のアプリで月10万円を稼ぐと、それに依存しがちですが、ストアの規約変更・OS アップデートでの非互換・競合参入などで一夜にして収益がゼロになるリスクがあります。少なくとも 3 本以上の収益源を持つことが、個人開発者の生存戦略の核です。
いつつめは「価格設定の根拠が薄い」こと。「他のアプリが 480 円だから」ではなく、「このユーザーが何にどれだけ価値を感じるか」から逆算した価格設定をしてください。私は新機能の価格を決めるとき、必ず 5 人のユーザーにインタビューしてから決めるようにしています。
12 年の経験から得た「収益化が伸びるアプリ」の共通点
最後に、私が 50 本以上アプリを作ってきた中で、月10万円を安定して稼ぐアプリには共通点があると感じています。
ひとつめは「明確な 1 つの価値提案」。「これができるアプリ」が 1 言で言えるアプリは、伸びます。逆に「色々できる便利アプリ」は、短期的にはダウンロードされても継続せず、収益化も難しいです。
ふたつめは「リテンションフックの存在」。毎日開きたくなる理由(通知・新コンテンツ・進捗の可視化など)が組み込まれているアプリは、長期的に強いです。
みっつめは「ユーザーとの定期的な対話」。レビュー返信・SNS での発信・お問い合わせへの丁寧な対応など、地道な活動を継続しているアプリは、口コミでじわじわ伸びていきます。
モバイルアプリのサブスクは、本書の理論をモバイル特有の制約の中でどう実装するかという話なので、土台として読んでおくと収益化の判断軸が一段上がります。
全体を振り返って
個人開発で月10万円を超えるには、「作る」から「運用する」への意識転換が必須です。月1万円までは作るだけで届くこともありますが、月10万円は意図的なチューニングなしには到達できません。
今日からひとつだけ始めるとしたら、自分のアプリの「現在の月次収益」と「ユーザー 1 人あたり月収益(ARPU)」を計算してみてください。その数字を 3 倍にするには何が必要か、本記事の 4 つのレバー(広告 eCPM・IAP・サブスク継続率・ASO)のどれを優先すべきかが見えてきます。
12 年間の試行錯誤の中で得た最大の学びは、「月10万円の壁を超えると、月50万円までは比較的スムーズに到達できる」ということです。最初の壁が一番高い。逆に言えば、月10万円を超えた瞬間に、個人開発のキャリアの可能性は大きく広がります。Rork という強力な実装ツールを手にしている今、その壁を超えるチャンスはこれまでで最も大きいタイミングだと感じています。