導入(問題提起)

CRMは“多機能=成功”ではありません。項目が多すぎて入力が続かない、運用に合わず形骸化する——よくある失敗です。重要なのは、現場が「今日から使える最小機能」に絞り、効果を見ながら拡張すること。Pythonによる小規模なWebシステム開発で、まずはExcel Web化の延長として“回る最小CRM”を作るのが現実解です。本記事では、中小企業が最初に入れるべき必要機能と、その技術的な最小構成を具体的に示します。キーワードは「Webシステム開発」「業務システム」「Python」「Excel Web化」です。

課題の詳細説明

Excelやスプレッドシートによる顧客管理が抱える課題:

  • 履歴の欠落:電話/訪問/メールのやり取りが担当者メールや口頭で埋没する。
  • 重複と表記揺れ:会社名・部署名・担当者が複数表記で検索不能、案件の重複登録も発生。
  • 共有の困難:同時編集の上書き、誰が何を更新したか不明。
  • 成果の可視化不足:案件進捗、成約率、平均単価、活動量などのKPIが出ない。
  • 外部連携の弱さ:見積・請求、メール配信、問い合わせフォームと結びつかない。

解決方法(必要機能)

まずは“最小で回る”MVPを定義し、早期に定着させます。

必須(MVP):

  1. 顧客・担当者マスタ:重複チェック(会社名+電話/ドメイン)。会社—部門—担当者の階層。
  2. 商談/案件:フェーズ・見込み額・確度・次アクション・担当者。期日超過のアラート。
  3. 活動履歴:種別(架電/訪問/メール/WEB MTG)・要点・次アクションのテンプレ化。
  4. タグ/区分:業種・規模・興味領域などのセグメント配信の土台。
  5. 検索とCSV:あいまい検索、並び替え、CSV入出力(既存Excelの一括取込)。
  6. 権限/ログイン:閲覧制御、担当者のみ編集可、監査ログ。

重要(第二段):

  • 見積・請求連携:見込み→売上の自動トラッキング、受注確度と粗利見込の可視化。
  • メール/MA連携:ステップメール送信、反応ログ(開封/クリック)を活動履歴へ自動記録。
  • ダッシュボード:案件数・成約率・平均単価・活動量・滞留案件を可視化。

具体例

  • 一気通貫:顧客登録 → 案件作成 → 活動履歴 → 見積 → 受注 → 請求。
  • Excel Web化:既存台帳をCSVで取り込み、ドメインや電話番号で重複統合。
  • 使い勝手:案件一覧は「次アクション日」で並び替え、スヌーズ機能で漏れ防止。

技術的な解説(Python × 最小CRMアーキテクチャ)

最小構成は「Python + FastAPI(またはBottle) + SQLite」。小規模導入に十分で、将来はPostgreSQLへ移行可能。

  • データモデル(SQLite例)

CREATE TABLE companies(id INTEGER PRIMARY KEY, name TEXT, domain TEXT);
CREATE UNIQUE INDEX uniq_company ON companies(name, COALESCE(domain,''));
CREATE TABLE contacts(id INTEGER PRIMARY KEY, company_id INTEGER, name TEXT, email TEXT, phone TEXT);
CREATE TABLE deals(id INTEGER PRIMARY KEY, company_id INTEGER, title TEXT, amount INTEGER, stage TEXT, owner TEXT, next_action DATE);
CREATE TABLE activities(id INTEGER PRIMARY KEY, deal_id INTEGER, type TEXT, note TEXT, ts DATETIME);
  • ルーティング(FastAPI例)

from fastapi import FastAPI
from pydantic import BaseModel
import sqlite3

app = FastAPI()

def db():
    return sqlite3.connect('crm.db')

class Deal(BaseModel):
    company_id: int
    title: str
    amount: int
    stage: str
    owner: str
    next_action: str

@app.post('/deals')
def create_deal(d: Deal):
    with db() as con:
        con.execute('INSERT INTO deals(company_id,title,amount,stage,owner,next_action) VALUES(?,?,?,?,?,?)',
                    (d.company_id, d.title, d.amount, d.stage, d.owner, d.next_action))
    return {'ok': True}
  • 権限/RBAC:担当者は自案件のみ編集、管理者は全件閲覧。更新は監査ログに必ず記録。
  • CSV取込:既存Excelの列をマッピングし、一括登録。重複は会社名+ドメイン/電話で検知。
  • 連携:問い合わせフォームから自動で見込み顧客を作成、メール送信ログを活動履歴へ保存。

導入の流れ

  1. 項目の棚卸し:既存Excelから“使っている列だけ”を抽出し、最小のデータ定義に落とす。
  2. PoC:顧客1社・案件1件で「登録→履歴→見積→請求」まで最短導線を通す。
  3. 定着:案件一覧の「次アクション」運用を徹底し、朝会で未対応抽出→即アサイン。
  4. 拡張:ダッシュボードとメール連携、見積/請求連携を追加。

まとめ

CRMの成功は“入力しやすさ”に尽きます。まずは最小のMVPで運用を回し、効果を確認しながら拡張する。Pythonを使った小規模業務システムなら短期間・低コストで実現でき、Excel Web化の延長として自然に移行できます。

「Webシステム開発のご相談は monou まで」