作成日: 2026-03-26 | プロジェクト: C:\Users\kawag\work\line-crm
目的: L-step(月額21,780円〜)/ Utage(月額17,600円〜)の代替として、LINE公式アカウントのCRM/マーケティングオートメーションを自前で無料運用する。
対象: 医療・訪問リハビリ施設(患者・ご家族へのステップ配信・休み連絡・受診リマインド)
| レイヤー | 技術 | バージョン / 備考 |
|---|---|---|
| フロントエンド | Next.js (App Router) | 16.2.1 |
| UIコンポーネント | shadcn/ui + Tailwind CSS | v4 |
| DB | Supabase (PostgreSQL) | @supabase/supabase-js + @supabase/ssr |
| LINE連携 | LINE Messaging API | @line/bot-sdk |
| グラフ | recharts | v3.8 |
| ホスティング | Vercel | Hobbyプラン |
| スタッフ通知 | Slack Webhook | LINE Notify終了のため |
| 定期実行 | 外部Cron + Vercel Cron | Hobby=1日1回制限 |
line-crm/ ├── app/ │ ├── api/ │ │ ├── webhook/line/route.ts # LINE Webhook(署名検証+イベント処理) │ │ ├── cron/step-delivery/route.ts # ステップ配信Cron │ │ ├── friends/ # 友だちCRUD (5ルート) │ │ ├── tags/route.ts # タグCRUD │ │ ├── scenarios/ # シナリオCRUD (5ルート) │ │ ├── broadcasts/ # 一斉配信CRUD+送信 (4ルート) │ │ ├── auto-replies/route.ts # 自動応答CRUD │ │ ├── rich-menus/route.ts # リッチメニューCRUD │ │ ├── absences/ # 休み連絡 (3ルート) │ │ └── analytics/route.ts # 分析データ │ └── dashboard/ # 管理画面 (9ページ) ├── lib/ │ ├── supabase/ (client.ts, server.ts) │ ├── line/ (client.ts, webhook.ts, messages.ts, event-handlers.ts) │ ├── scheduler.ts # ステップ配信エンジン │ ├── slack.ts # Slack通知 │ └── types.ts # 全型定義 ├── components/ (sidebar.tsx + shadcn/ui) ├── supabase/migrations/001_initial.sql └── vercel.json # Cron設定
| Phase | 内容 | 状態 |
|---|---|---|
| 1 | プロジェクト初期化(スキーマ・型定義・SDK・レイアウト) | 完了 |
| 2 | LINE Webhook(follow/unfollow/message/postback・休み連絡フロー) | 完了 |
| 3 | ステップ配信スケジューラ + Cronエンドポイント | 完了 |
| 4 | 友だち管理画面 + API(一覧・詳細・タグ・CSV) | 完了 |
| 5 | シナリオ管理画面(トリガー・ステップ編集) | 完了 |
| 6 | 一斉配信(セグメント絞込・即時/予約送信) | 完了 |
| 7 | 分析ダッシュボード(recharts 4種グラフ) | 完了 |
| 8 | 自動応答 + リッチメニュー管理 | 完了 |
| 9 | 休み連絡(管理画面・確認操作・ダッシュボード連携) | 完了 |
| テーブル | 用途 | 主要カラム |
|---|---|---|
friends | 友だち管理 | line_user_id, display_name, status, custom_fields |
tags | タグ | name, color |
friend_tags | 友だち×タグ(多対多) | friend_id, tag_id |
scenarios | シナリオ | trigger_type, trigger_value, is_active |
scenario_steps | ステップ | step_order, delay_hours, message_type, message_content |
friend_scenarios | シナリオ進捗 | current_step, next_send_at, status |
broadcasts | 一斉配信 | message_content, segment_filter, status, recipient_count |
auto_replies | 自動応答 | keyword, match_type, response_type, priority |
rich_menus | リッチメニュー | line_rich_menu_id, tag_conditions |
message_logs | 送信ログ | friend_id, message_type, status |
absence_notifications | 休み連絡 | absence_date, reason, status, confirmed_by |
conversation_states | 会話状態 | state, context, expires_at(10分TTL) |
※ tracking_urls, url_clicks テーブルも定義済み(未使用)
supabase/migrations/001_initial.sql を実行env.local.example → .env.local にリネームし全値を設定vercel deploy → 環境変数をVercelダッシュボードにも設定https://your-app.vercel.app/api/webhook/line を設定、応答メッセージをOFFにGET /api/cron/step-delivery + Authorization: Bearer {CRON_SECRET}NEXT_PUBLIC_SUPABASE_URL=https://xxx.supabase.co NEXT_PUBLIC_SUPABASE_ANON_KEY=xxx SUPABASE_SERVICE_ROLE_KEY=xxx LINE_CHANNEL_SECRET=xxx LINE_CHANNEL_ACCESS_TOKEN=xxx CRON_SECRET=xxx SLACK_WEBHOOK_URL=https://hooks.slack.com/services/xxx/xxx/xxx NEXT_PUBLIC_APP_URL=https://your-app.vercel.app
当初WebhookをEdge Runtimeで実装予定だったが、@line/bot-sdkがNode.jsのstreamモジュールに依存するためNode.js Runtimeに変更。署名検証はWeb Crypto APIで実装済み(Edge互換)のため、将来SDKを外せばEdge化可能。
Cron Jobsは1日1回が上限。ステップ配信の5分間隔には外部Cronサービス(cron-job.org等、無料枠あり)が必要。Proプラン(月$20)にすれば vercel.json の schedule を */5 * * * * に変更するだけで対応可。
LINE Notifyは2025年3月末でサービス終了。スタッフ通知はSlack Incoming Webhookに変更。lib/slack.ts で実装。
| コミット | 内容 |
|---|---|
1b679e7 | docs: 全Phase完了マーク更新 |
2f2c869 | feat: Phase 9 - 休み連絡管理画面 + ダッシュボードライブデータ |
0eb81da | feat: Phase 8 - 自動応答 + リッチメニュー管理 |
927ccb0 | feat: Phase 7 - 分析ダッシュボード |
4b8e410 | feat: Phase 6 - 一斉配信API + 画面 |
153facd | feat: Phase 5 - シナリオ管理API + 画面 |
1592920 | feat: Phase 4 - 友だち管理画面 + API |
d1134e6 | feat: Phase 3 - ステップ配信スケジューラ + Cron |
79b2954 | feat: Phase 2 - LINE Webhook + イベントハンドラー + Slack通知 |
bae2ba2 | feat: Phase 1 - LINE CRM プロジェクト初期化 |
LINE CRM Handoff Document — Generated 2026-03-26