Google Calendar + Gmail, interviews scheduled and reminded
Interview scheduling sounds simple until it isn’t. You’re copying times from an ATS, double-checking time zones, generating a Meet link, and then chasing candidates the day before because nobody saw the invite.
This is where interview reminder automation hits hardest for recruiters trying to keep pipelines moving. Hiring managers feel it when calendars are messy. Agency teams feel it when one missed reminder turns into a reschedule spiral.
This n8n workflow creates the calendar invite with a Google Meet link, drafts a professional reminder email with AI, and sends it exactly 24 hours before the interview. You’ll see how it works, what you need, and where teams usually trip up.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Calendar + Gmail, interviews scheduled and reminded
flowchart LR
subgraph sg0["Creates the e-mail c Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook"]
n1@{ icon: "mdi:swap-vertical", form: "rounded", label: "Formatting the start date/time", pos: "b", h: 48 }
n2@{ icon: "mdi:location-exit", form: "rounded", label: "Create the interview and inv..", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "Creates the e-mail content", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Separates the text", pos: "b", h: 48 }
n5@{ icon: "mdi:cog", form: "rounded", label: "Wait until 1 day before the ..", pos: "b", h: 48 }
n6@{ icon: "mdi:message-outline", form: "rounded", label: "Send the message to the cand..", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Adding observation in candid.."]
n8@{ icon: "mdi:cog", form: "rounded", label: "Wait", pos: "b", h: 48 }
n9@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Adding observation in candid.."]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Getting the vacancy"]
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "Selecting pipe stage id", pos: "b", h: 48 }
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Moving candidate to last stage"]
n14@{ icon: "mdi:message-outline", form: "rounded", label: "Reproval e-mail", pos: "b", h: 48 }
n15["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Request for candidate aproval"]
n16["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Reproving candidate"]
n9 --> n10
n9 --> n14
n8 --> n15
n0 --> n1
n14 --> n16
n4 --> n5
n4 --> n6
n11 --> n12
n12 --> n13
n3 --> n4
n15 --> n9
n1 --> n2
n7 --> n8
n10 --> n11
n6 --> n7
n5 --> n6
n2 --> n3
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n3 ai
class n9 decision
class n0,n7,n10,n11,n13,n16 api
classDef customIcon fill:none,stroke:none
class n0,n7,n10,n11,n13,n15,n16 customIcon
The Problem: Interview Scheduling Turns Into Follow-Up Work
When interview details arrive in a message, an ATS, or a spreadsheet, someone still has to translate that into a clean calendar event. Then comes the “did you get the invite?” follow-up, the reschedule request, and the awkward moment when a candidate misses the call because the Meet link is buried or the time zone is wrong. It’s not just time lost. It’s context switching, calendar clutter, and the quiet reputational damage of looking disorganized. Multiply that by a few roles per week and it becomes a constant drag on hiring velocity.
It adds up fast. Here’s where it usually breaks down.
- Calendar events get created inconsistently, so candidates receive different formats and instructions depending on who scheduled it.
- Manual reminders slip through the cracks when recruiters are juggling dozens of open loops.
- Meet links are sometimes missing or regenerated, which leads to last-minute “wrong link” messages.
- Hiring teams lose a clean audit trail because notes and status updates live in too many places.
The Solution: AI-Powered Scheduling + 24-Hour Reminders
This workflow starts by receiving interview details through a webhook (typically from your ATS). n8n normalizes the start time so the calendar event is created at the correct moment, then it schedules the interview in Google Calendar with a built-in Google Meet conference link. Next, an AI agent (using GPT-4.1-mini via an OpenAI Chat Model node) drafts a personalized reminder email that actually reads like a human recruiter wrote it. The workflow waits until exactly one day before the interview and sends the reminder through Gmail automatically. After that, it logs what happened back to your hiring system (via HTTP requests), and it can even kick off an approval decision in Slack after the interview time.
The workflow begins with structured interview JSON coming in from Recrutei (or another system). Google Calendar handles the invite and Meet link, OpenAI writes the reminder, and Gmail sends it on schedule. Slack and additional HTTP steps keep the rest of the hiring process moving without extra chasing.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you schedule 10 interviews a week. Manually, it’s usually about 10 minutes to create the invite, add a Meet link, write a reminder, and log a note, which is roughly 100 minutes weekly (and that’s before reschedules). With this workflow, the recruiter spends maybe 2 minutes checking the incoming details, then n8n creates the event, drafts the email, and sends it 24 hours before automatically. You get back around an hour or two every week, plus fewer “sorry, I missed it” messages.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Calendar to create events with Meet links
- Gmail to send the reminder email
- OpenAI API key (get it from the OpenAI dashboard)
Skill level: Intermediate. You will connect accounts, map a few fields from your ATS payload, and test timing with the Wait nodes.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
An interview payload arrives. Your ATS (the workflow references Recrutei) sends interview JSON to the n8n webhook. That payload includes the candidate, time, and context needed to schedule cleanly.
The time gets normalized. n8n reformats the start time so Google Calendar receives it in the right structure (this is where time zone mistakes usually happen). Small detail, big difference.
The calendar invite is created and the reminder is written. Google Calendar schedules the event and generates a Hangouts/Google Meet conference link. Then the OpenAI chat model drafts a personalized email body, which is extracted into a format Gmail can send.
The workflow waits, then sends. A Wait node pauses the run until one day before the interview and triggers the Gmail reminder at the right time. After sending, it logs meeting notes via HTTP requests and can notify Slack for post-interview approvals.
You can easily modify the reminder timing to match your policy (48 hours, same-day, or both). See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Start the workflow by accepting inbound interview data via the webhook trigger.
- Add the Incoming Interview Hook node as the trigger.
- Set the Path to
interview-calendar-meet. - Save the node and copy the Test URL for later testing.
Step 2: Normalize the Interview Date and Create the Calendar Event
Prepare the date/time and create the Google Calendar event with a Meet link.
- In Normalize Start Time, keep Include Other Fields enabled and set the when value to
{{ $json.when.marked_at }}T{{ $json.when.start_at }}:00.000-05:00. - Open Schedule Calendar Meeting and set Start to
{{ $json.when }}and End to{{ $json.when }}. - Set Summary to
Interview for {{ $json.vacancy }}and Attendees to{{ $json.candidate.email }}, {{ $json.participants[0].email }}. - Enable Google Meet creation by setting Conference Solution to
hangoutsMeet. - Credential Required: Connect your googleCalendarOAuth2Api credentials in Schedule Calendar Meeting.
Step 3: Generate the Reminder Email Text with AI
Use AI to draft a professional reminder email and extract the text content.
- Open Draft Reminder Text and confirm the Model is set to
gpt-4.o-mini. - Keep the prompt content and system instructions intact so the output matches your email style requirements.
- Credential Required: Connect your openAiApi credentials in Draft Reminder Text.
- In Extract Email Body, set the text value to
{{ $json.output[0].content[0].text }}.
Step 4: Send Candidate Reminder and Log the Meeting (Parallel Timing)
Schedule the reminder timing, send the email, and log the interview details. The workflow runs parallel timing from the reminder text.
Extract Email Body outputs to both Pause Until Day Before and Dispatch Candidate Email in parallel.
- In Pause Until Day Before, set Resume to
specificTimeand Date/Time to{{ DateTime.fromISO($('Schedule Calendar Meeting').item.json.start.dateTime).minus({ days: 1 }).toISO() }}. - Configure Dispatch Candidate Email with Send To
{{ $('Normalize Start Time').item.json.candidate.email }}, Subject{{ $('Schedule Calendar Meeting').item.json.summary }}, and Message{{ $('Extract Email Body').item.json.text }}. - Set Sender Name to
{{ $('Normalize Start Time').item.json.participants[0].name }}and keep Email Type astext. - Credential Required: Connect your gmailOAuth2 credentials in Dispatch Candidate Email.
- In Log Meeting Note, keep the URL as
https://api.recrutei.com.br/api/v2/talents-observationsand ensure the Authorization header includes your token (replaceBearer [CONFIGURE_YOUR_TOKEN]).
Step 5: Run Approval Flow and Handle Outcomes
Pause until the interview time, request approval in Slack, then route to acceptance or rejection actions.
- In Hold Until Interview Time, set Resume to
specificTimeand Date/Time to{{ $('Normalize Start Time').item.json.when }}. - Configure Slack Approval Request to send to a specific channel and set Message to
The candidate {{ $('Incoming Interview Hook').item.json.candidate.name }} was approved and can proceed to the next fase?. - Credential Required: Connect your slackApi credentials in Slack Approval Request.
- In Approval Decision Gate, ensure the condition checks
{{ $json.data.approved }}equals true. - Configure Send Rejection Email with Send To
{{ $('Incoming Interview Hook').item.json.candidate.email }}, Subject{{ $('Incoming Interview Hook').item.json.vacancy }}, and keep the provided rejection message template. - Credential Required: Connect your gmailOAuth2 credentials in Send Rejection Email.
- In Flag Application Rejected, keep the URL as
https://api.recrutei.com.br/api/v1/applications/rateand replaceBearer [CONFIGURE_YOUR_TOKEN]in the headers.
Step 6: Promote Approved Candidates to the Final Stage
When approved, log the approval and move the application to the final pipeline stage using API requests.
- In Record Approval Note, confirm the URL is
https://api.recrutei.com.br/api/v2/talents-observationsand replaceBearer [CONFIGURE_YOUR_TOKEN]in the headers. - In Fetch Vacancy Details, keep the URL set to
https://api.recrutei.com.br/api/v1/vacancies/{{ $('Log Meeting Note').item.json.data.vacancy.id }}. - In Choose Final Stage, set last_stage to
{{ $json.pipe_vacancy.pipe.pipe_stages[7].id }}. - In Move to Final Stage, set the URL to
https://api.recrutei.com.br/api/v1/applications/{{ $('Incoming Interview Hook').item.json.application_id }}/pipeand pipe_stage_id to{{ $json.last_stage }}.
Bearer [CONFIGURE_YOUR_TOKEN].Step 7: Test & Activate Your Workflow
Validate the workflow end-to-end and then enable it for production use.
- Click Execute Workflow and send a test payload to the Incoming Interview Hook test URL.
- Confirm a Google Calendar event is created by Schedule Calendar Meeting and that Draft Reminder Text returns email content.
- Verify that Dispatch Candidate Email sends a message and Log Meeting Note logs the API entry.
- Wait until Hold Until Interview Time triggers Slack Approval Request and test the approval flow through Approval Decision Gate.
- Once everything works, switch the workflow to Active for production use.
Common Gotchas
- Google Calendar credentials can expire or need specific permissions. If things break, check the Google connection status in n8n Credentials and confirm the calendar scope is allowed.
- If you’re using Wait nodes or external processing, timing can be unpredictable during testing. Bump up the wait duration (or swap to a short delay) if downstream nodes fail because the event or email body isn’t ready yet.
- Default AI prompts are frankly too generic for real hiring. Add your tone, interview type (technical vs. behavioral), and “what to prepare” details early or you’ll be editing every reminder anyway.
Frequently Asked Questions
About 30 minutes if your accounts and interview payload are ready.
No. You’ll mostly connect accounts and map a few fields from your webhook payload into Google Calendar and Gmail.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs (usually a few cents per interview email, depending on your prompt length).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, but you’ll add one more Wait path. Duplicate the existing “Pause Until Day Before” logic, then adjust one Wait node to 48 hours before and another to 2 hours before; both can feed into the same Gmail send step with slightly different messaging from the AI email draft.
Usually it’s an expired Google OAuth connection or missing calendar permissions. Reconnect Google Calendar in n8n Credentials, then confirm the workflow is targeting the right calendar ID. If the Meet link isn’t generating, check that the conference type is set to create a Hangouts/Meet conference and that the account is allowed to create conferencing links.
A lot. On n8n Cloud Starter, you’re limited by monthly executions, so high-volume recruiting teams may want a higher tier. If you self-host, there’s no platform execution cap; you’re mainly limited by your server and API rate limits from Google and your ATS. In practice, this workflow is lightweight because it’s one webhook-in, a calendar create, an AI draft, a wait, and one email send per interview.
Often, yes. n8n handles branching logic cleanly (like the Slack approval gate after interview time) without turning every path into a separate paid step, and you can self-host for unlimited runs. It’s also easier to keep ATS logging together because HTTP requests, merges, and conditionals are first-class citizens in the workflow. Zapier or Make can be quicker for a simple “calendar invite + one email,” though, especially if you don’t need AI-written copy. If you’re unsure, Talk to an automation expert and we’ll sanity-check your use case.
Once this is live, interview scheduling stops being a daily game of follow-up. The workflow handles the repetitive parts so you can focus on hiring decisions, not calendar cleanup.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.