This workflow corresponds to n8n.io template #10795 — we link there as the canonical source.
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": "g6Phx24314txxWRn",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Internal Systro Nurture (0-8 days)",
"tags": [],
"nodes": [
{
"id": "f63b66f8-d376-46a0-8966-f66fe5739a38",
"name": "Cal.com Trigger",
"type": "n8n-nodes-base.calTrigger",
"position": [
240,
464
],
"parameters": {
"events": [
"BOOKING_CREATED"
],
"options": {}
},
"credentials": {
"calApi": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "b1d64da4-5a5e-47ad-bd1d-e8741a675157",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
688,
464
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "425c0f1f-dd29-4a73-9f75-b4a26e4435f9",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.is_company_email }}",
"rightValue": "true"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "035248af-3e48-4a48-b552-4ec9ff71dde6",
"name": "Calculate time",
"type": "n8n-nodes-base.code",
"position": [
912,
464
],
"parameters": {
"jsCode": "// Get meeting start time from original Cal.com data\nconst meetingStartTime = $('Extract prospect').item.json.meeting_start_time;\n\n// Calculate days until meeting\nconst meetingDate = new Date(meetingStartTime);\nconst today = new Date();\nconst diffTime = meetingDate - today;\nconst diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));\n\n// Get all previous data\nconst prospectData = $('Extract prospect').item.json;\nconst aiData = $input.item.json;\n\nreturn {\n json: {\n // Original prospect data\n attendee_email: prospectData.attendee_email,\n attendee_name: prospectData.attendee_name,\n meeting_start_time: prospectData.meeting_start_time,\n meeting_title: prospectData.meeting_title,\n email_domain: prospectData.email_domain,\n company_name: prospectData.company_name, // \u2190 ADDED\n website_url: prospectData.website_url,\n \n // AI analysis data\n has_website_data: aiData.has_website_data,\n business_type: aiData.business_type,\n tech_stack: aiData.tech_stack,\n likely_pain_points: aiData.likely_pain_points,\n personalization_hook: aiData.personalization_hook,\n \n // Days calculation\n days_until_meeting: diffDays\n }\n};"
},
"typeVersion": 2
},
{
"id": "70c2a2c4-02db-42c1-bdad-fcbb5469bb49",
"name": "Extract prospect",
"type": "n8n-nodes-base.code",
"position": [
464,
464
],
"parameters": {
"jsCode": "// Get attendee email from Cal.com webhook\nconst attendeeEmail = $input.item.json.attendees[0].email;\nconst attendeeName = $input.item.json.attendees[0].name;\nconst meetingStartTime = $input.item.json.startTime;\nconst meetingTitle = $input.item.json.eventTitle;\n\n// Get company name from custom field (if provided)\nconst companyName = $input.item.json.responses['Company-Name']?.value || null;\n\n// Extract domain from email\nconst domain = attendeeEmail.split('@')[1];\n\n// List of consumer email providers\nconst consumerDomains = [\n 'gmail.com', 'yahoo.com', 'outlook.com', 'hotmail.com',\n 'aol.com', 'icloud.com', 'protonmail.com', 'mail.com',\n 'live.com', 'msn.com', 'ymail.com', 'googlemail.com'\n];\n\n// Check if it's a company email\nconst isCompanyEmail = !consumerDomains.includes(domain.toLowerCase());\n\n// Build website URL - use company name if provided and consumer email, otherwise use domain\nlet websiteUrl = null;\nif (companyName && !isCompanyEmail) {\n // They gave us company name but have Gmail - try to build URL from company name\n websiteUrl = `https://${companyName.toLowerCase().replace(/\\s+/g, '')}.com`;\n} else if (isCompanyEmail) {\n // Company email - use domain\n websiteUrl = `https://${domain}`;\n}\n\nreturn {\n json: {\n attendee_email: attendeeEmail,\n attendee_name: attendeeName,\n meeting_start_time: meetingStartTime,\n meeting_title: meetingTitle,\n email_domain: domain,\n company_name: companyName,\n is_company_email: isCompanyEmail,\n website_url: websiteUrl\n }\n};"
},
"typeVersion": 2
},
{
"id": "14f95913-ea00-4041-aacd-329ac4770e65",
"name": "Wait 1 Day",
"type": "n8n-nodes-base.wait",
"position": [
1584,
464
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "65db5d98-cca3-4ba0-89b9-d583e8b4fb75",
"name": "Switch: Days Until Meeting",
"type": "n8n-nodes-base.switch",
"position": [
1136,
448
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "0\u20131 days",
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "number",
"operation": "lte"
},
"leftValue": "={{ $json.days_until_meeting }}",
"rightValue": 1
}
]
},
"renameOutput": true
},
{
"outputKey": "2\u20137 days",
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"operator": {
"type": "number",
"operation": "lte"
},
"leftValue": "={{ $json.days_until_meeting }}",
"rightValue": 7
},
{
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $json.days_until_meeting }}",
"rightValue": 1
}
]
},
"renameOutput": true
},
{
"outputKey": "8+ days",
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "dd9c015f-4dcc-4577-9c12-a610e167dccb",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $json.days_until_meeting }}",
"rightValue": 7
}
]
},
"renameOutput": true
}
]
},
"options": {
"fallbackOutput": "none",
"looseTypeValidation": true
}
},
"typeVersion": 3
},
{
"id": "074aa12d-bc36-46a6-b10f-6dc144d76ce6",
"name": "Quick prep email",
"type": "n8n-nodes-base.set",
"position": [
1360,
272
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a008a6aa-e391-4684-87d7-42c0a19540ae",
"name": "email",
"type": "string",
"value": "={{(() => {\n const firstName = $json.attendee_name.split(' ')[0];\n const company = $json.company_name;\n const rawDate = new Date($json.meeting_start_time);\n const now = new Date();\n\n const isTomorrow = rawDate.getDate() === (now.getDate() + 1) &&\n rawDate.getMonth() === now.getMonth() &&\n rawDate.getFullYear() === now.getFullYear();\n\n const options = { hour: 'numeric', minute: '2-digit', hour12: true };\n const timeString = rawDate.toLocaleTimeString('en-US', options).toLowerCase().replace(':00', '');\n\n const daysOfWeek = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];\n const dayName = daysOfWeek[rawDate.getDay()];\n\n const friendlyTime = isTomorrow ? `${timeString} tomorrow` : `${timeString} on ${dayName}`;\n\n return `Hey ${firstName},\n\nAppreciate you booking \u2014 looking forward to chatting at ${friendlyTime}.\n\nTo make this actually useful for both of us, quick q\u2019s:\n\n\u2013 What\u2019s the biggest thing you\u2019re stuck on right now?\n\u2013 Are you the main decider on this, or is someone else looped in?\n\nDoesn\u2019t need to be a long reply \u2014 just gives me a bit of context so I can prep around what matters for ${company}.\n\nCatch you soon \ud83d\ude4f`;\n})()}}\n"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "a88320c9-184a-40b3-9cac-14b5d2cdddf5",
"name": "Casual flex",
"type": "n8n-nodes-base.gmail",
"position": [
1360,
464
],
"parameters": {
"sendTo": "={{ $('Calculate time').item.json.attendee_email }}",
"message": "=Looking forward to chat about how we can connect {{ $('Calculate time').item.json.company_name }} with ideal clients before your competitors\n\nTo prep: Think about your ideal client profile and how many intros per month would move the needle for you.\n\nPS: not to flex here but \u2014 we helped Vention add $85K last quarter using the same system\n\nCatch you then \ud83d\ude4f\n\n\u2014 Maks\n",
"options": {},
"subject": "=Meeting confirmed \ud83d\udc4b\ud83c\udffb",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "d72e7083-48db-4ca6-821c-84ce0f64270b",
"name": "Casual press",
"type": "n8n-nodes-base.gmail",
"position": [
1808,
464
],
"parameters": {
"sendTo": "={{ $('Calculate time').item.json.attendee_email }}",
"message": "=Hey {{ $json.attendee_name.split(' ')[0] }}\u2014\n\nQuick context about who I am:\n\nI\u2019ve been deep in the industry for a while now. At this point, I\u2019ve seen what works (and what doesn\u2019t) when referals dry up\n\nOver time, I started connecting the right firms to the right buyers \u2014 not with ads or cold pitches, but through early, quiet convos before things go live.\n\nI\u2019m not an agency \u2014 I\u2019m more like a researcher/network hub depending on the setup.\n\nRight now I\u2019m helping companies in your space connect with folks who\u2019ve already proven they can deliver.\n\nThought I\u2019d share this to give you a quick idea before we chat \ud83d\ude4f\n\nCheers\n\n\u2014 Maks",
"options": {},
"subject": "=Meeting confirmed \ud83d\udc4b\ud83c\udffb",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "1d8e95e9-aa8b-4e61-bd4f-643dc22ba075",
"name": "Casual knowledge flex",
"type": "n8n-nodes-base.gmail",
"position": [
2256,
464
],
"parameters": {
"sendTo": "={{ $('Calculate time').item.json.attendee_email }}",
"message": "=Hey again {{ $json.attendee_name.split(' ')[0] }}, \n\nMaks here\n\nA lot of teams we\u2019ve worked with hit the same wall \u2014 outbound either burns cash or burns out their team.\n\nReferrals slow down, ads get expensive, and internal SDRs can\u2019t scale.\n\nOne thing that tends to move the needle early:\n\nRunning early-intro campaigns that quietly connect you to decision-makers before roles go public, since:\n\n- you skip the queue \u2014 connect before roles/postings go live\n- you stay invisible to competitors \u2014 no noisy job boards or bidding wars\n- you own the timing \u2014 you\u2019re not waiting for inbound or referral luck\n\nLet me know if this resonates \u2014 happy to adapt our call.\n\n\u2014 Maks",
"options": {},
"subject": "quick thought"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "162b2e87-a79c-48f5-998c-de9bf5f5f27e",
"name": "Send it",
"type": "n8n-nodes-base.gmail",
"position": [
1584,
272
],
"parameters": {
"sendTo": "={{ $('Calculate time').item.json.attendee_email }}",
"message": "={{ $json.email }}",
"options": {
"appendAttribution": false
},
"subject": "Quick prep for tomorrow's call \ud83d\ude4f\ud83c\udffb",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "e494daf8-064a-445e-924f-97623573764b",
"name": "Wait another day",
"type": "n8n-nodes-base.wait",
"position": [
2032,
464
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "5fa9f448-f8e8-4a57-bbfd-150e9c3e9cb6",
"name": "Wait 1 Day1",
"type": "n8n-nodes-base.wait",
"position": [
1584,
656
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "292b1910-34c4-4b3c-9da7-5624f605c301",
"name": "Casual flex 8+ days",
"type": "n8n-nodes-base.gmail",
"position": [
1360,
656
],
"parameters": {
"sendTo": "={{ $('Calculate time').item.json.attendee_email }}",
"message": "=Excited to connect with {{ $('Calculate time').item.json.company_name }} soon \u2014 plenty of time to prep, so I\u2019ll keep it light for now.\n\nIf you get a spare moment, it\u2019s worth reflecting on your ideal client profile \u2014 and how many intros per month would make a real difference for your team.\n\nPS: We helped Vention add $85K last quarter using this same system. Looking forward to exploring how it could map to your setup too.\n\nCatch you soon \ud83d\ude4f\n\n\u2014 Maks\n",
"options": {},
"subject": "=Looking ahead to our call \ud83d\udc4b\ud83c\udffb",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "48e0d4d3-64bb-49df-8b2f-d950b3f39ca0",
"name": "Casual press 8+days",
"type": "n8n-nodes-base.gmail",
"position": [
1808,
656
],
"parameters": {
"sendTo": "={{ $('Calculate time').item.json.attendee_email }}",
"message": "=Hey {{ $json.attendee_name.split(' ')[0] }}\u2014\n\nQuick context about who I am:\n\nI\u2019ve been deep in the indusry for a while now. At this point, I\u2019ve seen what works (and what doesn\u2019t) when referals dry up\n\nOver time, I started connecting the right firms to the right buyers \u2014 not with ads or cold pitches, but through early, quiet convos before things go live.\n\nI\u2019m not an agency \u2014 I\u2019m more like a researcher/network hub depending on the setup.\n\nRight now I\u2019m helping companines in your space connect with folks who\u2019ve already proven they can deliver.\n\nThought I\u2019d share this to give you a quick idea before we chat \ud83d\ude4f\n\nCheers\n\n\u2014 Maks",
"options": {},
"subject": "=Meeting confirmed \ud83d\udc4b\ud83c\udffb",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "17645622-c90a-4df3-b682-fee7aa2bd402",
"name": "Wait another day 8+days",
"type": "n8n-nodes-base.wait",
"position": [
2032,
656
],
"parameters": {},
"typeVersion": 1.1
},
{
"id": "50b296d1-235c-45fe-8859-25633979854d",
"name": "Casual knowledge flex 8+days",
"type": "n8n-nodes-base.gmail",
"position": [
2256,
656
],
"parameters": {
"sendTo": "={{ $('Calculate time').item.json.attendee_email }}",
"message": "=Hey again {{ $json.attendee_name.split(' ')[0] }}, \n\nMaks here\n\nA lot of {{ $json.business_type }} teams we worked with struggle with {{ $json.likely_pain_points }}. \n\nHere's one thing that tends to move the needle early: [Insert tactic, framework, or article] \n\nLet me know if this resonates \u2014 happy to adapt our call.\n\n\u2014 Maks",
"options": {},
"subject": "insight"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "cdebfebe-b561-4560-92ea-a5574babeeb6",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
2480,
464
],
"parameters": {
"unit": "days",
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "ea936593-456d-487d-9568-140428c19c36",
"name": "Quick prep email2",
"type": "n8n-nodes-base.set",
"position": [
2704,
656
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a008a6aa-e391-4684-87d7-42c0a19540ae",
"name": "email",
"type": "string",
"value": "={{(() => {\n const firstName = $json.attendee_name.split(' ')[0];\n const company = $json.company_name;\n const rawDate = new Date($json.meeting_start_time);\n const now = new Date();\n\n const isTomorrow = rawDate.getDate() === (now.getDate() + 1) &&\n rawDate.getMonth() === now.getMonth() &&\n rawDate.getFullYear() === now.getFullYear();\n\n const options = { hour: 'numeric', minute: '2-digit', hour12: true };\n const timeString = rawDate.toLocaleTimeString('en-US', options).toLowerCase().replace(':00', '');\n\n const daysOfWeek = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];\n const dayName = daysOfWeek[rawDate.getDay()];\n\n const friendlyTime = isTomorrow ? `${timeString} tomorrow` : `${timeString} on ${dayName}`;\n\n return `Hey ${firstName},\n\nAppreciate you booking \u2014 looking forward to chatting at ${friendlyTime}.\n\nTo make this actually useful for both of us, quick q\u2019s:\n\n\u2013 What\u2019s the biggest thing you\u2019re stuck on right now?\n\u2013 Are you the main decider on this, or is someone else looped in?\n\nDoesn\u2019t need to be a long reply \u2014 just gives me a bit of context so I can prep around what matters for ${company}.\n\nCatch you soon \ud83d\ude4f`;\n})()}}\n"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "7ee51230-b333-4f40-a0fd-aa39b23c8013",
"name": "Quick prep",
"type": "n8n-nodes-base.gmail",
"position": [
2928,
464
],
"parameters": {
"sendTo": "={{ $('Calculate time').item.json.attendee_email }}",
"message": "={{ $json.email }}",
"options": {
"appendAttribution": true
},
"subject": "Quick prep for tomorrow's call \ud83d\ude4f\ud83c\udffb",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "630c45e5-5fb5-417e-83f6-fee3f56998d3",
"name": "Quick prep +8days",
"type": "n8n-nodes-base.gmail",
"position": [
2928,
656
],
"parameters": {
"sendTo": "={{ $('Calculate time').item.json.attendee_email }}",
"message": "={{ $json.email }}",
"options": {
"appendAttribution": true
},
"subject": "Quick prep for tomorrow's call \ud83d\ude4f\ud83c\udffb",
"emailType": "text"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "e4b7cae4-af14-40b2-bc33-04e14f450cea",
"name": "Quick prep email (2)",
"type": "n8n-nodes-base.set",
"position": [
2704,
464
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a008a6aa-e391-4684-87d7-42c0a19540ae",
"name": "email",
"type": "string",
"value": "={{(() => {\n const firstName = $json.attendee_name.split(' ')[0];\n const company = $json.company_name;\n const rawDate = new Date($json.meeting_start_time);\n const now = new Date();\n\n const isTomorrow = rawDate.getDate() === (now.getDate() + 1) &&\n rawDate.getMonth() === now.getMonth() &&\n rawDate.getFullYear() === now.getFullYear();\n\n const options = { hour: 'numeric', minute: '2-digit', hour12: true };\n const timeString = rawDate.toLocaleTimeString('en-US', options).toLowerCase().replace(':00', '');\n\n const daysOfWeek = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];\n const dayName = daysOfWeek[rawDate.getDay()];\n\n const friendlyTime = isTomorrow ? `${timeString} tomorrow` : `${timeString} on ${dayName}`;\n\n return `Hey ${firstName},\n\nAppreciate you booking \u2014 looking forward to chatting at ${friendlyTime}.\n\nTo make this actually useful for both of us, quick q\u2019s:\n\n\u2013 What\u2019s the biggest thing you\u2019re stuck on right now?\n\u2013 Are you the main decider on this, or is someone else looped in?\n\nDoesn\u2019t need to be a long reply \u2014 just gives me a bit of context so I can prep around what matters for ${company}.\n\nCatch you soon \ud83d\ude4f`;\n})()}}\n"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e317772f-47fa-4007-8166-3a67e1a60512",
"name": "Wait1",
"type": "n8n-nodes-base.wait",
"position": [
2480,
656
],
"parameters": {
"unit": "days",
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "210fa6ca-168f-437b-8f18-0ac5e2004521",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-448,
0
],
"parameters": {
"width": 592,
"height": 720,
"content": "# \u2b50 Overview \n**Automated Pre-Meeting Email Sequence for Cal.com Bookings**\n\nThis workflow automatically warms up your leads between the moment they book a meeting and the day the meeting happens. It pulls in new Cal.com bookings, checks how many days remain until the meeting, and sends a series of pre-written emails spaced over time. The goal is to increase show-up rates, set expectations, and gently steer the user toward understanding the \u201cconnector\u201d or sales-oriented purpose of the call.\n\nInstead of manually sending reminders or hoping your lead reads the booking confirmation, this workflow creates a structured drip sequence leading up to the meeting. Each email is triggered based on time intervals (for example: immediately, 3 days before, 1 day before). You have full control over the email content and timing.\n\n### How it works\n1. Trigger fires when someone books a meeting in Cal.com. \n2. The workflow calculates how many days remain before the call. \n3. Based on timing, the appropriate warm-up emails are sent via Gmail. \n4. Additional Wait nodes space out messages to ensure natural engagement.\n\n### Setup steps\n1. Add your **Cal.com API key** in the Trigger node. \n2. Authenticate your **Google account** for Gmail. \n3. Customize each email message to match your tone and purpose. \n4. Test internally with sample bookings before enabling it live.\n\n### Customization\nAdjust wait durations, timing logic, or create separate sequences for different event types in Cal.com. You can also use other calendar apps like calendly. You just need to change the trigger. "
},
"typeVersion": 1
},
{
"id": "fe992484-d156-46f1-8cff-51380e5fcaee",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1312,
144
],
"parameters": {
"color": 7,
"width": 1840,
"height": 720,
"content": "## Nurturing Message\nYou can change the message for your needs and duration before sending the messages in here."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "f154098c-f378-4329-9f05-b0e1fd978e85",
"connections": {
"If": {
"main": [
[
{
"node": "Calculate time",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "Quick prep email (2)",
"type": "main",
"index": 0
}
]
]
},
"Wait1": {
"main": [
[
{
"node": "Quick prep email2",
"type": "main",
"index": 0
}
]
]
},
"Wait 1 Day": {
"main": [
[
{
"node": "Casual press",
"type": "main",
"index": 0
}
]
]
},
"Casual flex": {
"main": [
[
{
"node": "Wait 1 Day",
"type": "main",
"index": 0
}
]
]
},
"Wait 1 Day1": {
"main": [
[
{
"node": "Casual press 8+days",
"type": "main",
"index": 0
}
]
]
},
"Casual press": {
"main": [
[
{
"node": "Wait another day",
"type": "main",
"index": 0
}
]
]
},
"Calculate time": {
"main": [
[
{
"node": "Switch: Days Until Meeting",
"type": "main",
"index": 0
}
]
]
},
"Cal.com Trigger": {
"main": [
[
{
"node": "Extract prospect",
"type": "main",
"index": 0
}
]
]
},
"Extract prospect": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"Quick prep email": {
"main": [
[
{
"node": "Send it",
"type": "main",
"index": 0
}
]
]
},
"Wait another day": {
"main": [
[
{
"node": "Casual knowledge flex",
"type": "main",
"index": 0
}
]
]
},
"Quick prep email2": {
"main": [
[
{
"node": "Quick prep +8days",
"type": "main",
"index": 0
}
]
]
},
"Casual flex 8+ days": {
"main": [
[
{
"node": "Wait 1 Day1",
"type": "main",
"index": 0
}
]
]
},
"Casual press 8+days": {
"main": [
[
{
"node": "Wait another day 8+days",
"type": "main",
"index": 0
}
]
]
},
"Quick prep email (2)": {
"main": [
[
{
"node": "Quick prep",
"type": "main",
"index": 0
}
]
]
},
"Casual knowledge flex": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Wait another day 8+days": {
"main": [
[
{
"node": "Casual knowledge flex 8+days",
"type": "main",
"index": 0
}
]
]
},
"Switch: Days Until Meeting": {
"main": [
[
{
"node": "Quick prep email",
"type": "main",
"index": 0
}
],
[
{
"node": "Casual flex",
"type": "main",
"index": 0
}
],
[
{
"node": "Casual flex 8+ days",
"type": "main",
"index": 0
}
]
]
},
"Casual knowledge flex 8+days": {
"main": [
[
{
"node": "Wait1",
"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.
calApigmailOAuth2
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Trigger: When a new meeting is booked in Cal.com.
Source: https://n8n.io/workflows/10795/ — 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 workflow automates the entire process of managing event participants, from registration and payment to sending reminders and follow-up communications. It's designed for event organizers who want
How it works time trigger using the cron format, every weekday at 5pm gets CentralStationCRM people updates of today checks for tag "Outreach" if true, sends message on gmail (predefine in node) waits
This n8n workflow template, "Email Outreach Automation," is designed to help you set up an automated email outreach system using tools you might already be familiar with: Google Sheets and Google Docs
No more missed steps. No last-minute panic. Just smooth, professional launches — on autopilot.
This workflow runs on a daily schedule to monitor users currently on a trial plan. It fetches user data from MongoDB, calculates their trial stage, and assigns a trigger label such as Day 3, Day 7, Da