Claudeで価格改定の告知文を顧客別に作る — 契約条件の差し込みと金額の突合
顧客リストの契約プラン・席数・更新日・通知期間から、顧客ごとの影響額と告知文をClaudeに作らせる手順です。金額は計算列から差し込み、送る前にスクリプトで文面と突き合わせます。
BtoBの価格改定では、全顧客に同じ文面を送れません。契約プランも席数も更新日も、契約書に書かれた通知期間も顧客ごとに違うからです。顧客リストの列をClaudeに読ませれば、顧客ごとの影響額と告知文を一括で作れます。ただし金額を文面の中でClaudeに計算させると、1社分のずれが送信後まで残ります。この記事では、金額を計算列として先に確定させ、文面には差し込むだけにして、送る前にスクリプトで突合する手順を、5社の例で扱います。
自社が値上げする前の損益の試算は値上げシミュレーションを離脱率つきで組む手順、価格の見せ方の点検は二重価格表示の景品表示法チェックが別の話です。ここで扱うのは、改定を決めた後に顧客へ送る告知の実務です。
顧客リストに持たせる列 — 事実の列と人が決める列
告知文の出来は、リストの列でほぼ決まります。文面に使う値はすべて列にしておき、Claudeには列を読ませます。
| 列 | 例 | 誰が置くか |
|---|---|---|
| customer_id / name | 例C001 / A商事 | 誰が置くか顧客管理から転記 |
| plan / seats | 例スタンダード / 20 | 誰が置くか契約管理から転記 |
| old_unit | 例3000(1席・月額、円) | 誰が置くか契約書の現行単価。標準価格表ではない |
| new_unit | 例3300 | 誰が置くか価格改定の決定内容 |
| renewal | 例2027-01-01 | 誰が置くか契約管理から転記 |
| notice_days | 例60 | 誰が置くか契約書の通知期間を人が読んで入力 |
注意したいのはold_unitです。標準価格表の単価ではなく、その顧客が今払っている単価を入れます。過去の割引や特約で標準と違う顧客は、標準価格表から引くと旧単価を取り違えるからです。
notice_daysも人が契約書から拾う列です。契約書の本文をClaudeに読ませて拾わせる方法もありますが、数え方(暦日か営業日か)と改定条項の有無は契約ごとに違うので、拾った値は担当者が原本と照合してから列に置きます。この記事のスクリプトは暦日で数えています。契約が営業日で数えるなら、そちらに合わせます。
係争中の顧客や、営業が個別に交渉している顧客は、manual 列に印を付けて一括生成から外します。告知文の自動生成で扱うのは、条件が列だけで決まる顧客に限ります。
Claudeにファイルを渡す前に決めること
顧客リストはCSVかXLSXでアップロードできます。XLSXを使う場合は、アカウントでコード実行とファイル作成を有効にしている必要があります。CSVは、この追加条件が付かない形式として挙がっています。1チャットに上げられるのは20ファイル、1ファイル500MBまでで、顧客数百社のリストなら制限にはかかりません。
Team・Enterpriseプランでは、コード実行とファイル作成を組織のオーナーが無効にできます。この手順は計算列と出力ファイルをコード実行で作るので、社内で使えないときはオーナーに有効化を頼む必要があります。ファイル作成は通常のチャットより利用上限を多く消費する点も、件数が多いときの見積もりに入れます。
顧客の情報を渡す範囲も先に決めます。個人向けプラン(Free・Pro・Max)の案内では、機密性の高い個人情報や事業上の機密文書は慎重に扱うよう勧めています。モデル改善への利用設定やシークレットモードの扱いはClaudeに機密情報を入力しても安全かにまとめてあります。告知文の生成に担当者の氏名やメールアドレスは要らないので、リストには入れません。宛先は文面ができた後に、社内の配信ツール側で差し込みます。
手順 — 計算列を先に確定し、文面は差し込みだけにする
告知文を作る4段
- 1
計算列を作らせて、表で見る
customers.csvをアップロードし、金額と発送期限の列を先に作らせます。ここで返ってきた表は、人が目で確認します。
- 2
テンプレートを1つだけ決める
文面は1パターンだけ作らせ、差し込み位置を
{{ }}で示させます。顧客ごとにゼロから書かせると、言い回しが揺れます。 - 3
5社で試してから全件へ
最初に、条件の違う顧客を5社選んで文面を出し、読んでから全件に広げます。
- 4
スクリプトで突合してから送る
文面と計算列を突き合わせるスクリプトを走らせ、通ったものだけを送ります。
手順1の依頼は、次のように書きます。
添付の customers.csv を読み、Pythonで次の列を足して表で見せてください。
- monthly_diff = (new_unit - old_unit) * seats
- annual_diff = monthly_diff * 12
- rate = new_unit / old_unit - 1(小数1桁の%)
- send_by = renewal から notice_days 日前の日付
元の列は変更しないでください。行数と、各列の合計も添えてください。「合計も添えて」と頼むのは、後の突合で使う基準を先に作るためです。5社の例では、計算列は次のようになります。
| 顧客 | 改定率 | 月額差 | 年額差 | 発送期限 |
|---|---|---|---|---|
| A商事 | 改定率10.0% | 月額差6,000円 | 年額差72,000円 | 発送期限2026-11-02 |
| B工業 | 改定率10.0% | 月額差13,500円 | 年額差162,000円 | 発送期限2026-12-01 |
| Cホールディングス | 改定率15.0% | 月額差90,000円 | 年額差1,080,000円 | 発送期限2027-01-01 |
| D設計 | 改定率10.0% | 月額差1,200円 | 年額差14,400円 | 発送期限2027-01-02 |
| Eフーズ | 改定率14.3% | 月額差6,000円 | 年額差72,000円 | 発送期限2026-11-02 |
合計は月額差が116,700円、年額差が1,400,400円です。Claudeが返した合計がこれと違えば、文面を作る前に計算列を疑います。Eフーズの旧単価は2,800円で、他のスタンダード顧客の3,000円とは違います。改定後を3,200円にそろえた結果、改定率が14.3%になっている行です。
手順2のテンプレートは、顧客の列名をそのまま差し込み位置にします。
{{name}} 御中
平素より{{plan}}をご利用いただき、ありがとうございます。
{{renewal}}の契約更新分から、1席あたりの月額を{{old_unit}}円から
{{new_unit}}円に改定いたします。
ご契約{{seats}}席の場合、月額は{{monthly_diff}}円、
年額では{{annual_diff}}円の増加となります。Claudeへの指示で効くのは、「金額は列の値をそのまま3桁区切りで入れ、文中で計算し直さない」と明記することです。差し込み専用の指示にしておけば、文面の側で金額が生まれません。出力はcustomer_idとbodyの2列を持つnotices.csvにさせると、次の突合がしやすくなります。
改定幅や条件が顧客ごとに違うとき、たとえば15%の大口顧客や、割引を引き継ぐ顧客には、追加の一文が要ります。これはテンプレートを分岐させず、「rateが15%以上の顧客には、改定幅に関する説明の一文を足す」のように条件つきの追記として頼み、適用された顧客を一覧で返させます。分岐の漏れは、返ってきた一覧と元のリストを見比べれば分かります。
送る前の突合 — 文面の金額を計算列と照らす
文面ができたら、Claudeの外のスクリプトで検証します。同じClaudeに「合っていますか」と聞くより、別の計算で確かめるほうが、ずれを見つけられます。次は、文面に出る金額が計算列の値と一致するかを見るスクリプトの中核です。
for cid, c in cust.items():
seats, old, new = int(c["seats"]), int(c["old_unit"]), int(c["new_unit"])
monthly = (new - old) * seats
expected = {"旧単価": f"{old:,}円", "新単価": f"{new:,}円",
"月額差": f"{monthly:,}円", "年額差": f"{monthly*12:,}円"}
body = notices[cid]
for label, s in expected.items():
if s not in body:
print(cid, f"{label} {s} が本文にない")
for m in re.findall(r"[\d,]+円", body):
if m not in set(expected.values()):
print(cid, f"表に無い金額 {m}")見ているのは2点です。期待する4つの金額が本文にあること、そして本文に出る金額がその4つ以外にないことです。後者があるので、文面に紛れ込んだ余計な数字も拾えます。
5社分の文面を用意し、Eフーズの旧単価だけ標準価格表の3,000円で書いた状態で走らせると、次の出力になりました(Python 3で実行)。
python3 check_notices.pyC001 A商事 改定率10.0% 発送期限2026-11-02 OK
C002 B工業 改定率10.0% 発送期限2026-12-01 OK
C003 Cホールディングス 改定率15.0% 発送期限2027-01-01 OK
C004 D設計 改定率10.0% 発送期限2027-01-02 OK
C005 旧単価 2,800円 が本文にない
C005 表に無い金額 3,000円注目したいのは、Eフーズの月額差6,000円と年額差72,000円の欄が正しい値のままで、旧単価の記述だけが標準価格の3,000円になっていることです。差額の欄だけを見る検算なら、この文面は通ってしまいます。旧単価・新単価・月額差・年額差の4つを個別に照合し、本文にない金額と余計な金額の両方を拾うのは、このためです。
突合が通ったら、スクリプトは終了コード0で止まります。1件でも落ちた間は、その顧客の文面を送りません。
送る前に人が見る点
スクリプトが保証するのは、文面の金額が列と一致していることだけです。列そのものが正しいか、送ってよい文面かは、人が決めます。
- 発送期限: send_byを過ぎている顧客はいないか。A商事とEフーズの2026-11-02のように、期限が近い顧客から先に処理する
- 契約書の改定条項: 一方的な通知で改定できる契約か、個別の合意が要る契約か。この区別は列に持たせず、契約書を読んだ担当者が
manualに回す - 追加の説明が要る顧客: 改定幅が大きい顧客や、特約のある顧客
- 宛先と署名: 差し込み後の宛先が、契約上の相手方の正式名称と合っているか
文面の語調や、法的な有効性の判断は、Claudeの出力に頼らず、社内の法務・営業責任者が確認する項目です。
落とし穴
旧単価を標準価格表から引かせてしまう
「プランが同じなら旧単価も同じ」と見なしてClaudeに価格表を渡すと、特約価格の顧客の旧単価が標準に置き換わります。old_unitは契約書の単価を転記した列として、リストに持たせてください。文面の中で旧単価を出す顧客ほど、4つの金額の個別照合が効きます。
Projectsに置いておくと次回に使い回せるもの
価格改定は、次の改定でも同じ型の告知を作ります。ClaudeのProjectsにテンプレートと依頼文を置いておくと、次回は顧客リストだけを替えて同じ手順を回せます。Projectのファイルは1ファイル30MBまでで、内容はテキストとして抽出されます。顧客リストそのものは、改定のたびに最新のものを該当チャットにアップロードするほうが、古い契約条件を引きずりません。
督促のように、相手の支払い状況で文面が変わる連絡は売掛金の年齢調べと督促メールの下書き、顧客リストを施策別に切る前段はRFM分析の手順が参考になります。取引先から届いた値上げ通知を照合する逆向きの作業は、取引先の値上げ通知を契約・単価表と照合する手順で扱っています。
まとめ
告知文そのものより、金額の出どころを一つにしておくことが、この作業の核です。計算は列で確定させ、文面は差し込みに限り、送る前に別の計算で突き合わせます。Claudeに任せるのは、計算列の作成、テンプレートへの差し込み、条件つきの追記です。契約書の読み取り、改定の可否、文面の最終判断は人に残ります。まず5社分で試し、突合が通る形を作ってから、全件に広げてください。