← 一覧に戻る

管理ダッシュボード + 意見コマンド + マーケティングトラッカー

2026年3月15日 20:12 更新
MD から自動変換されたページです。内容について質問があれば右下の ? ボタンからどうぞ。

Context

Phase 2b(ユーザーを集める)に入り、プロダクトの全状態を1画面で把握できる司令塔が必要。 バジェット・ファネル・フィードバック・マーケティング進捗・LINEプロフィール・LP状況を remindenwa.com/admin のダッシュボード1枚に集約する。

運用モデル: ダッシュボードは完全に閲覧専用。データ更新は2種類:

DB スキーマ変更

feedback テーブル + users.awaiting_feedback

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;

outreach テーブル(チャネル別集計)

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);

line_api_cache + milestones テーブル

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');

API エンドポイント(全て Bearer 認証、既存パターン踏襲)

メソッド パス 用途 更新者
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
}

LINE Bot「意見」コマンド

既存の pending_reminder パターンと同じ2ステップフロー:

  1. text === "意見"awaiting_feedback = 1 にセット → 返信「感想や気づいたこと、こうしてほしいってことをそのまま送ってね!」
  2. 次メッセージ → feedback テーブルに INSERT → フラグリセット → 返信「ありがとう!改善の参考にするね!」

挿入位置: awaiting_feedback チェックは pending_reminder チェックの直後(コマンド判定の前)。

ダッシュボード HTML(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)。

TDD イテレーション

# 内容 テスト数(見込み)
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 新規 ダッシュボード本体

検証手順

  1. tsc --noEmit && pnpm test(全テスト通過)
  2. wrangler devlocalhost:8787/admin でダッシュボード表示確認
  3. LINE Bot で「意見」→ テキスト送信 → /admin/feedback に反映確認
  4. curl -X POST -H "Authorization: Bearer $KEY" -d '{"channel":"jpc","sent_count":5}' localhost:8787/admin/outreach → GET で反映確認
  5. Codex レビュー → LGTM まで修正
📝 質問モード — テキストを選択してね
✓ 質問を送信しました