◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り26日。API 連携を足したアプリは移行先の確認を●SDK 58 — React Native 0.88 に更新されました。Android のリリース版で R8 が既定オンになり、iOS は SceneDelegate を生成します●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)●SONNET 4.5 — Claude API での提供終了は 11/30、残り26日。API 連携を足したアプリは移行先の確認を●SDK 58 — React Native 0.88 に更新されました。Android のリリース版で R8 が既定オンになり、iOS は SceneDelegate を生成します●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/ビジネス
⟐ ビジネス/2026-06-13上級

収益の「本当の数字」を掴む — AdMob・App Store・Google Play・Stripe を突き合わせる集計設計

ダッシュボードの売上と実際の入金額は一致しません。通貨・タイムゾーン・推定値と確定値のズレを吸収し、4つの収益ソースを突き合わせる集計パイプラインを、6本並行運用の実装と運用判断とともに整理しました。

収益管理AdMob75App Store Connect17Stripe20データ設計

✦ プレミアム記事

ある月、AdMob のダッシュボードは前月比 12% 増を示していたのに、実際の入金は横ばいでした。最初はバグを疑いましたが、原因は単純で、ダッシュボードの「推定収益」と確定した入金額は別物だったのです。為替の確定タイミング、無効トラフィックの事後調整、支払いの最低額への到達——いくつもの要因で、画面の数字と銀行口座の数字はずれます。

個人開発でアプリを6本運用していると、収益は AdMob・App Store・Google Play・Stripe の4つから入ってきます。それぞれが別の通貨、別のタイムゾーン、別の「推定と確定」の概念を持っています。これらを素朴に足し算すると、毎月どこかで数字が合わなくなります。ここでは、4ソースを突き合わせて「本当の数字」を掴むために組んだ集計パイプラインを、正規化のスキーマと日次集計の実装、そして月次の帳尻合わせの手順とともに共有します。

なぜ数字がずれるのか — ソース別の性格

突き合わせを設計する前に、4つのソースがそれぞれどう嘘をつくかを理解する必要がありました。

AdMob の画面に出るのは推定収益です。無効トラフィックの控除や為替の確定により、月末に確定する金額は数%下振れします。私の実績では、推定と確定の差はおおむね 2〜6% の範囲に収まっていました。App Store Connect と Google Play は、画面の「販売」と、財務レポートの確定額、さらに実際の入金額(手数料控除後)の3層がそれぞれ違います。Stripe は比較的素直ですが、返金やチャージバックが後日マイナスで入るため、発生日と確定日を分けて持たないと月をまたいだときに合わなくなります。

つまり、どのソースも「今いくら稼いだか」を一意には教えてくれません。設計の出発点は、推定値と確定値を別の列として持つことだと最初に決めました。

正規化スキーマ — すべてを同じ形に直す

4ソースのデータ形式はバラバラなので、いったん共通の形に正規化します。私が使っているスキーマはこうです。

CREATE TABLE revenue_events (
  app_id        TEXT NOT NULL,        -- 6本のどれか
  source        TEXT NOT NULL,        -- admob / appstore / googleplay / stripe
  kind          TEXT NOT NULL,        -- ad / iap / subscription / refund
  occurred_on   DATE NOT NULL,        -- 発生日(UTC基準に統一)
  amount_minor  INTEGER NOT NULL,     -- 最小通貨単位(円なら1=1円, ドルなら1=1セント)
  currency      TEXT NOT NULL,        -- JPY / USD など
  status        TEXT NOT NULL,        -- estimated / finalized
  fx_to_jpy     REAL,                 -- 確定時の対円レート(estimated は NULL 可)
  PRIMARY KEY (app_id, source, kind, occurred_on, status)
);

肝は3つです。金額を浮動小数ではなく最小通貨単位の整数(amount_minor)で持つことで、丸め誤差が積み上がるのを防ぎます。status で推定と確定を明確に分け、同じ日・同じソースの行が二重に立つのを主キーで防ぎます。そして為替は「集計時の今のレート」ではなく「確定時のレート」を fx_to_jpy に保存し、後から再集計しても過去の数字が動かないようにします。

通貨換算をうっかり集計時のレートでやると、月初に見た数字と月末に見た数字が変わってしまい、信頼できないダッシュボードになります。これは一度やって痛い目を見ました。

✦

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

この記事の続きを読む

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

この記事で得られること
✦推定値と確定入金額がなぜズレるのかを4ソース別に切り分け、突き合わせる集計の考え方
✦通貨・タイムゾーン・返金を吸収する正規化スキーマと、日次で集計する実装の骨格
✦ダッシュボードの数字を鵜呑みにせず、月次で入金と帳尻を合わせる運用手順
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⟐ ビジネス2026-10-28
公開後にアプリ名を変えたくなったら、ストアで続くものと作り直すものを先に分けます。名前を決める前に見るのは商標の検索結果です
App Store Connect で名前が保存できたことと、その名前を使ってよいことは別の話です。公開後に改名する場合に Apple と Google Play の公式記載から言える範囲と、アプリ内に残る旧名を拾う小さなスクリプト、名前を決める前の確認順をまとめました。
⟐ ビジネス2026-10-25
見た目は不透明なのに「アイコンに alpha チャンネルがあります」と弾かれる。PNG の中身を提出前に確かめます
App Store Connect の ITMS-90717(Invalid large app icon)は、透けて見えない画像でも alpha チャンネルが残っているだけで出ます。6種類のサンプル PNG で見分け方を確かめ、標準ライブラリだけの検査スクリプトと、alpha を外す直し方をまとめました。
⟐ ビジネス2026-10-17
予約や物販のアプリで Stripe を使ってよいか — Apple の線引きは「どこで消費されるか」です
予約や物販のアプリに Stripe を入れてよいのか、アプリ内課金を求められるのか。App Review Guidelines の 3.1.1 と 3.1.3 を「どこで消費されるか」で読み分け、売るもの別の判定表と審査メモの書き方をまとめました。