AutomationFlowsWeb Scraping › Automated Workshop Certificate System with Jotform, Email Verification &…

Automated Workshop Certificate System with Jotform, Email Verification &…

Original n8n title: Automated Workshop Certificate System with Jotform, Email Verification & Google Workspace

ByJitesh Dugar @jiteshdugar on n8n.io

Transform your event registration process with this comprehensive automation that eliminates manual certificate creation and ensures only verified attendees receive credentials.

Event trigger★★★★☆ complexity24 nodesHTTP RequestGmailGoogle SheetsJot Form TriggerN8N Nodes VerifiemailN8N Nodes HtmlcsstopdfGoogle Drive
Web Scraping Trigger: Event Nodes: 24 Complexity: ★★★★☆ Added:

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

This workflow follows the Gmail → Google Drive 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
{
  "id": "",
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "name": "Workshop Certificate Pre-Issuance System",
  "tags": [],
  "nodes": [
    {
      "id": "5e7bec79-8951-4388-890c-73e37a6ef8b2",
      "name": "IF - Email Valid?",
      "type": "n8n-nodes-base.if",
      "position": [
        560,
        560
      ],
      "parameters": {
        "conditions": {
          "boolean": [
            {
              "value1": "={{ $json.valid }}",
              "value2": "={{ true }}"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "1e9a2800-bab2-47f2-8fff-5f52f0d3e903",
      "name": "Prepare Certificate Data",
      "type": "n8n-nodes-base.code",
      "position": [
        880,
        368
      ],
      "parameters": {
        "jsCode": "// Get current item (merged data)\nconst data = $input.first().json;\n\n// Build full name\nconst fullName = `${data[\"Full Name\"].first} ${data[\"Full Name\"].last}`.trim();\n\n// Format date\nconst dateObj = data[\"Select Workshop Date\"];\nconst displayDate = new Date(`${dateObj.year}-${dateObj.month}-${dateObj.day}`).toLocaleDateString('en-US', {\n  year: 'numeric',\n  month: 'long',\n  day: 'numeric'\n});\n\n// QR Code URL\nconst verificationUrl = `https://your-domain.com/verify?email=${encodeURIComponent(data.Email)}&event=${encodeURIComponent(data[\"Select Workshop\"])}`;\n\n// Unique Certificate ID\nconst certificateId = `CERT-${Date.now().toString(36).toUpperCase()}-${Math.random().toString(36).substr(2, 5).toUpperCase()}`;\n\n// Return clean data for HTML\nreturn [\n  {\n    json: {\n      name: fullName,\n      email: data.Email,\n      event: data[\"Select Workshop\"],\n      date: displayDate,\n      qrCodeUrl: `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(verificationUrl)}&size=200x200&margin=10`,\n      verificationUrl: verificationUrl,\n      certificateId: certificateId,\n      verifiedAt: new Date().toISOString(),\n      emailProvider: data.details?.mx?.provider || \"Unknown\",\n      isValid: data.valid\n    }\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "ff60e9dc-464e-4b54-8bbd-1e90874436d5",
      "name": "Download PDF File",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1536,
        368
      ],
      "parameters": {
        "url": "={{ $json.pdf_url }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file",
              "outputPropertyName": "pdfData"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "f8ec0f94-b7c6-43c8-8598-7cb5e324b523",
      "name": "Send Confirmation Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2464,
        368
      ],
      "parameters": {
        "sendTo": "={{ $('Prepare Certificate Data').item.json.email }}",
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n  <meta charset=\"utf-8\">\n  <style>\n    body { font-family: 'Segoe UI', Tahoma, sans-serif; background: #f4f4f9; color: #333; padding: 20px; }\n    .container { max-width: 600px; margin: auto; background: white; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 12px rgba(0,0,0,0.1); }\n    .header { background: #1a5fb4; color: white; padding: 30px; text-align: center; }\n    .header h1 { margin: 0; font-size: 24px; }\n    .body { padding: 30px; line-height: 1.6; }\n    .highlight { background: #e3f2fd; padding: 15px; border-radius: 8px; margin: 20px 0; font-weight: bold; }\n    .qr { text-align: center; margin: 25px 0; }\n    .qr img { width: 140px; height: 140px; border: 1px solid #ddd; padding: 8px; border-radius: 8px; }\n    .footer { background: #f0f0f0; padding: 20px; text-align: center; font-size: 12px; color: #777; }\n    .btn { display: inline-block; background: #1a5fb4; color: white; padding: 12px 24px; text-decoration: none; border-radius: 6px; margin-top: 15px; font-weight: bold; }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <div class=\"header\">\n      <h1>Workshop Confirmation</h1>\n    </div>\n    <div class=\"body\">\n      <p>Hi <strong>{{ $json['Full Name'] }}</strong>,</p>\n      <p>Congratulations! Your registration for:</p>\n      <div class=\"highlight\">\n        <strong>{{ $json.Workshop }}</strong><br>\n        {{ $json.Date }}\n      </div>\n      <p>has been <strong>verified and confirmed</strong>.</p>\n\n      <div class=\"qr\">\n        <img src=\"{{ $json['QR Code URL'] }}\" alt=\"QR Code\">\n        <p><em>Scan on event day for instant check-in</em></p>\n      </div>\n\n      <p><strong>Certificate ID:</strong> <code>{{ $json['Certificate ID'] }}</code></p>\n      <p><strong>Verified Email:</strong> {{ $json.Email }}</p>\n\n      <p>Your official <strong>pre-issued certificate is attached</strong> as a PDF.</p>\n\n      <a href=\"{{ $json['PDF Link'] }}\" class=\"btn\" target=\"_blank\">\n        View Certificate Online\n      </a>\n    </div>\n    <div class=\"footer\">\n      Issued on {{ new Date().toLocaleDateString() }} \u2022 Powered by <strong>n8n Automation</strong>\n    </div>\n  </div>\n</body>\n</html>",
        "options": {},
        "subject": "=\ud83c\udf89 Your Workshop Seat is Confirmed - {{ $('Prepare Certificate Data').item.json.event }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "96b09356-225b-41dd-8684-b003df5b7f1c",
      "name": "Log to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2176,
        368
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $('Prepare Certificate Data').item.json.date }}",
            "Email": "={{ $('Prepare Certificate Data').item.json.email }}",
            "PDF Link": "={{ $json.webViewLink }}",
            "Workshop": "={{ $('Prepare Certificate Data').item.json.event }}",
            "Full Name": "={{ $('Prepare Certificate Data').item.json.name }}",
            "Timestamp": "={{ new Date().toISOString() }}",
            "QR Code URL": "={{ $('Prepare Certificate Data').item.json.qrCodeUrl }}",
            "Verified At": "={{ $json.createdTime }}",
            "Certificate ID": "={{ $('Prepare Certificate Data').item.json.certificateId }}"
          },
          "schema": [
            {
              "id": "Timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Full Name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Full Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Workshop",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Workshop",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Certificate ID",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Certificate ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "QR Code URL",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "QR Code URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "PDF Link",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "PDF Link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Verified At",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Verified At",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Email"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_DOCUMENT_ID/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEETS_DOCUMENT_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_DOCUMENT_ID/edit?usp=drivesdk",
          "cachedResultName": "Workshop Registrations & Certificates"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "4c34e01e-c47f-4879-a79b-f358b4e774e6",
      "name": "Log Failed Registrations",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        880,
        736
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ new Date(\n  $json[\"Select Workshop Date\"].year + '-' +\n  String($json[\"Select Workshop Date\"].month).padStart(2, '0') + '-' +\n  String($json[\"Select Workshop Date\"].day).padStart(2, '0')\n).toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' }) }}",
            "Email": "={{ $json.Email }}",
            "Status": "Invalid Email",
            "PDF Link": "Invalid Email",
            "Workshop": "={{ $json[\"Select Workshop\"] }}",
            "Full Name": "={{ $json['Full Name'].first + ' ' + $json['Full Name'].last }}",
            "Timestamp": "={{ $now }}",
            "QR Code URL": "Invalid Email",
            "Verified At": "Invalid Email",
            "Certificate ID": "Invalid Email"
          },
          "schema": [
            {
              "id": "Timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Full Name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Full Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Workshop",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Workshop",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Certificate ID",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Certificate ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "QR Code URL",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "QR Code URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "PDF Link",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "PDF Link",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Verified At",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Verified At",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_DOCUMENT_ID/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEETS_DOCUMENT_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_DOCUMENT_ID/edit?usp=drivesdk",
          "cachedResultName": "Workshop Registrations & Certificates"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "0d26d3cd-509b-4f95-b188-00d41bb17e3c",
      "name": "JotForm Trigger",
      "type": "n8n-nodes-base.jotFormTrigger",
      "position": [
        -224,
        544
      ],
      "parameters": {
        "form": "YOUR_JOTFORM_FORM_ID"
      },
      "credentials": {
        "jotFormApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "de18b560-5a30-4b26-998f-a701590b4e9d",
      "name": "Verifi Email",
      "type": "n8n-nodes-verifiemail.verifiEmail",
      "position": [
        0,
        752
      ],
      "parameters": {
        "email": "={{ $json.Email }}"
      },
      "credentials": {
        "verifiEmailApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "1eb2b648-b557-42f1-aed5-d6b3f5b6419e",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        288,
        560
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "5b63e21f-3504-4081-8422-800bda3803b5",
      "name": "HTML to PDF",
      "type": "n8n-nodes-htmlcsstopdf.htmlcsstopdf",
      "position": [
        1200,
        368
      ],
      "parameters": {
        "html_content": "=<div style=\"font-family: 'Georgia', serif; text-align: center; padding: 40px; border: 8px double #1a5fb4; background: #f9f9fb; max-width: 600px; margin: auto; color: #1a1a1a;\">\n  <h1 style=\"color: #1a5fb4; margin-bottom: 10px;\">Certificate of Confirmation</h1>\n  <p style=\"font-size: 18px; color: #555;\">This certifies that</p>\n  \n  <h2 style=\"font-size: 28px; margin: 15px 0; color: #1a5fb4;\">{{ $json.name }}</h2>\n  \n  <p style=\"font-size: 18px; color: #555;\">has successfully registered for</p>\n  <h3 style=\"font-size: 22px; color: #000;\">{{ $json.event }}</h3>\n  \n  <p style=\"font-size: 16px; margin: 10px 0;\"><strong>Date:</strong> {{ $json.date }}</p>\n  \n  <div style=\"margin: 30px 0;\">\n    <img src=\"{{ $json.qrCodeUrl }}\" alt=\"QR Code\" style=\"width: 150px; height: 150px;\" />\n  </div>\n  \n  <p style=\"font-size: 14px; color: #666;\">\n    <strong>Certificate ID:</strong> {{ $json.certificateId }}<br>\n    <strong>Verified Email:</strong> {{ $json.email }} ({{ $json.emailProvider }})<br>\n    <em>Scan QR code on event day for instant check-in</em>\n  </p>\n  \n  <hr style=\"border: 1px dashed #ccc; margin: 30px 0;\">\n  <p style=\"font-size: 12px; color: #999;\">\n    Issued: {{ new Date().toLocaleDateString() }} \u2022 Powered by n8n Automation\n  </p>\n</div>"
      },
      "credentials": {
        "htmlcsstopdfApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d7504f9f-ee7e-41b0-8ec3-28acf6b139be",
      "name": "Upload file",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        1856,
        368
      ],
      "parameters": {
        "name": "=Confirmed_Attendee_{{ $('Prepare Certificate Data').item.json.name }}_{{ $('Prepare Certificate Data').item.json.date }}.pdf",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive",
          "cachedResultUrl": "https://drive.google.com/drive/my-drive",
          "cachedResultName": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_DRIVE_FOLDER_ID",
          "cachedResultUrl": "https://drive.google.com/drive/folders/YOUR_GOOGLE_DRIVE_FOLDER_ID",
          "cachedResultName": "Attendee Data"
        },
        "inputDataFieldName": "pdfData"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "cfe08577-ff68-4961-af0a-20ad40a7393b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -928,
        -32
      ],
      "parameters": {
        "width": 368,
        "height": 336,
        "content": "## \ud83c\udfaf WORKFLOW OVERVIEW\n\n**Purpose:** Automated Pre-Issued Workshop Certificate System\n\n**What This Workflow Does:**\n1. \u2705 Captures workshop registrations from Jotform\n2. \u2705 Verifies email validity using VerifiEmail\n3. \u2705 Generates professional PDF certificates\n4. \u2705 Saves certificates to Google Drive\n5. \u2705 Sends confirmation email with certificate\n6. \u2705 Logs all registrations to Google Sheets\n7. \u2705 Handles invalid email addresses gracefully\n"
      },
      "typeVersion": 1
    },
    {
      "id": "3bc160b5-b5f3-4b6d-82cc-85a70e6f7beb",
      "name": "Sticky Note - Step 3 Merge",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        176,
        336
      ],
      "parameters": {
        "color": 5,
        "width": 300,
        "height": 381,
        "content": "## \ud83d\udd00 STEP 3: Data Merge\n\n**What It Does:**\n- Combines Jotform data with email verification results\n- Merges by position (1st submission + 1st verification)\n- Creates unified data object for downstream nodes\n"
      },
      "typeVersion": 1
    },
    {
      "id": "343482c5-6df5-41c2-9954-5047ff76d18f",
      "name": "Sticky Note - Step 5 Data Prep",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        784,
        160
      ],
      "parameters": {
        "color": 5,
        "width": 348,
        "height": 343,
        "content": "## \ud83e\udde0 STEP 5: Data Preparation\n\n**What It Does:**\n- Formats and cleans data for certificate\n- Builds full name from first + last\n- Formats date in readable format\n- Generates unique Certificate ID\n- Creates QR code URL for verification"
      },
      "typeVersion": 1
    },
    {
      "id": "66a19ac2-10fb-465d-b54c-08593974aae0",
      "name": "Sticky Note - Step 6 PDF Generation",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1136,
        112
      ],
      "parameters": {
        "color": 5,
        "width": 316,
        "height": 405,
        "content": "## \ud83c\udfa8 STEP 6: PDF Certificate Generation\n\n**Certificate Design Features:**\n\u2728 Professional Georgia serif font\n\u2728 Blue theme (#1a5fb4) with double border\n\u2728 Centered layout\n\u2728 QR code for instant check-in\n\u2728 Certificate ID & verification details\n\u2728 Timestamp footer\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7e7c6eda-9d79-4cc2-97a4-3c70a1c42f5b",
      "name": "Sticky Note - Step 7 Download PDF",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1456,
        128
      ],
      "parameters": {
        "color": 5,
        "width": 316,
        "height": 377,
        "content": "## \u2b07\ufe0f STEP 7: Download PDF File\n\n**What It Does:**\n- Downloads PDF from generated URL\n- Converts to binary data\n- Prepares for Google Drive upload\n- Makes PDF available for email attachment\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "556585b6-08ee-43c7-9ba0-2d770495b442",
      "name": "Sticky Note - Step 8 Google Drive",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1776,
        112
      ],
      "parameters": {
        "color": 5,
        "width": 300,
        "height": 407,
        "content": "## \u2601\ufe0f STEP 8: Save to Google Drive\n\n**What It Does:**\n- Uploads PDF certificate to Google Drive\n- Organizes in \"Attendee Data\" folder\n- Generates shareable web view link\n- Creates permanent backup of all certificates\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "b236ab7c-1343-401b-809a-46da6da52e78",
      "name": "Sticky Note - Step 9 Google Sheets",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2080,
        -80
      ],
      "parameters": {
        "color": 5,
        "width": 316,
        "height": 601,
        "content": "## \ud83d\udcca STEP 9: Log to Google Sheets\n\n**Google Sheet:**\n\"Workshop Registrations & Certificates\"\n\n**Logged Fields:**\n\n| Columns | \n|--------|\n- Timestamp \n- Full Name \n- Email \n- Workshop  \n- Date \n- Certificate ID \n- QR Code URL \n- PDF Link \n- Status\n- Verification time \n"
      },
      "typeVersion": 1
    },
    {
      "id": "92f23ba3-991c-478f-a73a-6066d71c81c9",
      "name": "Sticky Note - Step 10 Gmail",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2400,
        0
      ],
      "parameters": {
        "color": 5,
        "width": 380,
        "height": 519,
        "content": "## \ud83d\udce7 STEP 10: Send Confirmation Email\n\n**What It Does:**\n- Sends beautiful HTML confirmation email\n- Includes event details & QR code\n- Provides Drive link to certificate\n- Professional branded template\n\n**Email Features:**\n\u2728 Mobile responsive\n\u2728 Professional styling\n\u2728 Blue color theme (#1a5fb4)\n\u2728 Clean typography\n\u2728 Embedded QR code\n\u2728 Direct Drive link\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "e52d6ffe-cd32-410f-bc4a-6df2188e3159",
      "name": "Sticky Note - False Branch",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        800,
        720
      ],
      "parameters": {
        "color": 3,
        "width": 380,
        "height": 409,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n## \u274c FALSE BRANCH: Invalid Email Path\n\n**Common Failure Reasons:**\n\u274c Invalid email format\n\u274c Disposable/temporary email\n\u274c Domain doesn't exist\n\u274c Mailbox doesn't exist\n\u274c SMTP verification failed\n\u274c Role-based email blocked\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "c28f87a3-365f-4fba-aec5-3f9db0f0a571",
      "name": "Sticky Note - Credentials Status",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -928,
        336
      ],
      "parameters": {
        "color": 4,
        "width": 327,
        "height": 339,
        "content": "## \ud83d\udd10 CREDENTIALS SETUP CHECKLIST\n\n**Required Credentials (All Configured \u2705):**\n\n1. **\u2705 Jotform API**\n2. **\u2705 VerifiEmail API**\n3. **\u2705 Google Drive OAuth2**\n   - Folder: Attendee Data\n4. **\u2705 Gmail OAuth2**\n5. **\u2705 Google Sheets OAuth2**\n   - Sheet: Workshop Registrations\n6. **\u2705 HTML to PDF API**\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8a808aa3-96eb-40c8-b2e1-e46258d936e4",
      "name": "Sticky Note - Step 1 Jotform",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -464,
        336
      ],
      "parameters": {
        "color": 5,
        "width": 364,
        "height": 347,
        "content": "## \ud83d\udcdd STEP 1: Registration Form Trigger\n\n**What It Does:**\n- Listens for new workshop registrations\n- Captures form data in real-time\n- Starts the automation workflow\n\n**Captured Fields:**\n- Full Name (First + Last)\n- Email Address\n- Workshop Selection\n- Workshop Date\n"
      },
      "typeVersion": 1
    },
    {
      "id": "9e18f646-f00f-4a08-a22d-866d735cba3b",
      "name": "Sticky Note - Step 2 Email Verification",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        736
      ],
      "parameters": {
        "color": 5,
        "width": 364,
        "height": 367,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n## \u2709\ufe0f STEP 2: Email Verification\n\n**What It Does:**\n- Validates email deliverability in real-time\n- Checks for disposable/temporary emails\n- Verifies email format and DNS records\n- Detects role-based emails (info@, admin@)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "f59bfa08-733e-46d2-925a-97f717ee8162",
      "name": "Sticky Note - Step 4 IF Condition",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        480,
        288
      ],
      "parameters": {
        "color": 5,
        "width": 300,
        "height": 417,
        "content": "## \ud83d\udd00 STEP 4: Conditional Split\n\n**What It Does:**\n- Routes workflow based on email validation\n- Splits into two branches: SUCCESS & FAILURE\n\n**Condition:**\n`{{ $json.valid }} === true`\n\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "",
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "IF - Email Valid?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTML to PDF": {
      "main": [
        [
          {
            "node": "Download PDF File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload file": {
      "main": [
        [
          {
            "node": "Log to Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verifi Email": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "JotForm Trigger": {
      "main": [
        [
          {
            "node": "Verifi Email",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download PDF File": {
      "main": [
        [
          {
            "node": "Upload file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF - Email Valid?": {
      "main": [
        [
          {
            "node": "Prepare Certificate Data",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Log Failed Registrations",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log to Google Sheets": {
      "main": [
        [
          {
            "node": "Send Confirmation Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Confirmation Email": {
      "main": [
        []
      ]
    },
    "Prepare Certificate Data": {
      "main": [
        [
          {
            "node": "HTML to PDF",
            "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.

Pro

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

About this workflow

Transform your event registration process with this comprehensive automation that eliminates manual certificate creation and ensures only verified attendees receive credentials.

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

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

Verified Corporate Training Certificate with CEUs – Fully Automated & Verifiable

Google Drive, Slack, Google Sheets +4
Web Scraping

Transform your order fulfillment process with complete invoice automation. This workflow automatically generates professional PDF invoices from Jotform orders and delivers them to customers while keep

Google Drive, Gmail, N8N Nodes Htmlcsstopdf +2
Web Scraping

A comprehensive n8n workflow template that completely automates the startup pitch deck submission process for accelerators, incubators, VC firms, and startup competitions. This workflow validates foun

Google Drive, Gmail, N8N Nodes Verifiemail +2
Web Scraping

This workflow automates the entire parent consent process for school field trips, replacing manual paper forms with a secure, verified, and legally compliant digital system.

Google Drive, Gmail, N8N Nodes Verifiemail +2
Web Scraping

This workflow automates the entire pre-issuance process of workshop participation certificates. When an attendee submits a registration form via a webhook, the workflow validates the data, verifies th

Google Drive, Gmail, Google Sheets +4