EC・小売

カーディーラーの査定書・点検案内をClaude Codeで自動化【2026年版】

カーディーラー・中古車販売店向け。査定書ドラフト自動生成・車検点検案内メール・在庫Slack通知をClaude Codeで実装する具体的コードと運用フロー。

カーディーラーの査定書・点検案内をClaude Codeで自動化【2026年版】



結論:カーディーラーの3大定型業務はClaude Codeで自動化できる

  • 査定書ドラフトは車両情報CSVから5秒以内に整形出力できる
  • 車検・点検案内メールはDMS(販売管理システム)のデータを読んで自動バッチ送信できる
  • 在庫更新をSlackにリアルタイム通知するスクリプトは1日で実装可能

対象読者:カーディーラー・中古車販売店の営業担当・整備士・店長
本記事で得られること:3つの自動化スクリプト実装例(想定モデル事例)と、顧客個人情報を守る運用ルール

ある地方の中古車販売店(スタッフ8名、月100台規模)では、営業担当が査定書を1枚作るたびに15〜20分かかっていた。車検証情報をExcelに手打ちして書式を整え、減価率を調べて金額欄を埋める。それを1日10件繰り返すと、1日あたり約2.5時間が査定書作業に消える計算になる。

同様の状況は点検案内にも当てはまる。「車検が2ヶ月後に切れるお客様にDMを出す」という作業は、スタッフが月末にExcelをソートして宛先を手作業でコピーするという、昔ながらのやり方で回っていた。

本記事では、Claude Codeを使ってこれらの定型業務をどのように自動化するか、想定モデル事例として3つの実装パターンを具体的なコードで紹介する。数字はすべて想定値であり、個別のディーラーが保証する成果ではない。

⚠ 重要:個人情報・車検証情報の取り扱いについて
本記事で紹介するスクリプトは、匿名化・サンプルデータでの検証を前提としている。実際の運用では、顧客氏名・住所・車検証番号などの個人情報をClaude Codeのプロンプトに直接入力しないこと。最終的な査定額の提示・顧客への説明はかならず査定士・スタッフが担当すること。

カーディーラーで自動化できる3つの定型業務

まず業務の現状を整理する。一般的なカーディーラーや中古車販売店では、以下の業務がスタッフの手間を奪っている。

業務 現状の課題 自動化の余地
査定書ドラフト作成 車両情報の転記・書式整形に15〜20分/件 CSV入力→書式整形を5秒以下に
点検・車検案内メール 月末の手動Excelソート+コピペ作業 バッチスクリプトで自動生成・送信
在庫リスト管理・Slack通知 展示車の追加・売約済みの更新が翌日対応になる ファイル変更検知→Slack自動通知

いずれも「人間の判断が不要な転記・整形・配信」に時間がかかっている。Claude Codeはこういったルールが明確な作業を得意とする。

実装1:車両情報CSVから査定書ドラフトを自動生成する

想定モデル事例の概要

月100台の中古車買取を行う販売店(スタッフ8名)が、既存の査定入力CSVを査定書ドラフトに変換するスクリプトをClaude Codeで実装した想定ケース。

実装ステップ

Claude Codeに以下のように依頼してスクリプトを生成した:

Prompt(Claude Codeへの指示):
「査定入力データ(CSV)を読み込んで、社内フォーマットの査定書テキストを出力する
Pythonスクリプトを作って。

CSVの列: 車名,年式,走行距離km,車体色,修復歴有無,車検満了日

出力フォーマット:
---
【査定書ドラフト】
車名: {車名}
年式: {年式}年式
走行距離: {走行距離}万km(小数点1桁に丸める)
車体色: {車体色}
修復歴: {修復歴有無を'有り'/'なし'に変換}
車検満了: {車検満了日をYYYY年MM月DD日形式で}
---

注意: このスクリプトは書式整形のみ。査定額の自動計算は行わないこと。
顧客氏名・住所・車検証番号などの個人情報は入力しない前提で設計すること。」

Claude Codeが生成したスクリプトは下記のとおり:

import csv
import sys
from datetime import datetime

def format_estimate_draft(csv_path: str, output_path: str) -> None:
    """
    車両情報CSVを査定書ドラフトテキストに変換する。
    個人情報(氏名・住所・車検証番号)は含まない設計。
    """
    results = []

    with open(csv_path, encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            # 走行距離: kmを万km表示(小数点1桁)
            km_raw = float(row["走行距離km"].replace(",", ""))
            km_man = round(km_raw / 10000, 1)

            # 修復歴の正規化
            repair = row["修復歴有無"].strip()
            repair_label = "有り" if repair in ("有", "有り", "あり", "1", "Y") else "なし"

            # 車検日のフォーマット
            shaken_raw = row["車検満了日"].strip()
            try:
                dt = datetime.strptime(shaken_raw, "%Y/%m/%d")
                shaken_str = dt.strftime("%Y年%m月%d日")
            except ValueError:
                shaken_str = shaken_raw  # パース失敗時はそのまま出力

            draft = (
                "---\n"
                "【査定書ドラフト】\n"
                f"車名: {row['車名']}\n"
                f"年式: {row['年式']}年式\n"
                f"走行距離: {km_man}万km\n"
                f"車体色: {row['車体色']}\n"
                f"修復歴: {repair_label}\n"
                f"車検満了: {shaken_str}\n"
                "---\n"
            )
            results.append(draft)

    with open(output_path, "w", encoding="utf-8") as out:
        out.write("\n".join(results))

    print(f"✓ {len(results)}件の査定書ドラフトを生成しました: {output_path}")
    print("  ※ 査定額は査定士が別途確認・入力してください。")

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("Usage: python estimate_draft.py input.csv output.txt")
        sys.exit(1)
    format_estimate_draft(sys.argv[1], sys.argv[2])

運用上のルール(重要)

  • このスクリプトは書式整形のみ。査定額の算定はAIが行わない
  • 出力された「査定書ドラフト」は査定士が目視確認してから顧客に提示する
  • CSVには顧客氏名・住所・車検証番号を含めない(車両情報のみ)
  • 生成したドラフトファイルは共有フォルダに保存し、査定士のサインオフを必須にする

想定される効果(モデルケース)

指標 自動化前(想定) 自動化後(想定)
査定書ドラフト作成時間/件 15〜20分 5秒(スクリプト実行)+ 2〜3分(査定士確認)
月100件の総工数 約25〜33時間 約3〜4時間(確認作業のみ)

あくまでモデルケースの試算であり、実際の削減時間はDMSの構成や社内フォーマットの複雑さによって変わる。

実装2:車検・点検案内メールのバッチ送信スクリプト

課題と設計方針

多くの販売店では「車検満了2ヶ月前」にDMや電話案内をするが、顧客リストのソートと文面作成を月末にまとめてスタッフが行っている。Claude Codeを使ってこのバッチ処理を自動化する。

個人情報の取り扱いに関する重要注意事項
実装前に個人情報保護方針を確認し、顧客データの外部送信・クラウド連携には社内のセキュリティ規定に従うこと。下記スクリプトはローカル環境での実行を前提とし、顧客データをClaude APIに送信しない設計にしている。

Claude Codeへの依頼プロンプト:

Prompt:
「顧客管理CSV(顧客ID, 車検満了日, メールアドレス)を読み込んで、
2ヶ月以内に車検が切れる顧客に向けた案内メールの文面を生成するスクリプトを作って。

・顧客氏名はCSVに含まないこと(個人情報保護のため、メール宛先は顧客IDで管理)
・文面はテンプレートをベースにした差し込み形式
・実際のメール送信は行わず、送信候補一覧のCSVを出力するだけ(送信は別途担当者が確認してから実施)
・今日の日付から60日以内に車検満了する行だけを抽出する
・出力: 顧客ID, 車検満了日, 案内メール文面」
import csv
import sys
from datetime import datetime, timedelta

EMAIL_TEMPLATE = """
車検のご案内

平素よりご愛顧いただきありがとうございます。
お客様のお車の車検有効期限が近づいてまいりました。

■ 車検満了日: {shaken_date}

お早めのご予約をお勧めしております。
ご不明な点がございましたら、担当スタッフまでお気軽にご連絡ください。

---
※ 本メールは自動生成されたドラフトです。送信前に担当スタッフが内容を確認します。
"""

def generate_inspection_notices(
    input_csv: str,
    output_csv: str,
    days_ahead: int = 60
) -> None:
    """
    車検満了日が指定日数以内の顧客を抽出し、案内メール文面を生成する。
    実際の送信は行わず、担当者確認用のCSVを出力する。
    """
    today = datetime.today()
    deadline = today + timedelta(days=days_ahead)
    results = []

    with open(input_csv, encoding="utf-8") as f:
        reader = csv.DictReader(f)
        for row in reader:
            shaken_raw = row["車検満了日"].strip()
            try:
                shaken_dt = datetime.strptime(shaken_raw, "%Y/%m/%d")
            except ValueError:
                print(f"  ⚠ 日付パース失敗: 顧客ID={row['顧客ID']} 値={shaken_raw}")
                continue

            # 期限内かつ未来の日付のみ対象
            if today <= shaken_dt <= deadline:
                shaken_label = shaken_dt.strftime("%Y年%m月%d日")
                body = EMAIL_TEMPLATE.format(shaken_date=shaken_label).strip()
                results.append({
                    "顧客ID": row["顧客ID"],
                    "車検満了日": shaken_label,
                    "メールアドレス": row.get("メールアドレス", ""),
                    "案内メール文面": body,
                    "確認済み": "",   # 担当者がチェック後に記入
                })

    if not results:
        print("対象顧客がいませんでした。")
        return

    with open(output_csv, "w", encoding="utf-8", newline="") as out:
        fieldnames = ["顧客ID", "車検満了日", "メールアドレス", "案内メール文面", "確認済み"]
        writer = csv.DictWriter(out, fieldnames=fieldnames)
        writer.writeheader()
        writer.writerows(results)

    print(f"✓ {len(results)}件の案内メール候補を出力しました: {output_csv}")
    print("  ※ 担当者が「確認済み」列にチェック後、実際の送信を行ってください。")

if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("Usage: python inspection_notice.py customers.csv output_notices.csv [days=60]")
        sys.exit(1)
    days = int(sys.argv[3]) if len(sys.argv) > 3 else 60
    generate_inspection_notices(sys.argv[1], sys.argv[2], days)

ポイント:スクリプトは「送信候補CSV生成」まで

実際のメール送信には必ず担当者の確認ステップを挟む設計にした。スクリプトが生成するCSVの「確認済み」列にスタッフがチェックを入れた行だけを送信対象にすることで、誤送信を防ぐ。

メール文面の改善もClaude Codeで繰り返し試行できる。「もっと親しみやすいトーンに」「車検費用の目安も加えて」といった指示で即座に文面を修正できるのが強みだ。

実装3:在庫リスト更新をSlackにリアルタイム通知する

課題:展示車情報が現場に伝わらない問題

複数拠点を持つディーラーや、営業・整備が分かれている店舗では「あの車、もう売れたの?」という確認電話が多発する。在庫データが更新されても全員に伝わらないためだ。Claude Codeを使ってCSVやExcelの在庫ファイルの変更を検知し、Slackに自動通知するスクリプトを作った。

Claude Codeへの依頼:

Prompt:
「在庫管理CSV(車両ID, 車名, 状態)を定期的に読み込んで、
前回実行時からの変更(新規追加・ステータス変更・削除)をSlack Webhookに通知する
Pythonスクリプトを作って。

・前回の在庫状態をJSONファイルに保存し、差分だけ通知する
・通知フォーマット:
  🆕 新着: {車名}({車両ID})
  ✅ 売約済: {車名}({車両ID})
  ❌ 削除: {車名}({車両ID})
・Webhook URLは環境変数 SLACK_WEBHOOK_URL から読む
・通知には顧客情報を含めない(車両情報のみ)」
import csv
import json
import os
import sys
from pathlib import Path
import urllib.request
import urllib.error

PREV_STATE_FILE = Path("/tmp/inventory_prev_state.json")


def load_inventory(csv_path: str) -> dict:
    """在庫CSVを {車両ID: {車名, 状態}} の辞書に変換する"""
    inventory = {}
    with open(csv_path, encoding="utf-8") as f:
        for row in csv.DictReader(f):
            inventory[row["車両ID"]] = {
                "車名": row["車名"],
                "状態": row["状態"],
            }
    return inventory


def send_slack(webhook_url: str, message: str) -> None:
    """Slack Webhook にメッセージを送信する"""
    payload = json.dumps({"text": message}).encode("utf-8")
    req = urllib.request.Request(
        webhook_url,
        data=payload,
        headers={"Content-Type": "application/json"},
        method="POST",
    )
    try:
        with urllib.request.urlopen(req, timeout=10) as resp:
            if resp.status != 200:
                print(f"  ⚠ Slack送信失敗: HTTP {resp.status}")
    except urllib.error.URLError as e:
        print(f"  ⚠ Slack送信エラー: {e}")


def check_and_notify(csv_path: str) -> None:
    webhook_url = os.environ.get("SLACK_WEBHOOK_URL", "")
    if not webhook_url:
        print("⚠ 環境変数 SLACK_WEBHOOK_URL が未設定です")
        sys.exit(1)

    current = load_inventory(csv_path)

    if PREV_STATE_FILE.exists():
        prev = json.loads(PREV_STATE_FILE.read_text(encoding="utf-8"))
    else:
        # 初回実行: 前回状態を保存して終了
        PREV_STATE_FILE.write_text(json.dumps(current, ensure_ascii=False), encoding="utf-8")
        print("初回実行: 現在の在庫状態を保存しました。次回から差分通知します。")
        return

    messages = []

    # 新規追加
    for vid, info in current.items():
        if vid not in prev:
            messages.append(f"🆕 新着: {info['車名']}(車両ID: {vid})")

    # ステータス変更・削除
    for vid, info in prev.items():
        if vid not in current:
            messages.append(f"❌ 削除: {info['車名']}(車両ID: {vid})")
        elif current[vid]["状態"] != info["状態"]:
            messages.append(
                f"✅ 状態変更: {current[vid]['車名']}({vid})"
                f" {info['状態']} → {current[vid]['状態']}"
            )

    if messages:
        text = "【在庫更新通知】\n" + "\n".join(messages)
        send_slack(webhook_url, text)
        print(f"✓ Slack通知送信: {len(messages)}件の変更")
    else:
        print("変更なし")

    # 今回の在庫を次回比較用に保存
    PREV_STATE_FILE.write_text(json.dumps(current, ensure_ascii=False), encoding="utf-8")


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python inventory_slack_notify.py inventory.csv")
        sys.exit(1)
    check_and_notify(sys.argv[1])

定期実行の設定(cron)

15分ごとに在庫CSVをチェックして差分通知する設定例:

# crontab -e で設定
*/15 * * * * SLACK_WEBHOOK_URL=https://hooks.slack.com/services/XXX/YYY/ZZZ \
  python3 /opt/dealer_tools/inventory_slack_notify.py /data/inventory.csv >> /var/log/inventory_notify.log 2>&1

Webhook URLは環境変数から読む設計にしているので、ソースコードに直接記述しない。

よくある失敗パターン4選

❌ 失敗1:査定額をスクリプトに計算させようとした
✅ 対策:スクリプトの役割は「書式整形のみ」と明確に定義する。査定額はスクリプト出力後に査定士が入力する運用フローにする。AIが算定した金額をそのまま顧客に提示するのは法的・信頼上のリスクがある。
❌ 失敗2:CSVに氏名・車検証番号を含めてしまった
✅ 対策:スクリプトに渡すCSVは「車両情報のみ」の専用ファイルを作る。顧客管理データベースとは分離し、顧客IDだけで紐付ける設計にする。入力ファイルのチェック関数を最初に実装させ、特定列(氏名・住所など)が含まれていたらエラーで止まるようにする。
❌ 失敗3:点検案内メールをスクリプトから直接送信する実装にした
✅ 対策:スクリプトは「候補CSV生成まで」にする。実際の送信は担当者がCSVを確認してから別途実施する運用にした。誤送信のリスクを考えると、自動送信の実装は慎重に判断すべきだ。
❌ 失敗4:作ったスクリプトの動作を本番データで初めてテストした
✅ 対策:まず架空のサンプルCSV(5〜10行)でスクリプトを動作確認する。Claude Codeに「サンプルデータを生成して」と依頼すれば、本番に似た構造のテストデータをすぐに作ってくれる。

段階的導入ロードマップ(3フェーズ)

Phase 1(1〜2ヶ月):査定書ドラフト自動化から始める

最も効果が大きく、失敗リスクが低い「査定書ドラフト生成」から手をつける。既存のExcelやCSVをそのまま入力に使えるので、DMSの改修が不要。まず1名のスタッフが試して運用フローを固める。

Phase 2(3〜4ヶ月):点検案内メールの半自動化

月1回の定期バッチ処理として点検案内メール候補CSVの生成を自動化する。担当者確認のステップを必ず残し、全件確認→承認のワークフローを確立してから本格運用に移行する。

Phase 3(5〜8ヶ月):在庫通知と連携強化

在庫Slack通知を導入し、複数拠点・複数スタッフへのリアルタイム情報共有を実現する。ここまでできると「電話で確認」の回数が減り始める。さらに発展させるなら、DMSのAPIと連携した自動取り込みも検討できる。

Claude Codeを業務で使いこなすための次のステップ

カーディーラーの事例で紹介したスクリプトはどれも、プログラミング未経験の営業担当でも実装できるレベルを目指して設計している。Claude Codeは自然言語で指示するだけでコードを生成してくれる。

次のステップとして、以下の記事も参照してほしい:

よくある質問(FAQ)

Q. DMS(販売管理システム)がある店舗でも使えますか?
A. はい。DMSからCSVエクスポートできれば、本記事のスクリプトをそのまま使えます。DMSのAPIと直接連携する高度な実装は Phase 3 以降で検討するのが現実的です。
Q. Claude Codeを使うのにプログラミング知識は必要ですか?
A. 基本的な読み書きができれば大丈夫です。生成されたコードを実行する最初のステップ(Pythonのインストール、ターミナルの使い方)だけは覚える必要があります。社内に詳しい担当者が1名でもいると導入がスムーズです。
Q. 査定額をAIに出させることはできますか?
A. 技術的には参考値を出すことは可能ですが、顧客への提示額は査定士が決定する運用にすることを強く推奨します。AIが算定した金額をそのまま使うと、法的責任の所在が曖昧になるリスクがあります。
Q. 顧客データをClaude Codeに渡しても安全ですか?
A. 本記事で紹介した設計では、個人情報をClaude Codeのプロンプトに渡さないことを前提としています。スクリプト生成は車両情報のみを対象にし、顧客氏名・住所・車検証番号は含めない運用にしてください。Anthropicの利用規約と自社の個人情報保護方針を必ず確認してください。
Q. 初期費用はどれくらいかかりますか?
A. Claude Codeは月額2,000円程度(個人プラン)から試せます。本記事で紹介したスクリプトはローカル環境で動作するため、APIコストは最小限です。法人での本格利用はClaudeのビジネスプランを確認してください。

カーディーラーへのClaude Code導入を検討中の方へ

「スクリプトを作ってみたが動かない」「自社のDMSとどう連携すれば良いかわからない」——そんな具体的な壁に対して、実装伴走型の個別指導を提供しています。業界特有の業務フローに合わせたスクリプト設計から、スタッフ向けの使い方レクチャーまで対応可能です。

  • 業界特化の実装スクリプトを共同開発
  • 個人情報保護・セキュリティルールを踏まえた設計レビュー
  • スタッフ向け操作説明会の実施

→ 無料相談はこちら | 個別指導の詳細を見る

出典・参考情報

  1. Anthropic Claude Code 公式ドキュメント — https://docs.anthropic.com/ja/docs/claude-code/overview
  2. 個人情報の保護に関する法律(個人情報保護法)— 個人情報保護委員会 https://www.ppc.go.jp/
  3. Python csv モジュール公式ドキュメント — https://docs.python.org/ja/3/library/csv.html
  4. Slack Incoming Webhooks 公式ドキュメント — https://api.slack.com/messaging/webhooks

佐藤 傑(さとう すぐる)

株式会社Uravation 代表取締役

X(@SuguruKun_ai)フォロワー約10万人。100社以上の企業向けAI研修・導入支援を実施。著書『AIエージェント仕事術』(SBクリエイティブ)。SoftBank IT連載執筆多数。

Next Step

この事例を、自社の業務に置き換える。

対象業務、利用データ、評価基準、社内展開の順番まで整理すると、Claude Code導入の失敗を減らせます。

導入を相談する