This workflow corresponds to n8n.io template #10793 — 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 →
{
"id": "",
"meta": {
"templateCredsSetupCompleted": false
},
"name": "Verified Press Pass for Media Events",
"tags": [],
"nodes": [
{
"id": "244283a0-fe52-407d-b0a8-b8029b2cc963",
"name": "Webhook Trigger",
"type": "n8n-nodes-base.webhook",
"position": [
496,
368
],
"parameters": {
"path": "press-application",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 2
},
{
"id": "a523430b-73b8-483c-8e78-a537a2cd4169",
"name": "Validate Required Fields",
"type": "n8n-nodes-base.if",
"position": [
704,
368
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "condition-1",
"operator": {
"type": "string",
"operation": "notEmpty"
},
"leftValue": "={{ $json.body.name }}",
"rightValue": ""
},
{
"id": "condition-2",
"operator": {
"type": "string",
"operation": "notEmpty"
},
"leftValue": "={{ $json.body.email }}",
"rightValue": ""
},
{
"id": "condition-3",
"operator": {
"type": "string",
"operation": "notEmpty"
},
"leftValue": "={{ $json.body.photo_url }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "1fe9f17a-2517-4ff5-a938-c693c0ba12e0",
"name": "Stop: Incomplete Data",
"type": "n8n-nodes-base.stopAndError",
"position": [
992,
576
],
"parameters": {
"errorMessage": "Data is Incomplete"
},
"typeVersion": 1
},
{
"id": "b01f285b-a56d-4f0d-b837-cd30538e212c",
"name": "Check Domain Verified",
"type": "n8n-nodes-base.if",
"position": [
1136,
224
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "condition-verified",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.valid }}",
"rightValue": "true"
}
]
}
},
"typeVersion": 2
},
{
"id": "388d974b-8dd1-443d-b00b-4c3403318660",
"name": "Stop: Domain Not Verified",
"type": "n8n-nodes-base.stopAndError",
"position": [
1424,
384
],
"parameters": {
"errorMessage": "Email Domain not Verified"
},
"typeVersion": 1
},
{
"id": "1bc828ce-ffeb-4ed1-a197-30931c0f5e09",
"name": "Generate Press ID & QR",
"type": "n8n-nodes-base.code",
"position": [
1424,
80
],
"parameters": {
"jsCode": "// Get data from previous nodes\nconst inputData = $input.item.json;\n\n// Extract webhook body data\nconst webhookData = inputData.body || inputData;\n\n// Generate unique Press ID\nconst timestamp = Date.now();\nconst randomStr = Math.random().toString(36).substring(2, 8).toUpperCase();\nconst pressId = `PRESS-${randomStr}-${timestamp}`;\n\n// Your event verification portal URL\nconst baseUrl = 'https://your-event-portal.com';\nconst verificationUrl = `${baseUrl}/verify?id=${pressId}`;\n\n// Generate QR code using free API\nconst qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&format=png&data=${encodeURIComponent(verificationUrl)}`;\n\n// Merge everything together\nreturn {\n json: {\n // Preserve webhook body data\n body: webhookData,\n // Add validation data\n email: inputData.email || webhookData.email,\n valid: inputData.valid,\n details: inputData.details,\n // Add new press pass data\n press_id: pressId,\n verification_url: verificationUrl,\n qr_code_url: qrCodeUrl,\n issued_at: new Date().toISOString(),\n issued_date: new Date().toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n }),\n valid_until: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n })\n }\n};"
},
"typeVersion": 2
},
{
"id": "6d49ad00-e959-4d06-959f-27a618db05eb",
"name": "Send Press Pass Email",
"type": "n8n-nodes-base.gmail",
"position": [
2080,
80
],
"parameters": {
"sendTo": "={{ $('Generate Press ID & QR').item.json.body.email }}",
"message": "=<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<style>\n body { margin: 0; padding: 0; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: #333; background: #f4f4f4; }\n .email-container { max-width: 600px; margin: 20px auto; background: white; border-radius: 12px; overflow: hidden; box-shadow: 0 4px 20px rgba(0,0,0,0.1); }\n .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 40px 30px; text-align: center; }\n .header h1 { margin: 0 0 10px; font-size: 32px; font-weight: 700; }\n .header p { margin: 0; font-size: 16px; opacity: 0.95; }\n .content { padding: 40px 30px; }\n .greeting { font-size: 18px; margin-bottom: 20px; }\n .intro { font-size: 16px; line-height: 1.8; margin-bottom: 30px; }\n .details-box { background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%); padding: 25px; border-radius: 10px; margin: 25px 0; }\n .details-box h3 { margin: 0 0 15px; color: #667eea; font-size: 18px; }\n .detail-row { display: flex; padding: 10px 0; border-bottom: 1px solid rgba(0,0,0,0.1); }\n .detail-row:last-child { border-bottom: none; }\n .detail-label { font-weight: 600; min-width: 140px; color: #555; }\n .detail-value { color: #333; flex: 1; }\n .badge-preview { text-align: center; margin: 30px 0; padding: 30px; background: #f8f9fa; border-radius: 10px; }\n .badge-preview img { max-width: 100%; height: auto; border-radius: 12px; box-shadow: 0 10px 40px rgba(0,0,0,0.15); transition: transform 0.3s ease; }\n .badge-preview img:hover { transform: scale(1.02); }\n .button-container { text-align: center; margin: 35px 0; }\n .button { display: inline-block; background: #667eea; color: white; padding: 14px 32px; text-decoration: none; border-radius: 8px; margin: 8px; font-weight: 600; font-size: 15px; transition: all 0.3s ease; box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4); }\n .button:hover { background: #5568d3; transform: translateY(-2px); box-shadow: 0 6px 20px rgba(102, 126, 234, 0.6); }\n .button-secondary { background: #6c757d; box-shadow: 0 4px 15px rgba(108, 117, 125, 0.4); }\n .button-secondary:hover { background: #5a6268; }\n .instructions { background: #fff3cd; border-left: 4px solid #ffc107; padding: 20px; border-radius: 8px; margin: 25px 0; }\n .instructions h3 { margin: 0 0 15px; color: #856404; font-size: 18px; }\n .instructions ul { margin: 10px 0; padding-left: 20px; }\n .instructions li { margin: 8px 0; color: #856404; }\n .footer { background: #f8f9fa; padding: 25px 30px; text-align: center; border-top: 1px solid #e9ecef; }\n .footer p { margin: 5px 0; font-size: 14px; color: #6c757d; }\n .footer a { color: #667eea; text-decoration: none; }\n .qr-notice { background: #e7f3ff; padding: 15px; border-radius: 8px; margin: 20px 0; text-align: center; border: 2px dashed #2196F3; }\n @media only screen and (max-width: 600px) {\n .header { padding: 30px 20px; }\n .header h1 { font-size: 26px; }\n .content { padding: 25px 20px; }\n .button { display: block; margin: 10px 0; }\n .detail-row { flex-direction: column; }\n .detail-label { margin-bottom: 5px; }\n }\n</style>\n</head>\n<body>\n<div class=\"email-container\">\n <div class=\"header\">\n <h1>\ud83c\udfab Press Pass Verified!</h1>\n <p>Your credentials have been approved</p>\n </div>\n \n <div class=\"content\">\n <p class=\"greeting\">Dear <strong>{{ $('Webhook Trigger').item.json.body.name }}</strong>,</p>\n \n <p class=\"intro\">Congratulations! Your press credentials for <strong>{{ $('Webhook Trigger').item.json.body.event_name }}</strong> have been successfully verified. You're all set to cover this exciting event.</p>\n \n <div class=\"details-box\">\n <h3>\ud83d\udccb Your Press Credentials</h3>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Press ID:</span>\n <span class=\"detail-value\"><strong>{{ $('Generate Press ID & QR').item.json.press_id }}</strong></span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Media Outlet:</span>\n <span class=\"detail-value\">{{ $('Webhook Trigger').item.json.body.media_outlet }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Email:</span>\n <span class=\"detail-value\">{{ $('Webhook Trigger').item.json.body.email }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Issued On:</span>\n <span class=\"detail-value\">{{ $('Generate Press ID & QR').item.json.issued_date }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Valid Until:</span>\n <span class=\"detail-value\">{{ $('Generate Press ID & QR').item.json.valid_until }}</span>\n </div>\n </div>\n\n <div class=\"badge-preview\">\n <h3 style=\"color: #667eea; margin-bottom: 20px;\">\ud83c\udfa8 Your Digital Press Badge</h3>\n <img src=\"{{ $json.image_url }}\" alt=\"Press Badge\">\n </div>\n\n <div class=\"button-container\">\n <a href=\"{{ $json.image_url }}\" class=\"button\">\ud83d\udce5 Download Badge (PNG)</a>\n </div>\n\n <div class=\"qr-notice\">\n <p style=\"margin: 0; color: #0c5460; font-weight: 600;\">\ud83d\udca1 Your QR code is embedded in the badge above</p>\n </div>\n\n <div class=\"instructions\">\n <h3>\u26a0\ufe0f Important Instructions</h3>\n <ul>\n <li><strong>Save this email</strong> and download the badge to your device</li>\n <li><strong>Present the QR code</strong> at event entry for quick check-in</li>\n <li><strong>Carry a government-issued photo ID</strong> matching your press credentials</li>\n <li><strong>Badge is non-transferable</strong> and valid only for the named individual</li>\n <li><strong>Arrive 30 minutes early</strong> to collect any physical materials</li>\n </ul>\n </div>\n\n <p style=\"font-size: 16px; margin-top: 30px;\">Looking forward to seeing you at <strong>{{ $('Webhook Trigger').item.json.body.event_name }}</strong>!</p>\n <p>Best regards,<br><strong>Event Media Relations Team</strong></p>\n </div>\n \n <div class=\"footer\">\n <p><strong>Need Help?</strong></p>\n <p>\ud83d\udce7 Email: <a href=\"mailto:press@event.com\">press@event.com</a></p>\n <p>\ud83d\udcde Phone: +1 (555) 123-4567</p>\n <p style=\"margin-top: 15px; font-size: 12px; color: #999;\">\u00a9 2025 Event Media Relations. All rights reserved.</p>\n </div>\n</div>\n</body>\n</html>",
"options": {},
"subject": "=\u2705 Your Verified Press Pass - {{ $('Webhook Trigger').item.json.body.event_name }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "46c2cc1d-6723-43d2-a328-345fd6a7e333",
"name": "Notify Organizers (Slack)",
"type": "n8n-nodes-base.slack",
"position": [
2352,
-96
],
"parameters": {
"text": "=\u2705 *New Press Pass Issued*\n\n*Journalist:* {{ $('Webhook Trigger').item.json.body.name }}\n*Outlet:* {{ $('Webhook Trigger').item.json.body.media_outlet }}\n*Email:* {{ $('Webhook Trigger').item.json.body.email }}\n*Press ID:* `{{ $('Generate Press ID & QR').item.json.press_id }}`\n\n\ud83d\udcf8 Badge: {{ $('HTML/CSS to Image').item.json.image_url }}\n\ud83d\udd0d Verify: {{ $('Generate Press ID & QR').item.json.verification_url }}\n\n_Issued: {{ $('Generate Press ID & QR').item.json.issued_date }}_\n_Valid Until: {{ $('Generate Press ID & QR').item.json.valid_until }}_",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "YOUR_SLACK_CHANNEL_ID",
"cachedResultName": "YOUR_SLACK_CHANNEL_NAME"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "28277e80-b94d-49b6-b64d-afc7701b3e2e",
"name": "Log to Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
2384,
192
],
"parameters": {
"columns": {
"value": {
"Name": "={{ $('Webhook Trigger').item.json.body.name }}",
"Email": "={{ $('Webhook Trigger').item.json.body.email }}",
"Phone": "={{ $('Webhook Trigger').item.json.body.phone }}",
"Press ID": "={{ $('Generate Press ID & QR').item.json.press_id }}",
"Photo URL": "={{ $('Webhook Trigger').item.json.body.photo_url }}",
"Timestamp": "={{ $now.toISO() }}",
"Event Name": "={{ $('Webhook Trigger').item.json.body.event_name }}",
"Issued Date": "={{ $('Generate Press ID & QR').item.json.issued_date }}",
"QR Code URL": "={{ $('Generate Press ID & QR').item.json.qr_code_url }}",
"Valid Until": "={{ $('Generate Press ID & QR').item.json.valid_until }}",
"Media Outlet": "={{ $('Webhook Trigger').item.json.body.media_outlet }}",
"Badge Image URL": "={{ $('HTML/CSS to Image').item.json.image_url }}",
"Verification URL": "={{ $('Generate Press ID & QR').item.json.verification_url }}",
"Verification Status": "YES",
"Webhook Execution Mode": "={{ $('Webhook Trigger').item.json.executionMode }}"
},
"schema": [
{
"id": "Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Press ID",
"type": "string",
"display": true,
"required": false,
"displayName": "Press ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Phone",
"type": "string",
"display": true,
"required": false,
"displayName": "Phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Media Outlet",
"type": "string",
"display": true,
"required": false,
"displayName": "Media Outlet",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Verification Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Verification Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Event Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Event Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Issued Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Issued Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Valid Until",
"type": "string",
"display": true,
"required": false,
"displayName": "Valid Until",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Badge Image URL",
"type": "string",
"display": true,
"required": false,
"displayName": "Badge Image URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "QR Code URL",
"type": "string",
"display": true,
"required": false,
"displayName": "QR Code URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Verification URL",
"type": "string",
"display": true,
"required": false,
"displayName": "Verification URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Photo URL",
"type": "string",
"display": true,
"required": false,
"displayName": "Photo URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Webhook Execution Mode",
"type": "string",
"display": true,
"required": false,
"displayName": "Webhook Execution Mode",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEETS_SHEET_ID",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_DOCUMENT_ID/edit#gid=YOUR_GOOGLE_SHEETS_SHEET_ID",
"cachedResultName": "YOUR_GOOGLE_SHEETS_SHEET_NAME"
},
"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": "YOUR_GOOGLE_SHEETS_DOCUMENT_NAME"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "2c254f60-918f-4b7f-8897-d238ee24fcca",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
2672,
64
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={{ {\n \"success\": true,\n \"message\": \"Press pass generated successfully\",\n \"press_id\": $json.press_id,\n \"verification_url\": $json.verification_url,\n \"badge_url\": $json.badge_image_url,\n \"issued_at\": $json.issued_at,\n \"valid_until\": $json.valid_until\n} }}"
},
"typeVersion": 1.1
},
{
"id": "d5d8966f-d7ad-4e7b-97b2-2de650e64e44",
"name": "Verifi Email",
"type": "n8n-nodes-verifiemail.verifiEmail",
"position": [
896,
224
],
"parameters": {
"email": "={{ $json.body.email }}"
},
"credentials": {
"verifiEmailApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "3c6ee60f-a677-4d90-88a5-72aee7e8a0b5",
"name": "HTML/CSS to Image",
"type": "n8n-nodes-htmlcsstoimage.htmlCssToImage",
"position": [
1696,
80
],
"parameters": {
"css_content": "@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap');\",\n \"google_fonts\": \"Poppins\",\n \"viewport_width\": 400,\n \"viewport_height\": 600",
"html_content": "=<div style='width: 400px; height: 600px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 20px; padding: 30px; box-shadow: 0 20px 60px rgba(0,0,0,0.3); font-family: Poppins, Arial, sans-serif; color: white; position: relative;'><div style='position: absolute; top: 20px; right: 20px; background: rgba(255,255,255,0.2); padding: 8px 15px; border-radius: 20px; font-size: 12px; font-weight: bold;'>VERIFIED</div><div style='text-align: center;'><div style='background: white; border-radius: 50%; width: 150px; height: 150px; margin: 0 auto 20px; overflow: hidden; border: 5px solid #fff; box-shadow: 0 10px 30px rgba(0,0,0,0.2);'><img src='{{ $('Webhook Trigger').item.json.body.photo_url }}' style='width: 100%; height: 100%; object-fit: cover;'></div><h1 style='margin: 0 0 5px; font-size: 28px; color: #fff; font-weight: 700;'>{{ $('Webhook Trigger').item.json.body.name }}</h1><p style='margin: 0 0 25px; font-size: 16px; opacity: 0.9; font-weight: 500;'>{{ $('Webhook Trigger').item.json.body.media_outlet }}</p><div style='background: rgba(255,255,255,0.15); backdrop-filter: blur(10px); padding: 15px 20px; border-radius: 12px; margin: 25px 0; border: 1px solid rgba(255,255,255,0.2);'><p style='margin: 0; font-size: 11px; opacity: 0.8; text-transform: uppercase; letter-spacing: 1px;'>PRESS ID</p><p style='margin: 5px 0 0; font-size: 18px; font-weight: bold; letter-spacing: 1px; font-family: monospace;'>{{ $json.press_id }}</p></div><div style='background: white; padding: 15px; border-radius: 12px; margin: 25px 0; box-shadow: 0 10px 30px rgba(0,0,0,0.2);'><img src='{{ $json.qr_code_url }}' style='width: 180px; height: 180px; display: block;'></div><div style='margin-top: 20px; padding-top: 20px; border-top: 1px solid rgba(255,255,255,0.2);'><p style='font-size: 16px; font-weight: 600; margin: 0 0 5px;'>{{ $('Webhook Trigger').item.json.body.event_name || 'Media Event 2025' }}</p><p style='font-size: 11px; opacity: 0.7; margin: 0;'>Valid until: {{ $json.valid_until }}</p></div></div></div>"
},
"credentials": {
"htmlcsstoimgApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "e574c3aa-a621-45e6-8886-94c4166579ae",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
64,
32
],
"parameters": {
"width": 380,
"height": 652,
"content": "## How it works\nAutomated press pass generation system for media events. When journalists submit applications via webhook, the workflow validates their data, verifies email domains using VerifiEmail API against approved media organizations, generates unique press IDs with QR codes, creates professional branded badges using HTMLCSSToImage, stores records in Google Sheets, sends email confirmations with badge attachments, and notifies event organizers via Slack\u2014all in under 10 seconds.\n\n## Setup steps\n1. **Activate workflow** and copy webhook URL to embed in your event website form\n2. **Connect credentials**: VerifiEmail API, HTMLCSSToImage, Gmail OAuth, Slack OAuth, Google Sheets API\n3. **Setup Google Sheets**: Add column headers:- Timestamp,Press ID,Name,Email,Phone,Media Outlet,Verification Status,Event Name,Issued Date,Valid Until,Badge Image URL,QR Code URL,Verification URL,Photo URL,Webhook Execution Mode\n4. **Customize branding**: Edit HTML/CSS in badge generation node to match your event colors and logo\n5. **Test thoroughly**: Send sample POST requests with all required fields before going live"
},
"typeVersion": 1
},
{
"id": "6b1a61e4-4793-4270-9d70-c3a992252e35",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
464,
256
],
"parameters": {
"color": 5,
"width": 388,
"height": 244,
"content": "## Data Reception & Validation\nWebhook receives journalist applications and validates required fields (name, email, photo_url) before processing."
},
"typeVersion": 1
},
{
"id": "4b8dc3ba-c4a8-47e3-b977-147324563c8c",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
880,
96
],
"parameters": {
"color": 5,
"width": 392,
"height": 284,
"content": "## Email Verification\nVerifiEmail API validates email domain, checks MX records, and confirms journalist works for approved media outlet."
},
"typeVersion": 1
},
{
"id": "3a2eda27-24e5-471d-82c4-869edb8bbb50",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1376,
-16
],
"parameters": {
"color": 5,
"width": 472,
"height": 252,
"content": "## Badge Creation\nGenerates unique press ID, QR code, and professional badge image with journalist photo, credentials, and event branding."
},
"typeVersion": 1
},
{
"id": "89ab45e1-d6ee-4642-8e68-f64acf5edb5a",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2032,
-176
],
"parameters": {
"color": 5,
"width": 856,
"height": 524,
"content": "## Distribution & Logging\nSends badge via email, notifies organizers on Slack, logs to Google Sheets, then responds to webhook with success."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "",
"connections": {
"Verifi Email": {
"main": [
[
{
"node": "Check Domain Verified",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Validate Required Fields",
"type": "main",
"index": 0
}
]
]
},
"HTML/CSS to Image": {
"main": [
[
{
"node": "Send Press Pass Email",
"type": "main",
"index": 0
}
]
]
},
"Log to Google Sheets": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Check Domain Verified": {
"main": [
[
{
"node": "Generate Press ID & QR",
"type": "main",
"index": 0
}
],
[
{
"node": "Stop: Domain Not Verified",
"type": "main",
"index": 0
}
]
]
},
"Send Press Pass Email": {
"main": [
[
{
"node": "Notify Organizers (Slack)",
"type": "main",
"index": 0
},
{
"node": "Log to Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Generate Press ID & QR": {
"main": [
[
{
"node": "HTML/CSS to Image",
"type": "main",
"index": 0
}
]
]
},
"Validate Required Fields": {
"main": [
[
{
"node": "Verifi Email",
"type": "main",
"index": 0
}
],
[
{
"node": "Stop: Incomplete Data",
"type": "main",
"index": 0
}
]
]
},
"Notify Organizers (Slack)": {
"main": [
[
{
"node": "Respond to Webhook",
"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.
gmailOAuth2googleSheetsOAuth2ApihtmlcsstoimgApislackApiverifiEmailApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Automate press credential verification and badge generation for journalists covering your events
Source: https://n8n.io/workflows/10793/ — 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.
Transform your visitor management process with this fully automated, enterprise-grade workflow. The Verified Visitor Pass Generator eliminates manual data entry, prevents fake registrations through em
Automated email verification and welcome email workflow that validates new user signups, prevents fake emails, and creates a seamless onboarding experience with real-time team notifications.
Automatically generate, validate, and deliver professional course completion certificates with zero manual work — from webhook request to PDF delivery in seconds.
A comprehensive n8n workflow template for automating e-commerce return processes with fraud prevention and professional document generation. E-commerce businesses preventing fraudulent returns Custome
Transform your referral program into a fully automated, fraud-resistant system that delivers professional rewards to verified referrers. This workflow combines email validation, dynamic coupon generat