Phase 2b(ユーザーを集める)に入り、プロダクトの全状態を1画面で把握できる司令塔が必要。
バジェット・ファネル・フィードバック・マーケティング進捗・LINEプロフィール・LP状況を
remindenwa.com/admin のダッシュボード1枚に集約する。
運用モデル: ダッシュボードは完全に閲覧専用。データ更新は2種類:
CREATE TABLE feedback (
id INTEGER PRIMARY KEY AUTOINCREMENT,
line_user_id TEXT NOT NULL,
content TEXT NOT NULL,
created_at INTEGER DEFAULT (unixepoch())
);
ALTER TABLE users ADD COLUMN awaiting_feedback INTEGER NOT NULL DEFAULT 0;
CREATE TABLE outreach (
channel TEXT PRIMARY KEY, -- 'jpc','friends','community','x','referral'
target_count INTEGER NOT NULL DEFAULT 0, -- 送信対象人数(JPC=25, friends=10 等)
sent_count INTEGER NOT NULL DEFAULT 0,
registered_count INTEGER NOT NULL DEFAULT 0,
continued_count INTEGER NOT NULL DEFAULT 0,
notes TEXT,
updated_at INTEGER DEFAULT (unixepoch())
);
INSERT INTO outreach (channel, target_count) VALUES
('jpc', 25), ('friends', 10), ('community', 0), ('x', 0), ('referral', 0);
CREATE TABLE line_api_cache (
key TEXT PRIMARY KEY,
value TEXT NOT NULL,
fetched_at INTEGER NOT NULL DEFAULT (unixepoch())
);
CREATE TABLE milestones (
key TEXT PRIMARY KEY,
done INTEGER NOT NULL DEFAULT 0,
done_at INTEGER,
updated_at INTEGER DEFAULT (unixepoch())
);
INSERT INTO milestones (key) VALUES
('lp_created'), ('lp_deployed'), ('line_profile_set'),
('line_icon_set'), ('beta_invite_started'), ('first_feedback');
| メソッド | パス | 用途 | 更新者 |
|---|---|---|---|
| GET | /admin/stats |
バジェット+ファネル | 自動(既存) |
| GET | /admin/feedback |
フィードバック一覧 | 自動(意見コマンド) |
| GET | /admin/outreach |
チャネル別マーケ進捗 | Claude Code |
| POST | /admin/outreach |
マーケ進捗更新 | Claude Code |
| GET | /admin/line-info |
LINE Bot情報(キャッシュ付きproxy) | 自動(1時間TTL) |
| GET | /admin/milestones |
チェックリスト | Claude Code |
| POST | /admin/milestones |
マイルストーン更新 | Claude Code |
GET /admin/feedback
{ "items": [{ "id": 1, "content": "朝5時にも使いたい", "created_at": 1710000000 }] }
※ line_user_id はダッシュボードに返さない(個人情報保護)
GET /admin/outreach
{
"jpc": { "target": 25, "sent": 5, "registered": 3, "continued": 2, "notes": null },
"friends": { "target": 10, "sent": 3, "registered": 2, "continued": 1, "notes": null },
"community": { "target": 0, "sent": 1, "registered": 0, "continued": 0, "notes": "Zenn記事1本" },
"x": { "target": 0, "sent": 2, "registered": 0, "continued": 0, "notes": null },
"referral": { "target": 0, "sent": 0, "registered": 0, "continued": 0, "notes": null }
}
GET /admin/line-info(Workers内でLINE API /v2/bot/info をfetch → D1キャッシュ)
{
"displayName": "リマイン電話くん",
"pictureUrl": "https://...",
"followersCount": 42,
"cachedAt": 1710000000
}
既存の pending_reminder パターンと同じ2ステップフロー:
text === "意見" → awaiting_feedback = 1 にセット → 返信「感想や気づいたこと、こうしてほしいってことをそのまま送ってね!」feedback テーブルに INSERT → フラグリセット → 返信「ありがとう!改善の参考にするね!」挿入位置: awaiting_feedback チェックは pending_reminder チェックの直後(コマンド判定の前)。
public/admin/index.html)ページ読み込み時に localStorage.getItem('adminKey') を確認。なければ入力モーダル。
/admin/stats に試し打ちして 200 なら保存。
┌─────────────────────────────┐
│ リマイン電話くん 管理画面 │
│ 🔄 ボタンで全セクション更新 │
├─────────────────────────────┤
│ [1] バジェット │ ← /admin/stats .budget
│ ¥646 / ¥4,000 (16%) │
│ [████░░░░░░░░░░] 残¥3,354 │
│ 完了34件 + 予約3件 │
│ 開発費: ¥295(別枠) │
├─────────────────────────────┤
│ [2] ファネル │ ← /admin/stats .funnel
│ 友達追加 → 番号送信 → 認証 │
│ 8 → 5 → 4 │
│ → 利用 → D7継続 → 枠到達 │
│ 3 → 1 → 0 │
├─────────────────────────────┤
│ [3] マーケティング │ ← /admin/outreach
│ │
│ JPC同期 ██░░░ 5/25送信 │
│ 登録3 継続2 │
│ 友達 ███░░ 3/10送信 │
│ 登録2 継続1 │
│ コミュニティ 投稿1 登録0 │
│ X 投稿2 登録0 │
│ 紹介 依頼0 獲得0 │
├─────────────────────────────┤
│ [4] LINE プロフィール │ ← /admin/line-info
│ リマイン電話くん │
│ 友達 42人 │
│ 更新: 1時間前 │
├─────────────────────────────┤
│ [5] フィードバック │ ← /admin/feedback
│ 「朝5時にも使いたい」 3/15 │
│ 「電話が聞こえにくい」 3/14 │
├─────────────────────────────┤
│ [6] チェックリスト │ ← /admin/milestones
│ ✅ LINEプロフィール設定 │
│ ✅ アイコン設定 │
│ ⬜ LP公開 │
│ ⬜ β招待開始 │
└─────────────────────────────┘
pricing-strategy-v2.html のCSSを踏襲(ダークブルーテーマ #0d223a、アクセント #3ea8ff、カード #0f2744)。
| # | 内容 | テスト数(見込み) |
|---|---|---|
| 1 | 「意見」コマンド(awaiting_feedback フロー) | +3 |
| 2 | GET /admin/feedback |
+2 |
| 3 | GET/POST /admin/outreach |
+3 |
| 4 | GET /admin/line-info(LINE API proxy + キャッシュ) |
+3 |
| 5 | GET/POST /admin/milestones |
+3 |
| 6 | ダッシュボード HTML(テストなし、手動確認) | 0 |
| ファイル | 種別 | 内容 |
|---|---|---|
schema.sql |
変更 | 4テーブル追加 + users.awaiting_feedback |
src/index.ts |
変更 | 「意見」コマンド + 5本のAPIエンドポイント |
src/index.test.ts |
変更 | +14テスト |
public/admin/index.html |
新規 | ダッシュボード本体 |
tsc --noEmit && pnpm test(全テスト通過)wrangler dev → localhost:8787/admin でダッシュボード表示確認/admin/feedback に反映確認curl -X POST -H "Authorization: Bearer $KEY" -d '{"channel":"jpc","sent_count":5}' localhost:8787/admin/outreach → GET で反映確認