Media > AI活用ユースケース > マーケティング > 海外の広告媒体から毎月届く英文の請求書を読み取り、出稿の申込(IO)と配信実績に照らして、広告主へ請求する前に金額・期間・キャンペーン名の食い違いを洗い出す

海外の広告媒体から毎月届く英文の請求書を読み取り、出稿の申込(IO)と配信実績に照らして、広告主へ請求する前に金額・期間・キャンペーン名の食い違いを洗い出す

実装ステータス:構成例 技術的に実現可能な構成として設計したもの。自社未検証

海外の広告媒体から毎月届く英文の請求書を読み取り、明細の行を出稿の申込(インサーションオーダー、以下IO)のキャンペーンに対応付けます。IOの金額・期間と配信実績に照らし、広告主へ請求する前に食い違いを洗い出します。

サマリー
生成AI
ChatGPT/Claude/Gemini
AIサービス
AWS Textract/Azure AI/Google Document AI
連携・自動化
Python
対象業界
EC/IT・SaaS/広告
対象部門
マーケティング/経理
対象業務
内容確認・チェック/比較検討
主な課題
入力作業が多い/属人化している/確認ミスが多い
AIで行う処理
読み取り(OCR)
主な効果
入力漏れ削減/工数削減/機会損失防止
導入難易度
★★★☆☆
実装レベル
半自動化
費用感
API連携(中)
人間の確認
条件付き
現在工数
100h/月
AI導入後
30h/月
想定削減
70%
年間削減
840h
モデル条件による試算値です。実在企業の実績ではありません。

01導入前 / 導入後の業務フロー

導入前(Before)
  1. 媒体からメールで届いた請求書のPDFを、媒体ごとのフォルダに保存する
  2. 担当者が請求書を開き、請求番号・期間・合計・明細の行を表に写す
  3. 明細の行ごとに、案件管理の表から該当するIOを探す
  4. 媒体の管理画面から配信実績を出力し、キャンペーンごとの費用と比べる
  5. IOの上限の金額と期間、通貨を確かめる
  6. 食い違いがあればメディア部に確かめ、必要なら媒体へ照会する
  7. 確かめ終えたものを、広告主への請求の明細に反映する
導入後(After)
  1. 【人/自動】 媒体からの請求書のPDFを受付フォルダへ入れる(請求書の受け取り用のメールアドレスから自動で保存してもよい)
  2. 自動保存をきっかけに、形式・ページ数・パスワードの有無を確かめる
  3. 自動OCRが請求書の標準の項目(請求番号・日付・支払期日・合計・税・PO番号)と明細の行、通貨、信頼度を返す
  4. 自動生成AIが、明細の行を「媒体費」「手数料」「クレジット・調整」「税」「その他」に分け、IOのキャンペーンの候補に対応付ける
  5. 自動配信実績のファイル(管理画面からの出力)を読み、キャンペーンごとの費用を引く
  6. 自動IOの上限・期間・通貨、配信実績との差を、決めた許容の範囲で照らす
  7. 自動行ごとに `match` / `amount_diff` / `period_diff` / `over_io` / `credit` / `unmatched` / `needs_human` を付ける
  8. 人経理の担当者が `match` 以外を開き、メディア部と確かめて、媒体へ照会するか、許容するかを決める
  9. 人確かめ終えた請求書の金額を、広告主への請求の明細に反映する
各工程の詳しい説明を読む
  1. 媒体からメールで届いた請求書のPDFを、媒体ごとのフォルダに保存する
  2. 担当者が請求書を開き、請求番号・期間・合計・明細の行を表に写す
  3. 明細の行ごとに、案件管理の表から該当するIOを探す
  4. 媒体の管理画面から配信実績を出力し、キャンペーンごとの費用と比べる
  5. IOの上限の金額と期間、通貨を確かめる
  6. 食い違いがあればメディア部に確かめ、必要なら媒体へ照会する
  7. 確かめ終えたものを、広告主への請求の明細に反映する

(a)名前が合わない。 3番で、請求書のキャンペーン名から案件管理の表を探すのに時間がかかります。媒体の側の名前は、運用の担当者が管理画面で付けた名前で、IOの名前とは無関係です。 担当者の記憶に頼る部分が大きく、担当者が休むと照合が止まります。

(b)管理画面の費用と請求書の金額が合わない。 4番で比べると、多くの媒体で少しずつ違います。媒体の説明では、不正なクリックのクレジット、配信の超過のクレジットなどの調整が反映されるのに時間がかかり、管理画面と請求書で違う値が出るとされています。どこまでを許容の差とするかが決まっていません。

(c)クレジットが元の月につながらない。 後の月の請求書にクレジットの行が載っても、元のどの請求の、どのキャンペーンの分かを追わないまま、当月の支払から差し引いて終わることがあります。広告主への請求は元の月の金額のままです。

(d)IOの上限を超えた請求に気づかない。 配信の超過で上限を少し超えた金額が請求されても、明細の数が多い請求書では見落とします。 広告主へは上限で請求しているので、差額は自社の持ち出しになります。

  1. 【人/自動】 媒体からの請求書のPDFを受付フォルダへ入れる(請求書の受け取り用のメールアドレスから自動で保存してもよい)
  2. 【自動】 保存をきっかけに、形式・ページ数・パスワードの有無を確かめる
  3. 【自動】 OCRが請求書の標準の項目(請求番号・日付・支払期日・合計・税・PO番号)と明細の行、通貨、信頼度を返す
  4. 【自動】 生成AIが、明細の行を「媒体費」「手数料」「クレジット・調整」「税」「その他」に分け、IOのキャンペーンの候補に対応付ける
  5. 【自動】 配信実績のファイル(管理画面からの出力)を読み、キャンペーンごとの費用を引く
  6. 【自動】 IOの上限・期間・通貨、配信実績との差を、決めた許容の範囲で照らす
  7. 【自動】 行ごとに match / amount_diff / period_diff / over_io / credit / unmatched / needs_human を付ける
  8. 【人】 経理の担当者が match 以外を開き、メディア部と確かめて、媒体へ照会するか、許容するかを決める
  9. 【人】 確かめ終えた請求書の金額を、広告主への請求の明細に反映する

4番目でAIに任せるのは「候補」までです。 対応付けの確からしさを evidence とともに出させ、最終的な対応はメディア部の担当者が一度確かめたものを辞書に残します。 翌月から同じ名前の行は、辞書で機械的に引けます。

7番目で「媒体へ照会するか」は決めません。 出すのは食い違いの種類と金額の差です。少額の差を照会するかどうかは、媒体との関係と広告主との契約で決まります。

02今回想定するシステム構成

構成図
媒体からの英文の請求書(PDF)       配信実績(管理画面からの出力)
   ▼【トリガー】受付フォルダ(Amazon S3)への保存      │
AWS Lambda ── 形式・ページ数・サイズ・パスワードの確認     │
   ▼                                                       │
AWS Textract(StartExpenseAnalysis:請求書・領収書の分析)   │
   │   標準の項目、明細の行、通貨、信頼度                    │
   ▼                                                       │
Claude API ── 明細の行を分け、IOのキャンペーンに対応付ける  │
   │   ① 媒体費 ② 手数料 ③ クレジット・調整 ④ 税          │
   ▼                                                       ▼
Python ── IOの上限・期間・通貨、配信実績との差を照らす ◀──┘
   ▼
判定(match / amount_diff / period_diff / over_io / credit / unmatched / needs_human)
   ▼
【経理とメディア部が match 以外を確認】
   ├──▶ 媒体への照会(英文の下書き)
   └──▶ 広告主への請求の明細へ
役割想定する製品代替候補
OCRAWS Textract(AnalyzeExpense/StartExpenseAnalysis)Azure AI Document Intelligence、Google Document AI
生成AIClaude API(明細の行の区分とIOへの対応付け、照会文の下書き)OpenAI API、Gemini API
差異計算Python(IOの上限・期間・通貨と配信実績との照合)案件管理の仕組みの照合の機能
連携AWS Lambda(保存と完了の通知を起点に処理を動かす)Amazon EventBridge
保管Amazon S3(請求書、読み取り結果、照合の結果)社内のファイルサーバー

案件管理の表と会計システムは、新しく足すものではありません。 最初の準備は、案件管理の表に「媒体の側のキャンペーンの名前とID」の列を足すことと、媒体ごとの許容の差(管理画面と請求の差を何%まで認めるか)を決めることです。

OCRに AWS Textract を選ぶのは、請求書が英文だからです。 対応言語は英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語で、日本語の請求書は読めません。 欧州の出版社がフランス語やドイツ語の請求書を出す場合も読めますが、照合の手がかりはキャンペーンの名前とIDなので、言語は大きな問題になりません。

使う機能は、請求書と領収書の分析(AnalyzeExpense と、その非同期版の StartExpenseAnalysis)です。 テンプレートなしで請求番号・日付・品目の金額・合計を取り出し、違う言い方を標準の項目名にそろえて返します。 「Invoice No.」「Bill Number」は INVOICE_RECEIPT_ID に、IOの番号を「PO Number」として書く媒体なら PO_NUMBER に入ります。 標準に当たらない項目は OTHER になります。

明細の多い請求書は複数ページになるので、非同期の処理で読みます。 同期の処理はPDFで1ページ・10MBまで、非同期はPDFで500MB・3,000ページまでです。

管理画面の費用と請求書の金額が違うのは、媒体の側でも説明されています。 ある配信プラットフォームのヘルプでは、不正なクリックのクレジット、配信の超過のクレジット、その他の調整が違いの理由として挙げられ、調整は反映に時間がかかるとされています。照合の許容の差は、この前提で決めます。

03どうやって実装するのか

Step1

処理の起点を決める

受付フォルダ(Amazon S3)にPDFが保存されたことを起点にします。 請求書は月の初めの数日に集中して届くため、届いた順に処理します。月の初めの10日間に照合を終えたいので、まとめて夜に流すより、届いたものから食い違いを出したほうが照会の時間を確保できます。

請求書の受け取り用のメールアドレスを媒体ごとに案内しておき、添付を自動で受付フォルダへ保存する形にすると、担当者の保存の手間もなくなります。

配信実績のファイルは、媒体ごとに月の締めの後で出力して別のフォルダに置きます。 請求書と実績のどちらかが先に届いても、照合は両方がそろった時点で動かします。処理が終わった請求書は処理済みの場所へ移し、移すのは照合の一覧への書き出しまで成功したときだけにします。

Step2

入力データを集める

データ中身取得元
請求書PDF。送り元の媒体、受け取った日時受付フォルダ
読み取り結果標準の項目、明細の行、書かれていた項目名、値と信頼度、通貨AWS Textract
IOIOの番号、媒体、広告主、キャンペーン、期間、課金の方式、単価、上限の金額、通貨案件管理の表
名前の辞書媒体の側のキャンペーンの名前・ID と、IOのキャンペーンの対応案件管理の表に足す列
配信実績キャンペーンごとの表示回数・クリック数・費用(媒体の管理画面からの出力)媒体の管理画面
媒体の一覧既定の通貨、請求の締め、許容の差、IOの番号を書く欄、登録済みの振込先自社で用意する一覧
過去の請求媒体ごとの請求番号と、行ごとの金額照合の結果の保存

質を決めるのは、名前の辞書と過去の請求です。 辞書が育つほどAIの対応付けに頼る行が減り、過去の請求が無いとクレジットを元の請求につなげません。

Step3

データの取得方法を決める

読み取りは、Lambda から StartExpenseAnalysis を呼んで始めます。 文書はS3の場所で指定し、完了の通知先にSNSのトピックを渡します。ClientRequestToken に受付のファイルごとの値を入れ、同じ請求書の処理が二重に始まらないようにします。 JobId は7日間しか有効でないので、完了を受けたらすぐに GetExpenseAnalysis で結果を取り、自社のバケットへ書き出します。

取るものどこから何に使うか
請求番号・日付・支払期日INVOICE_RECEIPT_ID・INVOICE_RECEIPT_DATE・DUE_DATE重複の検知、支払の予定
IOの番号PO_NUMBER または OTHERIOを引く第一の手がかり
媒体と請求先VENDOR_NAME・RECEIVER_NAME媒体の特定、請求先が自社か
合計と内訳TOTAL・SUBTOTAL・TAX・DISCOUNT・AMOUNT_DUE明細の合計との突き合わせ
明細の行EXPENSE_ROW の中の ITEM・PRICE・QUANTITY・UNIT_PRICE行ごとのキャンペーンと金額
通貨金額の Currency の CodeIOの通貨との照合
振込先ACCOUNT_NUMBER と OTHER の項目登録済みの振込先との照合
項目名・信頼度LabelDetection・Confidence根拠と、読み直しの要否

IOの番号は、媒体ごとに置き場所が違います。 PO_NUMBER に入る媒体もあれば、明細の行の説明に「IO#12345」と書く媒体もあります。媒体の一覧に「IOの番号を書く欄」を持たせ、LabelDetection(書かれていた項目名)で拾い分けます。

配信実績は、管理画面から出力したCSVを Python で読みます。 媒体ごとに列の名前が違うので、媒体の一覧に列の対応(どの列が費用か、どの列がキャンペーンIDか)を持たせます。 出力するときは、期間を請求書の締めと同じ月の初日から末日にそろえ、時間帯の設定も媒体の請求の基準に合わせます。 ずれていると、月末の1日分の費用が差として出続けます。

Step4

AIへ渡す前に整形する

  1. 形式の確認 … StartExpenseAnalysis が扱うのはJPEG、PNG、PDFです。XFA形式のPDFには対応していません
  2. パスワードの確認 … パスワードで保護されたPDFは読めません。 媒体に保護のないものを送り直してもらいます
  3. ページ数とサイズの確認 … 非同期の処理はPDFで500MB・3,000ページまで。明細の多い請求書も収まります
  4. 解像度の確認 … 読み取れる文字の高さは15ピクセル以上(150dpiで8ポイント)。明細の行の小さな文字が、この下限に近いことがあります
  5. 数値の正規化 … 媒体の一覧の書き方で、金額と日付を自社の形に直します。元の文字列は残します
  6. 期間の取り出し … 明細の行に「Oct 1 - Oct 31」のような配信の期間があれば、開始と終了に分けます
  7. 重複の検知 … 同じ媒体・同じ請求番号のものが既にあれば、再送か重複かの印を付けます

5番目はAIに任せません。 「1.250,00」の読み方を生成AIに決めさせると、千倍ずれた値を返すことがあります。書き方は媒体の一覧で決め打ちします。

Step5

AIに処理させる

させるのは、明細の行の種類を分け、IOのキャンペーンの候補に対応付け、根拠にした文字列を写すことだけです。

見るもの書き出す内容判断できないときの扱い
明細の行の種類媒体費/手数料/クレジット・調整/税/その他決められなければ unknown
媒体費の行IOのキャンペーンの候補(最大3つ)と、対応の根拠候補が無ければ unmatched
クレジット・調整の行元の請求番号、元の月、元のキャンペーンの記載書かれていなければ「不明」
配信の期間行に書かれた期間書かれていなければ請求書の期間

候補を最大3つまで出させるのは、似た名前のキャンペーンが同じ広告主に並ぶからです。 「BrandX_Q4_Video_A」と「BrandX_Q4_Video_B」のように、IOでは別の上限を持つ2つが、名前の末尾だけで分かれます。1つに決めさせると、もっともらしい方を選んで終わります。

させないこと理由
金額の比較と差の計算規則で行う。AIに計算させない
許容の差の判断媒体ごとに自社が決めた値で照らす
媒体へ照会するかの判断媒体との関係と、広告主との契約で決まる
合計の作り直し行の合計が合わなくても、合わないまま出す
対応付けの確定候補まで。確定はメディア部の担当者

1行目がいちばん起きやすい失敗です。 請求書とIOを並べて渡すと、AIは頼まなくても差を計算し、「おおむね一致」とまとめます。 そのまとめが、上限を少し超えた請求を見落とす原因になります。

Step6

指示内容を固定する

あなたは広告会社の経理部で、海外の媒体からの請求書の明細を、
出稿の申込(IO)のキャンペーンに対応付ける立場です。
渡すのは、OCRが返した明細の行と、その媒体・その月に有効なIOの一覧です。
そこに書かれたことだけを使ってください。

【書き出すこと】
1. line_type: media_cost / fee / credit_adjustment / tax / other / unknown
2. media_cost の行: IOのキャンペーンの候補を最大3つ。
   それぞれに、対応の根拠にした文字列(請求書側とIO側)を写す
3. credit_adjustment の行: 元の請求番号、元の月、元のキャンペーンの記載
4. 行に書かれた配信の期間

【厳守事項】
- 書かれていない項目は「不明」としてください。推測で埋めないでください。
- 金額を比べたり、差を計算したりしないでください。
  「一致」「おおむね一致」などの評価を書かないでください。
- 候補が見つからない行は unmatched とし、候補を作らないでください。
  広告主が同じというだけで候補にしないでください。
- 候補を1つに絞れないときは、無理に絞らず複数を挙げてください。
- 金額と日付は、読み取り結果の文字列のまま写してください。
- クレジットの元の請求番号や元の月が書かれていなければ「不明」とし、
  当月の請求に当てはめないでください。
- 媒体へ照会すべきかを書かないでください。
- evidence には、根拠にした文字列をそのまま写してください。
- 請求書でない書類(実績レポート、見積など)と判断した場合は、
  対応付けをせず document_type に種類を書いてください。

【明細の行】{line_items}
【この媒体・この月に有効なIOの一覧】{io_list}
【名前の辞書で既に対応が決まっている行】{known_mappings}

「広告主が同じというだけで候補にしない」を書かないと、unmatched がほとんど出ません。 同じ広告主のIOが1つしか無ければ、それを候補にして返します。IOの無い出稿(運用の担当者が管理画面だけで足したもの)が見えなくなります。

名前の辞書で決まっている行も渡すのは、残りの行の手がかりになるからです。 同じ請求書の中で「_A」が決まっていれば、「_B」の候補は絞れます。

Step7

出力形式を固定する

次の形のJSONで受け取ります。 Claude API の構造化出力(output_config.format にJSONスキーマを渡す)を使うと、スキーマどおりの形で返り、必須の項目が欠けません。

{
  "invoice_id": "",
  "media": "",
  "document_type": "invoice",
  "lines": [
    { "item_text": "", "amount_text": "", "period_text": "",
      "line_type": "media_cost",
      "io_candidates": [ { "io_id": "", "campaign": "", "evidence": "" } ],
      "credit_ref": { "original_invoice": "", "original_month": "" } }
  ]
}

この後に、Python が照合を足します。

確かめること規則結果
対応名前の辞書に1つで当たるか、候補が1つか当たらなければ unmatched、複数なら needs_human
期間行の期間がIOの期間に収まるか外なら period_diff
通貨読み取りの Code とIOの通貨違えば needs_human
上限そのIOの累計の請求額が上限を超えないか超えたら over_io と超過額
実績配信実績の費用との差が、媒体ごとの許容の内か外なら amount_diff と差額
クレジット元の請求番号が過去の請求にあるかあれば credit として元の行につなぐ。無ければ needs_human

1つ目の理由は、上限を「累計」で見られることです。 IOの上限は、キャンペーンの期間全体での金額です。月ごとの請求だけを見ると、3か月目で上限を超えたことに気づきません。 過去の請求を足し上げて照らすのは、規則の側でしかできません。

2つ目は、クレジットを元の月につなげることです。 不正な操作に対するクレジットの詳細には、元の請求番号、元のサービスの月、PO番号、キャンペーン名などが含まれるとする媒体もあります。元の行が分かれば、広告主への請求をどの月で直すかが決まります。 なお、同じ媒体の説明では、請求のやり直しがあった場合に元の番号が変わっていることもあるとされています。

Step8

システムへ連携する

つなぎ先方式内容
受付フォルダ(Amazon S3)保存の通知で Lambda を起動請求書の受け取り
AWS TextractStartExpenseAnalysis/GetExpenseAnalysis標準の項目、明細の行、通貨
Claude APIAPI呼び出し行の区分とIOへの対応付け、照会文の下書き
案件管理の表読み取りと、確定した対応の辞書への追記IOと名前の辞書
配信実績のフォルダCSVの読み取りキャンペーンごとの費用
照合の一覧表への書き出し経理とメディア部が確認する一覧

会計システムへは書き込みません。 照合の結果は一覧までで、支払の登録と広告主への請求は、確認を終えた人が既存の手順で行います。名前の辞書への追記も、メディア部の担当者が確定したものだけです。

Step9

人が確認する

人が開くのは match 以外の行です。 種類ごとに見る人と順を決めます。

  1. over_io を最優先で見る … 超過額を確かめ、媒体に照会するか、広告主と相談するかをメディア部と決めます
  2. unmatched を見る … IOの無い出稿か、辞書の抜けか。IOの無い出稿なら、広告主への請求の根拠が無いので、まずメディア部に事情を聞きます
  3. amount_diff と period_diff を見る … 差額が許容を少し超えた程度なら、調整の反映待ちかを媒体の次の請求で確かめます
  4. credit のつなぎ先を確かめる … 元の行と、広告主への請求をどの月で直すかを決めます
  5. 対応を確定したら辞書に残す … 翌月から同じ名前の行は機械で引けます

5番目が、この構成を月ごとに速くします。 最初の月は needs_human と unmatched が多く出ますが、辞書が育つと、毎月同じ名前で請求される継続のキャンペーンは確認の対象から外れます。

目標は、150件をならして1件12分です。 明細の多い請求書で over_io が出ると30分以上かかり、継続のキャンペーンだけの請求書は数分で終わる想定です。

Step10

例外に対処する

起きること対応
パスワードで保護されたPDF読めない。媒体に保護のないものを送り直してもらう
XFA形式のPDF対応していない。印刷してPDFにし直す
配信実績のファイルがまだ無い請求書の読み取りと対応付けまで進め、実績の照合は保留にする
IOの番号がどこにも無い名前の辞書とAIの候補で引く。それでも無ければ unmatched
媒体の通貨とIOの通貨が違うneeds_human。換算の規則は経理が決める
クレジットの元の請求が見つからない請求のやり直しで番号が変わった可能性。媒体の請求の履歴で確かめる
行の合計と TOTAL が合わない直さずに needs_human。画像で確かめる
振込先が登録と違う支払を止め、登録済みの連絡先で媒体に確かめる
請求書でない書類が入ったdocument_type を見て、照合せずに担当者へ戻す
OCRが応答しない受付フォルダに残す。処理済みへ移すのは成功時だけ

下から3行目を軽く見ないでください。 「振込先が変わりました」という連絡と一緒に届く請求書は、なりすましの典型です。メールの返信で確かめず、登録済みの連絡先に別の経路で確かめます。

Step11

記録を残す

  • 元の請求書のPDFと、受け取った日時・送り元
  • OCRが返したJSONの全文
  • AIが返したJSONと、そのとき参照したIOの一覧と名前の辞書の版
  • 配信実績のファイルと、照合に使った列の対応
  • 行ごとの判定と差額、IOごとの累計の請求額
  • 人が対応を確定・変更した記録と、辞書への追記
  • 媒体への照会と回答、広告主への請求に反映した月

「IOごとの累計の請求額」を残すのは、上限の照合が累計で行われるためです。 途中の月の請求を後から直したとき、どの月の照合をやり直すかが、この記録で決まります。

04実装レベルの3段階

最小構成:PDFとIOの一覧を手でAIの画面に貼り、行の区分と候補を出させる / 1件ごとの対応付けの下書き
半自動化:上記+OCRのAPIで読み取り、配信実績とIOの上限・期間・通貨を規則で照らし、判定の一覧を出す / 読み取り、対応付け、照合
本格構成:上記+請求書の受け取りと配信実績の取得を自動にし、広告主への請求の明細の下書きまでつなぐ / 受け取りから請求の下書きまで

本記事の想定は半自動化です。 1件40分が12分になります。本格構成では配信実績の取得も自動にしますが、媒体ごとに取得の方法が違い、媒体の数だけ手間が増えます。 半自動化で辞書を3か月育て、取引の多い上位の媒体から順に取得を自動にするほうが早く効きます。

05工数削減シミュレーション

前提値(モデル条件)
対象人数
4 名
月間件数
150 件
1件あたり現在時間
40 分
1件あたり導入後時間
12 分
現在  150件 × 40分 ÷ 60 = 100 時間/月
導入後 150件 × 12分 ÷ 60 = 30 時間/月
月間削減時間
70h
削減率
70%
年間削減時間
840h
年間金額換算(時間単価3,500円)
294万円
モデル条件による試算であり、実際の効果は業務内容・運用方法によって異なります。

自社条件で導入効果を整理したい方へ

このユースケースを自社に当てはめた場合の前提値と削減見込みを、業務ヒアリングをもとに整理します。

AI活用について相談する

06向いている企業・向いていない企業

向いている
  1. 海外の広告媒体・配信プラットフォーム・海外の出版社のサイトに広告主の出稿を取り次ぎ、英文の請求書を毎月百件以上受け取る広告会社。海外向けの広告を自社で出稿しているEC事業者やIT企業のマーケティング部門。出稿ごとに申込(IO)を交わし、配信実績のレポートを媒体の管理画面から取り出せる場合。媒体からの請求をもとに広告主へ請求している場合。
向いていない
  1. 媒体からの請求書が日本語で届く場合(この構成のOCRは英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語しか読めません)。媒体が数社で、月の請求書が十件程度の場合。申込(IO)を交わさず、管理画面の設定だけで出稿していて照らす先が無い場合。なお、媒体への減額の申し入れと、広告主へ請求する金額の最終的な決定は、この構成では代替できません。

07最小構成で試す方法

  1. 先月の請求書から5件を選ぶ(明細の多いもの、クレジットの行があるもの、名前がIOと大きく違うものを入れる)
  2. 5件について、担当者が作った照合の表を書き出しておく
  3. 請求書のPDFと、その媒体の有効なIOの一覧を手元のAIサービスに貼り付ける
  4. 「この請求書の明細の行を、媒体費・手数料・クレジット・税に分け、媒体費の行にIOのキャンペーンの候補を最大3つ挙げてください。金額の比較はしないでください。候補が無い行は『該当なし』としてください」と指示する
  5. 出てきた対応を、担当者の照合の表と突き合わせる

5件は必ずやってください。 組む前に、「名前の違う行を、候補として正しく拾えるか」を確かめます。

出てきた内容判断
担当者の対応と同じ候補が上位に出たOCRと照合の仕組みに進む
金額を比べて「一致」と書いた指示の書き方で直る。構成は有効
候補がほとんど外れる名前の辞書を先に作る。 運用の命名がIOと無関係すぎる

3行目が出たら、名前の付け方の問題です。 管理画面でキャンペーンを作るときにIOの番号を名前の先頭に付ける決まりにすると、AIに頼らず引けるようになります。

08実装時につまずきやすいポイント

問題対策
AIが金額を比べて「一致」とまとめる比較を禁じ、規則で照らす
似た名前のキャンペーンを取り違える候補を最大3つ出させ、確定は人と辞書
同じ広告主のIOに何でも対応付ける候補が無ければ unmatched と指示する
IOの上限を月ごとに見る累計で照らす
クレジットを当月の減額にする元の請求番号と元の月でつなぐ
管理画面と請求の差を全部照会する媒体ごとに許容の差を決める
配信実績のCSVの列が媒体ごとに違う媒体の一覧に列の対応を持たせる
千と小数の区切りを読み違える媒体の一覧で決め打ちし、AIに読ませない
振込先の変更を請求書で受け入れる登録済みの連絡先に別の経路で確かめる
辞書が育たない確定した対応を毎回辞書に追記する

上の3行が、この構成の失敗のほとんどです。 どれも対応付けの段階で「もっともらしくまとめる」ことから出ています。候補と根拠を出させ、決めるのは辞書と人、という分け方を崩さないことです。

4行目と5行目は、時間がたってから効いてきます。 どちらも月をまたいで見ないと分からない誤りで、1件ずつの照合では見つかりません。

09セキュリティ・AIガバナンス上の注意点

この構成で扱うデータ: 広告主の名前、キャンペーンの名前と期間、媒体費の金額、IOの単価と上限、媒体の振込先です。単価と上限は、広告主にも媒体にも見せない取引の条件を含みます。

  1. 外部へ渡す範囲を、対応付けに必要な項目に限る … 生成AIに渡すのは明細の行と、その媒体・その月のIOの一覧だけです。他の媒体の単価や、広告主との契約の金額は渡しません
  2. 支払と請求を自動にしない … 照合の一覧までで止め、支払の登録と広告主への請求は人が行います
  3. 振込先の変更を請求書だけで受け入れない … なりすましの典型です。登録済みの連絡先に別の経路で確かめます
  4. 媒体への照会を自動で送らない … 照会文は下書きまでです。媒体との関係に直接ひびきます
  5. 保存先を暗号化する … 非同期の分析では、結果を自社のバケットに出し、KMSの鍵で暗号化する設定ができます
  6. 見られる人を絞る … 照合の一覧は、経理と、その広告主を担当するメディア部の担当者だけが見られるようにします

誤りが起きた場合のリスクは、払いすぎと、広告主への請求の誤りの2つです。 前者は上限の超過の見落としで、後者はクレジットの月の取り違えで起きます。どちらも、比較と累計を規則に置く設計で防ぎます。

10まず何から始めるか

1週目:名前の辞書の土台を作る

先月の請求書から、取引の多い上位10媒体の明細の行を抜き出し、IOのキャンペーンとの対応を担当者に書いてもらいます。 これが辞書の最初の版です。

2週目:5件で試す

先月の請求書から5件を選び、手元のAIサービスで行の区分とIOの候補を出させます。金額を比べていないか、unmatched を作れているかを最優先で見ます。

3週目:許容の差とIOの上限の見方を決める

媒体ごとに、管理画面と請求の差を何%まで認めるかを決めます。IOの上限を累計で見ることを、メディア部と経理で合わせます。

4週目:受付から照合の一覧までをつなぐ

S3 の受付フォルダから StartExpenseAnalysis を呼び、行の区分、IOへの対応付け、上限・期間・通貨の照合を一覧に書き出すところまで作ります。この時点では配信実績の照合は手で行い、一覧の判定だけを見ます。

2か月目: 配信実績のCSVの読み込みと amount_diff を足し、match 以外の件数を毎週数えます。3か月目以降: クレジットのつなぎ込みと照会文の下書きを足し、1件40分が何分になったかを実測します。辞書で引ける行が大半になった時点で、この構成は完成です。


11関連ユースケース

12この仕組みを理解するための記事

13技術仕様の確認日・参考情報

技術仕様確認日:2026-10-06/最終更新:2026-10-06
確認した内容情報源確認日
請求書と領収書の分析が、テンプレートなしで請求番号・日付・品目の金額・合計を取り出し、違う言い方を標準の項目名(INVOICE_RECEIPT_ID など)にそろえ、標準に当たらない項目を OTHER とすること。標準の項目に PO_NUMBER・DUE_DATE・DISCOUNT・AMOUNT_DUE・ACCOUNT_NUMBER などがあること。LabelDetection・ValueDetection・Confidence・EXPENSE_ROW が返り、金額に通貨の Code が付くことAWS: Analyzing Invoices and Receipts2026-10-06
StartExpenseAnalysis がJPEG・PNG・PDFを非同期で分析し、完了をSNSに通知し、GetExpenseAnalysis で結果を取ること。ClientRequestToken で二重起動を防げること、JobId が7日間有効なこと、OutputConfig と KMSKeyId で自社のバケットへの出力と暗号化ができることAWS: StartExpenseAnalysis2026-10-06
同期の処理がPDFで1ページ・10MBまで、非同期がPDFで500MB・3,000ページまで、XFA形式とパスワード保護のPDFは不可、対応言語が6言語、文字の高さが15ピクセル以上(150dpiで8ポイント)であることAWS: Set Quotas in Amazon Textract2026-10-06
不正な操作に対するクレジットなどの調整があり、その詳細に元の請求番号、元のサービスの月、PO番号、アカウント予算の名前、キャンペーン名が含まれること。請求のやり直しがあった場合に番号が変わっていることがあることGoogle Ads Help: Understanding credits and adjustments to your account2026-10-06
キャンペーンの画面と請求の画面で費用が違う理由が、不正なクリックのクレジット、配信の超過のクレジット、その他の調整であり、調整の反映に時間がかかることGoogle Ads Help: About cost differences on the Campaigns page and Billing pages2026-10-06
構造化出力を output_config.format で指定でき、スキーマどおりの形で必須の項目が欠けずに返ることClaude Docs: Structured outputs2026-10-06

媒体ごとの請求の仕組みは、それぞれの媒体の案内で確かめてください。 本記事は上記の公開情報で確認できた範囲だけを扱っており、上の2件は1つの配信プラットフォームの例です。

実装ステータス:構成例。 公開仕様に基づいて設計した構成であり、当社で実際に構築・検証したものではありません。工数の数値はモデル条件による試算です。

自社の業務に使えるAI活用候補を整理します

このユースケース(UC-0509)についてのご相談はこちらから。

AI活用について相談する
目次