This workflow corresponds to n8n.io template #8456 — we link there as the canonical source.
This workflow follows the Form → Form Trigger 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 →
{
"nodes": [
{
"id": "3f6e9ca9-e576-4c65-aa5f-73ccdc775b84",
"name": "Sticky Note16",
"type": "n8n-nodes-base.stickyNote",
"position": [
16,
-208
],
"parameters": {
"color": 7,
"width": 3032,
"height": 84,
"content": "# \ud83d\ude80 Live Demo Request"
},
"typeVersion": 1
},
{
"id": "7c4f06a8-2e33-4b3c-b4a9-bf7a2d8a1b07",
"name": "Select Date&Time",
"type": "n8n-nodes-base.form",
"onError": "continueRegularOutput",
"position": [
1680,
192
],
"parameters": {
"options": {
"customCss": "/* N8N Landing Page CSS \u2013 Header-matching Blues */\n\n/* Style the main form card */\n.card {\n position: relative;\n max-width: 500px;\n margin: 20px auto;\n padding: 20px;\n background: white !important;\n border-radius: 12px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n/* Header bar with your header gradient */\n.card:before {\n content: '';\n display: block;\n height: 50px;\n background: linear-gradient(135deg, #0A3E7B 0%, #1565C0 100%) !important;\n position: relative;\n margin: -20px -20px 30px -20px;\n border-radius: 12px 12px 0 0;\n}\n\n/* Titles in deep blue */\n.form-header,\n.card h1,\n.card h2 {\n text-align: center !important;\n color: #0A3E7B !important;\n font-weight: 500 !important;\n font-size: 1.6em !important;\n margin: 20px 0 15px 0 !important;\n position: relative;\n z-index: 5;\n}\n\n/* Description copy in a cool neutral */\n.card p {\n text-align: center !important;\n color: #475569 !important;\n position: relative;\n z-index: 5;\n}\n\n/* Inputs wrapper keeps above the gradient */\n.inputs-wrapper {\n position: relative;\n z-index: 5;\n}\n\n/* Form fields with blue focus */\n.card input[type=\"text\"],\n.card input[type=\"email\"],\n.card input[type=\"tel\"],\n.card input[type=\"number\"],\n.card textarea,\n.card select {\n width: 100% !important;\n padding: 12px 16px !important;\n border: 2px solid #E5E7EB !important;\n border-radius: 8px !important;\n font-size: 16px !important;\n transition: border-color 0.3s ease !important;\n box-sizing: border-box !important;\n}\n\n.card input:focus,\n.card textarea:focus,\n.card select:focus {\n outline: none !important;\n border-color: #0A3E7B !important;\n box-shadow: 0 0 0 3px rgba(10, 62, 123, 0.1) !important;\n}\n\n/* Submit button in a mid-to-light blue gradient */\n.card button[type=\"submit\"],\n.card input[type=\"submit\"] {\n background: linear-gradient(135deg, #1565C0 0%, #64B5F6 100%) !important;\n color: white !important;\n border: none !important;\n padding: 15px 40px !important;\n border-radius: 10px !important;\n font-size: 18px !important;\n font-weight: 600 !important;\n cursor: pointer !important;\n width: 100% !important;\n margin-top: 10px !important;\n transition: all 0.3s ease !important;\n box-shadow: 0 4px 15px rgba(21, 101, 192, 0.3) !important;\n position: relative;\n z-index: 5;\n}\n\n.card button:hover,\n.card input[type=\"submit\"]:hover {\n transform: translateY(-2px) !important;\n box-shadow: 0 6px 20px rgba(21, 101, 192, 0.4) !important;\n}\n\n/* Page background to complement the pale side of your header */\nbody.vsc-initialized {\n background: #EEF6FF !important;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;\n margin: 0 !important;\n padding: 20px !important;\n}\n\n/* Center container */\n.container {\n max-width: 600px !important;\n margin: 0 auto !important;\n}\n\n.card .form-group {\n margin-top: 4px !important;\n margin-bottom: 4px !important;\n}\n\n/* Mobile tweaks */\n@media (max-width: 768px) {\n .card {\n margin: 10px !important;\n padding: 15px !important;\n }\n .card:before {\n height: 50px !important;\n margin: -15px -15px 20px -15px !important;\n }\n .form-header,\n .card h1,\n .card h2 {\n font-size: 1.7em !important;\n margin: 20px 0 15px 0 !important;\n }\n}\n",
"formTitle": "Select your preferred time",
"buttonLabel": "Submit"
},
"defineForm": "json",
"jsonOutput": "=[{{ $json.form }}]"
},
"typeVersion": 1
},
{
"id": "4152a07b-0210-4b26-92cb-d9cd6c31a7a8",
"name": "On form submission",
"type": "n8n-nodes-base.formTrigger",
"position": [
48,
-96
],
"parameters": {
"options": {
"path": "yourcompany-demo-request",
"customCss": "/* N8N Landing Page CSS \u2013 Header-matching Blues */\n\n/* Style the main form card */\n.card {\n position: relative;\n max-width: 500px;\n margin: 20px auto;\n padding: 20px;\n background: white !important;\n border-radius: 12px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n/* Header bar with your header gradient */\n.card:before {\n content: '';\n display: block;\n height: 50px;\n background: linear-gradient(135deg, #0A3E7B 0%, #1565C0 100%) !important;\n position: relative;\n margin: -20px -20px 30px -20px;\n border-radius: 12px 12px 0 0;\n}\n\n/* Titles in deep blue */\n.form-header,\n.card h1,\n.card h2 {\n text-align: center !important;\n color: #0A3E7B !important;\n font-weight: 500 !important;\n font-size: 1.6em !important;\n margin: 20px 0 15px 0 !important;\n position: relative;\n z-index: 5;\n}\n\n/* Description copy in a cool neutral */\n.card p {\n text-align: center !important;\n color: #475569 !important;\n position: relative;\n z-index: 5;\n}\n\n/* Inputs wrapper keeps above the gradient */\n.inputs-wrapper {\n position: relative;\n z-index: 5;\n}\n\n/* Form fields with blue focus */\n.card input[type=\"text\"],\n.card input[type=\"email\"],\n.card input[type=\"tel\"],\n.card input[type=\"number\"],\n.card textarea,\n.card select {\n width: 100% !important;\n padding: 12px 16px !important;\n border: 2px solid #E5E7EB !important;\n border-radius: 8px !important;\n font-size: 16px !important;\n transition: border-color 0.3s ease !important;\n box-sizing: border-box !important;\n}\n\n.card input:focus,\n.card textarea:focus,\n.card select:focus {\n outline: none !important;\n border-color: #0A3E7B !important;\n box-shadow: 0 0 0 3px rgba(10, 62, 123, 0.1) !important;\n}\n\n/* Submit button in a mid-to-light blue gradient */\n.card button[type=\"submit\"],\n.card input[type=\"submit\"] {\n background: linear-gradient(135deg, #1565C0 0%, #64B5F6 100%) !important;\n color: white !important;\n border: none !important;\n padding: 15px 40px !important;\n border-radius: 10px !important;\n font-size: 18px !important;\n font-weight: 600 !important;\n cursor: pointer !important;\n width: 100% !important;\n margin-top: 10px !important;\n transition: all 0.3s ease !important;\n box-shadow: 0 4px 15px rgba(21, 101, 192, 0.3) !important;\n position: relative;\n z-index: 5;\n}\n\n.card button:hover,\n.card input[type=\"submit\"]:hover {\n transform: translateY(-2px) !important;\n box-shadow: 0 6px 20px rgba(21, 101, 192, 0.4) !important;\n}\n\n/* Page background to complement the pale side of your header */\nbody.vsc-initialized {\n background: #EEF6FF !important;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;\n margin: 0 !important;\n padding: 20px !important;\n}\n\n/* Mobile tweaks */\n@media (max-width: 768px) {\n .card {\n margin: 5px !important;\n padding: 15px !important;\n max-width: 100% !important;\n box-shadow: none !important; /* optional: flatter design for mobile */\n }\n\n .card:before {\n height: 40px !important;\n margin: -15px -15px 20px -15px !important;\n border-radius: 10px 10px 0 0 !important;\n }\n\n .form-header,\n .card h1,\n .card h2 {\n font-size: 1.4em !important;\n margin: 5px 0 5px 0 !important;\n }\n\n .card input[type=\"text\"],\n .card input[type=\"email\"],\n .card input[type=\"tel\"],\n .card input[type=\"number\"],\n .card textarea,\n .card select {\n font-size: 15px !important;\n padding: 10px 12px !important;\n }\n\n .card button[type=\"submit\"],\n .card input[type=\"submit\"] {\n font-size: 16px !important;\n padding: 12px 20px !important;\n }\n\n .container {\n padding: 0 5px !important;\n max-width: 100% !important;\n }\n\n .card .form-group {\n margin-top: 6px !important;\n margin-bottom: 6px !important;\n }\n}",
"buttonLabel": "Let's Schedule",
"appendAttribution": false
},
"formTitle": "Live Demo Request",
"formDescription": "Request a live demo of our software"
},
"typeVersion": 2.2
},
{
"id": "e2c3bdf4-e85d-4f22-aac4-3a4791dc583a",
"name": "Outlook Calendar CheckAvailability",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
816,
48
],
"parameters": {
"url": "https://graph.microsoft.com/v1.0/me/calendarView",
"options": {},
"sendQuery": true,
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "startDateTime",
"value": "={{ $json[\"Select the date you would you require a demo\"] }}T00:00:00"
},
{
"name": "endDateTime",
"value": "={{\n (() => {\n const d = new Date($json[\"Select the date you would you require a demo\"]);\n d.setDate(d.getDate() + 30);\n return d.toLocaleDateString('en-CA') + 'T23:59:59';\n })()\n}}"
},
{
"name": "$top",
"value": "3"
},
{
"name": "$orderby\t",
"value": "start/dateTime asc"
},
{
"name": "$filter",
"value": "startsWith(subject,'Online Meeting Slot')"
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Prefer",
"value": "outlook.timezone=\"Asia/Dubai\""
}
]
},
"nodeCredentialType": "microsoftOutlookOAuth2Api"
},
"credentials": {
"microsoftOutlookOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "e112995a-c635-4a2a-b1e6-790cf828129c",
"name": "Set Events",
"type": "n8n-nodes-base.code",
"onError": "continueRegularOutput",
"position": [
1328,
64
],
"parameters": {
"jsCode": "// items passed in are the HTTP Request output\n// which returns { value: [ /* events */ ] }\nconst events = $input.first().json.value || [];\n\n// 2) map into slot objects\nconst newSlots = events.map(e => {\n // Parse ISO string into Date object\n const d = new Date(e.start.dateTime);\n\n // Format: Wednesday 20 August 2025 11:00\n const formatted = d.toLocaleString(\"en-GB\", {\n weekday: \"long\",\n day: \"2-digit\",\n month: \"long\",\n year: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n hour12: false\n });\n\n return {\n time: formatted,\n subject: e.subject,\n start: e.start.dateTime,\n end: e.end.dateTime,\n id: e.id\n };\n});\n\n// 3) return each slot as its own item\nreturn newSlots.map(slot => ({ json: slot }));\n\n\n\n"
},
"typeVersion": 2
},
{
"id": "9317b0c9-f67b-4b5b-8f2c-347f218b4686",
"name": "Set Form Dates",
"type": "n8n-nodes-base.code",
"onError": "continueRegularOutput",
"position": [
1520,
192
],
"parameters": {
"jsCode": "// 1. Pull in all event objects\nconst events = items.map(item => item.json);\n\n// 2. Build your dropdown object\nconst dropdown = {\n fieldLabel: \"Select one of our available time\",\n fieldType: \"dropdown\",\n fieldOptions: {\n values: events.map(e => {\n // Parse the time string into a Date object\n return { option: e.time };\n })\n },\n requiredField: true\n};\n\n// 3. Combine into a single JS array: dropdown first, then each event\nconst combined = [{ form: dropdown }, ...events];\n\nreturn combined.map(json => ({ json }));\n\n"
},
"typeVersion": 2
},
{
"id": "5ca66c67-4ad4-4204-96ec-e55614d5f317",
"name": "Select New Date",
"type": "n8n-nodes-base.form",
"position": [
1040,
304
],
"parameters": {
"options": {
"customCss": "/* N8N Landing Page CSS \u2013 Header-matching Blues */\n\n/* Style the main form card */\n.card {\n position: relative;\n max-width: 500px;\n margin: 20px auto;\n padding: 20px;\n background: white !important;\n border-radius: 12px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n/* Header bar with your header gradient */\n.card:before {\n content: '';\n display: block;\n height: 50px;\n background: linear-gradient(135deg, #0A3E7B 0%, #1565C0 100%) !important;\n position: relative;\n margin: -20px -20px 30px -20px;\n border-radius: 12px 12px 0 0;\n}\n\n/* Titles in deep blue */\n.form-header,\n.card h1,\n.card h2 {\n text-align: center !important;\n color: #0A3E7B !important;\n font-weight: 500 !important;\n font-size: 1.6em !important;\n margin: 20px 0 15px 0 !important;\n position: relative;\n z-index: 5;\n}\n\n/* Description copy in a cool neutral */\n.card p {\n text-align: center !important;\n color: #475569 !important;\n position: relative;\n z-index: 5;\n}\n\n/* Inputs wrapper keeps above the gradient */\n.inputs-wrapper {\n position: relative;\n z-index: 5;\n}\n\n/* Form fields with blue focus */\n.card input[type=\"text\"],\n.card input[type=\"email\"],\n.card input[type=\"tel\"],\n.card input[type=\"number\"],\n.card textarea,\n.card select {\n width: 100% !important;\n padding: 12px 16px !important;\n border: 2px solid #E5E7EB !important;\n border-radius: 8px !important;\n font-size: 16px !important;\n transition: border-color 0.3s ease !important;\n box-sizing: border-box !important;\n}\n\n.card input:focus,\n.card textarea:focus,\n.card select:focus {\n outline: none !important;\n border-color: #0A3E7B !important;\n box-shadow: 0 0 0 3px rgba(10, 62, 123, 0.1) !important;\n}\n\n/* Submit button in a mid-to-light blue gradient */\n.card button[type=\"submit\"],\n.card input[type=\"submit\"] {\n background: linear-gradient(135deg, #1565C0 0%, #64B5F6 100%) !important;\n color: white !important;\n border: none !important;\n padding: 15px 40px !important;\n border-radius: 10px !important;\n font-size: 18px !important;\n font-weight: 600 !important;\n cursor: pointer !important;\n width: 100% !important;\n margin-top: 10px !important;\n transition: all 0.3s ease !important;\n box-shadow: 0 4px 15px rgba(21, 101, 192, 0.3) !important;\n position: relative;\n z-index: 5;\n}\n\n.card button:hover,\n.card input[type=\"submit\"]:hover {\n transform: translateY(-2px) !important;\n box-shadow: 0 6px 20px rgba(21, 101, 192, 0.4) !important;\n}\n\n/* Page background to complement the pale side of your header */\nbody.vsc-initialized {\n background: #EEF6FF !important;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;\n margin: 0 !important;\n padding: 20px !important;\n}\n\n/* Center container */\n.container {\n max-width: 600px !important;\n margin: 0 auto !important;\n}\n\n.card .form-group {\n margin-top: 4px !important;\n margin-bottom: 4px !important;\n}\n\n/* Mobile tweaks */\n@media (max-width: 768px) {\n .card {\n margin: 5px !important;\n padding: 15px !important;\n max-width: 100% !important;\n box-shadow: none !important; /* optional: flatter design for mobile */\n }\n\n .card:before {\n height: 40px !important;\n margin: -15px -15px 20px -15px !important;\n border-radius: 10px 10px 0 0 !important;\n }\n\n .form-header,\n .card h1,\n .card h2 {\n font-size: 1.4em !important;\n margin: 5px 0 5px 0 !important;\n }\n\n .card input[type=\"text\"],\n .card input[type=\"email\"],\n .card input[type=\"tel\"],\n .card input[type=\"number\"],\n .card textarea,\n .card select {\n font-size: 15px !important;\n padding: 10px 12px !important;\n }\n\n .card button[type=\"submit\"],\n .card input[type=\"submit\"] {\n font-size: 16px !important;\n padding: 12px 20px !important;\n }\n\n .container {\n padding: 0 5px !important;\n max-width: 100% !important;\n }\n\n .card .form-group {\n margin-top: 6px !important;\n margin-bottom: 6px !important;\n }\n}\n",
"formTitle": "Previous selected date is unavailable",
"buttonLabel": "Submit",
"formDescription": "Please, select a new date"
},
"formFields": {
"values": [
{
"fieldType": "date",
"fieldLabel": "Select the date you would you require a demo",
"requiredField": true
}
]
}
},
"typeVersion": 1
},
{
"id": "4dcf3659-6ee2-45e8-8340-b3261c9ad1df",
"name": "Outlook Update Event",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
2656,
48
],
"parameters": {
"url": "=https://graph.microsoft.com/v1.0/me/events/{{ $('Persist Selected Date&Time').item.json.id }}",
"method": "PATCH",
"options": {},
"jsonBody": "={\n \"categories\":[\"Booked\",\"Online meeting\"],\n \"subject\": \"Live Demo Booked\",\n \"showAs\": \"busy\",\n \"body\": {\n \"contentType\": \"HTML\",\n \"content\": \"{{$json.content}}\"\n },\n \"attendees\": [\n {\n \"emailAddress\": {\n \"address\": \"{{$json.your_email}}\",\n \"name\": \"{{$json.your_name}}\"\n },\n \"type\": \"required\"\n },\n {\n \"emailAddress\": {\n \"address\": \"{{ $('Persist Selected Date&Time').item.json['Contact Email'] }}\",\n \"name\": \"{{ $('Persist Selected Date&Time').item.json['Full Contact Name'] }}\"\n },\n \"type\": \"required\"\n }\n ]\n\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "microsoftOutlookOAuth2Api"
},
"credentials": {
"microsoftOutlookOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "211a666f-c3cc-48fe-9769-0769e866dc61",
"name": "Final Form",
"type": "n8n-nodes-base.form",
"onError": "continueRegularOutput",
"position": [
2848,
64
],
"parameters": {
"options": {
"customCss": "/* N8N Landing Page CSS \u2013 Header-matching Blues */\n\n/* Style the main form card */\n.card {\n position: relative;\n max-width: 500px;\n margin: 20px auto;\n padding: 20px;\n background: white !important;\n border-radius: 12px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n/* Header bar with your header gradient */\n.card:before {\n content: '';\n display: block;\n height: 50px;\n background: linear-gradient(135deg, #0A3E7B 0%, #1565C0 100%) !important;\n position: relative;\n margin: -20px -20px 30px -20px;\n border-radius: 12px 12px 0 0;\n}\n\n/* Titles in deep blue */\n.form-header,\n.card h1,\n.card h2 {\n text-align: center !important;\n color: #0A3E7B !important;\n font-weight: 500 !important;\n font-size: 1.6em !important;\n margin: 20px 0 15px 0 !important;\n position: relative;\n z-index: 5;\n}\n\n/* Description copy in a cool neutral */\n.card p {\n text-align: center !important;\n color: #475569 !important;\n position: relative;\n z-index: 5;\n}\n\n/* Inputs wrapper keeps above the gradient */\n.inputs-wrapper {\n position: relative;\n z-index: 5;\n}\n\n/* Form fields with blue focus */\n.card input[type=\"text\"],\n.card input[type=\"email\"],\n.card input[type=\"tel\"],\n.card input[type=\"number\"],\n.card textarea,\n.card select {\n width: 100% !important;\n padding: 12px 16px !important;\n border: 2px solid #E5E7EB !important;\n border-radius: 8px !important;\n font-size: 16px !important;\n transition: border-color 0.3s ease !important;\n box-sizing: border-box !important;\n}\n\n.card input:focus,\n.card textarea:focus,\n.card select:focus {\n outline: none !important;\n border-color: #0A3E7B !important;\n box-shadow: 0 0 0 3px rgba(10, 62, 123, 0.1) !important;\n}\n\n/* Submit button in a mid-to-light blue gradient */\n.card button[type=\"submit\"],\n.card input[type=\"submit\"] {\n background: linear-gradient(135deg, #1565C0 0%, #64B5F6 100%) !important;\n color: white !important;\n border: none !important;\n padding: 15px 40px !important;\n border-radius: 10px !important;\n font-size: 18px !important;\n font-weight: 600 !important;\n cursor: pointer !important;\n width: 100% !important;\n margin-top: 10px !important;\n transition: all 0.3s ease !important;\n box-shadow: 0 4px 15px rgba(21, 101, 192, 0.3) !important;\n position: relative;\n z-index: 5;\n}\n\n.card button:hover,\n.card input[type=\"submit\"]:hover {\n transform: translateY(-2px) !important;\n box-shadow: 0 6px 20px rgba(21, 101, 192, 0.4) !important;\n}\n\n/* Page background to complement the pale side of your header */\nbody.vsc-initialized {\n background: #EEF6FF !important;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;\n margin: 0 !important;\n padding: 20px !important;\n}\n\n/* Center container */\n.container {\n max-width: 600px !important;\n margin: 0 auto !important;\n}\n\n.card .form-group {\n margin-top: 4px !important;\n margin-bottom: 4px !important;\n}\n\n/* Mobile tweaks */\n@media (max-width: 768px) {\n .card {\n margin: 5px !important;\n padding: 15px !important;\n max-width: 100% !important;\n box-shadow: none !important; /* optional: flatter design for mobile */\n }\n\n .card:before {\n height: 40px !important;\n margin: -15px -15px 20px -15px !important;\n border-radius: 10px 10px 0 0 !important;\n }\n\n .form-header,\n .card h1,\n .card h2 {\n font-size: 1.4em !important;\n margin: 5px 0 5px 0 !important;\n }\n\n .card input[type=\"text\"],\n .card input[type=\"email\"],\n .card input[type=\"tel\"],\n .card input[type=\"number\"],\n .card textarea,\n .card select {\n font-size: 15px !important;\n padding: 10px 12px !important;\n }\n\n .card button[type=\"submit\"],\n .card input[type=\"submit\"] {\n font-size: 16px !important;\n padding: 12px 20px !important;\n }\n\n .container {\n padding: 0 5px !important;\n max-width: 100% !important;\n }\n\n .card .form-group {\n margin-top: 6px !important;\n margin-bottom: 6px !important;\n }\n}\n"
},
"operation": "completion",
"completionTitle": "Live Demo Scheduled",
"completionMessage": "=\u2705 All set! Your Live Demo is booked on \n{{ \n new Date($('Persist Selected Date&Time').item.json.start)\n .toLocaleDateString('en-GB', { weekday:'long', day:'numeric', month:'long' })\n .replace(',', '') \n}} \n\nFrom {{ \n new Date($('Persist Selected Date&Time').item.json.start)\n .toLocaleTimeString('en-GB', { hour:'2-digit', minute:'2-digit', hour12:false })\n}} \nTo {{ \n new Date($('Persist Selected Date&Time').item.json.end)\n .toLocaleTimeString('en-GB', { hour:'2-digit', minute:'2-digit', hour12:false })\n}} \n\nA calendar invite is on its way.\n\n"
},
"typeVersion": 1
},
{
"id": "4f82e490-51b7-40a0-9be0-f52fac0ab533",
"name": "Get Date",
"type": "n8n-nodes-base.merge",
"onError": "continueRegularOutput",
"position": [
1872,
80
],
"parameters": {
"mode": "combine",
"options": {},
"advanced": true,
"mergeByFields": {
"values": [
{
"field1": "time",
"field2": "Select one of our available time"
}
]
}
},
"typeVersion": 3.2
},
{
"id": "682a04fe-6001-4ebf-b8a7-a6dbb7caa07f",
"name": "Form Failed",
"type": "n8n-nodes-base.form",
"onError": "continueRegularOutput",
"position": [
64,
672
],
"parameters": {
"options": {
"customCss": "/* N8N Landing Page CSS \u2013 Header-matching Blues */\n\n/* Style the main form card */\n.card {\n position: relative;\n max-width: 500px;\n margin: 20px auto;\n padding: 20px;\n background: white !important;\n border-radius: 12px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n/* Header bar with your header gradient */\n.card:before {\n content: '';\n display: block;\n height: 50px;\n background: linear-gradient(135deg, #0A3E7B 0%, #1565C0 100%) !important;\n position: relative;\n margin: -20px -20px 30px -20px;\n border-radius: 12px 12px 0 0;\n}\n\n/* Titles in deep blue */\n.form-header,\n.card h1,\n.card h2 {\n text-align: center !important;\n color: #0A3E7B !important;\n font-weight: 500 !important;\n font-size: 1.6em !important;\n margin: 20px 0 15px 0 !important;\n position: relative;\n z-index: 5;\n}\n\n/* Description copy in a cool neutral */\n.card p {\n text-align: center !important;\n color: #475569 !important;\n position: relative;\n z-index: 5;\n}\n\n/* Inputs wrapper keeps above the gradient */\n.inputs-wrapper {\n position: relative;\n z-index: 5;\n}\n\n/* Form fields with blue focus */\n.card input[type=\"text\"],\n.card input[type=\"email\"],\n.card input[type=\"tel\"],\n.card input[type=\"number\"],\n.card textarea,\n.card select {\n width: 100% !important;\n padding: 12px 16px !important;\n border: 2px solid #E5E7EB !important;\n border-radius: 8px !important;\n font-size: 16px !important;\n transition: border-color 0.3s ease !important;\n box-sizing: border-box !important;\n}\n\n.card input:focus,\n.card textarea:focus,\n.card select:focus {\n outline: none !important;\n border-color: #0A3E7B !important;\n box-shadow: 0 0 0 3px rgba(10, 62, 123, 0.1) !important;\n}\n\n/* Submit button in a mid-to-light blue gradient */\n.card button[type=\"submit\"],\n.card input[type=\"submit\"] {\n background: linear-gradient(135deg, #1565C0 0%, #64B5F6 100%) !important;\n color: white !important;\n border: none !important;\n padding: 15px 40px !important;\n border-radius: 10px !important;\n font-size: 18px !important;\n font-weight: 600 !important;\n cursor: pointer !important;\n width: 100% !important;\n margin-top: 10px !important;\n transition: all 0.3s ease !important;\n box-shadow: 0 4px 15px rgba(21, 101, 192, 0.3) !important;\n position: relative;\n z-index: 5;\n}\n\n.card button:hover,\n.card input[type=\"submit\"]:hover {\n transform: translateY(-2px) !important;\n box-shadow: 0 6px 20px rgba(21, 101, 192, 0.4) !important;\n}\n\n/* Page background to complement the pale side of your header */\nbody.vsc-initialized {\n background: #EEF6FF !important;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;\n margin: 0 !important;\n padding: 20px !important;\n}\n\n/* Center container */\n.container {\n max-width: 600px !important;\n margin: 0 auto !important;\n}\n\n.card .form-group {\n margin-top: 4px !important;\n margin-bottom: 4px !important;\n}\n\n/* Mobile tweaks */\n@media (max-width: 768px) {\n .card {\n margin: 5px !important;\n padding: 15px !important;\n max-width: 100% !important;\n box-shadow: none !important; /* optional: flatter design for mobile */\n }\n\n .card:before {\n height: 40px !important;\n margin: -15px -15px 20px -15px !important;\n border-radius: 10px 10px 0 0 !important;\n }\n\n .form-header,\n .card h1,\n .card h2 {\n font-size: 1.4em !important;\n margin: 5px 0 5px 0 !important;\n }\n\n .card input[type=\"text\"],\n .card input[type=\"email\"],\n .card input[type=\"tel\"],\n .card input[type=\"number\"],\n .card textarea,\n .card select {\n font-size: 15px !important;\n padding: 10px 12px !important;\n }\n\n .card button[type=\"submit\"],\n .card input[type=\"submit\"] {\n font-size: 16px !important;\n padding: 12px 20px !important;\n }\n\n .container {\n padding: 0 5px !important;\n max-width: 100% !important;\n }\n\n .card .form-group {\n margin-top: 6px !important;\n margin-bottom: 6px !important;\n }\n}\n"
},
"operation": "completion",
"completionTitle": "\u26a0\ufe0f Submission Failed",
"completionMessage": "=Something went wrong while submitting your live demo request.\nPlease try again in a moment.\nIf the issue persists, contact our support team at info@yourcompany.ae or call us at +971 55 5555 55 55 we\u2019ll be happy to assist you."
},
"typeVersion": 1
},
{
"id": "926d46af-3943-48c6-b178-4d1dc539b509",
"name": "New Slot Available?",
"type": "n8n-nodes-base.if",
"onError": "continueRegularOutput",
"position": [
1024,
48
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "5be8bde8-b6fb-48cd-a5c7-4f425a9e0923",
"operator": {
"type": "object",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json }}",
"rightValue": ""
},
{
"id": "4d152d98-636a-4521-a30e-489d1d2ca2b4",
"operator": {
"type": "array",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.value }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "befe75b8-157e-40b7-a595-2477f5d8543f",
"name": "Create Zoom meeting",
"type": "n8n-nodes-base.zoom",
"onError": "continueErrorOutput",
"position": [
2320,
48
],
"parameters": {
"topic": "=Live Demo - {{ $json[\"Company trade name\"] }}",
"authentication": "oAuth2",
"additionalFields": {
"duration": 40,
"timeZone": "Asia/Dubai",
"startTime": "={{ $json.start }}"
}
},
"credentials": {
"zoomOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "389efd9d-165d-4648-a129-c2c741fcd16a",
"name": "Persist Selected Date&Time",
"type": "n8n-nodes-base.merge",
"onError": "continueRegularOutput",
"position": [
2096,
-80
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3.2
},
{
"id": "e0552e28-e7dc-4a1d-b2d5-13b62af932d4",
"name": "Client Details",
"type": "n8n-nodes-base.form",
"onError": "continueRegularOutput",
"position": [
256,
-96
],
"parameters": {
"options": {
"customCss": "/* N8N Landing Page CSS \u2013 Header-matching Blues */\n\n/* Style the main form card */\n.card {\n position: relative;\n max-width: 500px;\n margin: 20px auto;\n padding: 20px;\n background: white !important;\n border-radius: 12px;\n box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n}\n\n/* Header bar with your header gradient */\n.card:before {\n content: '';\n display: block;\n height: 50px;\n background: linear-gradient(135deg, #0A3E7B 0%, #1565C0 100%) !important;\n position: relative;\n margin: -20px -20px 30px -20px;\n border-radius: 12px 12px 0 0;\n}\n\n/* Titles in deep blue */\n.form-header,\n.card h1,\n.card h2 {\n text-align: center !important;\n color: #0A3E7B !important;\n font-weight: 500 !important;\n font-size: 1.6em !important;\n margin: 20px 0 15px 0 !important;\n position: relative;\n z-index: 5;\n}\n\n/* Description copy in a cool neutral */\n.card p {\n text-align: center !important;\n color: #475569 !important;\n position: relative;\n z-index: 5;\n}\n\n/* Inputs wrapper keeps above the gradient */\n.inputs-wrapper {\n position: relative;\n z-index: 5;\n}\n\n/* Form fields with blue focus */\n.card input[type=\"text\"],\n.card input[type=\"email\"],\n.card input[type=\"tel\"],\n.card input[type=\"number\"],\n.card textarea,\n.card select {\n width: 100% !important;\n padding: 12px 16px !important;\n border: 2px solid #E5E7EB !important;\n border-radius: 8px !important;\n font-size: 16px !important;\n transition: border-color 0.3s ease !important;\n box-sizing: border-box !important;\n}\n\n.card input:focus,\n.card textarea:focus,\n.card select:focus {\n outline: none !important;\n border-color: #0A3E7B !important;\n box-shadow: 0 0 0 3px rgba(10, 62, 123, 0.1) !important;\n}\n\n/* Submit button in a mid-to-light blue gradient */\n.card button[type=\"submit\"],\n.card input[type=\"submit\"] {\n background: linear-gradient(135deg, #1565C0 0%, #64B5F6 100%) !important;\n color: white !important;\n border: none !important;\n padding: 15px 40px !important;\n border-radius: 10px !important;\n font-size: 18px !important;\n font-weight: 600 !important;\n cursor: pointer !important;\n width: 100% !important;\n margin-top: 10px !important;\n transition: all 0.3s ease !important;\n box-shadow: 0 4px 15px rgba(21, 101, 192, 0.3) !important;\n position: relative;\n z-index: 5;\n}\n\n.card button:hover,\n.card input[type=\"submit\"]:hover {\n transform: translateY(-2px) !important;\n box-shadow: 0 6px 20px rgba(21, 101, 192, 0.4) !important;\n}\n\n/* Page background to complement the pale side of your header */\nbody.vsc-initialized {\n background: #EEF6FF !important;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif !important;\n margin: 0 !important;\n padding: 20px !important;\n}\n\n/* Center container */\n.container {\n max-width: 600px !important;\n margin: 0 auto !important;\n}\n\n.card .form-group {\n margin-top: 4px !important;\n margin-bottom: 4px !important;\n}\n\n/* Mobile tweaks */\n@media (max-width: 768px) {\n .card {\n margin: 5px !important;\n padding: 15px !important;\n max-width: 100% !important;\n box-shadow: none !important; /* optional: flatter design for mobile */\n }\n\n .card:before {\n height: 40px !important;\n margin: -15px -15px 20px -15px !important;\n border-radius: 10px 10px 0 0 !important;\n }\n\n .form-header,\n .card h1,\n .card h2 {\n font-size: 1.4em !important;\n margin: 5px 0 5px 0 !important;\n }\n\n .card input[type=\"text\"],\n .card input[type=\"email\"],\n .card input[type=\"tel\"],\n .card input[type=\"number\"],\n .card textarea,\n .card select {\n font-size: 15px !important;\n padding: 10px 12px !important;\n }\n\n .card button[type=\"submit\"],\n .card input[type=\"submit\"] {\n font-size: 16px !important;\n padding: 12px 20px !important;\n }\n\n .container {\n padding: 0 5px !important;\n max-width: 100% !important;\n }\n\n .card .form-group {\n margin-top: 6px !important;\n margin-bottom: 6px !important;\n }\n}\n",
"formTitle": "Demo Request",
"buttonLabel": "Submit"
},
"formFields": {
"values": [
{
"fieldLabel": "Company trade name",
"requiredField": true
},
{
"fieldLabel": "Full Contact Name",
"requiredField": true
},
{
"fieldLabel": "Contact Role",
"requiredField": true
},
{
"fieldType": "email",
"fieldLabel": "Contact Email",
"requiredField": true
},
{
"fieldLabel": "Contact Phone",
"placeholder": "050 111 2442",
"requiredField": true
},
{
"fieldType": "date",
"fieldLabel": "Select the date you would you require a demo",
"requiredField": true
}
]
}
},
"typeVersion": 1
},
{
"id": "965c381d-5c13-4b06-9fde-468e59325752",
"name": "Selected Date Has Slot Available?",
"type": "n8n-nodes-base.if",
"onError": "continueRegularOutput",
"position": [
496,
64
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "680bb6fe-eede-40d6-9e8b-995f74a53645",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{\n (new Date($json['Select the date you would you require a demo']).getTime()) >= new Date().getTime()\n}}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "e055f836-1d14-4c59-84ea-608826085bf2",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
32
],
"parameters": {
"color": 5,
"width": 800,
"height": 688,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Date Availability\n**When the user selects a date in the form, first we check if there is an available slot with subject name 'Online Meeting Slot' at this date\n**The Calendar must have pre-created event in the outlook calendar with subject name 'Online Meeting Slot'\n**If there are no slots available on the selected date, the Form loops back to ask for a new date until we fetch a date that contains available 'Online Meeting Slot'"
},
"typeVersion": 1
},
{
"id": "e5c4d914-9e04-4b37-8b70-e520a2ffb2ee",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
1248,
32
],
"parameters": {
"color": 6,
"width": 800,
"height": 688,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Time Availability\n***Once a date is fetched, we propose the 3 nearest time slots available from the date of selection and present it in the Form for the user to choose from"
},
"typeVersion": 1
},
{
"id": "036184e2-f87c-4237-adc3-768aea38903c",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
2064,
32
],
"parameters": {
"color": 4,
"width": 992,
"height": 688,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Create Zoom Link - Update Event - Send Invitation\n***Once the user has selected both Date & Time, we create the zoom link \n***Update Event with \n- Zoom link URL \n- Client Details\n- Change the Event Subject to 'Booked Live Demo' so that this slot becomes unavailable for the next clients attempts to schedule the slot"
},
"typeVersion": 1
},
{
"id": "1a50e67c-d2eb-4929-9433-a3b9649b64d2",
"name": "Set Event Fields",
"type": "n8n-nodes-base.set",
"position": [
2496,
48
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "17e17f08-3b06-480e-b363-d4fd704eea12",
"name": "content",
"type": "string",
"value": "=<h2>\n<strong>{{ $('Persist Selected Date&Time').item.json['Company trade name'] }}</strong>\n</h2>\n\n<p>\n<strong>Requested by: </strong>{{ $('Persist Selected Date&Time').item.json['Full Contact Name'] }}</p>\n\n<p><strong>Role: </strong>{{ $('Persist Selected Date&Time').item.json['Contact Role'] }}</p>\n\n<p><strong>Phone: </strong>{{ $('Persist Selected Date&Time').item.json['Contact Phone'] }}</p>\n\n<p><strong>Email: </strong>{{ $('Persist Selected Date&Time').item.json['Contact Email'] }}</p>\n\n<p>Subject: Your Company Live Demo</p>\n\n<p>Kindly join via Zoom: <a href=\\\"{{ $json.join_url }}\\\">{{ $json.join_url }}</a></p>\n\n<p>For more information visit our website <a href=\\\"https://yourwebsite.ae\\\">www.yourwebsite.ae</a></p>"
},
{
"id": "899d0b17-6726-4e7b-9880-6a54d307b2f2",
"name": "your_email",
"type": "string",
"value": "John"
},
{
"id": "3633f129-47b2-4754-9a2e-977090356cdc",
"name": "your_name",
"type": "string",
"value": "Smith"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "8eb535b6-1947-4c30-a65a-817bdf680189",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-768,
-208
],
"parameters": {
"width": 704,
"height": 944,
"content": "#### Live Demo Booking with Outlook + Zoom\n\nThis workflow automates **live demo scheduling**: \n\n1. **Client Form** \u2192 Collects company & contact details with preferred demo date. \n2. **Outlook Calendar Check** \u2192 Looks for available events titled *\u201cOnline Meeting Slot\u201d*. \n - If no slot exists \u2192 prompts client to pick a new date. \n - If slot exists \u2192 shows up to 3 nearest available times. \n3. **Client Selects Time** \u2192 Their choice is merged with the event details. \n4. **Zoom Meeting Created** \u2192 A Zoom link is generated automatically. \n5. **Update Outlook Event** \u2192 The slot is updated with: \n - Client details \n - Zoom meeting link \n - Subject changed to *\u201cBooked Live Demo\u201d* (to block double-booking). \n6. **Confirmation** \u2192 Client receives styled confirmation + calendar invite. \n\n\u26a1 **Requirements:** \n- Microsoft Outlook account with pre-created *\u201cOnline Meeting Slot\u201d* events. \n- Zoom account with OAuth2 credentials. \n- n8n self-hosted or cloud setup. \n"
},
"typeVersion": 1
}
],
"connections": {
"Get Date": {
"main": [
[
{
"node": "Persist Selected Date&Time",
"type": "main",
"index": 1
}
]
]
},
"Set Events": {
"main": [
[
{
"node": "Set Form Dates",
"type": "main",
"index": 0
},
{
"node": "Get Date",
"type": "main",
"index": 0
}
]
]
},
"Client Details": {
"main": [
[
{
"node": "Selected Date Has Slot Available?",
"type": "main",
"index": 0
},
{
"node": "Persist Selected Date&Time",
"type": "main",
"index": 0
}
]
]
},
"Set Form Dates": {
"main": [
[
{
"node": "Select Date&Time",
"type": "main",
"index": 0
}
]
]
},
"Select New Date": {
"main": [
[
{
"node": "Selected Date Has Slot Available?",
"type": "main",
"index": 0
}
]
]
},
"Select Date&Time": {
"main": [
[
{
"node": "Get Date",
"type": "main",
"index": 1
}
]
]
},
"Set Event Fields": {
"main": [
[
{
"node": "Outlook Update Event",
"type": "main",
"index": 0
}
]
]
},
"On form submission": {
"main": [
[
{
"node": "Client Details",
"type": "main",
"index": 0
}
]
]
},
"Create Zoom meeting": {
"main": [
[
{
"node": "Set Event Fields",
"type": "main",
"index": 0
}
],
[
{
"node": "Form Failed",
"type": "main",
"index": 0
}
]
]
},
"New Slot Available?": {
"main": [
[
{
"node": "Set Events",
"type": "main",
"index": 0
}
],
[
{
"node": "Select New Date",
"type": "main",
"index": 0
}
]
]
},
"Outlook Update Event": {
"main": [
[
{
"node": "Final Form",
"type": "main",
"index": 0
}
],
[
{
"node": "Form Failed",
"type": "main",
"index": 0
}
]
]
},
"Persist Selected Date&Time": {
"main": [
[
{
"node": "Create Zoom meeting",
"type": "main",
"index": 0
}
]
]
},
"Selected Date Has Slot Available?": {
"main": [
[
{
"node": "Outlook Calendar CheckAvailability",
"type": "main",
"index": 0
}
],
[
{
"node": "Select New Date",
"type": "main",
"index": 0
}
]
]
},
"Outlook Calendar CheckAvailability": {
"main": [
[
{
"node": "New Slot Available?",
"type": "main",
"index": 0
}
],
[
{
"node": "Form Failed",
"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.
microsoftOutlookOAuth2ApizoomOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow is designed for SaaS companies, consultants, or sales teams that regularly run live demos. It helps automate demo scheduling, ensuring clients can only book from available time slots while instantly generating Zoom links and calendar invitations. Client fills demo…
Source: https://n8n.io/workflows/8456/ — 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.
🎥 Analyze YouTube Video for Summaries, Transcripts & Content + Google Gemini AI. Uses stickyNote, httpRequest, googleDrive, gmail. Event-driven trigger; 33 nodes.
Splitout Extractfromfile. Uses splitOut, httpRequest, formTrigger, form. Event-driven trigger; 21 nodes.
With this template, users will be able to automate design and marketing tasks such as creating variants of existing designs, remixing existing assets to validate different styles and explore a range o
3954. Uses httpRequest, formTrigger, form, gmail. Event-driven trigger; 21 nodes.
Streamline Your Zoom Meetings With Secure Automated Stripe Payments. Uses zoom, httpRequest, gmail, googleSheets. Event-driven trigger; 20 nodes.