AutomationFlowsAI & RAG › Ai-powered Reservation Reminder Calls for Restaurant with Twilio & Grok-4

Ai-powered Reservation Reminder Calls for Restaurant with Twilio & Grok-4

ByDavide Boizza @n3witalia on n8n.io

🤖📞 This workflow automates the process of calling customers to remind them of their booking reservations using AI-generated messages and a Twilio phone number. It can easily be adapted for other venues.

Event trigger★★★★☆ complexityAI-powered12 nodesAgentOpenRouter ChatGoogle SheetsTwilio
AI & RAG Trigger: Event Nodes: 12 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #6135 — we link there as the canonical source.

This workflow follows the Agent → Google Sheets recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "qO5iIv005Wh8MNjr",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "AI-Powered Reservation Reminder Calls with Twilio",
  "tags": [],
  "nodes": [
    {
      "id": "7f2c26e5-a2da-44c5-8ec3-bc23a2893d14",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        176,
        1088
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "cfdab910-984d-49bb-9835-03486d5fa4d9",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        176,
        912
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 11
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "2345492b-8fa2-4fcc-8756-33da030bc6a2",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        464
      ],
      "parameters": {
        "width": 680,
        "height": 224,
        "content": "## STEP 1\n\nRegister to Twilio and buy a phone number\n- Set the [text-to-speach](https://console.twilio.com/us1/develop/voice/settings/text-to-speech) language\n- Set the [geo permissions](https://console.twilio.com/us1/develop/voice/settings/geo-permissions)\n- Set up the Twilio node\n- Set up the sender in the field \"From\""
      },
      "typeVersion": 1
    },
    {
      "id": "c31a610e-5c11-43c1-ba93-aef36f4b9730",
      "name": "Secretary Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        928,
        992
      ],
      "parameters": {
        "text": "=Details booking appointment:\nName: {{ $json.NAME }}\nTime: {{ $json.TIME }}\nN. People: {{ $json['N. PEOPLE'] }}",
        "options": {
          "systemMessage": "=You are the secretary of the restaurant \"Bella Napoli\" and your task is to create a conversation for a phone call to remind a customer about their reservation today. You will be provided with the reservation name, time, and number of people.\n\nHere are the details of the reservation:\n<reservation>\nName: {{ $json.NAME }}\nTime: {{ $json.TIME }}\nN. People: {{ $json['N. PEOPLE'] }}\n</reservation>\n\nCreate a polite and friendly conversation for the phone call. The conversation should include:\n1. A greeting and introduction\n2. A reminder of the reservation details (name, time, number of people)\n\nOnly Write the message without any tags.\n\nHere's an example of how your output should be structured:\n\nGood morning, Mr. Paolo. I'm the secretary at Bella Napoli restaurant. I'm calling to remind you of your reservation for today at 8:00 PM for four people. Have a nice day!\n\nRemember to use the provided reservation details in your conversation. Create a natural and friendly message that a real restaurant secretary might have with a customer."
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.8
    },
    {
      "id": "bacd0bad-93be-4643-b76d-a232372d8652",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        640,
        976
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "568a49f4-653f-45e1-8515-22742ac0f18a",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        1424,
        1200
      ],
      "parameters": {
        "unit": "minutes",
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "f3b319f4-8c5e-4ef9-b633-bcefa9a1bb04",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        720
      ],
      "parameters": {
        "width": 688,
        "height": 128,
        "content": "## STEP 2\n- Clone this [Google Sheet](https://docs.google.com/spreadsheets/d/1lQh-199bQe-HKwmVI_6cS-Xv1OiGo1B4-OpR6kbNg7E/edit?usp=sharing)\n- Remember that the Phone field must contain the international prefix without the \"+\" character."
      },
      "typeVersion": 1
    },
    {
      "id": "c4a2fcfb-0875-4607-a874-0b34d4f24785",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        144,
        256
      ],
      "parameters": {
        "color": 3,
        "width": 672,
        "content": "## AI-Powered Reservation Reminder Calls with Twilio\n\nThis workflow automates the process of calling customers to **remind them of their booking reservations** using AI-generated messages and a **Twilio** phone number. It can easily be adapted for other venues"
      },
      "typeVersion": 1
    },
    {
      "id": "7ed94873-766a-43a3-82f4-882b3d482e83",
      "name": "Grok 4",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        896,
        1200
      ],
      "parameters": {
        "model": "x-ai/grok-4",
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "2142042a-0d66-4053-8c6c-a6008b269e8d",
      "name": "Get daily reservations",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        432,
        976
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupColumn": "CALLED"
            },
            {
              "lookupValue": "={{ $now.format('yyyy-LL-dd') }}",
              "lookupColumn": "DATE"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1lQh-199bQe-HKwmVI_6cS-Xv1OiGo1B4-OpR6kbNg7E/edit#gid=0",
          "cachedResultName": "Foglio1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1lQh-199bQe-HKwmVI_6cS-Xv1OiGo1B4-OpR6kbNg7E",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1lQh-199bQe-HKwmVI_6cS-Xv1OiGo1B4-OpR6kbNg7E/edit?usp=drivesdk",
          "cachedResultName": "Booking appointments"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "80d0ebf7-0e19-452b-ad25-993e77ced577",
      "name": "Make a call",
      "type": "n8n-nodes-base.twilio",
      "position": [
        1424,
        992
      ],
      "parameters": {
        "to": "=+{{ $('Get daily reservations').item.json.PHONE }}",
        "from": "+177526xxxxxx",
        "twiml": true,
        "message": "=<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Response>\n  <Say voice=\"alice\" language=\"it-IT\">\n    {{ $json.output }}\n  </Say>\n</Response>\n",
        "options": {},
        "resource": "call"
      },
      "credentials": {
        "twilioApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "fadf15c5-c652-4ec2-9e21-0a61f4046532",
      "name": "Update reservation",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1104,
        1200
      ],
      "parameters": {
        "columns": {
          "value": {
            "CALLED": "x",
            "row_number": "={{ $('Get daily reservations').item.json.row_number }}"
          },
          "schema": [
            {
              "id": "DATE",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "DATE",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "TIME",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "TIME",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "NAME",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "NAME",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "N. PEOPLE",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "N. PEOPLE",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "PHONE",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "PHONE",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "CALLED",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "CALLED",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "row_number"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1lQh-199bQe-HKwmVI_6cS-Xv1OiGo1B4-OpR6kbNg7E/edit#gid=0",
          "cachedResultName": "Foglio1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1lQh-199bQe-HKwmVI_6cS-Xv1OiGo1B4-OpR6kbNg7E",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1lQh-199bQe-HKwmVI_6cS-Xv1OiGo1B4-OpR6kbNg7E/edit?usp=drivesdk",
          "cachedResultName": "Booking appointments"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "dda55711-3ade-40ea-bddf-618aa56f6650",
  "connections": {
    "Wait": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Grok 4": {
      "ai_languageModel": [
        [
          {
            "node": "Secretary Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Make a call": {
      "main": [
        [
          {
            "node": "Update reservation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Secretary Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Secretary Agent": {
      "main": [
        [
          {
            "node": "Make a call",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get daily reservations",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update reservation": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get daily reservations": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Get daily reservations",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

🤖📞 This workflow automates the process of calling customers to remind them of their booking reservations using AI-generated messages and a Twilio phone number. It can easily be adapted for other venues.

Source: https://n8n.io/workflows/6135/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This workflow transforms your Telegram bot into an intelligent creative assistant. It can chat conversationally, fetch trending image prompts from PromptHero for inspiration, or perform a deep "remix"

Telegram Trigger, Output Parser Structured, Telegram +6
AI & RAG

This workflow is designed for marketers, content creators, agencies, and solo founders who want to publish long‑form posts with visuals on autopilot using n8n and AI agents. ​

Tool Http Request, Agent, HTTP Request +27
AI & RAG

🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.

Output Parser Structured, HTTP Request, OpenAI +10
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Output Parser Structured, Telegram, N8N Nodes Tesseractjs +14
AI & RAG

YouTube Strategist. Uses formTrigger, splitOut, splitInBatches, agent. Event-driven trigger; 50 nodes.

Form Trigger, Agent, OpenRouter Chat +5