売上請求書を発行する前に、契約・注文と突き合わせて請求漏れと金額違いを見つける
請求データと契約・注文データを突き合わせ、請求漏れ、単価違い、請求先違いを発行前に洗い出します。経理の作業は、画面を見比べて全件を確かめることから、指摘が付いた件だけを確認することに変わります。
- 利用ツール
- ChatGPT/Claude/Gemini/Google Apps Script/Make/Power Automate/Python
- 対象業界
- IT・SaaS/人材/商社/広告
- 対象部門
- 営業/経理
- 対象業務
- 内容確認・チェック/集計・分析
- 主な課題
- 属人化している/期限・対応漏れが起きる/確認ミスが多い
- AIで行う処理
- 判定
- 主な効果
- 品質標準化/工数削減/機会損失防止
- 導入難易度
- ★★☆☆☆
- 実装レベル
- 半自動化
- 費用感
- API連携(中)
- 人間の確認
- 必須
01導入前 / 導入後の業務フロー
- 毎月20日ごろ、営業から「今月の請求内容」の連絡が来る(メール、チャット、スプレッドシートの更新)
- 経理が販売管理システムに請求データを作る、または前月のデータを複製する
- 契約書または契約管理シートを開き、単価と契約期間を目で確認する
- 従量課金の分は、利用実績のレポートを開いて数量を確認する
- 請求先の宛名、部署、送付方法(メール/郵送/取引先ポータル)を確認する
- 適格請求書の記載事項がそろっているかを確認する
- 上長が承認する
- 請求書を発行して送付する
- 毎月18日の朝、処理が自動で走る
- 自動販売管理システムから今月の請求予定データを取り出す
- 自動契約管理シート、CRMの契約情報、利用実績レポートを取り出す
- 自動請求予定と契約情報を突き合わせ、金額・数量・期間・請求先の差異を計算する
- 自動差異のある件と、契約があるのに請求予定が無い件を一覧にする
- 自動適格請求書の記載事項が欠けている件を指摘する
- 人経理が指摘一覧を上から確認し、直すか、そのまま進めるかを決める
- 人営業に確認が必要な件だけ、生成された確認文を送る
- 人販売管理システムで修正し、発行する
各工程の詳しい説明を読む
- 毎月20日ごろ、営業から「今月の請求内容」の連絡が来る(メール、チャット、スプレッドシートの更新)
- 経理が販売管理システムに請求データを作る、または前月のデータを複製する
- 契約書または契約管理シートを開き、単価と契約期間を目で確認する
- 従量課金の分は、利用実績のレポートを開いて数量を確認する
- 請求先の宛名、部署、送付方法(メール/郵送/取引先ポータル)を確認する
- 適格請求書の記載事項がそろっているかを確認する
- 上長が承認する
- 請求書を発行して送付する
問題は4つあります。
(a)前月の複製が事故のもとになる。 月額課金は前月と同じであることがほとんどなので、複製して発行する運用になります。ところが、途中で契約が終了した、プランが変わった、台数が増えたという変更は、営業からの連絡が漏れると反映されません。複製は「変わっていないこと」を確認しないまま通ってしまいます。
(b)請求漏れが検出されない。 過大請求は取引先から連絡が来るので必ず発覚します。しかし請求漏れは、こちらが気づかない限り誰も指摘しません。契約が始まったのに初回請求が立っていない案件は、数か月後の売上照合で見つかることがあります。
(c)確認の深さが担当者によって違う。 ベテランは「この取引先は毎年4月に単価が変わる」と覚えていますが、引き継いだ担当者は分かりません。契約書のどこを見るべきかも人によって違います。
(d)月末の3営業日に集中する。 600件のうち大半をこの期間に発行します。1件4分でも、2名で40時間分の作業が3日に寄ります。
- 毎月18日の朝、処理が自動で走る
- 【自動】 販売管理システムから今月の請求予定データを取り出す
- 【自動】 契約管理シート、CRMの契約情報、利用実績レポートを取り出す
- 【自動】 請求予定と契約情報を突き合わせ、金額・数量・期間・請求先の差異を計算する
- 【自動】 差異のある件と、契約があるのに請求予定が無い件を一覧にする
- 【自動】 適格請求書の記載事項が欠けている件を指摘する
- 【人】 経理が指摘一覧を上から確認し、直すか、そのまま進めるかを決める
- 【人】 営業に確認が必要な件だけ、生成された確認文を送る
- 【人】 販売管理システムで修正し、発行する
自動化されるのは「集める」「突き合わせる」「差を数える」の3つです。発行そのものは自動化しません。 残るのは「この差異は正しいのか」を決める判断です。
指摘の件数は、600件のうち20〜40件程度を想定しています。全件を見比べるのではなく、この数十件だけを見るようになるため、1件あたりの平均時間が下がります。
02今回想定するシステム構成
毎月18日 朝8時(時間主導型トリガー) │ ▼ Google Apps Script │ ├──▶ 販売管理システム ── 今月の請求予定データ(CSV / API) ├──▶ 契約管理スプレッドシート ── 契約単価・期間・請求先 ├──▶ CRM ── 契約ステータス(継続 / 解約 / プラン変更) └──▶ 利用実績レポート ── 従量課金の数量 │ ▼【差異計算】件数・金額の単純な突合はスクリプトで行う │ ▼【判定】Claude API(構造化出力) │ ─ 差異の原因の候補を付ける │ ─ 契約があるのに請求予定が無い件を指摘する │ ─ 適格請求書の記載事項の欠けを指摘する │ ▼ 指摘一覧シート(差異の大きい順)──【人が確認】 │ ├──▶ 営業への確認文(下書き) │ ▼ 販売管理システムで修正 → 発行【人が実行】
| 役割 | 想定する製品 | 代替候補 |
|---|---|---|
| 実行環境 | Google Apps Script | Power Automate、Make、Python |
| 差異計算 | Google Apps Script | Python、Power Query |
| 生成AI | Claude API(構造化出力) | OpenAI API、Gemini API |
| データ保管 | Google スプレッドシート | Excel Online、SharePoint |
| 販売管理 | 既存の販売管理システム | 各社の請求管理SaaS |
請求管理SaaSを先に検討してください。 契約情報と請求データを同じ画面で持ち、継続課金の自動生成まで行う製品があります。契約と請求のずれは、そもそも両者を別々に管理しているから起きます。自前で組む価値があるのは、販売管理システムを変えられない場合、または契約情報がCRMとスプレッドシートに分かれていて統合できない場合です。
差異の計算そのものをAIにさせない設計にしています。 「契約単価12,000円、請求単価13,000円、差額1,000円」の計算は、スクリプトで確実に出せます。AIに任せると桁を間違える可能性があり、確実な処理をわざわざ不確実にすることになります。AIには、計算結果を見て原因の候補を付けることと、数字では表せない欠け(記載事項の不足、請求先の宛名の違い)を見つけることをさせます。
03どうやって実装するのか
処理の起点を決める
毎月18日の朝8時を起点にします。月末の発行作業に入る前に、確認と修正の時間を確保するためです。
Google Apps Script には、スクリプトを時刻で起動する「時間主導型トリガー」があります。1分おきから月1回まで指定できます。公式ドキュメントには「実行時刻は多少ばらつく。午前9時の定期トリガーを作ると、午前9時から10時の間で実行時刻が選ばれる」と明記されています。分単位で正確に動かす必要がある処理には向きません。 今回は朝の時間帯に走ればよいので問題ありません。
月1回だけにせず、月半ばと月末前の2回走らせる構成を勧めます。1回目で見つかった差異を営業に確認し、2回目で直っているかを見ます。
入力データを集める
| データ | 中身 | 取得元 |
|---|---|---|
| 請求予定データ | 請求先、品目、単価、数量、請求期間、金額 | 販売管理システム |
| 契約情報 | 取引先、契約品目、契約単価、契約開始日、終了日、支払条件 | 契約管理シート |
| 契約ステータス | 継続/解約予定/プラン変更 | CRM |
| 利用実績 | 従量課金の対象数量(前月分) | 利用実績レポート |
| 前月の請求実績 | 前月に発行した請求書の内容 | 販売管理システム |
| 取引先マスタ | 正式名称、請求先部署、送付方法、登録番号 | 販売管理システム |
データの取得方法を決める
販売管理システム: APIがあればそれを使います。無い場合は、CSVエクスポートを所定のフォルダに置く運用にして、スクリプトがそれを読みます。リアルタイム連携は不要です。 月2回しか走らない処理なので、前日の夜にエクスポートしておけば足ります。
契約管理シート: Google スプレッドシートであれば SpreadsheetApp でそのまま読めます。Excelの場合は、Google ドライブに置いて変換するか、Power Automate 側で読みます。
CRM: 契約ステータスだけが必要です。案件全体を取る必要はありません。「解約予定」「プラン変更予定」のフラグが立っている取引先の一覧が取れれば十分です。
利用実績: 従量課金の数量です。ここは自社サービスの管理画面から取ります。この値は請求金額に直結するため、集計の定義(締め日、カウント単位)を先に文書化してください。 定義が曖昧なままだと、差異が出たときにどちらが正しいか誰にも分かりません。
AIへ渡す前に整形する
- 取引先名の名寄せ … 販売管理システムと契約シートとCRMで、同じ取引先の表記が違うことがあります。取引先コードで突き合わせられるなら、それを使います。コードが無いシートには、先にコード列を足してください。名寄せをAIに任せないほうが安全です
- 対象期間の絞り込み … 今月の請求対象だけに絞ります。契約終了日が前月末の契約は、今月の請求対象から外れているのが正しい状態です
- 金額の型をそろえる … CSVから読むと「1,200,000」のような文字列になります。カンマを外して数値に変換します
- 差異の計算 … ここまでをスクリプトで済ませます。契約単価と請求単価の差、契約数量と請求数量の差、契約期間と請求期間のずれを、それぞれ数値として出します
- 突合できなかった行の分離 … 契約はあるが請求予定が無い、請求予定はあるが契約が無い、の2種類に分けます。この2つが一番重要な指摘です
AIに処理させる
スクリプトが出した差異の一覧を渡し、次を行わせます。
| 処理 | 内容 |
|---|---|
| 原因の候補付け | 差異ごとに「解約済み」「プラン変更の反映漏れ」「日割り計算」「契約更新時の単価改定」などの候補を付ける |
| 重要度の判定 | 金額の大小ではなく、請求漏れか過大請求かで重要度を分ける |
| 請求漏れの指摘 | 契約が有効なのに請求予定が無い件を、理由の候補とともに挙げる |
| 記載事項の確認 | 適格請求書の記載事項が欠けている件を指摘する |
| 確認文の下書き | 営業に確認が必要な件について、何を確認すべきかを書いた短文を作る |
適格請求書の記載事項は、国税庁が6項目を示しています。 書類作成者の氏名または名称および登録番号、取引年月日、取引内容(軽減税率の対象品目である旨)、税率ごとに区分して合計した対価の額および適用税率、税率ごとに区分した消費税額等、書類の交付を受ける事業者の氏名または名称です。多くの販売管理システムはこれを満たす形で出力しますが、手で作った請求書や、備考欄で調整した請求書では欠けることがあります。 ここをチェック項目として持たせます。
指示内容を固定する
あなたは経理の売掛金担当を支援する担当者です。
今月の請求予定と契約情報の突合結果を渡します。
各差異について、原因の候補と重要度を付けてください。
【厳守事項】
- 金額、数量、単価を計算し直さないでください。
渡された差異の値をそのまま引き継いでください。
- 原因は候補として挙げるだけです。断定しないでください。
根拠が契約情報にない推測は cause に書かず、
needs_confirmation に「営業に確認すべきこと」として書いてください。
- 請求漏れ(契約が有効で請求予定が無い)は、金額の大小にかかわらず
severity を high にしてください。
- 契約終了日が請求期間の途中にある場合、日割りが必要かどうかは
判断せず、needs_confirmation に入れてください。
日割りの要否は契約書の条項によります。
- 適格請求書の記載事項(登録番号、取引年月日、取引内容、
税率ごとの対価の額と適用税率、税率ごとの消費税額、交付先の名称)
のうち欠けているものを missing_invoice_fields に列挙してください。
【突合結果】
{diff_rows}
【契約情報】
{contract_rows}
【契約ステータス(CRM)】
{crm_status}
「金額を計算し直さない」の1行が重要です。 差異の計算はスクリプトが済ませています。AIに再計算させると、渡した値と違う数字を返すことがあり、どちらが正しいか経理が判断できなくなります。
出力形式を固定する
{
"findings": [
{
"invoice_draft_id": "",
"customer_code": "",
"customer_name": "",
"finding_type": "amount_mismatch | quantity_mismatch | period_mismatch | missing_invoice | no_contract | field_missing",
"severity": "high | medium | low",
"contract_value": "",
"billing_value": "",
"difference": "",
"cause": "",
"needs_confirmation": "",
"missing_invoice_fields": [],
"confirmation_message_draft": ""
}
],
"summary": {
"checked_count": 0,
"finding_count": 0,
"high_count": 0
}
}
difference は、スクリプトが計算した値をそのまま入れさせます。cause と needs_confirmation を分けているのは、AIが分かることと分からないことを、出力の構造で分けるためです。混ぜて自由文で返させると、推測が事実のように読めてしまいます。
システムへ連携する
指摘一覧はスプレッドシートに書き出します。列は、重要度、取引先、指摘の種類、契約側の値、請求側の値、差額、原因の候補、確認事項、経理の判断(プルダウン)です。
経理の判断を書く列を必ず作ってください。 「修正した」「このままでよい」「営業に確認中」のいずれかを記録します。この列が次の月の入力になります。前月に「このままでよい」と判断した取引先の同じ差異は、翌月は重要度を下げて表示します。そうしないと、日割り契約のように毎月必ず差異が出る取引先の指摘が、毎月上位に居座ります。
修正は販売管理システムの画面で人が行います。スクリプトから販売管理システムへ書き戻す構成にはしません。 請求データを自動で書き換える仕組みは、誤りが起きたときに誰も気づけません。
人が確認する
指摘された件は全件、人が確認します。指摘されなかった件は確認しません。
ここが、この構成で工数が減る理由です。600件すべてを目で見比べる運用から、指摘された20〜40件を見る運用に変わります。そのため、指摘の漏れがそのまま事故になります。
漏れを防ぐ設計を2つ入れます。
- 契約側を起点にする。 請求予定データを1行ずつ見るのではなく、有効な契約をすべて列挙してから、対応する請求予定があるかを見ます。請求予定を起点にすると、そもそも作られていない請求書は最後まで現れません
- 突合できなかった行を必ず出す。 取引先コードが一致しない、契約品目が対応しないといった行は、判定不能として一覧の先頭に出します。ここを空振りとして捨てると、静かに漏れます
営業への確認は人が送ります。生成された確認文はそのまま送れる長さ(3〜4行)にしますが、送信前に必ず読みます。
例外に対処する
| 起きること | 対応 |
|---|---|
| 取引先コードが一致しない | 判定不能として一覧の先頭に出す。名寄せを自動でしない |
| 契約があるのに請求予定が無い | missing_invoice として severity high で出す。この検出がこの構成の主目的 |
| 請求予定があるのに契約が無い | no_contract として出す。スポット受注なら正常なので、受注データも参照して除外する |
| 契約終了日が請求期間の途中にある | 日割りの要否を判断させず、確認事項として人へ回す |
| 従量課金の実績が取れない | 該当件の判定を保留にする。前月の数量で代用しない |
| 同じ差異が毎月出る | 前月の「このままでよい」判断を読み、重要度を下げる |
| 販売管理システムのCSVが前日に出ていない | 処理を止め、担当へ通知する。古いCSVで走らせない |
| 適格請求書の記載事項が欠けている | field_missing として出す。欠けたまま発行させない |
| 取引先ごとに締め日が違う | 締め日を取引先マスタに持たせ、対象期間の判定に使う |
記録を残す
- 実行日時と、対象にした請求予定データのスナップショット
- 突合結果(差異の全件。指摘に上がらなかったものも含む)
- AIが付けた原因の候補と重要度
- 経理の判断(修正した/このままでよい/確認中)
- 実際に発行された請求書の内容
最後の2つを突き合わせると、検出の精度が測れます。 「指摘した40件のうち、実際に修正されたのは12件」であれば、28件は無駄な指摘だったことになります。逆に、指摘しなかった件で後から誤りが見つかった場合は、検出条件そのものに漏れがあります。 こちらのほうが重大なので、売上照合で見つかった請求漏れを必ずこのログに戻してください。
04実装レベルの3段階
半自動化の時点で効果の大半が出ます。 「集めて突き合わせる」が自動になるだけで、1件4分の照合が消えるためです。本格構成との差は、データ収集の手間(月2回、CSVを置く作業)と、確認文を送る手間だけです。 本格構成でも請求書の発行は自動化しません。 発行を自動化すると、この構成が防ごうとしている誤りが、そのまま取引先に届きます。
05工数削減シミュレーション
導入後 600件 × 1.2分 ÷ 60 = 12 時間/月
自社条件で導入効果を整理したい方へ
このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。
06向いている企業・向いていない企業
- 月300件以上の請求書を発行していて、契約や注文の情報が販売管理システム・スプレッドシート・CRMのいずれかにデータとして存在すること。継続課金や準委任契約が多く、毎月ほぼ同じ内容を請求していること。請求金額が営業担当の申告に依存していること。
- 請求が月50件未満で、担当者が全件を記憶できている場合。販売管理システムが契約情報と請求データを同一画面で自動照合している場合。契約情報が紙のみで、データとして取り出せない場合(先にデータ化が必要)。
07最小構成で試す方法
- 前月に発行した請求書のデータ(600件)をCSVで出す
- 同じ時点の契約情報をスプレッドシートにそろえる
- 表計算ソフトの関数(
VLOOKUPなど)で、取引先コードをキーに単価と数量を突き合わせる - 差異が出た行と、契約側にしかない行を数える
- その行を経理担当に見せ、「これは誤りだったか」を1件ずつ聞く
AIを使わずにここまで進めてください。 この4段階で分かることが2つあります。
ひとつは、突き合わせがそもそも成立するかです。取引先コードで7割しか一致しないなら、AI以前にデータ整備の問題です。もうひとつは、差異の件数です。600件中200件で差異が出るなら、指摘一覧を見る時間のほうが長くなり、効果が出ません。
判断の目安は次のとおりです。
| 差異の件数 | 判断 |
|---|---|
| 600件中10〜50件 | ちょうどよい。指摘を見る運用が成立する |
| 600件中50〜150件 | 差異が出る理由を分類し、正常なパターン(日割り、値引き)を除外する条件を先に作る |
| 150件以上 | 突合のキーか、契約情報の鮮度に問題がある。AIを足しても解決しない |
差異が10件未満なら、そもそも困っていない可能性があります。過去1年で請求漏れが何件あったかを先に確認してください。
原因の候補付けは、差異の一覧をそのままClaudeやChatGPTに貼り付けて試せます。開発は不要です。
08実装時につまずきやすいポイント
| 問題 | 対策 |
|---|---|
| 取引先コードが3つのシステムで違う | 対応表を1枚作る。名寄せをAIに任せない。対応表に無い取引先は判定不能として出す |
| 契約シートが最新でない | シートの更新日を取得し、1か月以上更新が無ければ警告を出す。古い契約情報での突合は誤検出のもと |
| 日割り契約で毎月差異が出る | 契約情報に「日割りあり」の列を足し、差異の許容範囲を持たせる |
| 値引きが請求データにしか無い | 値引きの根拠(稟議番号など)を請求データに持たせる。無いものは指摘に上げる |
| 指摘が多すぎて誰も見ない | 前月の判断を読み込み、同じ差異の重要度を下げる。初回は正常パターンの除外条件を作ってから運用に入る |
| AIが差額を計算し直して違う値を返す | プロンプトで再計算を禁止し、出力スキーマで差額を文字列として引き継がせる |
| CSVの金額がカンマ入りの文字列 | 読み込み時に数値へ変換する。変換に失敗した行は判定不能として出す |
| Apps Script の実行時間の上限に当たる | 取引先を分割して複数回に分ける。1回の実行で全件を処理しない |
| 締め日が取引先ごとに違う | 取引先マスタに締め日を持たせ、対象期間の判定に使う |
09セキュリティ・AIガバナンス上の注意点
この構成で扱うデータ: 取引先の社名、契約単価、契約期間、請求金額。自社の価格政策と、取引先ごとの値引き状況が含まれます。
- 外部AIへの入力可否 … 契約単価は取引先との秘密保持の対象になることがあります。主要取引先との契約に秘密保持条項があるかを確認してください。渡すデータを差異のある行だけに絞れば、入力量そのものを減らせます
- 社名の扱い … 原因の候補付けに社名は必須ではありません。取引先コードだけを渡し、社名は手元のシートで突き合わせる構成にすれば、外部に出る情報が減ります。ただし、社名を渡さないと「同一グループ内の別法人への請求先違い」は検出できません。 どちらを取るかは扱う情報の機微さで決めてください
- 学習利用 … 入力を学習に使わないことが契約で保証されるサービスを選びます
- アクセス権限 … 指摘一覧シートには全取引先の契約単価が並びます。経理と、権限を持つ営業管理者に限定してください。営業担当が全社の単価を見られる状態にしない
- 自動実行してよい範囲 … 収集と突合と指摘までです。請求データの修正と請求書の発行は、運用が安定しても自動化しません
誤りが起きた場合のリスクは、請求漏れによる売上の消失と、過大請求による取引先との関係悪化です。指摘の履歴と経理の判断を残し、後から追跡できる状態にしてください。
10まず何から始めるか
1週目:突合が成立するかを確かめる
前月の請求データと契約情報をスプレッドシートに並べ、取引先コードで突き合わせます。何%が一致するかを数えてください。 9割を超えないなら、この構成に進む前にコードの整備が必要です。
2週目:差異の件数と中身を見る
一致した行について、単価と数量の差異を出します。件数を数え、経理担当に「これは誤りか、正常か」を聞きます。正常な差異のパターン(日割り、値引き、契約更新月)を洗い出すのがこの週の目的です。 ここを先に潰さないと、運用に入ってから指摘が溢れます。
3〜4週目:契約側からの検出を試す
有効な契約をすべて列挙し、対応する請求予定が無い件を出します。過去12か月分で試してください。 実際に請求漏れだった件が見つかれば、それがこの構成を入れる根拠になります。1件も出なければ、現行の運用で足りている可能性があります。
2か月目以降: 差異の件数が運用に耐える水準なら、Apps Script でデータ収集と突合を自動化します。原因の候補付けにAIを入れるのは、そのあとで十分です。AIから始めないでください。 この構成の価値の大半は、突き合わせを機械的に毎月行うことにあります。
11関連ユースケース
12この仕組みを理解するための記事
13技術仕様の確認日・参考情報
| 確認した内容 | 情報源 | 確認日 |
|---|---|---|
Claude API の構造化出力が、JSON Schema で指定した形式に沿った応答を保証すること。output_config.format に json_schema を指定する。オブジェクトでは additionalProperties を false にする必要がある | Claude Docs: Structured outputs | 2026-09-15 |
| Google Apps Script に時間主導型トリガーがあり、1分おきから月1回までの間隔で関数を実行できること。実行時刻は多少ばらつく(午前9時の定期トリガーは午前9時から10時の間で実行される) | Google Apps Script: Installable triggers | 2026-09-15 |
| 適格請求書の記載事項が6項目であること(作成者の氏名または名称および登録番号/取引年月日/取引内容/税率ごとに区分して合計した対価の額および適用税率/税率ごとに区分した消費税額等/交付を受ける事業者の氏名または名称) | 国税庁 No.6625 適格請求書等の記載事項 | 2026-09-15 |
販売管理システムからのデータ取り出し方式(API/CSVエクスポート)は製品によって異なります。この部分は利用環境に応じた個別確認が必要です。 適格請求書の要件を自社の請求書が満たしているかは、顧問税理士に確認してください。
実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。
自社の業務に使えるAI活用候補を整理します
このユースケース(UC-0066)についてのご相談はこちらから。
