🧾
概念 #n8n #ユースケース #請求書OCR #経理自動化 #freee #マネーフォワード #PDF #会計 📚 n8nワークフロー自動化

請求書PDFをOCRで自動データ入力・会計ソフト登録する

メールに添付された請求書PDFをOpenAI VisionでOCR解析し、取引先名・金額・振込期日を自動抽出してfreee/マネーフォワードに仕訳登録するワークフロー。

ユースケース概要

仕入れ先から届く請求書メールをGmailトリガーで検知し、OpenAI VisionでPDFを読み取り・データ抽出してfreee/マネーフォワードに自動で仕訳登録する。

解決する課題: 1件10分かかっていた請求書手動入力作業を30秒に短縮。月100件なら約15時間の削減

使用するn8nノード:

  • Gmail Trigger(請求書メール受信)
  • Code(PDFをbase64エンコード)
  • OpenAI Chat Model with Vision(OCR解析)
  • Code(データ整形・バリデーション)
  • HTTP Request(会計ソフトAPI)
  • Slack(担当者への確認通知)

ワークフロー構成

[Gmail Trigger: 請求書ラベル付きメール]

[Code: 添付PDFをbase64エンコード]

[OpenAI Vision: 請求書からデータ抽出(JSON出力)]

[Code: データバリデーション・整形]

[IF: 信頼度スコア >= 90%]
  ├── 高信頼 → [freee/MF API: 自動登録]
  │                [Slack: 登録完了通知]
  └── 低信頼 → [Slack: 人間による確認依頼]

実装手順

Step 1: Gmail Triggerのフィルタ設定

請求書メールを自動的にフィルタリングするため、Gmail側でラベルを設定する。

Gmailフィルタ:
  from: (請求書を送るドメインリスト)
  subject: (請求書 OR 御請求書 OR invoice)
  → ラベル「請求書処理待ち」を自動付与

n8n設定:

Gmail Trigger → Filter → Label: 請求書処理待ち

Step 2: PDFのbase64変換(Codeノード)

// 添付ファイルの最初のPDFを取得
const attachments = $input.first().binary;
const pdfKey = Object.keys(attachments).find(k => 
  attachments[k].mimeType === 'application/pdf'
);

if (!pdfKey) throw new Error('PDF添付ファイルが見つかりません');

return [{
  json: {
    ...$json,
    pdfBase64: attachments[pdfKey].data,
    fileName: attachments[pdfKey].fileName
  }
}];

Step 3: OpenAI Visionで請求書OCR

Model: gpt-4o(Vision対応が必要)
System Prompt:
請求書画像から以下の情報をJSONで抽出してください。
不明な場合は null を返してください。

{
  "vendorName": "取引先名",
  "vendorRegistrationNumber": "インボイス登録番号(T+13桁)",
  "invoiceNumber": "請求書番号",
  "invoiceDate": "請求日(YYYY-MM-DD形式)",
  "dueDate": "支払期限(YYYY-MM-DD形式)",
  "subtotal": 税抜金額の数値,
  "taxAmount": 消費税額の数値,
  "totalAmount": 税込合計金額の数値,
  "items": [
    { "description": "品目", "quantity": 数量, "unitPrice": 単価, "amount": 金額 }
  ],
  "confidence": 0-100の整数(抽出の信頼度)
}

User Message Type: Image
Image Data: data:application/pdf;base64,{{ $json.pdfBase64 }}

Step 4: データバリデーション(Codeノード)

const data = $json;

// 金額チェック: 小計 + 税額 ≒ 合計
const calculatedTotal = (data.subtotal ?? 0) + (data.taxAmount ?? 0);
const totalDiff = Math.abs(calculatedTotal - (data.totalAmount ?? 0));
const isValid = totalDiff <= 10; // 10円以内の誤差は許容

return [{
  json: {
    ...data,
    isValid,
    validationNote: isValid ? 'OK' : `金額不一致: 計算値¥${calculatedTotal} vs 請求書¥${data.totalAmount}`
  }
}];

Step 5: freee APIへの仕訳登録

Method: POST
URL: https://api.freee.co.jp/api/1/deals
Headers:
  Authorization: Bearer {{ $credentials.freeeToken }}
Body:
{
  "company_id": {{ $vars.FREEE_COMPANY_ID }},
  "issue_date": "{{ $json.invoiceDate }}",
  "due_date": "{{ $json.dueDate }}",
  "type": "expense",
  "partner_name": "{{ $json.vendorName }}",
  "details": [
    {
      "account_item_id": 受取手形のID,
      "amount": {{ $json.subtotal }}
    }
  ]
}

Step 6: Slack確認通知

Channel: #accounting
Message:
✅ 請求書登録完了
取引先: {{ $json.vendorName }}
金額: ¥{{ $json.totalAmount?.toLocaleString() }}
期日: {{ $json.dueDate }}
信頼度: {{ $json.confidence }}%

{{ $json.isValid ? '' : '⚠️ 金額不一致のため確認が必要です。' }}
freee: {{ $('freee').first().json.deal.id }}

ポイント・注意事項

  • インボイス制度(適格請求書)対応のため、「インボイス登録番号(T+13桁)」の抽出も実装する
  • 信頼度が90%未満の場合は自動登録せず人間に確認依頼。ゴミデータを会計ソフトに入れない
  • freee・マネーフォワードの無料プランはAPIコールが制限される場合がある。プランを確認する

関連機能

  1. 1. 🔄n8n概要 - ワークフロー自動化プラットフォーム
  2. 2. ⚙️n8nワークフローの基本(ノード・コネクション・実行)
  3. 3. n8nトリガーの種類(Webhook・スケジュール・イベント)
  4. 4. 🔀n8nロジック制御(フィルター・条件分岐・ループ・マージ)
  5. 5. 🌐n8n HTTP Request・API連携
  6. 6. 🔗n8n主要インテグレーション(Slack・Gmail・GitHub)
  7. 7. 🛡️n8nエラーハンドリング・デバッグ
  8. 8. 🤖n8n AI・LLMエージェント(Chain・Agent)
  9. 9. 💻n8n Codeノード・カスタム処理
  10. 10. 🏢n8nエンタープライズ機能(ソース管理・シークレット・チーム管理)
  11. 11. 🌤️毎朝SlackにAIで天気・ニュースを通知する
  12. 12. 📊GitHubのPRをGoogleシートに自動記録する
  13. 13. 📧新規ユーザー登録時にWelcomeメールを自動送信する
  14. 14. 💳StripeのWebhookで決済完了を検知して処理する
  15. 15. 📈スケジュールトリガーで週次レポートを自動生成する
  16. 16. 🎫Gmailトリガーでサポートメールを自動Notionチケット化する
  17. 17. 🎯条件分岐でリード属性に応じて担当者を振り分ける
  18. 18. 📨ループ処理でリストを走査し一括メール送信する
  19. 19. 📋複数APIのデータをマージして統合レポートを作成する
  20. 20. 🗄️外部REST APIからデータを取得してDBに保存する
  21. 21. 🔍GraphQL APIでGitHubのIssueを取得・加工する
  22. 22. 🔐Bearer認証付きAPIを呼び出してデータ同期する
  23. 23. SlackとNotionを連携したチームタスク管理フロー
  24. 24. 🤝GmailとHubSpotを連携したCRM自動化フロー
  25. 25. 🚀GitHubデプロイイベントをSlackに通知する
  26. 26. 🚨APIエラー発生時にSlackへアラートを送る
  27. 27. 🔁リトライ付きの堅牢なデータ同期フローを構築する
  28. 28. 📝エラーログをAirtableに自動記録する
  29. 29. 🤖LLMを使ったカスタマーサポート自動応答ボット
  30. 30. 🔎ドキュメントRAG検索システムを構築する
  31. 31. 📬AIでメール内容を自動分類・ルーティングする
  32. 32. 🔧JavaScriptで複雑なデータ変換処理を実装する
  33. 33. 📄npmライブラリを使ったPDF自動生成フロー
  34. 34. ✔️カスタムバリデーションロジックをCodeノードで実装する
  35. 35. 🗂️Gitでワークフローをバージョン管理する
  36. 36. 🌍環境変数で本番・ステージングを切り替える
  37. 37. 👥チームでのワークフロー共同管理フロー
  38. 38. 📋AIで履歴書を自動スクリーニング・スコアリングする
  39. 39. 🧾請求書PDFをOCRで自動データ入力・会計ソフト登録する
  40. 40. 📱ブログ記事→SNS自動投稿パイプラインを構築する
  41. 41. 📦Shopify注文処理を完全自動化する(在庫・配送・顧客通知)
  42. 42. 🔔予約リマインダーを自動送信してノーショーを削減する
  43. 43. 📊経営ダッシュボードを毎朝Slackに自動配信する
  44. 44. 🔭競合情報を自動収集してWeeklyレポートにまとめる
  45. 45. 🎉新入社員オンボーディングを完全自動化する

出典: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/