AutomationFlowsAI & RAG › Crown Storage — Book Consultation

Crown Storage — Book Consultation

Crown Storage — Book Consultation. Uses googleCalendar, gmail. Webhook trigger; 7 nodes.

Webhook trigger★★★★☆ complexity7 nodesGoogle CalendarGmail
AI & RAG Trigger: Webhook Nodes: 7 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "name": "Crown Storage \u2014 Book Consultation",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "book-consultation",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "wh-1",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        240,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "typeValidation": "strict",
            "version": 2
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "c1",
              "leftValue": "={{ $json.body.customer_name }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              }
            },
            {
              "id": "c2",
              "leftValue": "={{ $json.body.customer_phone }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              }
            },
            {
              "id": "c3",
              "leftValue": "={{ $json.body.date }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              }
            },
            {
              "id": "c4",
              "leftValue": "={{ $json.body.time }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              }
            }
          ]
        },
        "options": {}
      },
      "id": "if-1",
      "name": "Validate Input",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        460,
        300
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "const body = $('Webhook').first().json.body || {};\nconst tz = 'Europe/Prague';\n\nconst start = DateTime.fromFormat(body.date + ' ' + body.time, 'yyyy-MM-dd h:mm a', { zone: tz });\nif (!start.isValid) {\n  throw new Error('Invalid date/time: ' + body.date + ' ' + body.time + ' \u2014 ' + start.invalidReason);\n}\nconst end = start.plus({ minutes: 30 });\n\nreturn [{\n  json: {\n    startISO: start.toISO(),\n    endISO: end.toISO(),\n    customer_name: body.customer_name,\n    customer_phone: body.customer_phone,\n    shipment_size: body.shipment_size || 'not specified',\n    date: body.date,\n    time: body.time\n  }\n}];"
      },
      "id": "compose-1",
      "name": "Compose DateTime",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        680,
        200
      ]
    },
    {
      "parameters": {
        "calendar": {
          "__rl": true,
          "value": "primary",
          "mode": "list",
          "cachedResultName": "primary"
        },
        "start": "={{ $json.startISO }}",
        "end": "={{ $json.endISO }}",
        "additionalFields": {
          "summary": "=Sales Consultation \u2014 {{ $json.customer_name }}",
          "description": "=Phone: {{ $json.customer_phone }}\nEstimated storage: {{ $json.shipment_size }}\nBooked via Crown Storage AI Voice Agent",
          "timezone": "Europe/Prague"
        }
      },
      "id": "cal-1",
      "name": "Create Calendar Event",
      "type": "n8n-nodes-base.googleCalendar",
      "typeVersion": 1.3,
      "position": [
        900,
        200
      ],
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "resource": "message",
        "operation": "send",
        "sendTo": "szergej.soros@gmail.com",
        "subject": "=Booking confirmed \u2014 {{ $('Compose DateTime').item.json.customer_name }} on {{ $('Compose DateTime').item.json.date }} {{ $('Compose DateTime').item.json.time }}",
        "emailType": "html",
        "message": "=<h2>Consultation booked</h2><p><strong>Name:</strong> {{ $('Compose DateTime').item.json.customer_name }}</p><p><strong>Phone:</strong> {{ $('Compose DateTime').item.json.customer_phone }}</p><p><strong>Estimated storage:</strong> {{ $('Compose DateTime').item.json.shipment_size }}</p><p><strong>When:</strong> {{ $('Compose DateTime').item.json.date }} at {{ $('Compose DateTime').item.json.time }} (Europe/Prague)</p><p><strong>Calendar event ID:</strong> {{ $json.id }}</p><hr><p><em>Booked via Crown Storage AI Voice Agent</em></p>",
        "options": {}
      },
      "id": "gm-1",
      "name": "Send Confirmation",
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        1120,
        200
      ],
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify({ success: true, booking_id: $('Create Calendar Event').item.json.id, confirmed_date: $('Compose DateTime').item.json.date, confirmed_time: $('Compose DateTime').item.json.time, message: 'Consultation booked successfully' }) }}",
        "options": {}
      },
      "id": "rok-1",
      "name": "Respond OK",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        1340,
        200
      ]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={\n  \"success\": false,\n  \"error\": \"missing_fields\"\n}",
        "options": {
          "responseCode": 400
        }
      },
      "id": "rbad-1",
      "name": "Respond Missing Fields",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        680,
        420
      ]
    }
  ],
  "connections": {
    "Webhook": {
      "main": [
        [
          {
            "node": "Validate Input",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate Input": {
      "main": [
        [
          {
            "node": "Compose DateTime",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Respond Missing Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compose DateTime": {
      "main": [
        [
          {
            "node": "Create Calendar Event",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Calendar Event": {
      "main": [
        [
          {
            "node": "Send Confirmation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Confirmation": {
      "main": [
        [
          {
            "node": "Respond OK",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}

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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Crown Storage — Book Consultation. Uses googleCalendar, gmail. Webhook trigger; 7 nodes.

Source: https://github.com/sssssergey/storagevoiceagent/blob/c91047dab48305ba79396ebc0c8db04a157497dc/n8n-workflows/book-consultation.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Transform your appointment scheduling with this production-ready workflow that connects ElevenLabs voice AI to your Google Calendar. Patients can call and book appointments naturally through conversat

Google Calendar, Gmail
AI & RAG

Zoho CRM - Smart Meeting Scheduler. Uses zohoCrm, googleCalendar, httpRequest, agent. Webhook trigger; 23 nodes.

Zoho Crm, Google Calendar, HTTP Request +3
AI & RAG

🧾 An intelligent automation system that turns Google Meet recordings into structured meeting notes — integrating Fireflies.ai, OpenAI GPT-4.1-mini, Notion, Slack, Google Drive, and Gmail via n8n.

Google Drive, OpenAI Chat, Output Parser Structured +8
AI & RAG

This workflow is an AI-powered Salon Booking Assistant that automates hair, beauty, and spa appointment scheduling through a Webhook trigger. It interacts with the user in natural conversation, collec

OpenAI Chat, Output Parser Autofixing, Output Parser Structured +4
AI & RAG

This workflow was created by Varritech Technologies, a cutting-edge software agency that helps founders and operators go from idea to production 5× faster using AI. Based in New York City, we speciali

Postgres, Twilio, Gmail +5