Scheduling meetings manually is one of those low-value tasks that never fully goes away. A supplier requests a site visit. A team member submits a maintenance window. A quality audit needs to be booked. Someone fills out a form, and then someone else reads the form and creates the calendar event by hand.
This tutorial builds the workflow that closes that gap. When a form is submitted, n8n creates the Google Calendar event automatically and sends a confirmation email to the person who submitted. No manual calendar entry. No missed bookings.
The workflow is three nodes and takes less than an hour to configure and test.
Form Trigger (form submission received)
→ Google Calendar (create event)
→ Gmail (send confirmation to submitter)
Two options for the form trigger: n8n's built-in Form node (simplest, no external tool needed) or a Google Form connected via a short Apps Script (if you already have Google Forms in use).
Both options produce the same result and use the same Google Calendar and Gmail nodes.
n8n instance. n8n Cloud or self-hosted, version 1.0 or later.
Google Calendar OAuth2 credential in n8n. Go to Credentials in n8n, add a new credential, select Google Calendar OAuth2, and authorize against the Google account that owns the calendar you want to add events to.
Gmail OAuth2 credential in n8n. Same process, select Gmail OAuth2, and authorize against the account you want to send confirmations from.
A shared Google Calendar for the event type you are automating. Create or identify the calendar that should receive these events (a team scheduling calendar, a supplier visit calendar, a maintenance window calendar). You will need the Calendar ID, found in Google Calendar under Settings, in the "Integrate calendar" section.
The n8n Form node creates a hosted form that submits directly to your workflow. No Google Forms, no Apps Script, no external tool.
Add a Form Trigger node as the first node in your workflow. Configure the fields:
n8n generates a URL for the form. Share this URL with suppliers, team members, or anyone who should be able to submit a booking request.
When the form is submitted, the workflow fires immediately with the form data as the input item.
If you already use Google Forms and want to trigger n8n from an existing form, use Apps Script to POST the submission data to an n8n Webhook node.
Step 1: In n8n, add a Webhook Trigger node. Set the HTTP Method to POST and copy the production webhook URL.
Step 2: Open your Google Form in edit mode. Go to Extensions → Apps Script. Paste the following code:
function onFormSubmit(e) {
var response = e.response;
var answers = response.getItemResponses();
var data = {
name: answers[0].getResponse(),
email: answers[1].getResponse(),
purpose: answers[2].getResponse(),
date: answers[3].getResponse(),
time: answers[4].getResponse(),
notes: answers[5] ? answers[5].getResponse() : ""
};
UrlFetchApp.fetch("YOUR_N8N_WEBHOOK_URL_HERE", {
method: "post",
contentType: "application/json",
payload: JSON.stringify(data)
});
}
Replace YOUR_N8N_WEBHOOK_URL_HERE with the URL from your n8n Webhook node.
Step 3: In Apps Script, set a trigger: click the clock icon (Triggers), add a trigger, select onFormSubmit, select "From form," and set the event type to "On form submit." Save.
From this point, every Google Form submission fires the Apps Script function, which POSTs the data to your n8n workflow in real time.
Add a Google Calendar node after the form trigger.
Configuration:
{{ $json.purpose }} - {{ $json.name }}{{ $json.date }}T{{ $json.time }}:00{{ DateTime.fromISO($json.date + 'T' + $json.time + ':00').plus({ hours: 1 }).toISO() }}Submitted by: {{ $json.name }}\nEmail: {{ $json.email }}\nNotes: {{ $json.notes }}{{ $json.email }} - adding the submitter as an attendee sends them a standard Google Calendar invite automatically
The event title format (Purpose - Name) keeps the calendar readable at a glance when multiple submissions come in on the same day.
Run the node with your test item and confirm the event appears on the target calendar.
Add a Gmail node after the Google Calendar node.
Configuration:
{{ $json.email }}Meeting confirmed: {{ $json.purpose }}
Hi {{ $json.name }},
Your request has been received and the meeting has been added to the calendar.
Date: {{ $json.date }}
Time: {{ $json.time }}
Purpose: {{ $json.purpose }}
You will also receive a separate Google Calendar invitation at this email address.
If anything needs to change, reply to this email.
The Gmail confirmation gives the submitter an immediate record of their booking. The Google Calendar invite (sent automatically when you add them as an attendee) gives them a calendar entry. Both fire within seconds of form submission.
If you are booking more than one type of meeting, a Switch node before the Google Calendar node routes each submission to the correct calendar.
Add a Switch node after the form trigger:
Each case connects to a Google Calendar node configured with the appropriate Calendar ID. Use the same Gmail node at the end of each branch by merging the branches before the confirmation step.
Supplier site visits. Share the n8n form URL with suppliers and let them request visits directly. The submission creates the event on the procurement team's calendar, sends the supplier a confirmation, and optionally triggers a Slack message to the procurement lead.
Equipment maintenance windows. Production scheduling team submits planned downtime windows via form. Events are created on the plant operations calendar and appear immediately for all shifts to see, without anyone manually updating a shared calendar.
Quality audits and inspections. QA team books inspection slots for new supplier qualification visits. Each submission creates the calendar event, sends the supplier details, and logs the booking.
Training session scheduling. Operations or safety training requests submitted by team leads create calendar events on the trainer's calendar automatically, removing back-and-forth email coordination.
Add a Slack notification. After the Gmail node, add a Slack node that posts to your team channel: "New booking: {{ $json.purpose }} with {{ $json.name }} on {{ $json.date }} at {{ $json.time }}." This keeps the full team aware without requiring anyone to check the calendar.
Add an approval step before creating the event. If certain meeting types require sign-off before confirming, insert a Wait node after the trigger. The workflow pauses and sends an approval request to the calendar owner. Once approved, it continues to create the event and send the confirmation. Once rejected, it sends the submitter a decline notice.
Log all submissions to Google Sheets. Add a Google Sheets node before the Calendar node to write each submission to a log. This creates a searchable record of all scheduling requests over time, useful for reporting on supplier visit frequency or maintenance window patterns.
Date and time format from the form. The Google Calendar node expects dates in ISO 8601 format (YYYY-MM-DD) and times in HH:MM:SS format. If your form returns dates in a different format (e.g., June 20, 2026), add a Code node between the trigger and the Calendar node to reformat:
const raw = $json.date;
const parsed = new Date(raw);
const formatted = parsed.toISOString().split('T')[0];
return [{ json: { ...$json, date: formatted } }];
Time zone handling. The Google Calendar node defaults to UTC unless you specify a time zone. Add a Time Zone field to your form and pass it to the Calendar node, or hardcode the time zone in the node settings if all submissions come from the same zone.
Attendee invites. Adding the submitter as an attendee in the Calendar node sends them a Google Calendar email invite in addition to your Gmail confirmation. For external suppliers, this is usually welcome. For internal team members who are already on the shared calendar, you may want to skip the attendee field to avoid a duplicate notification.
The Flow Kaizen guide covers how to sequence scheduling and notification workflows as part of a broader automation plan for your operations team.