AutomationFlowsData & Sheets › Reschedule Calendar Appointments with Google Sheets and Google Calendar

Reschedule Calendar Appointments with Google Sheets and Google Calendar

ByMD Faizan Uzzaman @buildwithfaizan on n8n.io

This workflow is triggered by another n8n workflow to reschedule an existing appointment by looking up the current booking in Google Sheets, validating the requested new slot via a sub-workflow, and updating the event in Google Calendar with the new date/time and service…

Event trigger★★★★☆ complexity22 nodesGoogle SheetsGoogle CalendarExecute Workflow Trigger
Data & Sheets Trigger: Event Nodes: 22 Complexity: ★★★★☆ Added:
Reschedule Calendar Appointments with Google Sheets and Google Calendar — n8n workflow card showing Google Sheets, Google Calendar, Execute Workflow Trigger integration

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

This workflow follows the Execute Workflow Trigger → 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": "6LpWrUPBXJgDuxH7",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Reschedule Appointment open-source-01",
  "tags": [
    {
      "id": "oufe6ROEtWIl02g4",
      "name": "open-source",
      "createdAt": "2026-06-25T18:55:08.441Z",
      "updatedAt": "2026-07-13T19:25:56.333Z"
    }
  ],
  "nodes": [
    {
      "id": "e2b1c3bc-15ff-4bd7-9dea-ef5429553630",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2224,
        4576
      ],
      "parameters": {
        "width": 720,
        "height": 896,
        "content": "## Reschedule Appointment open-source-01\n\n### How it works\n\nThis workflow is called by another workflow to reschedule an existing appointment. It looks up the appointment in Google Sheets, validates that it exists, builds the requested new time slot, checks availability through a sub-workflow, and updates the Google Calendar event when the slot is free. It returns status fields for success, not-found, unavailable-slot, and error cases, and can trigger follow-up background/error workflows.\n\n### Setup steps\n\n- Configure the Google Sheets credential and sheet/range used by the \"GET Event Id\" node so it can find the existing appointment and event ID.\n- Configure the Google Calendar credential and calendar/event fields in the \"Update an event\" node.\n- Ensure the called sub-workflows exist and are active: \"Check Slot Availability\", \"Error Workflow\", and \"Background Workflow\".\n- Verify the incoming data from the parent workflow includes the appointment identifier and requested reschedule date/time fields expected by the set and lookup nodes.\n\n### Customization\n\nAdjust the slot start/end calculation, appointment lookup criteria, success/error response fields, or background follow-up actions to match your scheduling rules and customer notification process."
      },
      "typeVersion": 1
    },
    {
      "id": "f1477686-e4a2-4e07-a74d-ef64214fb709",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1024,
        4672
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 640,
        "content": "## Validate appointment record\n\nChecks whether the appointment lookup found a record, prepares the new slot boundaries if it exists, or returns an appointment-not-found message if it does not."
      },
      "typeVersion": 1
    },
    {
      "id": "dc654fae-2670-44a9-bb2a-ce785e7a5885",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -416,
        4704
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 528,
        "content": "## Check slot availability\n\nCalls the availability-check sub-workflow, evaluates the result, and produces an unavailable-slot response when the requested time is already taken."
      },
      "typeVersion": 1
    },
    {
      "id": "11fdbaa0-e6b2-4e41-8cec-7dbffc5f0fe6",
      "name": "Check Slot Availability",
      "type": "n8n-nodes-base.if",
      "position": [
        -128,
        4944
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e9522f95-5f9c-4522-b6db-139e8c4ebe0f",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.available === true }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "81612899-6bf4-46ba-910a-65f2237ab690",
      "name": "Invoke Error Workflow",
      "type": "n8n-nodes-base.executeWorkflow",
      "disabled": true,
      "position": [
        656,
        4272
      ],
      "parameters": {
        "options": {
          "waitForSubWorkflow": false
        },
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "bQdno8qQgpKWbiDE",
          "cachedResultUrl": "/workflow/bQdno8qQgpKWbiDE",
          "cachedResultName": "Error Workflow"
        },
        "workflowInputs": {
          "value": {
            "resolved": "No",
            "node_name": "={{ $json.error }}",
            "timestamp": "={{ $now.toISO() }}",
            "error_type": "={{ $json.error }}",
            "execution_id": "={{ $execution.id }}",
            "patient_name": "={{ $('Read Event ID from Sheets').first()?.json?.name ?? 'Unknown' }}",
            "service_type": "={{ $('When Executed by Another Workflow').item.json.new_service_type }}",
            "patient_phone": "={{ $('When Executed by Another Workflow').item.json.phone }}",
            "workflow_name": "={{ $workflow.name }}",
            "preferred_date": "={{ $('When Executed by Another Workflow').item.json.new_date }}",
            "preferred_time": "={{ $('When Executed by Another Workflow').item.json.new_time }}"
          },
          "schema": [
            {
              "id": "workflow_name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "workflow_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "node_name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "node_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "error_type",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "error_type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "patient_name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "patient_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "patient_phone",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "patient_phone",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "service_type",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "service_type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "preferred_date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "preferred_date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "preferred_time",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "preferred_time",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "timestamp",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "execution_id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "execution_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "resolved",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "resolved",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "c750a26c-bab2-4844-b4b3-69ee806d2faf",
      "name": "Invoke Slot Check Workflow",
      "type": "n8n-nodes-base.executeWorkflow",
      "position": [
        -352,
        4944
      ],
      "parameters": {
        "options": {
          "waitForSubWorkflow": true
        },
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "AQhWv6s3ouxoTLPI",
          "cachedResultUrl": "/workflow/AQhWv6s3ouxoTLPI",
          "cachedResultName": "Check Slot Availability"
        },
        "workflowInputs": {
          "value": {
            "preferred_date": "={{ $('When Executed by Another Workflow').item.json.new_date }}",
            "preferred_time": "={{ $('When Executed by Another Workflow').item.json.new_time }}"
          },
          "schema": [
            {
              "id": "preferred_date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "preferred_date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "preferred_time",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "preferred_time",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "1726d17c-8076-40a0-8e99-fef5de4d2d00",
      "name": "Read Event ID from Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueErrorOutput",
      "position": [
        -1216,
        4880
      ],
      "parameters": {
        "options": {
          "returnFirstMatch": true
        },
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $json.preferred_date }}",
              "lookupColumn": "preferred_date"
            },
            {
              "lookupValue": "={{ $json.preferred_time }}",
              "lookupColumn": "preferred_time"
            },
            {
              "lookupValue": "Booked",
              "lookupColumn": "status"
            },
            {
              "lookupValue": "={{ $json.phone.replace('+','') }}",
              "lookupColumn": "phone"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit#gid=0",
          "cachedResultName": "Appointment_Sheet"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID/edit?usp=drivesdk",
          "cachedResultName": "VAPI AI Receptionist"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.7,
      "alwaysOutputData": true
    },
    {
      "id": "ace5a4f8-baa7-4e9d-b90b-f538e11c3065",
      "name": "Check Appointment Existence",
      "type": "n8n-nodes-base.if",
      "position": [
        -976,
        5008
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "f0fab72b-c87d-4c3e-ad52-62fff77970ed",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.event_id }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "b53666f1-5c2e-4e19-8ce4-402712a51f2b",
      "name": "Set Slot Timing",
      "type": "n8n-nodes-base.set",
      "position": [
        -752,
        4944
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "fd936412-e8ed-45b2-9842-9fccc73da593",
              "name": "start",
              "type": "string",
              "value": "={{ $('When Executed by Another Workflow').item.json.new_date }}T{{ $('When Executed by Another Workflow').item.json.new_time }}"
            },
            {
              "id": "3cda2a1b-6a47-452e-9840-93fffbda80f3",
              "name": "end",
              "type": "string",
              "value": "={{ $('When Executed by Another Workflow').item.json.new_date }}T{{\nDateTime\n  .fromFormat(\n    $('When Executed by Another Workflow').first().json.new_time,\n    'HH:mm'\n  )\n  .plus({ minutes: 30 })\n  .toFormat('HH:mm')\n}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ba07d31e-b149-4157-b6ad-d867edda9990",
      "name": "Set Appointment Not Found Message",
      "type": "n8n-nodes-base.set",
      "position": [
        -752,
        5104
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "7f623eb6-e679-4103-88f9-99e37962fdc2",
              "name": "message",
              "type": "string",
              "value": "Appointment Not Found"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "b15d5f22-beef-42c2-b406-6ab082517e41",
      "name": "Set Reschedule Error Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        432,
        4272
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a978fa3a-1de7-4149-8740-736df1b7f1a6",
              "name": "Rescheduled",
              "type": "boolean",
              "value": false
            },
            {
              "id": "0916d5f0-3c63-411a-953b-ac888d3c316a",
              "name": "error",
              "type": "string",
              "value": "crm_unavailable"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "99598678-eda3-4275-a2e5-66e1fc299209",
      "name": "Update Calendar Event",
      "type": "n8n-nodes-base.googleCalendar",
      "onError": "continueErrorOutput",
      "position": [
        320,
        4928
      ],
      "parameters": {
        "eventId": "={{ $('Read Event ID from Sheets').item.json.event_id }}",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "user@example.com",
          "cachedResultName": "user@example.com"
        },
        "operation": "update",
        "updateFields": {
          "end": "={{ $('Set Slot Timing').item.json.end }}",
          "start": "={{ $('Set Slot Timing').item.json.start }}",
          "summary": "={{ $('When Executed by Another Workflow').item.json.new_service_type }} - {{ $('Read Event ID from Sheets').item.json.name }}",
          "description": "={{ $('When Executed by Another Workflow').item.json.phone }}"
        }
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 1.3
    },
    {
      "id": "7667cb2e-cb11-453f-92dd-431acc409de0",
      "name": "Set Slot Unavailable Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        96,
        5040
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "0a7e4101-0dc2-4183-aa26-02f864588328",
              "name": "Rescheduled",
              "type": "boolean",
              "value": false
            },
            {
              "id": "f0da5310-1aa4-4745-a9de-d0494df9f192",
              "name": "error",
              "type": "string",
              "value": "new_slot_unavailable"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "4568495f-522a-40ce-9444-9539426cc2fc",
      "name": "Set Post-Update Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        880,
        4272
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a978fa3a-1de7-4149-8740-736df1b7f1a6",
              "name": "Rescheduled",
              "type": "boolean",
              "value": false
            },
            {
              "id": "0916d5f0-3c63-411a-953b-ac888d3c316a",
              "name": "error",
              "type": "string",
              "value": "calendar_unavailable"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "52ebcbd4-0975-4eb6-ab34-9b4dbd291f41",
      "name": "Set Extended Update Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        544,
        4912
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "320ac51e-c6c0-491e-af7c-690ca9e9ebad",
              "name": "Rescheduled",
              "type": "boolean",
              "value": true
            },
            {
              "id": "be46c811-6817-49ec-b91d-9595cc592c8f",
              "name": "name",
              "type": "string",
              "value": "={{ $('Read Event ID from Sheets').item.json.name }}"
            },
            {
              "id": "67c137ed-cda6-468a-b072-65b032c3214e",
              "name": "service_type",
              "type": "string",
              "value": "={{ $('When Executed by Another Workflow').item.json.new_service_type }}"
            },
            {
              "id": "3a7717f0-f49f-477d-a331-015c08c0c4b3",
              "name": "preferred_date",
              "type": "string",
              "value": "={{\nDateTime\n  .fromISO($('When Executed by Another Workflow').item.json.new_date)\n  .toFormat('dd LLL yyyy')\n}}"
            },
            {
              "id": "d7fc5978-8bd3-4941-9bf2-2e4d5508c08c",
              "name": "preferred_time",
              "type": "string",
              "value": "={{ DateTime   .fromFormat($('When Executed by Another Workflow').item.json.new_time, 'HH:mm')   .toFormat('hh:mm a') }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "577c6b8b-608d-405a-aff5-7e6e37b76092",
      "name": "Invoke Background Workflow",
      "type": "n8n-nodes-base.executeWorkflow",
      "disabled": true,
      "position": [
        704,
        5328
      ],
      "parameters": {
        "options": {
          "waitForSubWorkflow": false
        },
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "hEOycKblp9Yg7ath",
          "cachedResultUrl": "/workflow/hEOycKblp9Yg7ath",
          "cachedResultName": "Background Workflow"
        },
        "workflowInputs": {
          "value": {
            "name": "={{ $('Read Event ID from Sheets').item.json.name }}",
            "phone": "={{ $('When Executed by Another Workflow').item.json.phone }}",
            "event_id": "={{ $json.id }}",
            "action_type": "Reschedule",
            "service_type": "={{ $('When Executed by Another Workflow').item.json.new_service_type }}",
            "preferred_date": "={{ $('When Executed by Another Workflow').item.json.new_date }}",
            "preferred_time": "={{ $('When Executed by Another Workflow').item.json.new_time }}"
          },
          "schema": [
            {
              "id": "name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "phone",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "phone",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "service_type",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "service_type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "preferred_date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "preferred_date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "preferred_time",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "preferred_time",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "event_id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "event_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "action_type",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "action_type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "88b3eaee-58fd-42ab-a5d1-108e697f41fd",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1488,
        4672
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 416,
        "content": "## Trigger and lookup\n\nStarts when invoked by another workflow and retrieves the matching appointment/event record from Google Sheets."
      },
      "typeVersion": 1
    },
    {
      "id": "312e46a1-c895-4950-b494-4a57570e3719",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        272,
        4688
      ],
      "parameters": {
        "color": 7,
        "width": 560,
        "height": 400,
        "content": "## Update calendar event\n\nUpdates the existing Google Calendar event when the slot is available and formats the main successful reschedule response fields."
      },
      "typeVersion": 1
    },
    {
      "id": "459fced3-64b2-47aa-b952-801c2fc8d4b0",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        336,
        4048
      ],
      "parameters": {
        "color": 7,
        "width": 688,
        "height": 480,
        "content": "## Error status handling\n\nA separate upper-row cluster that prepares error/status fields and invokes the shared error workflow for lookup or calendar update failures; it also includes the adjacent update status formatter."
      },
      "typeVersion": 1
    },
    {
      "id": "a3e83f9c-bfeb-4a36-8942-1961c3fa0a83",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        352,
        5152
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 400,
        "content": "## Background follow-up\n\nRuns a lower-right background sub-workflow after the calendar update, likely for asynchronous follow-up tasks such as notifications or cleanup."
      },
      "typeVersion": 1
    },
    {
      "id": "df17de92-5525-44bb-bebc-ff6ef9107f2a",
      "name": "When Executed by Another Workflow",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        -1424,
        4880
      ],
      "parameters": {
        "workflowInputs": {
          "values": [
            {
              "name": "phone"
            },
            {
              "name": "new_date"
            },
            {
              "name": "new_time"
            },
            {
              "name": "preferred_date"
            },
            {
              "name": "preferred_time"
            },
            {
              "name": "new_service_type"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "a882470e-3872-4f61-91ed-1062e64e59c1",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1104,
        4544
      ],
      "parameters": {
        "color": "#356582",
        "width": 800,
        "height": 912,
        "content": "## See it in action\n\nThis workflow powers appointment booking inside Aria, a live AI \nvoice receptionist that books, reschedules, and cancels real \nappointments by phone. Watch the full call below.\n\n@[youtube](OF-5d0pQ7Zo)\n\nNote: this is one of 5 sub-workflows in the Aria system \u2014 \nbooking, canceling, rescheduling, checking availability, and \nfinding alternate slots each run as a separate workflow, called \nvia MCP tools. Build each one to match your own calendar/CRM \nsetup \u2014 or watch the video to see the full pattern working end \nto end."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "timezone": "America/Chicago",
    "binaryMode": "separate",
    "callerPolicy": "workflowsFromSameOwner",
    "errorWorkflow": "bQdno8qQgpKWbiDE",
    "timeSavedMode": "fixed",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "32d5590f-4c36-4405-839c-17dd815f4eff",
  "nodeGroups": [],
  "connections": {
    "Set Slot Timing": {
      "main": [
        [
          {
            "node": "Invoke Slot Check Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Calendar Event": {
      "main": [
        [
          {
            "node": "Set Extended Update Fields",
            "type": "main",
            "index": 0
          },
          {
            "node": "Invoke Background Workflow",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set Post-Update Fields",
            "type": "main",
            "index": 0
          },
          {
            "node": "Invoke Error Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Slot Availability": {
      "main": [
        [
          {
            "node": "Update Calendar Event",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set Slot Unavailable Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Event ID from Sheets": {
      "main": [
        [
          {
            "node": "Check Appointment Existence",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set Reschedule Error Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Invoke Slot Check Workflow": {
      "main": [
        [
          {
            "node": "Check Slot Availability",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Appointment Existence": {
      "main": [
        [
          {
            "node": "Set Slot Timing",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Set Appointment Not Found Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Reschedule Error Fields": {
      "main": [
        [
          {
            "node": "Invoke Error Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Executed by Another Workflow": {
      "main": [
        [
          {
            "node": "Read Event ID from Sheets",
            "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 is triggered by another n8n workflow to reschedule an existing appointment by looking up the current booking in Google Sheets, validating the requested new slot via a sub-workflow, and updating the event in Google Calendar with the new date/time and service…

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

More Data & Sheets workflows → · Browse all categories →

Related workflows

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

Data & Sheets

12 - Market Intelligence Report Builder (Stakeholder v0.3). Uses googleSheets, httpRequest, executeWorkflowTrigger. Event-driven trigger; 27 nodes.

Google Sheets, HTTP Request, Execute Workflow Trigger
Data & Sheets

Google Maps Email Scraper Template. Uses removeDuplicates, splitInBatches, httpRequest, splitOut. Event-driven trigger; 26 nodes.

HTTP Request, Google Sheets, Execute Workflow Trigger
Data & Sheets

Splitout Comparedatasets. Uses manualTrigger, gong, stickyNote, executeWorkflow. Event-driven trigger; 26 nodes.

Gong, Execute Workflow Trigger, Google Sheets +1
Data & Sheets

Streamline your sales call analysis with CallForge, an automated workflow that extracts, enriches, and refines Gong.io call data for AI-driven insights.

Gong, Execute Workflow Trigger, Google Sheets +1
Data & Sheets

Email Scapper. Uses httpRequest, googleSheets, executeWorkflowTrigger. Event-driven trigger; 26 nodes.

HTTP Request, Google Sheets, Execute Workflow Trigger