第11章 ― KPIダッシュボード v2(成長編)

“Step1の20行が、Step2の200行になる日。”
創業編 第6章で書いた kpi/dashboard.mjs(Step1 20行)を、Step2 に進化させる日。ASC Sales Reports API を統合して、毎日のDL/MRR/解約率を自動取得する。
Step2の要件
1. ASC Sales Reports API を毎朝6:00に叩く
2. 各アプリの daily DL / daily MRR / 国別 / 解約率 を取得
3. registry.json の各エントリに kpi_today / kpi_7d / kpi_30d をマージ
4. dashboard.mjs で5本のアプリの KPI を1画面で出す
5. CFO Agent(02_cfo.md) が30日連続赤字を自動検出
ASC API 認証の実装
認証情報は HANDOFF.md / CLAUDE.md / 21_carefam_master.md に共通で書いてある: Key `775PX32QH5` / Issuer `d89909ec-...` / p8 `/tmp/apple_keys/AuthKey_775PX32QH5.p8`。
JWT 生成は ES256(P-256)。トークン有効期限は20分。`jsonwebtoken` ライブラリで生成し、Bearer ヘッダで `https://api.appstoreconnect.apple.com/v1/salesReports?filter[reportType]=SALES&filter[reportSubType]=SUMMARY&filter[frequency]=DAILY&filter[reportDate]=YYYY-MM-DD&filter[vendorNumber]=XXXXXXXX` を叩く。レスポンスは TSV(gzip)。
1日のフロー(cron)
毎日の自動実行スケジュール
| 時刻 | ジョブ | 出力 |
|---|---|---|
| 6:00 | asc_sales_fetch.mjs | kpi/raw/YYYY-MM-DD.tsv.gz |
| 6:05 | asc_sales_parse.mjs | kpi/daily/YYYY-MM-DD.json |
| 6:10 | registry_merge.mjs | apps/registry.json 更新 |
| 7:00 | Trend Hunter Agent | market_research/YYYY-MM-DD_trends.md |
| 8:00 | CFO Agent | kpi/cfo_report_YYYY-MM-DD.md |
| 9:00 | CEO Agent | 当日のアプリ判断 |
| 20:00 | dashboard.mjs | stdout: 5本のKPIサマリ |
200行のdashboard.mjs
Step2 の dashboard.mjs は約200行。中身は:
* registry.json + kpi/daily/*.json を読む(20行)
* 各アプリの 1日 / 7日 / 30日 MRR/DL/解約率 を計算(40行)
* console.table で出力(20行)
* 30日連続赤字アプリをフラグ立て(40行)
* CFOレポート用 markdown 出力(60行)
* CLI フラグ `--json` `--cfo` `--mrr-only` 対応(20行)
Step1 から Step2 への増分は約180行。これは1日で書けた。
CFO Agent の自動判断
CFOレポートに『停止推奨アプリ』が自動で入る。判定ロジックはこう:
“30日連続でMRR < (Claude API課金 + Supabase維持費 + ストア手数料) なら停止推奨”
1本あたりの最低運用コストは、Supabase shared inst の按分1本¥500/月、Claude API使用分(雛形時消費)¥200/月、ストア手数料15-30%。実質、月¥800のMRRが立たないアプリは6ヶ月以内に停止候補になる。
5本の現在地(Step2 連携初日)
サンプル出力(数字は概算想定):
kpi/dashboard.mjs --mrr-only の出力例
| slug | MRR(30d) | DL(30d) | 解約率 | 判定 |
|---|---|---|---|---|
| carefam | ¥80,000 | 1,200 | 5% | 伸長 ⭐︎ |
| read-big-ocr | ¥25,000 | 800 | 8% | 順調 |
| focus-timer-adhd | ¥18,000 | 650 | 12% | 改善中(★1対応後) |
| sleep-mind-link | ¥8,000 | 300 | 10% | 監視 |
| cat-litter-log | ¥12,000 | 450 | 6% | 立ち上がり |
| 合計 | ¥143,000 | 3,400 | — | 1ヶ月目KPI(¥100k)達成 |
**2026年6月初週時点で、1ヶ月目KPI ¥100,000 を達成見込み。** これは1本のアプリでは到達しなかった数字。5本の合計で立てたという事実が、量産戦略の正しさを証明する。
「JSONファイルベース」哲学を保つ
Step2でも DBは使わない。すべて JSON ファイル + Markdown。git で全変化を追える。Mixpanel契約しない、Datadog契約しない。透明性とコスト最適化の両立。
理由は CLAUDE.md の絶対ルール:「全リポジトリ読込は禁止。指定ファイルのみ読む」。Claude Code が必要に応じて registry.json / kpi/cfo_report_*.md を読み、判断材料にする。SaaS連携はメリットよりブラックボックス化のコストが大きい。
4コマ漫画 ― 「ダッシュボードに5本並んだ朝」

- 1コマ目Step1: registry.jsonを読むだけの20行スクリプト
- 2コマ目ASC API JWT認証を1日で実装。p8キー読み込み完了
- 3コマ目毎朝6:00 cron: 5本のKPIが自動更新される
- 4コマ目1ヶ月目KPI ¥100,000、達成見込み。次は¥500,000
次回、第12章は「TikTokショート動画でDLが増えた日」。Growth Hacker Agent が初めてTikTokを回した日の記録。