中級向け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 にさせません。 金額と日付が合うかは、コードのほうが確実で、「なぜ一致としたか」の理由も、そのまま説明できるからです。
receipts-card-statement-match.json をダウンロード
n8n 公式のテンプレートとして承認されました(n8n の画面での公開の日付は、2026年10月15日)。配っているのは、n8n に出した英語版と同じファイルです。画面の文字は英語ですが、日本語の領収書で試しています。
このワークフローがすること
① 領収書が届くたびに
- Gmail のトリガーが、ラベル
receiptsが付いて、PDF が添付されたメールを拾う(15分おき) - PDF から文字を取り出す(確認に使うだけ)。PDF そのものを Claude が読んで、店名、番号、日付、通貨、明細、税、合計、支払い方法を JSON にする
- コードが確かめて、
Receiptsタブに記録する
② 月末に
- カード会社の明細(CSV)を、
Cardタブに貼る(列は、初期値でDate、Merchant、Amount。カード会社に合わせて、Config で変える) - 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 タブの日付は、本物の日付になりましたが、シリアル値で正しく読めました。
使うための設定
- スプレッドシート: 空のシートを作り、ID を Spreadsheet ID に貼って、Run once の枝を1回実行する(
Receipts、Card、Matchesのタブと見出しができる)。そのあと、Google スプレッドシートのノードで、そのシートを選ぶ - 認証情報: Gmail、Google スプレッドシート、Anthropic、Slack。Slack のアプリは、選んだチャンネルに入れておく
- Gmail: ラベル
receiptsを作り、領収書のメールに付ける(Gmail のフィルタで自動にできる) - Config: 通貨、カード明細の列名、日付の幅、金額の許容差を合わせる
- 公開する。月末に、カード明細を
Cardタブに貼って、Reconcile now を実行する
使う前に知っておくこと
- 領収書は、Anthropic に送られます。 送れない書類には、使わないでください
- 確認を通っても、領収書が本物であることや、経費として認められることは、分かりません。 分かるのは、「読んだ数字が PDF に印字された数字と同じで、計算が合っている」ことです
- 扱わないもの:外貨の換算(一覧に出すだけ)、分割払い、1回の支払いで複数の領収書、返金、JPG・PNG の添付、メールの本文に書かれた領収書
- 税率が複数ある領収書は、明細の合計だけを確かめ、税率ごとの税額は確かめません
確認していないこと
- 実際のカード会社の CSV。 手元になかったので、一般的な3列のダミーで試しました
- 実際のお店の領収書(感熱紙の写真、手書き、複雑なレイアウト)。試したのは、私が作った単純な12枚です
- 領収書1枚あたりの、Claude の費用
- 外貨の領収書の自動の突き合わせ(外貨の決済の確認は、別のテンプレートにしました:外貨のカード決済の為替チェック)
次に読む
- 外貨のカード決済が、市場レートより何%高かったかを出すのは 外貨のカード決済の為替チェック
- Chatwork に書いた経費のメモを、表にするのは Chatwork の記録をシートへ
- Gmail の認証が切れて、トリガーが黙って止まる件は n8n の「Access could not be refreshed」
- 重複を除くノードの落とし穴は n8n Remove Duplicates の使い方
- テンプレートを n8n 公式に出した記録は n8n テンプレート投稿と審査