This workflow corresponds to n8n.io template #11012 — 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 →
{
"id": "",
"meta": {
"templateCredsSetupCompleted": false
},
"name": "Verified Corporate Training Certificate with CEUs",
"tags": [
{
"id": "BPzhQdipnO0Tjdq6",
"name": "automation",
"createdAt": "2025-10-22T13:59:37.916Z",
"updatedAt": "2025-10-22T13:59:37.916Z"
},
{
"id": "GQud9hERPXmNNU0h",
"name": "events",
"createdAt": "2025-11-19T11:24:41.582Z",
"updatedAt": "2025-11-19T11:24:41.582Z"
},
{
"id": "fYwexpLkx0FjnL3x",
"name": "media",
"createdAt": "2025-11-19T11:24:41.557Z",
"updatedAt": "2025-11-19T11:24:41.557Z"
},
{
"id": "nm4Q6c2AuUgddkeM",
"name": "badges",
"createdAt": "2025-11-19T11:24:41.569Z",
"updatedAt": "2025-11-19T11:24:41.569Z"
}
],
"nodes": [
{
"id": "9d064507-3406-493e-836e-b16c81ad324b",
"name": "Webhook Trigger",
"type": "n8n-nodes-base.webhook",
"position": [
528,
288
],
"parameters": {
"path": "ceu-certificate",
"options": {},
"httpMethod": "POST",
"responseMode": "responseNode"
},
"typeVersion": 1
},
{
"id": "8107e3ae-b4bb-4a9b-9ab3-843525bfe943",
"name": "Validate Required Fields",
"type": "n8n-nodes-base.if",
"position": [
752,
288
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{$json.body.name}}",
"operation": "isNotEmpty"
},
{
"value1": "={{$json.body.email}}",
"operation": "isNotEmpty"
},
{
"value1": "={{$json.body.courseTitle}}",
"operation": "isNotEmpty"
},
{
"value1": "={{$json.body.CEUsEarned}}",
"operation": "isNotEmpty"
},
{
"value1": "={{$json.body.completionDate}}",
"operation": "isNotEmpty"
}
]
}
},
"typeVersion": 1
},
{
"id": "098338dc-abfd-4b12-b03d-4a9487f9a19d",
"name": "Stop: Incomplete Data",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
960,
480
],
"parameters": {
"options": {
"responseCode": 400
},
"respondWith": "json",
"responseBody": "={\"success\": false, \"error\": \"Missing required fields\", \"message\": \"Please provide name, email, courseTitle, CEUsEarned, and completionDate\"}"
},
"typeVersion": 1
},
{
"id": "5f95d17f-040d-49d4-8b8c-f6a49ebf039c",
"name": "Check Domain Verified",
"type": "n8n-nodes-base.if",
"position": [
1136,
272
],
"parameters": {
"conditions": {
"boolean": [
{
"value1": "={{ $json.valid }}",
"value2": true
}
]
}
},
"typeVersion": 1
},
{
"id": "29ef1e50-241e-4c02-bc29-f803cec709b6",
"name": "Stop: Domain Not Verified",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
1392,
480
],
"parameters": {
"options": {
"responseCode": 400
},
"respondWith": "json",
"responseBody": "={\"success\": false, \"error\": \"Invalid email\", \"message\": \"The provided email address could not be verified or is from a disposable domain\"}"
},
"typeVersion": 1
},
{
"id": "43662678-2cfd-42fc-9023-f37696269795",
"name": "Upload to Google Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
2016,
256
],
"parameters": {
"name": "=CEU_Certificate_{{ $('Webhook Trigger').item.json.body.name.replace(/\\s+/g, '_')}}_{{ $('Generate Certificate ID & QR').item.json.certificateId }}.png",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive",
"cachedResultName": "My Drive"
},
"options": {},
"folderId": {
"__rl": true,
"mode": "list",
"value": "root",
"cachedResultUrl": "https://drive.google.com/drive",
"cachedResultName": "YOUR_FOLDER_NAME"
}
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "1e3c0f8b-74d5-42df-822a-f04ce0d2c752",
"name": "Notify Organizers (Slack)",
"type": "n8n-nodes-base.slack",
"position": [
2416,
256
],
"parameters": {
"text": "=New CEU Certificate Issued\n\u2022 Recipient: John Smith\n\u2022 Course: Advanced Project Management\u2022 CEUs: 3.5 \u2022 Hours: 35\n\nCertificate ID Issued On\nCERT-CEU-1763553796549-VNDQJ6 November 19, 2025\n\n{{ $('HTML to PDF').item.json.pdf_url }}\n[ View Certificate PDF ]\n\nSent automatically \u2022 2:15 PM \u2022 n8n CEU Bot",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "YOUR_CHANNEL_ID",
"cachedResultName": "YOUR_CHANNEL_NAME"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "1dc79c9a-895a-471b-8f25-e8a90c20ca42",
"name": "Log to Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
2624,
256
],
"parameters": {
"columns": {
"value": {
"Name": "={{ $('Webhook Trigger').item.json.body.name }}",
"Email": "={{ $('Webhook Trigger').item.json.body.email }}",
"Status": "Issued",
"PDF URL": "={{ $('HTML to PDF').item.json.pdf_url }}",
"Timestamp": "={{new Date().toISOString()}}",
"CEUs Earned": "={{ $('Webhook Trigger').item.json.body.CEUsEarned }}",
"Course Title": "={{ $('Webhook Trigger').item.json.body.courseTitle }}",
"Certificate ID": "={{ $('Generate Certificate ID & QR').item.json.certificateId }}",
"Training Hours": "={{$('Webhook Trigger').item.json.body.trainingHours || 'N/A'}}",
"Completion Date": "={{ $('Webhook Trigger').item.json.body.completionDate }}",
"Instructor Name": "={{ $('Webhook Trigger').item.json.body.instructorName }}",
"Verification URL": "={{ $('Generate Certificate ID & QR').item.json.verificationUrl }}",
"Company / Provider": "={{ $('Webhook Trigger').item.json.body.companyName }}"
},
"schema": [
{
"id": "Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Timestamp",
"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": "Course Title",
"type": "string",
"display": true,
"required": false,
"displayName": "Course Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "CEUs Earned",
"type": "string",
"display": true,
"required": false,
"displayName": "CEUs Earned",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Training Hours",
"type": "string",
"display": true,
"required": false,
"displayName": "Training Hours",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Completion Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Completion Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Certificate ID",
"type": "string",
"display": true,
"required": false,
"displayName": "Certificate ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Verification URL",
"type": "string",
"display": true,
"required": false,
"displayName": "Verification URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "PDF URL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "PDF URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Instructor Name",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Instructor Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company / Provider",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Company / Provider",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Status",
"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_DOCUMENT_ID/edit#gid=0",
"cachedResultName": "YOUR_SHEET_NAME"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_DOCUMENT_ID",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_DOCUMENT_ID/edit?usp=drivesdk",
"cachedResultName": "YOUR_DOCUMENT_NAME"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.4
},
{
"id": "8ab2756a-1239-459b-b9f6-6ec9fd6312f7",
"name": "Respond to Webhook",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
2848,
256
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={\n \"success\": true,\n \"message\": \"CEU Certificate generated and sent successfully\",\n \"certificateId\": \"{{ $('Generate Certificate ID & QR').item.json.certificateId }}\",\n \"certificateUrl\": \"{{ $('HTML to PDF').item.json.pdf_url }}\",\n \"driveUrl\": \"{{$('Upload to Google Drive').item.json.webViewLink}}\"\n}"
},
"typeVersion": 1
},
{
"id": "086482ae-80f3-4058-848c-497a6774dcbc",
"name": "Verifi Email",
"type": "n8n-nodes-verifiemail.verifiEmail",
"position": [
944,
272
],
"parameters": {
"email": "={{ $json.body.email }}"
},
"credentials": {
"verifiEmailApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "4f25bfb0-1934-4d2b-94e6-f0c9d898d13d",
"name": "HTML to PDF",
"type": "n8n-nodes-htmlcsstopdf.htmlcsstopdf",
"position": [
1584,
256
],
"parameters": {
"html_content": "=<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<title>CEU Certificate - {{ $json.certificateId }}</title>\n<style>\n@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&family=Open+Sans:wght@400;600&display=swap');\nbody{margin:0;padding:40px;background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);font-family:'Open Sans',sans-serif;display:flex;justify-content:center;align-items:center;min-height:100vh}\n.certificate{width:1200px;height:900px;background:white;border-radius:20px;box-shadow:0 30px 80px rgba(0,0,0,0.4);padding:80px;position:relative;overflow:hidden}\n.title{font-family:'Playfair Display',serif;font-size:56px;color:#2d3748;margin:0;text-align:center}\n.subtitle{font-size:24px;color:#718096;text-transform:uppercase;letter-spacing:4px;text-align:center;margin-top:10px}\n.recipient{font-size:48px;font-weight:bold;color:#5a67d8;text-align:center;margin:40px 0 20px}\n.course{font-size:32px;font-weight:600;color:#2d3748;text-align:center;margin:30px 0}\n.details{text-align:center;font-size:20px;line-height:1.8;color:#4a5568}\n.ceu-box{background:#f7fafc;border:3px solid #5a67d8;border-radius:12px;padding:25px 50px;margin:40px auto;display:inline-block;text-align:center}\n.ceu-value{font-size:48px;font-weight:bold;color:#5a67d8;margin:0}\n.footer{position:absolute;bottom:80px;left:80px;right:80px;display:flex;justify-content:space-between;align-items:flex-end}\n.qr-code{width:140px;height:140px;border:10px solid white;box-shadow:0 6px 20px rgba(0,0,0,0.2);border-radius:8px}\n.cert-id{position:absolute;bottom:40px;left:0;right:0;text-align:center;font-size:14px;color:#718096}\n</style>\n</head>\n<body>\n<div class=\"certificate\">\n\n <div style=\"text-align:center;margin-bottom:40px\">\n <h1 class=\"title\">Certificate of Completion</h1>\n <p class=\"subtitle\">Continuing Education Units (CEUs)</p>\n </div>\n\n <p style=\"text-align:center;font-size:20px;color:#718096\">This certifies that</p>\n <h2 class=\"recipient\">{{ $('Webhook Trigger').item.json.body.name }}</h2>\n\n <div class=\"details\">\n <p>has successfully completed the training course</p>\n <p class=\"course\">{{ $('Webhook Trigger').item.json.body.courseTitle }}</p>\n <p>on {{ $('Webhook Trigger').item.json.body.completionDate.split(\"-\")[1] + \"/\" + $('Webhook Trigger').item.json.body.completionDate.split(\"-\")[2] + \"/\" + $('Webhook Trigger').item.json.body.completionDate.split(\"-\")[0] }}</p>\n </div>\n\n <div class=\"ceu-box\">\n <p style=\"margin:0;color:#718096\">Awarded</p>\n <p class=\"ceu-value\">{{ $('Webhook Trigger').item.json.body.CEUsEarned }} CEUs</p>\n <p style=\"margin:0;color:#718096\">{{ $('Webhook Trigger').item.json.body.trainingHours || \"\u2014\" }} Contact Hours</p>\n </div>\n\n <div class=\"footer\">\n <div>\n <p style=\"margin:0;font-weight:600\">{{$('Webhook Trigger').item.json.body.instructorName || \"Training Director\" }}</p>\n <p style=\"margin:0;font-size:14px;color:#718096\">Instructor / Program Director</p>\n </div>\n\n <div style=\"text-align:center\">\n <img src=\"{{ $json.qrCodeUrl }}\" class=\"qr-code\" alt=\"Verification QR Code\" />\n <p style=\"margin:4px 0 0;font-size:11px;color:#666\">Scan to verify authenticity</p>\n </div>\n\n <div style=\"text-align:right\">\n <p style=\"margin:0;font-weight:600\">{{ $('Webhook Trigger').item.json.body.companyName || \"Your Organization\" }}</p>\n <p style=\"margin:0;font-size:14px;color:#718096\">Accredited Provider</p>\n </div>\n </div>\n\n <div class=\"cert-id\">\n Certificate ID: <strong>{{ $json.certificateId }}</strong> \u2022 \n Issued: {{ $now.toFormat(\"MMMM d, yyyy\") }} \u2022 \n Valid until: {{ $now.plus({years: 2}).toFormat(\"MMMM d, yyyy\") }}\n </div>\n\n</div>\n</body>\n</html>"
},
"credentials": {
"htmlcsstopdfApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "2266119e-b1a5-4472-b993-d47a8bdc3224",
"name": "Download File",
"type": "n8n-nodes-base.httpRequest",
"position": [
1792,
256
],
"parameters": {
"url": "={{ $json.pdf_url }}",
"options": {
"response": {
"response": {
"responseFormat": "file"
}
}
}
},
"typeVersion": 4.3
},
{
"id": "be72ef00-997a-4826-82b9-c76ffca52cd3",
"name": "Generate Certificate ID & QR",
"type": "n8n-nodes-base.function",
"position": [
1360,
256
],
"parameters": {
"functionCode": "// SINGLE CODE NODE \u2192 Certificate ID + QR Code (perfect for n8n 1.117.3)\nconst body = items[0].json.body;\n\n// Generate Certificate ID\nconst certId = `CERT-CEU-${Date.now()}-${Math.random().toString(36).substr(2, 6).toUpperCase()}`;\nconst verificationUrl = `https://training.verify.com/cert?id=${certId}`;\n\n// Direct QR code URL from qrserver.com\nconst qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&format=png&margin=10&data=${encodeURIComponent(verificationUrl)}`;\n\nreturn [\n {\n json: {\n ...body,\n certificateId: certId,\n verificationUrl: verificationUrl,\n qrCodeUrl: qrCodeUrl,\n generatedAt: new Date().toISOString()\n },\n // This tells n8n to download the QR image automatically and embed it\n binary: {\n qrCode: {\n data: qrCodeUrl,\n mimeType: \"image/png\",\n fileName: `${certId}-QR.png`,\n fileExtension: \"png\"\n }\n }\n }\n];"
},
"typeVersion": 1
},
{
"id": "b93f81d0-b3eb-47ca-8c64-ea81b39c4e98",
"name": "Send Email",
"type": "n8n-nodes-base.gmail",
"position": [
2208,
256
],
"parameters": {
"sendTo": "={{ $('Webhook Trigger').item.json.body.email }}",
"message": "=<div style=\"font-family: Arial, sans-serif; max-width: 600px; margin: 40px auto; background: #ffffff; border-radius: 16px; overflow: hidden; box-shadow: 0 10px 30px rgba(0,0,0,0.1);\">\n \n <!-- Header -->\n <div style=\"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); padding: 40px 30px; text-align: center; color: white;\">\n <h1 style=\"margin:0; font-size: 28px; font-weight: 600;\">Certificate Awarded</h1>\n <p style=\"margin:8px 0 0; font-size: 18px; opacity: 0.95;\">Congratulations on your achievement!</p>\n </div>\n\n <!-- Body -->\n <div style=\"padding: 40px 30px; color: #333; line-height: 1.7;\">\n \n <p style=\"font-size: 17px; margin-bottom: 20px;\">\n Dear <strong>{{ $('Webhook Trigger').item.json.body.name }}</strong>,\n </p>\n\n <p style=\"font-size: 16px;\">\n We are delighted to inform you that you have successfully completed the training program:\n </p>\n\n <div style=\"background: #f8f5ff; padding: 20px; border-radius: 12px; border-left: 5px solid #764ba2; margin: 25px 0; font-size: 18px; text-align: center;\">\n <strong>{{ $('Webhook Trigger').item.json.body.courseTitle }}</strong>\n </div>\n\n <!-- Certificate Details -->\n <div style=\"background: #f9f9f9; padding: 20px; border-radius: 12px; margin: 30px 0;\">\n <h3 style=\"margin: 0 0 15px; color: #764ba2; font-size: 18px;\">Certificate Details</h3>\n <table style=\"width: 100%; font-size: 15px; color: #444;\">\n <tr>\n <td style=\"padding: 8px 0; font-weight: 600;\">Certificate ID</td>\n <td style=\"text-align: right;\">{{ $('Generate Certificate ID & QR').item.json.certificateId }}</td>\n </tr>\n <tr>\n <td style=\"padding: 8px 0; font-weight: 600;\">CEUs Earned</td>\n <td style=\"text-align: right;\">{{ $('Webhook Trigger').item.json.body.CEUsEarned }} CEUs</td>\n </tr>\n <tr>\n <td style=\"padding: 8px 0; font-weight: 600;\">Completion Date</td>\n <td style=\"text-align: right;\">\n {{ $('Webhook Trigger').item.json.body.completionDate.split(\"-\")[2] + \"/\" + \n $('Webhook Trigger').item.json.body.completionDate.split(\"-\")[1] + \"/\" + \n $('Webhook Trigger').item.json.body.completionDate.split(\"-\")[0] }}\n </td>\n </tr>\n <tr>\n <td style=\"padding: 8px 0; font-weight: 600;\">Contact Hours</td>\n <td style=\"text-align: right;\">{{ $('Webhook Trigger').item.json.body.trainingHours || \"\u2014\" }}</td>\n </tr>\n </table>\n </div>\n\n <!-- Download Button -->\n <div style=\"text-align: center; margin: 35px 0;\">\n <a href=\"{{ $('HTML to PDF').item.json.pdf_url }}\" \n target=\"_blank\"\n style=\"background: #764ba2; color: white; font-weight: bold; font-size: 17px; padding: 16px 40px; border-radius: 50px; text-decoration: none; display: inline-block; box-shadow: 0 8px 20px rgba(118,75,162,0.4);\">\n Download Your Certificate (PDF)\n </a>\n </div>\n\n <p style=\"font-size: 14px; color: #777; text-align: center; margin-top: 30px;\">\n Your certificate has been securely issued and is ready for printing or sharing.\n </p>\n </div>\n\n <!-- Footer -->\n <div style=\"background: #f8f9fa; padding: 20px; text-align: center; font-size: 13px; color: #888; border-top: 1px solid #eee;\">\n Issued on {{ $now.toFormat(\"MMMM d, yyyy\") }} \u2022 Certificate ID: {{ $('Generate Certificate ID & QR').item.json.certificateId }}<br>\n This is an automated message. Please do not reply.\n </div>\n</div>",
"options": {
"appendAttribution": false
},
"subject": "=\u2705 Your CEU Certificate - {{ $('Webhook Trigger').item.json.body.courseTitle }}"
},
"credentials": {
"gmailOAuth2": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "f8f78383-859a-4395-b326-be9f7406d692",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-16,
48
],
"parameters": {
"width": 448,
"height": 368,
"content": "# How It Works\n\n## **Verified Corporate Training Certificate with CEUs**\n\nAutomates secure, verifiable CEU certificate generation for corporate training.\n\nFeatures:\n\u2022 Real-time email validation\n\u2022 Unique Certificate ID + QR code\n\u2022 Professional PDF certificate\\n\u2022 Auto-email delivery + Slack notification\n\u2022 Full audit log in Google Sheets"
},
"typeVersion": 1
},
{
"id": "6b634261-859a-4e5e-824b-66656ef038e6",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-16,
464
],
"parameters": {
"width": 336,
"height": 400,
"content": "# Setup Credentials \n## Setup Steps (One-time)\n\n1. Connect credentials:\n\u2022 Verif.Email API at verifi.email\n\u2022 https://pdfmunk.com\n\u2022 Google Drive + Gmail\n\u2022 Google Sheets\n\u2022 Slack (optional)\n\n2. Update: \n\u2022 Webhook URL in your forms\n\u2022 Company name & logo in HTML template\n\u2022 Google Sheets ID & tab name\n\n3. Activate workflow \u2192 ready!"
},
"typeVersion": 1
},
{
"id": "ad394608-8aa3-4123-a3c5-0a8ad127be46",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
496,
48
],
"parameters": {
"color": 5,
"width": 784,
"height": 368,
"content": "# Validation\n\n## **Data Reception & Validation**\n\n* Accepts POST from any form/tool\n* Checks all required fields\n* Validates email deliverability (MX + disposable check)\n\n\n"
},
"typeVersion": 1
},
{
"id": "0ac7497b-8134-48b6-8078-45d2687be00a",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1296,
0
],
"parameters": {
"color": 5,
"width": 624,
"height": 400,
"content": "# Generation\n\n## Certificate Generation\n\n* Generates unique Certificate ID\n* Creates QR code for verification\n* Renders beautiful PDF certificate via HTML \u2192 PDF\n* Downloads pdf URL to Binary File\n\n\n"
},
"typeVersion": 1
},
{
"id": "a84cb6f5-cb07-437a-bf89-90d455fe3979",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1952,
-16
],
"parameters": {
"color": 5,
"width": 1120,
"height": 432,
"content": "# Delivery\n\n## Distribution & Logging\n\n* Uploads to Google Drive\n* Sends personalized email with PDF\n* Notifies team via Slack\n* Logs everything to Google Sheets\n* Returns success to webhook"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "",
"connections": {
"Send Email": {
"main": [
[
{
"node": "Notify Organizers (Slack)",
"type": "main",
"index": 0
}
]
]
},
"HTML to PDF": {
"main": [
[
{
"node": "Download File",
"type": "main",
"index": 0
}
]
]
},
"Verifi Email": {
"main": [
[
{
"node": "Check Domain Verified",
"type": "main",
"index": 0
}
]
]
},
"Download File": {
"main": [
[
{
"node": "Upload to Google Drive",
"type": "main",
"index": 0
}
]
]
},
"Webhook Trigger": {
"main": [
[
{
"node": "Validate Required Fields",
"type": "main",
"index": 0
}
]
]
},
"Log to Google Sheets": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
},
"Check Domain Verified": {
"main": [
[
{
"node": "Generate Certificate ID & QR",
"type": "main",
"index": 0
}
],
[
{
"node": "Stop: Domain Not Verified",
"type": "main",
"index": 0
}
]
]
},
"Upload to Google Drive": {
"main": [
[
{
"node": "Send Email",
"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": "Log to Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Generate Certificate ID & QR": {
"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.
gmailOAuth2googleDriveOAuth2ApigoogleSheetsOAuth2ApihtmlcsstopdfApislackApiverifiEmailApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Verified Corporate Training Certificate with CEUs – Fully Automated & Verifiable
Source: https://n8n.io/workflows/11012/ — 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.
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
Automated Email Verification & Digital Health Card Generator
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
Transform your event registration process with this comprehensive automation that eliminates manual certificate creation and ensures only verified attendees receive credentials.
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.