小規模店舗向け 顧客・販促管理システム(CRM)
このシステムは何をするか
美容サロンなどの小規模店舗向けに、顧客・来店・売上を 1 か所にまとめ、次に声をかけるべき顧客を見つけ、販促の文案を用意し、人が承認するまでを回す業務システムです。
- 承認申請
- 人が承認
想定業務課題
- 誰にいま声をかけるべきかが、担当者の記憶と感覚に依存する。
- 販促文を自作すると、法律上問題になりやすい言い回しに気づかないまま外部へ出る。
- 生成 AI に書かせると、誰の確認も通らないまま顧客向けの文面が確定してしまう。
使う人と、いまのやり方
使うのは店舗のオーナーと店頭のスタッフで、日常的に触るのは予約表と表計算ソフトです。運用を専任で見る人はいません。台帳・予約・売上は別々にあり、突き合わせは手作業です。文面はオーナーが都度書き、送り先は記憶で決めています。
満たすべきこと
機能
- 顧客・来店・売上を 1 か所で見て、顧客の状態を同じ基準で分類し、月次の振り返りを出力する
- 販促の文案を下書きさせ、問題になりやすい表現を出す前に検出する
- 文案は承認を経ないと承認済みにならない(承認の段階管理/状態遷移)。承認できる人は共同作業者ごとの権限設定(StoreCollaborator)で限定する
制約
- 権限のないスタッフに氏名・電話・メールを見せない
- AI の契約・API キー無しで全機能を通しで確認できる
- 対象を限定して誰が何をしたかを記録し、公開デモとして置いても壊されない
作ったもの
なぜこの設計にしたか
画面側と業務ロジック側を分けた。
権限で見せる情報を変える画面が増えるほど分岐が散らばる。
画面(React / TypeScript)と業務ロジック(Django / DRF)を分離した。
却下した案 — 却下したのは、業務ロジック側が画面まで描く一体構成です。分岐が散らばり、外部へ渡せる仕様の形(API 仕様書の自動生成/drf-spectacular)が残りません。
代償 — frontend / backend の 2 デプロイ単位と、型定義の二重管理(OpenAPI からの生成は未導入)。
AI を使う場所を限定し、既定を見本応答にした(provider 抽象化/AI_PROVIDER=mock)。
顧客状態の分類と表現チェックは決まった規則で判定します(ルールベース)。
AI は文案生成に限定し、既定の provider を mock にした。
却下した案 — 却下したのは、分類と表現チェックも AI に任せる案です。同じ顧客が日によって別の状態になり、理由を説明できません。既定を実 API にする案も、契約が無い人が通しで確認できないため却下しました。
代償 — 表現チェックは辞書ベースで、辞書に無い表現は検出しません(法的判断ではありません)。
承認を段階で管理し、手順を飛ばした操作を拒否する(BUSINESS_RULE_ERROR)。
生成された文案が、誰の確認も通らないまま顧客向けに確定してしまう。
下書き → 承認待ち → 承認済み の段階を強制し、飛ばした操作を拒否する。
却下した案 — 却下したのは、生成物をそのまま承認済みにして後から取り消す方式です。外部に出た後では間に合いません。
見どころ
AI が書いた文案は、人が承認するまで「下書き」のままです。
承認後の画面には「配信(デモでは無効)」と出ますが、このデモに配信機能は含まれていません。
この画面で確認できること
- 承認を経て「下書き」→「承認済み」に変わる
- 同じ画面の 2 件目は「下書き」のままで、承認が文案単位の人の操作だと分かる
- 画面内に「配信(デモでは無効)」が写っている
Evidence の対象外
- 配信した証拠ではない。承認後に出る外部配信の文言は将来形で、このリポジトリに配信実装は無い
- AI が承認した証拠ではない(承認は can_approve_contents を持つ人の操作)
この画像の出所と、拡大
- 種別
- Screenshot(「承認申請する」→「承認する」後の同一画面)
- 出所
- assets/ai-crm/publish/06-campaign-approved.png
- 掲載サイズ
- 1600×1856
- 倍率
- 等倍 1.000
- SHA256
- dfd7b2e6…
同じ画面が、見る人の権限で表示の粒度だけ変わります。
同一顧客・同一画面で、氏名・電話・メールだけが伏せ字になります。
顧客の状態が同じ基準で分類され、判定理由まで残ります。
一覧はバッジで判別でき、詳細に最終来店からの日数と回数が並びます。
実装範囲
個人開発です。画面・API・データベース・AI 呼び出し・権限・テストまでを 1 人で実装しました。私的に開発中のプロダクトから公開可能な範囲を切り出したもので、外部配信・代理店管理・本番インフラは含めていません。
品質の担保方法
- 画面では気づけない部分 — 承認の段階管理、権限に応じた個人情報の伏せ字表示(Serializer マスキング)、ログイン状態の無効化、CSV 取込の失敗行、AI 呼び出しの差し替え — を自動の動作チェック(pytest)で固定しています。
- 領域別は認証 30 / マスキング 19 / 承認 16 / CSV 出力 29 / AI 呼び出し 37。件数は静的な def test_ 定義 480 件、CI 実行ログの実測値は 484 passed(AI CRM CI の main 実行)。
- backend のみで、frontend テストは 0 件です。
安全性とデータの扱い
運用と納品物
| 区分 | 内容 |
|---|---|
| 渡すもの | リポジトリ一式、docs/ の Markdown 24 本(連番の設計文書 23 本 + API_CONTRACT.md)、デモデータ投入コマンド python manage.py seed_demo |
| API 仕様書 | 自動生成(drf-spectacular)。静的な仕様ファイルは同梱していないため参照にはローカル起動が必要。同梱の docs/API_CONTRACT.md は strategy-goals 機能を追加するときの契約書(8 エンドポイント)であり、実装済み API の仕様書ではない(この機能はこのデモに未実装) |
| 依頼者側で行うこと | 環境構築とデータ投入。公開する場合は DJANGO_SECRET_KEY の再発行、デモ利用者の削除、DEMO_MODE=false の 3 点(README「Security Notes」の記載どおり) |
| 運用者が回すもの | 取込エラー行の削除コマンド python manage.py purge_import_errors(自動実行なし) |
| 本番運用の体制・監視・バックアップ | 未定義(このデモの範囲外) |
できること・含めていないこと
| Implemented | Not Included | Why |
|---|---|---|
| AI 文案の生成 + 人の承認 | 外部配信(LINE / メール) | 本番の認証情報・外部サービス運用を持たないため。このリポジトリには 1 行も含めていない |
| 施策のチャネル区分の分類 | チャネルへの送信 | 同上。チャネル値は分類のためのメタデータ |
| 権限別の個人情報マスキング | データベースの暗号化 | マスキングは表示制御。暗号化は別レイヤの要件で、混同させない |
| サーバー側のトークン更新・失効 | 画面側のトークン自動更新 | 未実装。401 でログイン画面へ戻す挙動のみ |
| 対象操作の監査記録(7 app / 23 か所) | 予約・売上の書き込みの記録 | 現状の実装範囲。README で対象操作を列挙している |
| AI 利用の記録(5 サービス中 3 つ) | AI コストの上限制御・集計画面 | 制御に必要なデータを取る段階まで |
| backend テスト | frontend テスト | 未着手。このデモの品質担保は backend の自動テストに寄せている |
| Anthropic API 経路(既定 off) | 本番運用実績 | 実装済みの経路であり、稼働実績ではない |
| 公開デモ用の破壊防止(DEMO_MODE) | 公開 Live Demo | 今回の公開条件に含めていない |
規模の目安
| 項目 | 実測値 | 取得方法 |
|---|---|---|
| API エンドポイント | 55 | apps/*/urls.py の path() 総数 63 から、下位 urls.py を束ねる include() 8 件を除いた実数。DRF Router は不使用 |
| モデル / アプリ | 26 / 11 | Django のモデルレジストリ(apps.get_models() のうち apps.* 所属) |
| 設計文書 | 24 本 | docs/ の Markdown(連番の設計文書 23 本 + API_CONTRACT.md) |
| backend テスト | 静的 480 件 / CI 実測 484 passed | backend/apps のテスト定義を数えた静的件数 480 件(2026-08-20 再計測)。CI 実行ログ run 32078586978 の実測は 484 passed |
| frontend テスト | 0 件 | frontend/ 配下に *.test.* / *.spec.* が 0 件(node_modules 除く) |
対応可能な作業の例
以下は対応できる作業の種類であり、受注実績ではありません。
- 顧客・予約・売上を扱う社内向け Web 業務システムの新規開発
- 権限別に見せる情報を変える管理画面の設計・実装
- 生成 AI を業務フローに組み込む際の、人の承認・記録・切替の設計
- REST API + データベース設計を伴うアプリケーション開発
技術詳細
証拠へのリンク
CI 実行ログは GitHub Actions で確認できます。閲覧には GitHub へのサインインが必要な場合があります。
- 01想定業務課題
- 02使う人と、いまのやり方
- 03満たすべきこと
- 04作ったもの
- 05なぜこの設計にしたか
- 06見どころ
- 07実装範囲
- 08品質の担保方法
- 09安全性とデータの扱い
- 10運用と納品物
- 11できること・含めていないこと
- 12規模の目安
- 13対応可能な作業の例
- 14技術詳細
- 15証拠へのリンク