AutomationFlowsEmail & Gmail › Automate Event Registration & Follow-ups with Gmail Reminders & Google Sheets

Automate Event Registration & Follow-ups with Gmail Reminders & Google Sheets

ByRodrigue Gbadou @gbadou on n8n.io

Simplified registration: Automatically captures sign-ups via optimized web forms.

Webhook trigger★★★★☆ complexity14 nodesGmailGoogle Sheets
Email & Gmail Trigger: Webhook Nodes: 14 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #6069 — we link there as the canonical source.

This workflow follows the Gmail → Google Sheets 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
{
  "nodes": [
    {
      "id": "1",
      "name": "Event Registration Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        240,
        300
      ],
      "parameters": {
        "path": "event-registration",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 1
    },
    {
      "id": "2",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        140,
        180
      ],
      "parameters": {
        "width": 240,
        "height": 160,
        "content": "## Event Management Config\n\n\u2699\ufe0f **Customize event settings:**\n- Event details and schedules\n- Email templates by event type\n- Reminder timings\n- Capacity limits"
      },
      "typeVersion": 1
    },
    {
      "id": "3",
      "name": "Event Settings",
      "type": "n8n-nodes-base.set",
      "position": [
        440,
        300
      ],
      "parameters": {
        "values": {
          "number": [
            {
              "name": "maxCapacity",
              "value": 100
            }
          ],
          "string": [
            {
              "name": "eventDate",
              "value": "2025-07-25T14:00:00Z"
            },
            {
              "name": "eventEndDate",
              "value": "2025-07-25T16:00:00Z"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4",
      "name": "Validate Registration",
      "type": "n8n-nodes-base.if",
      "position": [
        640,
        300
      ],
      "parameters": {
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "string",
                "operation": "isNotEmpty"
              },
              "leftValue": "={{ $json.email }}",
              "rightValue": ""
            },
            {
              "operator": {
                "type": "string",
                "operation": "isNotEmpty"
              },
              "leftValue": "={{ $json.name }}",
              "rightValue": ""
            },
            {
              "operator": {
                "type": "string",
                "operation": "contains"
              },
              "leftValue": "={{ $json.email }}",
              "rightValue": "@"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "5",
      "name": "Process Registration",
      "type": "n8n-nodes-base.code",
      "position": [
        840,
        300
      ],
      "parameters": {
        "jsCode": "// Process registration and generate unique details\nconst registration = $json;\nconst eventSettings = $node['Event Settings'].json;\n\n// Generate unique registration ID\nconst registrationId = `REG_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n// Calculate reminder dates\nconst eventDate = new Date(eventSettings.eventDate);\nconst reminderDates = {\n  weekBefore: new Date(eventDate.getTime() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n  dayBefore: new Date(eventDate.getTime() - 24 * 60 * 60 * 1000).toISOString(),\n  twoHoursBefore: new Date(eventDate.getTime() - 2 * 60 * 60 * 1000).toISOString()\n};\n\n// Generate calendar event data\nconst calendarEvent = {\n  summary: eventSettings.eventTitle,\n  start: eventSettings.eventDate,\n  end: eventSettings.eventEndDate,\n  location: eventSettings.eventLocation,\n  description: `Vous \u00eates inscrit(e) \u00e0 ${eventSettings.eventTitle}. D\u00e9tails: ${eventSettings.eventLocation}`\n};\n\n// Create access credentials for online events\nconst accessCredentials = {\n  meetingId: eventSettings.eventLocation.includes('zoom') ? 'ID: 123 456 789' : null,\n  accessCode: Math.random().toString(36).substr(2, 8).toUpperCase()\n};\n\nreturn {\n  ...registration,\n  registrationId,\n  eventDetails: eventSettings,\n  reminderDates,\n  calendarEvent,\n  accessCredentials,\n  registeredAt: new Date().toISOString(),\n  status: 'confirmed'\n};"
      },
      "typeVersion": 1
    },
    {
      "id": "6",
      "name": "Send Confirmation Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1040,
        300
      ],
      "parameters": {
        "sendTo": "={{ $json.email }}",
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n  <style>\n    body { font-family: Arial, sans-serif; margin: 20px; background-color: #f8f9fa; }\n    .container { max-width: 600px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; }\n    .header { text-align: center; margin-bottom: 30px; background: #007bff; color: white; padding: 20px; border-radius: 8px; }\n    .event-details { background: #e8f4f8; padding: 20px; margin: 20px 0; border-radius: 8px; }\n    .access-info { background: #d4edda; padding: 15px; margin: 15px 0; border-radius: 5px; border-left: 4px solid #28a745; }\n    .calendar-button { background: #28a745; color: white; padding: 15px 30px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0; }\n    .next-steps { background: #fff3cd; padding: 15px; margin: 15px 0; border-radius: 5px; border-left: 4px solid #ffc107; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <h2>\ud83c\udf89 Inscription Confirm\u00e9e !</h2>\n      <p>Merci {{ $json.name }}, votre place est r\u00e9serv\u00e9e</p>\n    </div>\n    \n    <div class=\"event-details\">\n      <h3>\ud83d\udcc5 D\u00e9tails de l'\u00c9v\u00e9nement</h3>\n      <p><strong>Titre:</strong> {{ $json.eventDetails.eventTitle }}</p>\n      <p><strong>Date:</strong> {{ new Date($json.eventDetails.eventDate).toLocaleDateString('fr-FR', { \n        weekday: 'long', \n        year: 'numeric', \n        month: 'long', \n        day: 'numeric', \n        hour: '2-digit', \n        minute: '2-digit' \n      }) }}</p>\n      <p><strong>Dur\u00e9e:</strong> 2 heures</p>\n      <p><strong>Format:</strong> En ligne</p>\n      <p><strong>Lieu:</strong> {{ $json.eventDetails.eventLocation }}</p>\n    </div>\n    \n    {{#if $json.accessCredentials.meetingId}}\n    <div class=\"access-info\">\n      <h3>\ud83d\udd11 Informations d'Acc\u00e8s</h3>\n      <p><strong>Lien de connexion:</strong> {{ $json.eventDetails.eventLocation }}</p>\n      <p><strong>{{ $json.accessCredentials.meetingId }}</strong></p>\n      <p><strong>Code d'acc\u00e8s:</strong> {{ $json.accessCredentials.accessCode }}</p>\n    </div>\n    {{/if}}\n    \n    <div style=\"text-align: center;\">\n      <a href=\"data:text/calendar;charset=utf8,BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nDTSTART:{{ $json.calendarEvent.start }}\nDTEND:{{ $json.calendarEvent.end }}\nSUMMARY:{{ $json.calendarEvent.summary }}\nLOCATION:{{ $json.calendarEvent.location }}\nDESCRIPTION:{{ $json.calendarEvent.description }}\nEND:VEVENT\nEND:VCALENDAR\" class=\"calendar-button\">\n        \ud83d\udcc5 Ajouter \u00e0 mon calendrier\n      </a>\n    </div>\n    \n    <div class=\"next-steps\">\n      <h3>\ud83d\udccb Prochaines \u00c9tapes</h3>\n      <ul>\n        <li>Vous recevrez un rappel 7 jours avant l'\u00e9v\u00e9nement</li>\n        <li>Un email de rappel sera envoy\u00e9 la veille</li>\n        <li>Les liens de connexion seront rappel\u00e9s 2h avant</li>\n        <li>Pr\u00e9parez vos questions pour la session Q&A</li>\n      </ul>\n    </div>\n    \n    <p style=\"color: #666; font-size: 14px; margin-top: 30px;\">\n      ID de r\u00e9servation: {{ $json.registrationId }}<br>\n      Pour toute question: {{ $json.eventDetails.organizerEmail }}\n    </p>\n  </div>\n</body>\n</html>",
        "options": {
          "contentType": "html"
        },
        "subject": "\u2705 Confirmation d'inscription - {{ $json.eventDetails.eventTitle }}"
      },
      "typeVersion": 1
    },
    {
      "id": "7",
      "name": "Wait Until Week Before",
      "type": "n8n-nodes-base.wait",
      "position": [
        1240,
        200
      ],
      "parameters": {
        "unit": "days",
        "amount": 7,
        "resume": "={{ $json.reminderDates.weekBefore }}"
      },
      "typeVersion": 1
    },
    {
      "id": "8",
      "name": "Send Week Reminder",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1440,
        200
      ],
      "parameters": {
        "sendTo": "={{ $json.email }}",
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n  <style>\n    body { font-family: Arial, sans-serif; margin: 20px; background-color: #f8f9fa; }\n    .container { max-width: 600px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; }\n    .reminder-header { text-align: center; margin-bottom: 30px; background: #ffc107; color: #212529; padding: 20px; border-radius: 8px; }\n    .countdown { background: #e9ecef; padding: 20px; margin: 20px 0; border-radius: 8px; text-align: center; }\n    .agenda { background: #f8f9fa; padding: 15px; margin: 15px 0; border-radius: 5px; }\n    .preparation { background: #d1ecf1; padding: 15px; margin: 15px 0; border-radius: 5px; border-left: 4px solid #17a2b8; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"reminder-header\">\n      <h2>\u23f0 Rappel - Plus qu'une semaine !</h2>\n      <p>{{ $json.eventDetails.eventTitle }}</p>\n    </div>\n    \n    <div class=\"countdown\">\n      <h3>\ud83d\uddd3\ufe0f Dans 7 jours</h3>\n      <p>{{ new Date($json.eventDetails.eventDate).toLocaleDateString('fr-FR', { \n        weekday: 'long', \n        year: 'numeric', \n        month: 'long', \n        day: 'numeric', \n        hour: '2-digit', \n        minute: '2-digit' \n      }) }}</p>\n    </div>\n    \n    <div class=\"agenda\">\n      <h3>\ud83d\udccb Programme de la Session</h3>\n      <ul>\n        <li>14h00 - 14h15 : Accueil et pr\u00e9sentation</li>\n        <li>14h15 - 15h00 : Pr\u00e9sentation principale</li>\n        <li>15h00 - 15h15 : Pause</li>\n        <li>15h15 - 15h45 : D\u00e9monstration pratique</li>\n        <li>15h45 - 16h00 : Questions & r\u00e9ponses</li>\n      </ul>\n    </div>\n    \n    <div class=\"preparation\">\n      <h3>\ud83c\udfaf Comment bien se pr\u00e9parer</h3>\n      <ul>\n        <li>Testez votre connexion internet</li>\n        <li>Pr\u00e9parez vos questions \u00e0 l'avance</li>\n        <li>Ayez un carnet pour prendre des notes</li>\n        <li>Rejoignez-nous 5 minutes avant le d\u00e9but</li>\n      </ul>\n    </div>\n    \n    <p style=\"color: #666; font-size: 14px; margin-top: 30px;\">\n      Lien de connexion: {{ $json.eventDetails.eventLocation }}<br>\n      Code d'acc\u00e8s: {{ $json.accessCredentials.accessCode }}\n    </p>\n  </div>\n</body>\n</html>",
        "options": {
          "contentType": "html"
        },
        "subject": "\ud83d\udcc5 Rappel - {{ $json.eventDetails.eventTitle }} dans 7 jours"
      },
      "typeVersion": 1
    },
    {
      "id": "9",
      "name": "Wait Until Day Before",
      "type": "n8n-nodes-base.wait",
      "position": [
        1640,
        200
      ],
      "parameters": {
        "unit": "days",
        "amount": 6,
        "resume": "={{ $json.reminderDates.dayBefore }}"
      },
      "typeVersion": 1
    },
    {
      "id": "10",
      "name": "Send Day Before Reminder",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1840,
        200
      ],
      "parameters": {
        "sendTo": "={{ $json.email }}",
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n  <style>\n    body { font-family: Arial, sans-serif; margin: 20px; background-color: #f8f9fa; }\n    .container { max-width: 600px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; }\n    .urgent-reminder { text-align: center; margin-bottom: 30px; background: #dc3545; color: white; padding: 20px; border-radius: 8px; }\n    .quick-access { background: #d4edda; padding: 20px; margin: 20px 0; border-radius: 8px; border-left: 4px solid #28a745; }\n    .final-details { background: #fff3cd; padding: 15px; margin: 15px 0; border-radius: 5px; border-left: 4px solid #ffc107; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"urgent-reminder\">\n      <h2>\ud83d\udea8 C'est demain !</h2>\n      <p>{{ $json.eventDetails.eventTitle }}</p>\n      <h3>{{ new Date($json.eventDetails.eventDate).toLocaleDateString('fr-FR', { \n        hour: '2-digit', \n        minute: '2-digit' \n      }) }}</h3>\n    </div>\n    \n    <div class=\"quick-access\">\n      <h3>\ud83d\udd17 Acc\u00e8s Rapide</h3>\n      <p><strong>Lien direct:</strong> <a href=\"{{ $json.eventDetails.eventLocation }}\">Cliquez ici pour rejoindre</a></p>\n      <p><strong>Code d'acc\u00e8s:</strong> {{ $json.accessCredentials.accessCode }}</p>\n      <p><strong>Sauvegardez ce lien</strong> pour un acc\u00e8s rapide demain</p>\n    </div>\n    \n    <div class=\"final-details\">\n      <h3>\u2705 Checklist Finale</h3>\n      <ul>\n        <li>\ud83d\udcf1 Notifications activ\u00e9es</li>\n        <li>\ud83c\udfa7 Audio/micro test\u00e9s</li>\n        <li>\ud83d\udcdd Questions pr\u00e9par\u00e9es</li>\n        <li>\u2615 Caf\u00e9/th\u00e9 pr\u00eat</li>\n        <li>\ud83d\udeaa Rejoindre 5 min avant</li>\n      </ul>\n    </div>\n    \n    <p style=\"color: #666; font-size: 14px; margin-top: 30px;\">\n      Vous recevrez un dernier rappel 2h avant l'\u00e9v\u00e9nement.<br>\n      H\u00e2te de vous voir demain ! \ud83c\udf89\n    </p>\n  </div>\n</body>\n</html>",
        "options": {
          "contentType": "html"
        },
        "subject": "\ud83d\udea8 Demain - {{ $json.eventDetails.eventTitle }} - Derni\u00e8res infos"
      },
      "typeVersion": 1
    },
    {
      "id": "11",
      "name": "Wait Until 2h Before",
      "type": "n8n-nodes-base.wait",
      "position": [
        2040,
        200
      ],
      "parameters": {
        "unit": "hours",
        "amount": 22,
        "resume": "={{ $json.reminderDates.twoHoursBefore }}"
      },
      "typeVersion": 1
    },
    {
      "id": "12",
      "name": "Send Final Reminder",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2240,
        200
      ],
      "parameters": {
        "sendTo": "={{ $json.email }}",
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n  <style>\n    body { font-family: Arial, sans-serif; margin: 20px; background-color: #f8f9fa; }\n    .container { max-width: 600px; margin: 0 auto; background: white; padding: 30px; border-radius: 10px; }\n    .final-call { text-align: center; margin-bottom: 30px; background: #28a745; color: white; padding: 20px; border-radius: 8px; }\n    .join-now { background: #007bff; color: white; padding: 20px 40px; text-decoration: none; border-radius: 5px; display: inline-block; margin: 20px 0; font-size: 18px; font-weight: bold; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"final-call\">\n      <h2>\ud83c\udfc1 C'est l'heure !</h2>\n      <p>{{ $json.eventDetails.eventTitle }}</p>\n      <h3>Dans 2 heures</h3>\n    </div>\n    \n    <div style=\"text-align: center;\">\n      <a href=\"{{ $json.eventDetails.eventLocation }}\" class=\"join-now\">\n        \ud83d\ude80 Rejoindre maintenant\n      </a>\n    </div>\n    \n    <p style=\"text-align: center; color: #666; font-size: 14px; margin-top: 30px;\">\n      Code d'acc\u00e8s: {{ $json.accessCredentials.accessCode }}<br>\n      \u00c0 tout de suite ! \ud83c\udf89\n    </p>\n  </div>\n</body>\n</html>",
        "options": {
          "contentType": "html"
        },
        "subject": "\ud83c\udfc1 MAINTENANT - {{ $json.eventDetails.eventTitle }} commence dans 2h"
      },
      "typeVersion": 1
    },
    {
      "id": "13",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2140,
        60
      ],
      "parameters": {
        "width": 240,
        "height": 160,
        "content": "## Post-Event Follow-up\n\n\ud83d\udcca **After event completion:**\n- Thank you email\n- Feedback survey\n- Resource sharing\n- Next event invitations"
      },
      "typeVersion": 1
    },
    {
      "id": "14",
      "name": "Track Registration",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1040,
        450
      ],
      "parameters": {
        "values": {
          "values": [
            "={{ $json.registrationId }}",
            "={{ $json.name }}",
            "={{ $json.email }}",
            "={{ $json.company }}",
            "={{ $json.eventDetails.eventTitle }}",
            "={{ $json.registeredAt }}",
            "={{ $json.status }}"
          ]
        },
        "resource": "sheet",
        "operation": "appendRow",
        "sheetName": "Event Registrations",
        "documentId": "your-google-sheet-id"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Event Settings": {
      "main": [
        [
          {
            "node": "Validate Registration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Week Reminder": {
      "main": [
        [
          {
            "node": "Wait Until Day Before",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Registration": {
      "main": [
        [
          {
            "node": "Send Confirmation Email",
            "type": "main",
            "index": 0
          },
          {
            "node": "Track Registration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait Until 2h Before": {
      "main": [
        [
          {
            "node": "Send Final Reminder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Validate Registration": {
      "main": [
        [
          {
            "node": "Process Registration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait Until Day Before": {
      "main": [
        [
          {
            "node": "Send Day Before Reminder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait Until Week Before": {
      "main": [
        [
          {
            "node": "Send Week Reminder",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Confirmation Email": {
      "main": [
        [
          {
            "node": "Wait Until Week Before",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Day Before Reminder": {
      "main": [
        [
          {
            "node": "Wait Until 2h Before",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Event Registration Webhook": {
      "main": [
        [
          {
            "node": "Event Settings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

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

About this workflow

Simplified registration: Automatically captures sign-ups via optimized web forms.

Source: https://n8n.io/workflows/6069/ — original creator credit. Request a take-down →

More Email & Gmail workflows → · Browse all categories →

Related workflows

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

Email & Gmail

Signup Intake → CRM triage. Uses formTrigger, googleSheets, telegram, telegramTrigger. Webhook trigger; 28 nodes.

Form Trigger, Google Sheets, Telegram +3
Email & Gmail

This template is designed for freelancers, small businesses, and finance teams who need automated invoice management with intelligent payment follow-ups. Perfect for service providers, agencies, or an

Google Sheets, Gmail, Slack
Email & Gmail

Automate short-term trading research by generating high-quality trade ideas using MCP (Market Context Protocol) signals and AI-powered analysis. 📈🤖 This workflow evaluates market context, catalysts, m

Slack, Asana, HTTP Request +4
Email & Gmail

A complete, production-ready newsletter automation workflow that validates email addresses, sends personalized welcome emails, and maintains comprehensive logs in Google Sheets. Perfect for marketing

Google Sheets, Gmail, N8N Nodes Verifiemail
Email & Gmail

This workflow receives purchase order requests via webhook, validates and enriches them, emails the correct approver through Gmail based on spend tier, checks department budgets in Google Sheets, send

Slack, Gmail, Google Sheets