This workflow follows the Gmail → Google Calendar 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": "MvSVpfzaFUWELNTR",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Send today\u2019s interview schedule from Google Calendar to each interviewer via email",
"tags": [],
"nodes": [
{
"id": "1ad3eb39-d1e3-455c-ad06-3264c2b6ec91",
"name": "About this template",
"type": "n8n-nodes-base.stickyNote",
"position": [
-180,
720
],
"parameters": {
"width": 1220,
"height": 240,
"content": "## Description\nThis workflow automatically sends daily interview schedules to each interviewer via email. It is triggered every day at 8:00 AM, fetches all interview events from a specified Google Calendar, and groups them by interviewer email (based on the event organizer or creator). Each interviewer then receives a personalized HTML-formatted email listing their interview schedule for the day, including event titles, start and end times."
},
"typeVersion": 1
},
{
"id": "d25ce1fa-0914-4ec4-aca6-10b232a0e753",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-100,
420
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"typeVersion": 1.2
},
{
"id": "e16e6483-873a-4184-84dc-67120fbcb4a3",
"name": "HTML Table",
"type": "n8n-nodes-base.code",
"position": [
520,
420
],
"parameters": {
"jsCode": "const events = $input.all().map(e => e.json);\n\n// Group events by organizer or creator email\nconst grouped = {};\n\nfor (const event of events) {\n const interviewerEmail = event.organizer?.email || event.creator?.email;\n if (!interviewerEmail) continue;\n\n if (!grouped[interviewerEmail]) grouped[interviewerEmail] = [];\n\n const attendees = (event.attendees || []).map(att => {\n return `${att.email} (${att.responseStatus})`;\n }).join('<br>');\n\n grouped[interviewerEmail].push({\n summary: event.summary || 'No Title',\n start: event.start?.dateTime || event.start?.date || 'N/A',\n end: event.end?.dateTime || event.end?.date || 'N/A',\n description: event.description || 'No description',\n htmlLink: event.htmlLink || '',\n meetLink: event.conferenceData?.entryPoints?.[0]?.uri || event.hangoutLink || 'N/A',\n attendees: attendees || 'No attendees'\n });\n}\n\nconst output = [];\n\nfor (const [email, interviews] of Object.entries(grouped)) {\n let html = `<h3>Your Interview Schedule for Today</h3>\n <table border=\"1\" cellpadding=\"5\" cellspacing=\"0\">\n <tr>\n <th>Title</th>\n <th>Start</th>\n <th>End</th>\n <th>Description</th>\n <th>Meeting Link</th>\n <th>Attendees (Status)</th>\n </tr>`;\n\n for (const iv of interviews) {\n html += `<tr>\n <td>${iv.summary}</td>\n <td>${new Date(iv.start).toLocaleString('en-IN', { timeZone: 'Asia/Kolkata' })}</td>\n <td>${new Date(iv.end).toLocaleString('en-IN', { timeZone: 'Asia/Kolkata' })}</td>\n <td>${iv.description}</td>\n <td><a href=\"${iv.meetLink}\" target=\"_blank\">Join</a></td>\n <td>${iv.attendees}</td>\n </tr>`;\n }\n\n html += `</table>`;\n\n output.push({\n json: {\n interviewer_email: email,\n subject: \"Today's Interview Schedule\",\n htmlContent: html\n }\n });\n}\n\nreturn output;\n"
},
"typeVersion": 2
},
{
"id": "33bd4e2d-fa01-42e4-9daa-c545763df3b9",
"name": "Gmail",
"type": "n8n-nodes-base.gmail",
"position": [
780,
420
],
"parameters": {
"sendTo": "={{ $json.interviewer_email }}",
"message": "={{ $json.htmlContent }}",
"options": {},
"subject": "Interview Reminder"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "e9103f86-7674-4b4f-856e-babae68f6c0f",
"name": "Google Calendar(Fetch Interview Events)",
"type": "n8n-nodes-base.googleCalendar",
"position": [
220,
420
],
"parameters": {
"options": {},
"calendar": {
"__rl": true,
"mode": "list",
"value": "user@example.com",
"cachedResultName": "user@example.com"
},
"operation": "getAll",
"returnAll": true
},
"credentials": {
"googleCalendarOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1.3
},
{
"id": "0b2f912b-19af-4c90-a42b-4f32daf6e73a",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-180,
320
],
"parameters": {
"color": 7,
"width": 1220,
"height": 360,
"content": "## Send today\u2019s interview schedule from Google Calendar to each interviewer via email"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "61b63191-87b5-4974-99fa-7437035c1dcd",
"connections": {
"HTML Table": {
"main": [
[
{
"node": "Gmail",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Google Calendar(Fetch Interview Events)",
"type": "main",
"index": 0
}
]
]
},
"Google Calendar(Fetch Interview Events)": {
"main": [
[
{
"node": "HTML Table",
"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.
gmailOAuth2googleCalendarOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Send today’s interview schedule from Google Calendar to each interviewer via email. Uses gmail, googleCalendar. Scheduled trigger; 6 nodes.
Source: https://github.com/weblineindia/n8n-Automate-Daily-Interview-Schedule-Delivery-from-Google-Calendar-to-Gmail/blob/main/main.json — 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.
Splitout Googlecalendar. Uses httpRequest, scheduleTrigger, googleCalendar, splitOut. Scheduled trigger; 19 nodes.
It’s very important to come prepared to Sales calls. This often means a lot of manual research about the person you’re calling with. This workflow delivers the latest social media activity (LinkedIn +
Sign up for Decodo — get better pricing here
Code Googlecalendar. Uses stickyNote, scheduleTrigger, httpRequest, gmail. Scheduled trigger; 12 nodes.
It's very important to come prepared to Sales calls. This often means a lot of manual research about the person you're calling with. This workflow delivers the latest news about businesses you are abo