中級向けn8n 公式テンプレート承認済み

領収書とカード明細の突合

Gmail に届いた領収書・請求書の PDF を Claude が読んで Google スプレッドシートに記録し、コードが「金額は PDF に書いてあるか」「明細と税の合計は合うか」を確かめます。

月末にカード明細を貼ると、金額と日付でコードが突き合わせ、一致・候補が複数・領収書なし・二重請求の疑いなどに分けます。突き合わせに AI は使いません。

ダミーの PDF 12枚とカード明細11行で、期待した16行と一致しました。n8n 公式テンプレートとして承認された JSON を配布します。

人の手間は、どう変わるか

Before(人が手でやっていたこと)

  • 届いた領収書の PDF を開いて、店名・日付・金額を表に打ち込む
  • 月末に、カード明細を1行ずつ見ながら、対応する領収書を探す
  • 見つからないもの、二重に請求されたものを、目で探す

After(このワークフローを入れると)

  • PDF が届くと、店名・日付・金額・明細が読み取られ、確認されて表に入る
  • 明細を貼って実行すると、行ごとに「一致」「候補が複数」「領収書なし」などに分かれる
  • 人が見るべき行だけが、Slack に届く

それでも人に残ること

  • 「候補が複数」「領収書なし」などの行を見て、判断する
  • 要確認の付いた領収書を、元の PDF で確かめる

動作確認: — n8n 2.36.8 / Claude Haiku 4.5 / Gmail / Google スプレッドシート / Slack(無料プラン)

n8n 公式テンプレート: 英語版が n8n の審査を通過しました()。注記を読む

この記事で配っている JSON は、n8n に出した英語版と同じものです(審査のあとで n8n 側が手を入れていれば、公式のページの版のほうが新しい)。n8n が内容を保証するものではありません。 n8n 公式のページ(英語版)を見る

月末に、カード明細を1行ずつ見ながら、領収書を探していく。手で突き合わせる作業は、地味に時間がかかります。

このワークフローの考え方は、1つです。AI に任せるのは、PDF を読むところだけ。突き合わせ(突合)は、AI にさせません。 金額と日付が合うかは、コードのほうが確実で、「なぜ一致としたか」の理由も、そのまま説明できるからです。

約45秒で、仕組みの全体(音声あり。音声:VOICEVOX:雨晴はう)

receipts-card-statement-match.json をダウンロード

n8n 公式のテンプレートとして承認されました(n8n の画面での公開の日付は、2026年10月15日)。配っているのは、n8n に出した英語版と同じファイルです。画面の文字は英語ですが、日本語の領収書で試しています。

① 届くたびに(AI が読む)Gmail領収書の PDFClaudePDF を項目に分けるコードが確かめる金額は PDF にあるか明細+税=合計かReceipts② 月末に(AI を使わない)Card タブカード明細を貼るコードが突き合わせる同じ金額で、日付が近いもの一致 / 候補が複数領収書なし / 二重請求の疑い領収書のみ / 重複Matches+ Slack
AI に任せるのは、PDF を読むところだけ。計算の確認と、カード明細との突き合わせは、コードがやる。結果に理由が付くので、人が最後に見る行が絞れる。

このワークフローがすること

① 領収書が届くたびに

  1. Gmail のトリガーが、ラベル receipts が付いて、PDF が添付されたメールを拾う(15分おき)
  2. PDF から文字を取り出す(確認に使うだけ)。PDF そのものを Claude が読んで、店名、番号、日付、通貨、明細、税、合計、支払い方法を JSON にする
  3. コードが確かめて、Receipts タブに記録する

② 月末に

  1. カード会社の明細(CSV)を、Card タブに貼る(列は、初期値で Date、Merchant、Amount。カード会社に合わせて、Config で変える)
  2. Reconcile now を実行すると、コードが突き合わせて、Matches タブに書き、人が見るべき行を Slack に送る

コードが確かめること

領収書(1枚ずつ)

確かめること どうしているか
PDF に書いてあるか 店名、番号、日付、合計、明細の金額、税の金額が、PDF の文字にあるか。店名だけは、5文字中1文字の違いを許す(下の「落とし穴1」)。金額は、ゆるく見ない
計算が合うか 数量 × 単価 = 各明細、明細 + 税 = 合計(税込みなら、明細 = 合計)。1円の端数は許す
税率に合うか 税率が1つなら、税額がその税率に合うか(10% の外税、8%・10% の内税)
文字のない PDF スキャンの画像だけの PDF は、Claude は読めても、照合する文字がない。「要確認」にして残す

突き合わせ(AI なし)

カード明細の1行ごとに、同じ金額で、日付が近い領収書を探します(初期値:カードの日付が、領収書の3日前から7日後まで)。結果は、次のどれかです。

結果 意味
一致 候補が1枚だけ
候補が複数 同じ金額の領収書が2枚以上(全部の候補を書く。人が選ぶ)
領収書なし 候補がない(外貨の領収書が近くにあれば、名前を挙げる)
二重請求の疑い 同じ店・同じ金額の明細が、数日のうちに2回あり、領収書は1枚
近い金額 金額が3%以内で近い(手数料やチップの可能性)
領収書のみ 現金払い、外貨、まだ明細に出ていない
重複 同じ領収書が2回届いた(2枚目は突き合わせに使わない)

店名は、補助にしか使いません。カード明細は「SAMPLE CAFE AOBA」、領収書は「サンプル・カフェ青葉」のように、書き方が違うのが普通だからです。

ダミーの PDF 12枚で試した結果

実在の会社やお店の領収書は使っていません。わなを仕込んだ12枚(文字のある PDF 11枚、画像だけの PDF 1枚。日本語と英語、領収書と請求書)と、カード明細11行を作りました。2026年10月12日、Claude Haiku 4.5、それぞれ1回の実行です。

領収書:10枚が OK、2枚が要確認で、2枚とも、わざと仕込んだものでした。

  • 明細と税の合計が、印字された合計より1,000円少ない請求書 → 「明細と税が合計と合わない」
  • 画像だけの PDF → 内容は Claude が読めたが、「文字がないので照合できない」
  • 同じ請求書をもう1通、外貨(USD)、現金払いも、正しく読み分けた

突き合わせ:期待した16行と、完全に一致しました。

結果 件数 中身
一致 7 うち2件は、領収書側の要確認が備考に出る
候補が複数 3 1,200円のランチの領収書2枚と、その明細
領収書なし 2 USD の会議(外貨の領収書を名指し)、コンビニ
二重請求の疑い 1 同じ日に、同じカフェで2回
領収書のみ 2 現金払い、USD
重複 1 同じ請求書の2通目

本物の Gmail のトリガーからも、1回だけ通しました(自分宛てに、ダミーの請求書を1通送った)。PDF が確認まで渡り、OK で記録されました。

コードの確認は、AI を使わずに、わざと間違えた入力で54通り試し、すべて期待どおりでした。

試して見つけた5つの落とし穴

1. PDF の文字に、見た目が同じ「別の字」が入っていた

Claude が正しく読んだ店名「サンプル・カフェ青葉」が、「PDF の文字にない」と判定されました。PDF から取り出した文字を見ると、「青」が、見た目は同じでも、別の文字コードの字(異体字)になっていました。「発行」の「行」なども、同じでした。

店名だけは、5文字以上なら、5文字中1文字の違いを許す形にしました。金額は、ゆるく見ません。

2. Claude が、金額を「¥3,200」という文字で返した

タクシーの領収書で、Claude が、金額を数字ではなく「¥3,200」という文字で返し、合計が空として「要確認」になりました。間違いとして通ったのではなく、止まったので、実害はありませんでした。金額を読むところで、「¥」「円」「,」を許すようにしました。

3. 列名の食い違いで、カード明細が全行、エラーなしで飛ばされた

最初の突き合わせで、結果が「領収書のみ 12件」になりました。カード明細が1行も読まれていません。原因は、設定の列名の名前(card_date_col)と、コードが探す名前(date_col)の食い違いでした。全行が「空の行」として、何のエラーもなく飛ばされていました。

名前を合わせたうえで、設定した列名が Card タブにないときは、見つかった列名を表示して、止まるようにしました。黙って0件になるより、止まるほうがずっとましです。

4. 「一致」に変わった領収書の、古い行が残った

突き合わせの結果を、キーで上書きする作りにしていたら、前の日に「領収書のみ」だった領収書が「一致」に変わっても、古い「領収書のみ」の行が消えずに残りました。 Matches タブは、毎回、空にしてから書き直す形に変えました。

5. Google スプレッドシートが、日付を書き換えた

2026-09-03 のような文字を、ふつうの設定(USER_ENTERED)で書き込むと、スプレッドシートが日付として解釈します。読み戻したときの文字の形は、シートの地域の設定に左右されるはずです(私は、日本の設定以外では確かめていません)。書き込みは「値をそのまま」(RAW)、読み取りは「日付をシリアル値(数値)で」にしました。カード明細を貼った Card タブの日付は、本物の日付になりましたが、シリアル値で正しく読めました。

使うための設定

  1. スプレッドシート: 空のシートを作り、ID を Spreadsheet ID に貼って、Run once の枝を1回実行する(Receipts、Card、Matches のタブと見出しができる)。そのあと、Google スプレッドシートのノードで、そのシートを選ぶ
  2. 認証情報: Gmail、Google スプレッドシート、Anthropic、Slack。Slack のアプリは、選んだチャンネルに入れておく
  3. Gmail: ラベル receipts を作り、領収書のメールに付ける(Gmail のフィルタで自動にできる)
  4. Config: 通貨、カード明細の列名、日付の幅、金額の許容差を合わせる
  5. 公開する。月末に、カード明細を Card タブに貼って、Reconcile now を実行する

使う前に知っておくこと

  • 領収書は、Anthropic に送られます。 送れない書類には、使わないでください
  • 確認を通っても、領収書が本物であることや、経費として認められることは、分かりません。 分かるのは、「読んだ数字が PDF に印字された数字と同じで、計算が合っている」ことです
  • 扱わないもの:外貨の換算(一覧に出すだけ)、分割払い、1回の支払いで複数の領収書、返金、JPG・PNG の添付、メールの本文に書かれた領収書
  • 税率が複数ある領収書は、明細の合計だけを確かめ、税率ごとの税額は確かめません

確認していないこと

  • 実際のカード会社の CSV。 手元になかったので、一般的な3列のダミーで試しました
  • 実際のお店の領収書(感熱紙の写真、手書き、複雑なレイアウト)。試したのは、私が作った単純な12枚です
  • 領収書1枚あたりの、Claude の費用
  • 外貨の領収書の自動の突き合わせ(外貨の決済の確認は、別のテンプレートにしました:外貨のカード決済の為替チェック)

次に読む

次に読む