This workflow corresponds to n8n.io template #7545 — we link there as the canonical source.
This workflow follows the Google Calendar → HTTP Request 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 →
{
"id": "cmusYcLEtQLBks00",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Appointment Reminder Agent",
"tags": [],
"nodes": [
{
"id": "016deabc-cd94-41f8-8470-a4df03cb431c",
"name": "Set Config (Retell Setup)",
"type": "n8n-nodes-base.set",
"position": [
400,
-48
],
"parameters": {
"values": {
"string": [
{
"name": "from_number",
"value": "{{ YOUR_FROM_NUMBER }}"
},
{
"name": "agent_id",
"value": "{{ YOUR_AGENT_ID }}"
}
]
},
"options": {}
},
"typeVersion": 2
},
{
"id": "47ccb25c-e543-40d1-8155-18046a85d1d5",
"name": "Schedule Trigger (9 AM)",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-352,
-48
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 9
}
]
}
},
"typeVersion": 1.2
},
{
"id": "c0a5e52a-ced2-4bbc-b5f2-99b7989f8b7b",
"name": "Send Reminder Call ( Retell Api)",
"type": "n8n-nodes-base.httpRequest",
"position": [
640,
-48
],
"parameters": {
"url": "https://api.retellai.com/v2/create-phone-call",
"options": {},
"jsonBody": "={\n\"from_number\": \"{{ $json.from_number }}\",\n\"to_number\": \"{{ $json.phone }}\",\n\"retell_llm_dynamic_variables\": {\n \"name\": \"{{ $json.name }}\",\n \"phone_number\": \"{{ $json.phone }}\",\n \"reason\": \"{{ $json.reason }}\",\n \"start_time\": \"{{ $json.startTime }}\",\n \"end_time\": \"{{ $json.endTime }}\"\n},\n\"override_agent_id\": \"{{ $json.agent_id }}\"\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpCustomAuth": {
"name": "<your credential>"
},
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "8d90ec35-90b6-495d-89e9-c816ff9279ca",
"name": "Get Upcoming Events",
"type": "n8n-nodes-base.googleCalendar",
"position": [
-112,
-48
],
"parameters": {
"options": {},
"timeMax": "={{ $now.plus(12, 'hours') }}",
"calendar": {
"__rl": true,
"mode": "id",
"value": "={{ Your Calendar Email }}"
},
"operation": "getAll",
"returnAll": true
},
"credentials": {
"googleCalendarOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "35fa6c4b-6298-4823-8368-e1153fe4740b",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-416,
-208
],
"parameters": {
"color": 3,
"width": 208,
"height": 320,
"content": "This node triggers the workflow every day at 9 AM.\nYou can change the trigger time in the settings if you want calls at a different hour.\n"
},
"typeVersion": 1
},
{
"id": "acb7fd45-ea35-47c2-a69f-b60ee1f98525",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-192,
-288
],
"parameters": {
"color": 5,
"height": 400,
"content": "This node fetches all events from your Google Calendar in the next 12 hours.\nReplace the calendar email with your own calendar.\nMake sure your Google Calendar OAuth2 credential is connected.\n"
},
"typeVersion": 1
},
{
"id": "b621211c-c65b-4dbb-b1d9-b5437a1b1e09",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
64,
-352
],
"parameters": {
"height": 464,
"content": "This Code node extracts:\n- Name\n- Phone number\n- Reason\n- Start and End time\n\n\u27a1\ufe0f These fields must be present in the Google Calendar event description.\n\u27a1\ufe0f Example description format:\nName: John Doe\nPhone Number: +14155552671\nReason: Consultation\n"
},
"typeVersion": 1
},
{
"id": "d890a065-3c77-4252-a0cb-a90e38d9a17c",
"name": "Extract Appointment Details",
"type": "n8n-nodes-base.code",
"position": [
144,
-48
],
"parameters": {
"jsCode": "return items.flatMap(item => {\n const description = item.json.description || \"\";\n\n // Normalize newlines\n const cleaned = description.replace(/\\r?\\n/g, '\\n').trim();\n\n // Split bookings by empty lines (double newline or similar)\n const bookings = cleaned.split(/\\n\\s*\\n/);\n\n return bookings.map(booking => {\n const flat = booking.replace(/\\n/g, ' ').replace(/\\s{2,}/g, ' ');\n\n const nameMatch = flat.match(/Name:\\s*(.+?)(?=\\s+[A-Za-z]+:|$)/i);\n const emailMatch = flat.match(/Email:\\s*(.+?)(?=\\s+[A-Za-z]+:|$)/i);\n const phoneMatch = flat.match(/Phone Number:\\s*(.+?)(?=\\s+[A-Za-z]+:|$)/i);\n const reasonMatch = flat.match(/Reason:\\s*(.+?)(?=\\s+[A-Za-z]+:|$)/i);\n\n return {\n json: {\n name: nameMatch ? nameMatch[1].trim() : \"\",\n email: emailMatch ? emailMatch[1].trim() : \"\",\n phone: phoneMatch ? phoneMatch[1].trim() : \"\",\n reason: reasonMatch ? reasonMatch[1].trim() : \"\",\n startTime: item.json.start?.dateTime || \"\",\n endTime: item.json.end?.dateTime || \"\"\n }\n };\n });\n});\n"
},
"typeVersion": 2
},
{
"id": "171d92a8-f4b7-4cd7-8ff2-fa60342983d2",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
-304
],
"parameters": {
"color": 4,
"height": 416,
"content": "This node stores your Retell setup:\n- from_number (your registered Retell number)\n- agent_id (your Retell agent ID)\n\n\u27a1\ufe0f Update these values before using the workflow.\n\u27a1\ufe0f They will be passed to the Retell API.\n"
},
"typeVersion": 1
},
{
"id": "da1d2978-d402-4524-ac5a-91834b44846b",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
576,
-304
],
"parameters": {
"color": 6,
"height": 416,
"content": "This node sends the API request to Retell AI to make the phone call.\n\n-It uses your Retell API key stored in n8n credentials.\n-Do NOT hardcode your API key \u2014 always use credentials.\n-The call includes dynamic variables: name, phone, reason, start_time, end_time.\n"
},
"typeVersion": 1
},
{
"id": "f3b6d02b-d978-43ae-b7da-21e439e33779",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
864,
-400
],
"parameters": {
"color": 2,
"width": 544,
"height": 736,
"content": "## Appointment Reminder Agent\n\n### Who's it for\nBusinesses, clinics, and service providers who want to automate **phone call reminders** for upcoming appointments.\n\n### How it works\nThis workflow:\n1. Runs daily at 9 AM (can be changed).\n2. Pulls upcoming events from Google Calendar.\n3. Extracts details (name, phone, reason, time).\n4. Calls the customer using Retell AI\u2019s API.\n\n### How to set up\n1. Add your **Retell API key** in n8n credentials (do not hardcode).\n2. Add your **Google Calendar account** in credentials.\n3. Update the `from_number` (your Retell-registered number).\n4. Update the `agent_id` (your Retell agent ID).\n5. Ensure phone numbers are in **E.164 format** (e.g. `+14155552671`).\n\n### Requirements\n- Retell AI account + API key \n- Registered Retell phone number \n- Google Calendar account \n\n### How to customize\n- Adjust trigger time. \n- Add logging (Google Sheets / Airtable). \n- Modify Retell agent script for different appointment types. \n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "fe292d57-7b18-44cc-9ad6-e9474c2208a2",
"connections": {
"Get Upcoming Events": {
"main": [
[
{
"node": "Extract Appointment Details",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger (9 AM)": {
"main": [
[
{
"node": "Get Upcoming Events",
"type": "main",
"index": 0
}
]
]
},
"Set Config (Retell Setup)": {
"main": [
[
{
"node": "Send Reminder Call ( Retell Api)",
"type": "main",
"index": 0
}
]
]
},
"Extract Appointment Details": {
"main": [
[
{
"node": "Set Config (Retell Setup)",
"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.
googleCalendarOAuth2ApihttpCustomAuthhttpHeaderAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Appointment Reminder Agent automates phone call reminders for upcoming appointments by seamlessly connecting Google Calendar with Retell AI. This powerful workflow is designed to help businesses, clinics, and service providers ensure clients never miss their scheduled…
Source: https://n8n.io/workflows/7545/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This n8n template transforms your daily meeting preparation by automatically researching attendees and generating comprehensive briefing documents. Every weekday morning, it analyzes your calendar eve
This workflow automatically researches your meeting attendees every morning and sends you a comprehensive brief in Slack with context about who you're meeting, their company, and key talking points. S
Who’s it for This template is ideal for busy professionals, students, or anyone with a dynamic schedule who wants to optimize their brief periods of free time. If you frequently find yourself with une
This automated disaster response workflow streamlines emergency management by monitoring multiple alert sources and coordinating property protection teams. Designed for property managers, insurance co
Author: Hyrum Hurst, AI Automation Engineer at QuarterSmart Contact: hyrum@quartersmart.com