8
n8n 中文网amn8n.com

通过Excel和VAPI语音助手实现餐厅营销与预订自动化

中级

这是一个Lead Nurturing, AI Chatbot领域的自动化工作流,包含 11 个节点。主要使用 Set, Code, Webhook, HttpRequest, GoogleSheets 等节点。 使用Excel、VAPI语音助手和日历自动化餐厅营销与预订

前置要求
  • HTTP Webhook 端点(n8n 会自动生成)
  • 可能需要目标 API 的认证凭证
  • Google Sheets API 凭证
工作流预览
可视化展示节点连接关系,支持缩放和平移
导出工作流
复制以下 JSON 配置到 n8n 导入,即可使用此工作流
{
  "id": "iD8sbZKww1NpC3At",
  "meta": {
    "instanceId": "dd69efaf8212c74ad206700d104739d3329588a6f3f8381a46a481f34c9cc281",
    "templateCredsSetupCompleted": true
  },
  "name": "通过 Excel 和 VAPI 语音助手实现餐厅营销与预订自动化",
  "tags": [],
  "nodes": [
    {
      "id": "61f3ed14-9be9-42bb-ac7b-90072005ebc1",
      "name": "新潜在客户触发器(Excel)",
      "type": "n8n-nodes-base.googleSheetsTrigger",
      "position": [
        -20,
        -220
      ],
      "parameters": {
        "event": "rowAdded",
        "options": {},
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1760068917,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1mkHJIhSFXdh1n65GKPwzEzFw0QasunyYm9BDglnXeiI/edit#gid=1760068917",
          "cachedResultName": "call_list"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1mkHJIhSFXdh1n65GKPwzEzFw0QasunyYm9BDglnXeiI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1mkHJIhSFXdh1n65GKPwzEzFw0QasunyYm9BDglnXeiI/edit?usp=drivesdk",
          "cachedResultName": "Vapi_real-estate"
        }
      },
      "credentials": {
        "googleSheetsTriggerOAuth2Api": {
          "id": "BoDTTv5L67GVL3Fi",
          "name": "Google Sheets  - test"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "de15cc25-830d-4efe-9265-685eef529094",
      "name": "准备潜在客户数据",
      "type": "n8n-nodes-base.set",
      "position": [
        200,
        -220
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a10873fa-0c01-46ed-a364-d31200e44e76",
              "name": "Phone",
              "type": "string",
              "value": "=+{{ $json.Phone }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "22384d76-3c0d-4d3b-9e85-4e9d6a005e7f",
      "name": "循环处理潜在客户",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        420,
        -220
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "eea1ca56-260e-4f81-980a-6f2dd46e0667",
      "name": "启动营销呼叫(VAPI)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        640,
        -220
      ],
      "parameters": {
        "url": "https://api.vapi.ai/call",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"assistantId\": \"add_id_here\",\n  \"phoneNumberId\": \"add_id_here\",\n  \"customers\": [\n    {\n      \"number\":\"{{ $json.Phone }}\"\n    }\n  ]\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "id": "JzfcNGi2NYJB6wll",
          "name": "Bearer Auth account"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "9addff6d-2a29-4f02-94a8-d76406987569",
      "name": "VAPI 呼叫响应 Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -20,
        40
      ],
      "webhookId": "a34ac7ac-7ea4-4942-8dbf-f9ce3f0986e4",
      "parameters": {
        "path": "a34ac7ac-7ea4-4942-8dbf-f9ce3f0986e4",
        "options": {},
        "httpMethod": "POST",
        "responseMode": "responseNode"
      },
      "typeVersion": 2
    },
    {
      "id": "9797586c-4313-4ce1-b58b-ec3e31cb705e",
      "name": "存储用户响应(表格)",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        200,
        40
      ],
      "parameters": {
        "columns": {
          "value": {
            "next_step": "={{ $json.body.message.toolCalls[0].function.arguments.next_step }}",
            "call_notes": "={{ $json.body.message.toolCalls[0].function.arguments.call_notes }}",
            "website_url": "={{ $json.body.message.toolCalls[0].function.arguments.website_url }}",
            "call_outcome": "={{ $json.body.message.toolCalls[0].function.arguments.call_outcome }}",
            "company_name": "={{ $json.body.message.toolCalls[0].function.arguments.company_name }}",
            "phone_number": "={{ $json.body.message.toolCalls[0].function.arguments.phone_number }}",
            "email_address": "={{ $json.body.message.toolCalls[0].function.arguments.email_address }}",
            "prospect_name": "={{ $json.body.message.toolCalls[0].function.arguments.prospect_name }}",
            "prospect_role": "={{ $json.body.message.toolCalls[0].function.arguments.prospect_role }}",
            "follow_up_date": "={{ $json.body.message.toolCalls[0].function.arguments.follow_up_date }}",
            "interest_level": "={{ $json.body.message.toolCalls[0].function.arguments.interest_level }}",
            "website_strength": "={{ $json.body.message.toolCalls[0].function.arguments.website_strength }}",
            "biggest_challenge": "={{ $json.body.message.toolCalls[0].function.arguments.biggest_challenge }}",
            "objections_raised": "={{ $json.body.message.toolCalls[0].function.arguments.objections_raised }}",
            "opt_out_requested": "={{ $json.body.message.toolCalls[0].function.arguments.opt_out_requested }}",
            "appointment_datetime": "={{ $json.body.message.toolCalls[0].function.arguments.appointment_datetime }}",
            "current_marketing_methods": "={{ $json.body.message.toolCalls[0].function.arguments.current_marketing_methods }}",
            "previous_digital_marketing": "={{ $json.body.message.toolCalls[0].function.arguments.previous_digital_marketing }}"
          },
          "schema": [
            {
              "id": "prospect_name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "prospect_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "prospect_role",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "prospect_role",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "company_name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "company_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "website_url",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "website_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "website_strength",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "website_strength",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "phone_number",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "phone_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "email_address",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "email_address",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "current_marketing_methods",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "current_marketing_methods",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "biggest_challenge",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "biggest_challenge",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "previous_digital_marketing",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "previous_digital_marketing",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "objections_raised",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "objections_raised",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "interest_level",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "interest_level",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "next_step",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "next_step",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "appointment_datetime",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "appointment_datetime",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "call_outcome",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "call_outcome",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "call_notes",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "call_notes",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "follow_up_date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "follow_up_date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "opt_out_requested",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "opt_out_requested",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "prospect_name"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1mkHJIhSFXdh1n65GKPwzEzFw0QasunyYm9BDglnXeiI/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1mkHJIhSFXdh1n65GKPwzEzFw0QasunyYm9BDglnXeiI",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1mkHJIhSFXdh1n65GKPwzEzFw0QasunyYm9BDglnXeiI/edit?usp=drivesdk",
          "cachedResultName": "Vapi_real-estate"
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "id": "ScSS2KxGQULuPtdy",
          "name": "Google Sheets- test"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "b5dbaaf8-c8e2-4dda-a3a0-862cf25bd659",
      "name": "提取预订/订单信息",
      "type": "n8n-nodes-base.code",
      "position": [
        420,
        40
      ],
      "parameters": {
        "jsCode": "function formatIST(date) {\n  const options = {\n    timeZone: 'Asia/Kolkata',\n    year: 'numeric',\n    month: '2-digit',\n    day: '2-digit',\n    hour: '2-digit',\n    minute: '2-digit',\n    second: '2-digit',\n    hour12: false\n  };\n  const parts = new Intl.DateTimeFormat('en-GB', options).formatToParts(date);\n  const lookup = {};\n  parts.forEach(p => lookup[p.type] = p.value);\n  return `${lookup.year}-${lookup.month}-${lookup.day} ${lookup.hour}:${lookup.minute}:${lookup.second} IST`;\n}\n\nfor (const item of items) {\n  let dateStr = item.json.date_input?.toLowerCase?.() || 'today';\n  let timeStr = item.json.time_input || '17:00'; // default to 5 PM\n\n  // Step 1: base date\n  let baseDate = new Date();\n  if (dateStr === 'tomorrow') {\n    baseDate.setDate(baseDate.getDate() + 1);\n  } else if (dateStr !== 'today') {\n    baseDate = new Date(dateStr);\n  }\n\n  // Step 2: parse time\n  const [timePart, ampm] = timeStr.trim().split(/ (AM|PM)/i);\n  let [hours, minutes] = timePart.split(':').map(Number);\n  if (ampm?.toLowerCase() === 'pm' && hours < 12) hours += 12;\n  if (ampm?.toLowerCase() === 'am' && hours === 12) hours = 0;\n\n  baseDate.setHours(hours, minutes || 0, 0, 0);\n\n  // Step 3: set IST formatted times\n  const startIST = formatIST(baseDate);\n  const endIST = formatIST(new Date(baseDate.getTime() + 60 * 60 * 1000)); // +1 hour\n\n  item.json.appointment_datetime_parsed = startIST;\n  item.json.appointment_end_datetime = endIST;\n}\n\nreturn items;\n"
      },
      "typeVersion": 2
    },
    {
      "id": "74ca51eb-c7c3-4965-839e-db0e80f8dc02",
      "name": "安排配送/餐桌预订",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        640,
        40
      ],
      "parameters": {
        "end": "={{ $json.appointment_end_datetime }}",
        "start": "={{ $json.appointment_datetime_parsed }}",
        "calendar": {
          "__rl": true,
          "mode": "id",
          "value": "abc@gmail.com"
        },
        "additionalFields": {}
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "6ldLmzzYtaqng4pw",
          "name": "Google Calendar account - test"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "d34f8054-9d1c-48fe-a6df-35e12a0d09a1",
      "name": "发送响应至 VAPI",
      "type": "n8n-nodes-base.respondToWebhook",
      "position": [
        860,
        40
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "f1a84630-df6e-4f6f-8633-b60a712bbd82",
      "name": "便签",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -80,
        -540
      ],
      "parameters": {
        "color": 3,
        "width": 980,
        "height": 520,
        "content": "## 潜在客户管理与营销自动化工作流"
      },
      "typeVersion": 1
    },
    {
      "id": "62f06ede-32ed-40fe-b40f-4887245e34f9",
      "name": "便签1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -140,
        0
      ],
      "parameters": {
        "width": 1240,
        "height": 500,
        "content": ""
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "timezone": "Asia/Kolkata",
    "callerPolicy": "workflowsFromSameOwner",
    "executionOrder": "v1"
  },
  "versionId": "dc998ee6-b2db-4413-8198-a94fc7ff539f",
  "connections": {
    "Prepare Lead Data": {
      "main": [
        [
          {
            "node": "Loop Through Leads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Through Leads": {
      "main": [
        [
          {
            "node": "Start Marketing Call (VAPI)",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Loop Through Leads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "New Lead Trigger (Excel)": {
      "main": [
        [
          {
            "node": "Prepare Lead Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Booking/Order Info": {
      "main": [
        [
          {
            "node": "Schedule Delivery/Table Booking",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "VAPI Call Response Webhook": {
      "main": [
        [
          {
            "node": "Store User Response (Sheet)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Store User Response (Sheet)": {
      "main": [
        [
          {
            "node": "Extract Booking/Order Info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Delivery/Table Booking": {
      "main": [
        [
          {
            "node": "Send Response to VAPI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
常见问题

如何使用这个工作流?

复制上方的 JSON 配置代码,在您的 n8n 实例中创建新工作流并选择「从 JSON 导入」,粘贴配置后根据需要修改凭证设置即可。

这个工作流适合什么场景?

中级 - 客户培育, AI 聊天机器人

需要付费吗?

本工作流完全免费,您可以直接导入使用。但请注意,工作流中使用的第三方服务(如 OpenAI API)可能需要您自行付费。

工作流信息
难度等级
中级
节点数量11
分类2
节点类型10
难度说明

适合有一定经验的用户,包含 6-15 个节点的中等复杂度工作流

作者
Oneclick AI Squad

Oneclick AI Squad

@oneclick-ai

The AI Squad Initiative is a pioneering effort to build, automate and scale AI-powered workflows using n8n.io. Our mission is to help individuals and businesses integrate AI agents seamlessly into their daily operations from automating tasks and enhancing productivity to creating innovative, intelligent solutions. We design modular, reusable AI workflow templates that empower creators, developers and teams to supercharge their automation with minimal effort and maximum impact.

外部链接
在 n8n.io 查看

分享此工作流