CFO 費用審査インターフェース
中級
これはAI, IT Ops分野の自動化ワークフローで、15個のノードを含みます。主にAirtable, Agent, AirtableTrigger, LmChatOpenAi, EmbeddingsOpenAiなどのノードを使用、AI技術を活用したスマート自動化を実現。 GPT-4、Airtable、Pineconeベクトルデータベースを使った自動経費承認システム
前提条件
- •Airtable API Key
- •OpenAI API Key
- •Pinecone API Key
使用ノード (15)
ワークフロープレビュー
ノード接続関係を可視化、ズームとパンをサポート
ワークフローをエクスポート
以下のJSON設定をn8nにインポートして、このワークフローを使用できます
{
"id": "zA3j2ZTGRt82vwa6",
"meta": {
"instanceId": "84ad02d6104594179f43f1ce9cfe3a81637b2faedb57dafcb9e649b7542988db",
"templateCredsSetupCompleted": true
},
"name": "CFO Expense Reviewer Agent",
"tags": [],
"nodes": [
{
"id": "7fec5e7c-abea-4caf-b8e2-718e7abc44ef",
"name": "新規経費申請を監視",
"type": "n8n-nodes-base.airtableTrigger",
"position": [
0,
0
],
"parameters": {
"baseId": {
"__rl": true,
"mode": "url",
"value": "https://airtable.com/appjaqV0O7FkXT2qj/shrst7GnlbzMDz4te"
},
"tableId": {
"__rl": true,
"mode": "url",
"value": "https://airtable.com/appjaqV0O7FkXT2qj/tblTAvRqVFOo5AVDF/viwEp0ssaidZOo4nl?blocks=hide"
},
"pollTimes": {
"item": [
{
"mode": "everyHour"
}
]
},
"triggerField": "Amount",
"authentication": "airtableTokenApi",
"additionalFields": {}
},
"credentials": {
"airtableTokenApi": {
"id": "OQJxQX3N8GKNxEOl",
"name": "Airtable Personal Access Token account 2"
}
},
"typeVersion": 1
},
{
"id": "8e0fa6f3-df8c-42b6-af2a-f2cfb25f1e6d",
"name": "CFO経費審査エージェント",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
440,
0
],
"parameters": {
"text": "=An employee submitted an expense:\nAmount: ${{ $json.fields.Amount }}\nSubmitted by: {{ $json.fields['Submitted By'] }}\nCategory: {{ $json.fields.Category }}\nDescription: {{ $json.fields.Description }}\nDate Submitted: {{ $json.fields['Date Submitted'] }}\nStatus: {{ $json.fields.Status }}",
"options": {
"systemMessage": "You are a CFO expense analysis agent. Flag suspicious expenses with the reason. When you answer try to give answer with all the given details"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.9
},
{
"id": "e53c34b4-fe86-4c70-ad90-e61ec4f8c72b",
"name": "OpenAI GPT-4 Model",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
360,
260
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4o-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"id": "wYwTjEv45IzlAOAu",
"name": "OpenAi account 2"
}
},
"typeVersion": 1.2
},
{
"id": "a561418a-2ef0-44bb-9683-ba239d58a3af",
"name": "CFOエージェント応答を解析",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
620,
220
],
"parameters": {
"jsonSchemaExample": "{\n \"amount\": 4500,\n \"submitted_by\": \"Alice\",\n \"category\": \"Travel\",\n \"description\": \"Business class flight to Tokyo\",\n \"date_submitted\": \"2025-05-29\",\n \"status\": \"Pending\",\n \"decision\": \"Flagged\",\n \"reason\": \"The amount of $4500 for a business class flight appears unusually high and requires verification against standard travel policies and previous similar expenses. Additionally, the submission date is in the future (2025), which raises concerns about the legitimacy of the expense. It is advisable to confirm the travel plans and the necessity of the business class flight for this trip.\"\n}\n"
},
"typeVersion": 1.2
},
{
"id": "1cba2b01-faeb-44ce-97e3-b3ada02ce748",
"name": "決定をPineconeに保存",
"type": "@n8n/n8n-nodes-langchain.vectorStorePinecone",
"position": [
1040,
0
],
"parameters": {
"mode": "insert",
"options": {
"pineconeNamespace": "={{ $json.output.decision }}"
},
"pineconeIndex": {
"__rl": true,
"mode": "list",
"value": "new",
"cachedResultName": "new"
}
},
"credentials": {
"pineconeApi": {
"id": "PSI5CiZnLRSkEgJg",
"name": "PineconeApi account"
}
},
"typeVersion": 1.1
},
{
"id": "5a80d379-907e-43c0-946e-fc82be36c288",
"name": "埋め込みを生成",
"type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
"position": [
980,
240
],
"parameters": {
"options": {}
},
"credentials": {
"openAiApi": {
"id": "wYwTjEv45IzlAOAu",
"name": "OpenAi account 2"
}
},
"typeVersion": 1.2
},
{
"id": "50c1a961-cc58-4b6a-bf46-da0925b617e2",
"name": "Pinecone用データを準備",
"type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
"position": [
1180,
220
],
"parameters": {
"options": {}
},
"typeVersion": 1
},
{
"id": "2484db3c-bef8-4b0e-a324-116dc70644a9",
"name": "推論テキストを分割",
"type": "@n8n/n8n-nodes-langchain.textSplitterRecursiveCharacterTextSplitter",
"position": [
1120,
440
],
"parameters": {
"options": {},
"chunkSize": 100,
"chunkOverlap": 20
},
"typeVersion": 1
},
{
"id": "cd1a7b50-edd7-400a-8fc8-ff237492749b",
"name": "Airtableレコードを更新",
"type": "n8n-nodes-base.airtable",
"position": [
1680,
0
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appjaqV0O7FkXT2qj",
"cachedResultUrl": "https://airtable.com/appjaqV0O7FkXT2qj",
"cachedResultName": "Table no.1"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblTAvRqVFOo5AVDF",
"cachedResultUrl": "https://airtable.com/appjaqV0O7FkXT2qj/tblTAvRqVFOo5AVDF",
"cachedResultName": "Table 1"
},
"columns": {
"value": {
"id": "={{ $('Watch New Expense Requests').item.json.id }}",
"Amount": "={{ $('CFO Expense Review Agent').item.json.output.amount }}",
"Reason": "={{ $('CFO Expense Review Agent').item.json.output.reason }}",
"Status": "=completed",
"Category": "={{ $('CFO Expense Review Agent').item.json.output.category }}",
"decision": "={{ $('CFO Expense Review Agent').item.json.output.decision }}",
"Description": "={{ $('CFO Expense Review Agent').item.json.output.description }}",
"Submitted By": "={{ $('CFO Expense Review Agent').item.json.output.submitted_by }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Amount",
"type": "number",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Amount",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Category",
"type": "options",
"display": true,
"options": [
{
"name": "Self-cleaning, keeps drinks cold for 24 hrs, BPA-free",
"value": "Self-cleaning, keeps drinks cold for 24 hrs, BPA-free"
},
{
"name": "Travel",
"value": "Travel"
}
],
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Category",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Description",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Submitted By",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Submitted By",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date Submitted",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "Date Submitted",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "decision",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "decision",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Reason",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Reason",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update"
},
"credentials": {
"airtableTokenApi": {
"id": "OQJxQX3N8GKNxEOl",
"name": "Airtable Personal Access Token account 2"
}
},
"typeVersion": 2.1
},
{
"id": "a45e7430-d205-4930-9b15-b52e51139d58",
"name": "付箋",
"type": "n8n-nodes-base.stickyNote",
"position": [
-100,
-480
],
"parameters": {
"color": 2,
"width": 340,
"height": 680,
"content": "## 🔁 **Section 1: Intake – Monitoring Expense Requests**\n\n### 1. **Watch New Expense Requests**\n\n**(Airtable Trigger)**\n\n* **Purpose:** Continuously monitors the Airtable `Expenses` table for new or updated entries with `Status = Pending`.\n* **What it does:** Triggers the entire workflow when a new expense is submitted or an existing one is updated for review.\n\n> 💡 Ensures real-time detection of incoming requests that need analysis."
},
"typeVersion": 1
},
{
"id": "6d6229ee-a86b-442f-ab8e-25d44b9bbe24",
"name": "付箋1",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
-600
],
"parameters": {
"color": 6,
"width": 500,
"height": 1020,
"content": "🧠 Section 2: AI Analysis – CFO Reasoning Engine\n2. CFO Expense Review Agent\n(AI Agent - Tools Agent)\n\nPurpose: Acts as a virtual CFO. It receives the expense data and reasons through the submission using a language model.\n\nConnected To: OpenAI GPT-4 Model and Structured Output Parser\n\n3. OpenAI GPT-4 Model\n(OpenAI Chat Model)\n\nPurpose: Powers the logic behind the CFO's decision-making.\n\nPrompt Format: Given structured context about the expense, it determines whether it should be flagged and explains why.\n\n4. Parse CFO Agent Response\n(Structured Output Parser)\n\nPurpose: Transforms the unstructured response from GPT into a clean JSON object.\n\nOutput: Fields like decision, reason, amount, submitted_by, category, etc., which can be used for downstream processing.\n\n🧩 This section gives intelligence to the system, allowing it to make smart and explainable decisions."
},
"typeVersion": 1
},
{
"id": "66201323-99aa-4d5e-ab1d-afcc3951e271",
"name": "付箋2",
"type": "n8n-nodes-base.stickyNote",
"position": [
920,
-740
],
"parameters": {
"color": 7,
"width": 580,
"height": 1320,
"content": "🧬 Section 3: Audit Trail – Embedding & Storage\n5. Prepare Data for Pinecone\n(Default Data Loader)\n\nPurpose: Loads the document (usually the reasoning or description) for embedding.\n\nInput: Reasoning text or metadata generated by the AI agent.\n\n6. Split Reasoning Text\n(Recursive Character Text Splitter)\n\nPurpose: Splits long reasoning content into smaller chunks (if needed) to fit OpenAI embedding limits.\n\n7. Generate Embeddings\n(Embeddings OpenAI)\n\nPurpose: Converts the textual reasoning into a vector representation using OpenAI's embedding model.\n\n8. Store Decision in Pinecone\n(Pinecone Vector Store)\n\nPurpose: Saves the embedded vector along with metadata like decision, amount, and reason.\n\nGoal: Creates a searchable, auditable archive of past decisions for future reference and pattern learning.\n\n🧾 This section builds a scalable memory system for compliance and insights over time."
},
"typeVersion": 1
},
{
"id": "117ba355-f8cd-465d-bbe6-1b37261f4640",
"name": "付箋3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1600,
-340
],
"parameters": {
"color": 3,
"width": 300,
"height": 540,
"content": "✅ Section 4: Output – Updating Records\n9. Update Airtable Record\n(Airtable Update Node)\n\nPurpose: Writes the final decision (Approved or Flagged) and the reasoning back to the original Airtable record.\n\nFields Updated: Status, Reason, and optionally an ReviewedAt timestamp.\n\n📥 Ensures that Airtable remains the source of truth, visibly updated with the CFO agent’s input."
},
"typeVersion": 1
},
{
"id": "e379569e-98b3-47d6-b60d-9faa1babdf1d",
"name": "付箋9",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1880,
-500
],
"parameters": {
"color": 4,
"width": 1300,
"height": 320,
"content": "=======================================\n WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n - YouTube: https://www.youtube.com/@YaronBeen/videos\n - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"
},
"typeVersion": 1
},
{
"id": "ec9af853-11be-4651-9978-c9f2f9a120ae",
"name": "付箋4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1880,
-160
],
"parameters": {
"color": 4,
"width": 1289,
"height": 2258,
"content": "## 📊 **CFO Expense Approval Workflow Overview**\n\nThis workflow automates the process of monitoring, analyzing, and auditing expense requests using Airtable, OpenAI, and Pinecone. It is organized into the following four sections:\n\n---\n\n## 🔁 **Section 1: Intake – Monitoring Expense Requests**\n\n### 1. **Watch New Expense Requests**\n\n**(Airtable Trigger)**\n\n* **Purpose:** Continuously monitors the Airtable `Expenses` table for new or updated entries with `Status = Pending`.\n* **What it does:** Triggers the entire workflow when a new expense is submitted or an existing one is updated for review.\n\n> 💡 Ensures real-time detection of incoming requests that need analysis.\n\n---\n\n## 🧠 **Section 2: AI Analysis – CFO Reasoning Engine**\n\n### 2. **CFO Expense Review Agent**\n\n**(AI Agent - Tools Agent)**\n\n* **Purpose:** Acts as a virtual CFO. It receives the expense data and reasons through the submission using a language model.\n* **Connected To:** OpenAI GPT-4 Model and Structured Output Parser\n\n### 3. **OpenAI GPT-4 Model**\n\n**(OpenAI Chat Model)**\n\n* **Purpose:** Powers the logic behind the CFO's decision-making.\n* **Prompt Format:** Given structured context about the expense, it determines whether it should be flagged and explains why.\n\n### 4. **Parse CFO Agent Response**\n\n**(Structured Output Parser)**\n\n* **Purpose:** Transforms the unstructured response from GPT into a clean JSON object.\n* **Output:** Fields like `decision`, `reason`, `amount`, `submitted_by`, `category`, etc., which can be used for downstream processing.\n\n> 🧩 This section gives intelligence to the system, allowing it to make smart and explainable decisions.\n\n---\n\n## 🧬 **Section 3: Audit Trail – Embedding & Storage**\n\n### 5. **Prepare Data for Pinecone**\n\n**(Default Data Loader)**\n\n* **Purpose:** Loads the document (usually the reasoning or description) for embedding.\n* **Input:** Reasoning text or metadata generated by the AI agent.\n\n### 6. **Split Reasoning Text**\n\n**(Recursive Character Text Splitter)**\n\n* **Purpose:** Splits long reasoning content into smaller chunks (if needed) to fit OpenAI embedding limits.\n\n### 7. **Generate Embeddings**\n\n**(Embeddings OpenAI)**\n\n* **Purpose:** Converts the textual reasoning into a vector representation using OpenAI's embedding model.\n\n### 8. **Store Decision in Pinecone**\n\n**(Pinecone Vector Store)**\n\n* **Purpose:** Saves the embedded vector along with metadata like decision, amount, and reason.\n* **Goal:** Creates a searchable, auditable archive of past decisions for future reference and pattern learning.\n\n> 🧾 This section builds a scalable **memory system** for compliance and insights over time.\n\n---\n\n## ✅ **Section 4: Output – Updating Records**\n\n### 9. **Update Airtable Record**\n\n**(Airtable Update Node)**\n\n* **Purpose:** Writes the final decision (`Approved` or `Flagged`) and the reasoning back to the original Airtable record.\n* **Fields Updated:** `Status`, `Reason`, and optionally an `ReviewedAt` timestamp.\n\n> 📥 Ensures that Airtable remains the **source of truth**, visibly updated with the CFO agent’s input.\n"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "40c83424-4fdd-4bd8-84fc-4418bdbaf450",
"connections": {
"e53c34b4-fe86-4c70-ad90-e61ec4f8c72b": {
"ai_languageModel": [
[
{
"node": "8e0fa6f3-df8c-42b6-af2a-f2cfb25f1e6d",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"5a80d379-907e-43c0-946e-fc82be36c288": {
"ai_embedding": [
[
{
"node": "1cba2b01-faeb-44ce-97e3-b3ada02ce748",
"type": "ai_embedding",
"index": 0
}
]
]
},
"2484db3c-bef8-4b0e-a324-116dc70644a9": {
"ai_textSplitter": [
[
{
"node": "50c1a961-cc58-4b6a-bf46-da0925b617e2",
"type": "ai_textSplitter",
"index": 0
}
]
]
},
"8e0fa6f3-df8c-42b6-af2a-f2cfb25f1e6d": {
"main": [
[
{
"node": "1cba2b01-faeb-44ce-97e3-b3ada02ce748",
"type": "main",
"index": 0
}
]
]
},
"a561418a-2ef0-44bb-9683-ba239d58a3af": {
"ai_outputParser": [
[
{
"node": "8e0fa6f3-df8c-42b6-af2a-f2cfb25f1e6d",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"50c1a961-cc58-4b6a-bf46-da0925b617e2": {
"ai_document": [
[
{
"node": "1cba2b01-faeb-44ce-97e3-b3ada02ce748",
"type": "ai_document",
"index": 0
}
]
]
},
"1cba2b01-faeb-44ce-97e3-b3ada02ce748": {
"main": [
[
{
"node": "cd1a7b50-edd7-400a-8fc8-ff237492749b",
"type": "main",
"index": 0
}
]
]
},
"7fec5e7c-abea-4caf-b8e2-718e7abc44ef": {
"main": [
[
{
"node": "8e0fa6f3-df8c-42b6-af2a-f2cfb25f1e6d",
"type": "main",
"index": 0
}
]
]
}
}
}よくある質問
このワークフローの使い方は?
上記のJSON設定コードをコピーし、n8nインスタンスで新しいワークフローを作成して「JSONからインポート」を選択、設定を貼り付けて認証情報を必要に応じて変更してください。
このワークフローはどんな場面に適していますか?
中級 - 人工知能, IT運用
有料ですか?
このワークフローは完全無料です。ただし、ワークフローで使用するサードパーティサービス(OpenAI APIなど)は別途料金が発生する場合があります。
関連ワークフロー
COOタスク優先順位付け
GPT-4とPinecone Memoryを基盤としたAI駆動のAsanaタスク優先順位付け
Asana
Postgres
Agent
+
Asana
Postgres
Agent
15 ノードYaron Been
人工知能
Chief Financial Officer 予測エージェント
Stripeデータに基づくGPT-4とGoogleスプレッドシートによる自動化された収入予測
Set
Code
Stripe
+
Set
Code
Stripe
16 ノードYaron Been
人工知能
ドキュメントベースのメモリを持つチャットボット:OpenAI、Pinecone、Google Driveを使用
メモリ機能付きドキュメントベースのチャットボット:OpenAI、Pinecone、Google Drive
Merge
Airtable
Aggregate
+
Merge
Airtable
Aggregate
22 ノードSally
人工知能
インスタントRAGビルダー
Google Drive、OpenAI GPT-4o-mini、Pineconeを使ってRAGシステムの構築と照会
Google Drive
Agent
Google Drive Trigger
+
Google Drive
Agent
Google Drive Trigger
12 ノードDavid Olusola
エンジニアリング
AI スマートアシスタント: Supabase ストレージと Google Drive ファイルとの対話
AIワンチャットボット:SupabaseストレージとGoogle Driveのファイルと対話
If
Set
Wait
+
If
Set
Wait
62 ノードMark Shcherbakov
エンジニアリング
Supabase ストレージ内のファイルと対話する AI エージェント
Supabaseストレージ内のファイルと対話するAIエージェント
If
Merge
Switch
+
If
Merge
Switch
33 ノードMark Shcherbakov
エンジニアリング
ワークフロー情報
難易度
中級
ノード数15
カテゴリー2
ノードタイプ10
作成者
Yaron Been
@yaron-nofluffBuilding AI Agents and Automations | Growth Marketer | Entrepreneur | Book Author & Podcast Host If you need any help with Automations, feel free to reach out via linkedin: https://www.linkedin.com/in/yaronbeen/ And check out my Youtube channel: https://www.youtube.com/@YaronBeen/videos
外部リンク
n8n.ioで表示 →
このワークフローを共有