Générateur de passes de visiteur vérifié
Ceci est unDocument Extractionworkflow d'automatisation du domainecontenant 22 nœuds.Utilise principalement des nœuds comme If, Set, Code, Gmail, Slack. Automatiser la gestion des visiteurs avec la vérification d'e-mail, les passes et des rappels Slack
- •Compte Google et informations d'identification Gmail API
- •Token Bot Slack ou URL Webhook
- •Point de terminaison HTTP Webhook (généré automatiquement par n8n)
- •Informations d'identification Google Sheets API
Nœuds utilisés (22)
Catégorie
{
"id": "",
"meta": {
"instanceId": ""
},
"name": "Verified Visitor Pass Generator",
"tags": [],
"nodes": [
{
"id": "c897caf3-b83b-46fd-9eb3-a73ea8b563a1",
"name": "Set - Extraire les données du formulaire",
"type": "n8n-nodes-base.set",
"position": [
192,
384
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "4276ef9c-3abd-4b5b-8187-56ac307c5a13",
"name": "visitorName",
"type": "string",
"value": "={{ $json.body[0]['Full Name'].first + ' ' + $json.body[0]['Full Name'].last }}"
},
{
"id": "5cb740d2-679e-4fc8-a6e1-264ee34ba06e",
"name": "firstName",
"type": "string",
"value": "={{ $json.body[0]['Full Name'].first }}"
},
{
"id": "c99fe4bc-fdc9-4290-9e0d-429917a0606c",
"name": "lastName",
"type": "string",
"value": "={{ $json.body[0]['Full Name'].last }}"
},
{
"id": "2b5e9fe9-cf86-4c9f-b85b-bb0a459c632d",
"name": "visitorEmail",
"type": "string",
"value": "={{ $json.body[0].Email }}"
},
{
"id": "ec0336a1-0421-4a51-964d-2a85b245de0a",
"name": "visitDate",
"type": "string",
"value": "={{ $json.body[0]['Visit Date '].year }}-{{ $json.body[0]['Visit Date '].month.padStart(2, '0') }}-{{ $json.body[0]['Visit Date '].day.padStart(2, '0') }}"
},
{
"id": "23e49d51-97c9-4ae7-b23c-73919c657d09",
"name": "visitDateFormatted",
"type": "string",
"value": "={{ $json.body[0]['Visit Date '].month }}/{{ $json.body[0]['Visit Date '].day }}/{{ $json.body[0]['Visit Date '].year }}"
},
{
"id": "c89c6db2-c36e-4ead-a06f-35d1d892f367",
"name": "purpose",
"type": "string",
"value": "={{ $json.body[0]['Purpose of Visit'] }}"
},
{
"id": "03695cab-73b4-4434-b12f-d1e73e2ad0fd",
"name": "company",
"type": "string",
"value": "={{ $json.body[0]['Company/Organization'] }}"
},
{
"id": "090d4bce-785d-4197-8786-f256e90bdf1c",
"name": " photoUrl",
"type": "string",
"value": "={{ $json.body[0][\"Profile Photo\"] }}"
},
{
"id": "001b90de-55f0-44fc-9e76-b86a667cac1d",
"name": " submissionId",
"type": "string",
"value": "={{ $now.format('yyyyMMddHHmmss') }}"
},
{
"id": "72a3157b-8e06-4765-bb21-351b140c3e3e",
"name": " timestamp",
"type": "string",
"value": "={{ $now.toISO() }}"
}
]
}
},
"typeVersion": 3.3
},
{
"id": "01532eac-8645-4137-b17e-283a31800072",
"name": "IF - Vérifier la validité de l'email",
"type": "n8n-nodes-base.if",
"position": [
944,
384
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "email-valid-check",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.valid }}",
"rightValue": "valid"
}
]
}
},
"typeVersion": 2
},
{
"id": "d2f63287-e0f0-41e2-bc7a-141a8fa05367",
"name": "Function - Générer ID visiteur et QR",
"type": "n8n-nodes-base.code",
"position": [
1360,
288
],
"parameters": {
"jsCode": "// Get visitor data from the Set node\nconst visitorData = $('Set - Extract Form Data').item.json;\n\n// Generate unique visitor ID\nconst timestamp = Date.now();\nconst dateStr = new Date().toISOString().split('T')[0].replace(/-/g, '');\nconst visitorId = `VIS-${dateStr}-${timestamp.toString().slice(-6)}`;\n\n// Create QR code data with all visitor information\nconst qrCodeData = JSON.stringify({\n id: visitorId,\n name: visitorData.visitorName,\n email: visitorData.visitorEmail,\n date: visitorData.visitDate,\n purpose: visitorData.purpose,\n company: visitorData.company,\n timestamp: new Date().toISOString(),\n verified: true\n});\n\n// Simple format for basic QR readers (alternative)\nconst qrCodeSimple = `VISITOR|${visitorId}|${visitorData.visitorName}|${visitorData.visitDate}|${visitorData.company}`;\n\n// Generate QR code image URL\nconst qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodeURIComponent(qrCodeSimple)}`;\n\n// Alternative high-quality QR code API\nconst qrCodeUrlAlt = `https://quickchart.io/qr?text=${encodeURIComponent(qrCodeSimple)}&size=300&margin=2`;\n\n// Return the generated data\nreturn {\n json: {\n visitorId: visitorId,\n qrCodeData: qrCodeData,\n qrCodeSimple: qrCodeSimple,\n qrCodeUrl: qrCodeUrl,\n qrCodeUrlAlt: qrCodeUrlAlt,\n generatedAt: new Date().toISOString()\n }\n};"
},
"typeVersion": 2
},
{
"id": "d1630c9e-05c5-43ae-9370-e22a778d86d5",
"name": "HTML/CSS vers image",
"type": "n8n-nodes-htmlcsstoimage.htmlCssToImage",
"position": [
1712,
288
],
"parameters": {
"html_content": "=<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"UTF-8\">\n<style>\n * { margin: 0; padding: 0; box-sizing: border-box; }\n body {\n font-family: 'Segoe UI', 'Roboto', 'Arial', sans-serif;\n background: #f5f5f5;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 100vh;\n padding: 20px;\n }\n .badge-container {\n width: 400px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n border-radius: 20px;\n padding: 40px 30px;\n box-shadow: 0 20px 60px rgba(0,0,0,0.3);\n position: relative;\n overflow: hidden;\n }\n .badge-container::before {\n content: '';\n position: absolute;\n top: -50%;\n right: -50%;\n width: 200%;\n height: 200%;\n background: radial-gradient(circle, rgba(255,255,255,0.1) 0%, transparent 70%);\n pointer-events: none;\n }\n .header {\n text-align: center;\n margin-bottom: 20px;\n position: relative;\n z-index: 1;\n }\n .logo {\n width: 80px;\n height: 80px;\n background: white;\n border-radius: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n margin-bottom: 10px;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n }\n .logo-text {\n font-size: 24px;\n font-weight: bold;\n color: #667eea;\n }\n .badge-title {\n color: white;\n font-size: 14px;\n text-transform: uppercase;\n letter-spacing: 2px;\n font-weight: 300;\n }\n .visitor-photo-container {\n text-align: center;\n margin: 25px 0;\n position: relative;\n z-index: 1;\n }\n .visitor-photo {\n width: 140px;\n height: 140px;\n border-radius: 50%;\n border: 5px solid white;\n object-fit: cover;\n box-shadow: 0 8px 25px rgba(0,0,0,0.3);\n background: white;\n }\n .verified-badge {\n position: absolute;\n bottom: 5px;\n right: calc(50% - 70px);\n background: #27ae60;\n color: white;\n width: 35px;\n height: 35px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n border: 3px solid white;\n box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n }\n .visitor-name {\n text-align: center;\n font-size: 32px;\n font-weight: bold;\n color: white;\n margin: 20px 0 10px;\n text-transform: uppercase;\n letter-spacing: 1px;\n text-shadow: 0 2px 10px rgba(0,0,0,0.2);\n position: relative;\n z-index: 1;\n }\n .visitor-id {\n text-align: center;\n font-size: 12px;\n color: rgba(255,255,255,0.8);\n margin-bottom: 20px;\n font-family: 'Courier New', monospace;\n letter-spacing: 1px;\n position: relative;\n z-index: 1;\n }\n .details-section {\n background: rgba(255,255,255,0.15);\n backdrop-filter: blur(10px);\n border-radius: 15px;\n padding: 20px;\n margin: 20px 0;\n border: 1px solid rgba(255,255,255,0.2);\n position: relative;\n z-index: 1;\n }\n .detail-row {\n display: flex;\n align-items: center;\n margin: 12px 0;\n color: white;\n }\n .detail-icon {\n font-size: 20px;\n margin-right: 12px;\n width: 25px;\n }\n .detail-label {\n font-size: 11px;\n text-transform: uppercase;\n opacity: 0.8;\n letter-spacing: 1px;\n margin-bottom: 3px;\n }\n .detail-value {\n font-size: 15px;\n font-weight: 600;\n }\n .qr-section {\n background: white;\n padding: 20px;\n border-radius: 15px;\n text-align: center;\n margin-top: 20px;\n box-shadow: 0 4px 15px rgba(0,0,0,0.2);\n position: relative;\n z-index: 1;\n }\n .qr-title {\n font-size: 12px;\n color: #666;\n margin-bottom: 10px;\n text-transform: uppercase;\n letter-spacing: 1px;\n }\n .qr-code {\n width: 200px;\n height: 200px;\n margin: 0 auto;\n }\n .footer {\n text-align: center;\n margin-top: 20px;\n padding-top: 15px;\n border-top: 1px solid rgba(255,255,255,0.2);\n color: white;\n font-size: 11px;\n opacity: 0.9;\n position: relative;\n z-index: 1;\n }\n .status-verified {\n display: inline-block;\n background: #27ae60;\n color: white;\n padding: 4px 12px;\n border-radius: 20px;\n font-size: 10px;\n font-weight: bold;\n text-transform: uppercase;\n letter-spacing: 1px;\n margin-top: 5px;\n }\n</style>\n</head>\n<body>\n <div class=\"badge-container\">\n <div class=\"header\">\n <div class=\"logo\">\n <span class=\"logo-text\">MJ</span>\n </div>\n <div class=\"badge-title\">Visitor Pass</div>\n </div>\n \n <div class=\"visitor-photo-container\">\n <img src=\"{{ $('Set - Extract Form Data').item.json[' photoUrl'] }}\" class=\"visitor-photo\" alt=\"Visitor Photo\" onerror=\"this.src='https://ui-avatars.com/api/?name={{ encodeURIComponent($('Set - Extract Form Data').item.json.visitorName) }}&size=200&background=667eea&color=fff&bold=true'\">\n <div class=\"verified-badge\">✓</div>\n </div>\n \n <div class=\"visitor-name\">{{ $('Set - Extract Form Data').item.json.visitorName }}</div>\n <div class=\"visitor-id\">ID: {{ $json.visitorId }}</div>\n \n <div class=\"details-section\">\n <div class=\"detail-row\">\n <span class=\"detail-icon\">📅</span>\n <div>\n <div class=\"detail-label\">Visit Date</div>\n <div class=\"detail-value\">{{ $('Set - Extract Form Data').item.json.visitDateFormatted }}</div>\n </div>\n </div>\n \n <div class=\"detail-row\">\n <span class=\"detail-icon\">🎯</span>\n <div>\n <div class=\"detail-label\">Purpose</div>\n <div class=\"detail-value\">{{ $('Set - Extract Form Data').item.json.purpose }}</div>\n </div>\n </div>\n \n <div class=\"detail-row\">\n <span class=\"detail-icon\">🏢</span>\n <div>\n <div class=\"detail-label\">Company</div>\n <div class=\"detail-value\">{{ $('Set - Extract Form Data').item.json.company }}</div>\n </div>\n </div>\n </div>\n \n <div class=\"qr-section\">\n <div class=\"qr-title\">Scan for Entry</div>\n <img src=\"{{ $json.qrCodeUrl }}\" class=\"qr-code\" alt=\"QR Code\">\n </div>\n \n <div class=\"footer\">\n <div class=\"status-verified\">✓ VERIFIED ENTRY</div>\n <div style=\"margin-top:8px;\">MediaJade Coworking Space</div>\n <div>{{ $('Set - Extract Form Data').item.json[' timestamp'] }}</div>\n </div>\n </div>\n</body>\n</html>"
},
"credentials": {
"htmlcsstoimgApi": {
"id": "YOUR HTMLCSSTOIMG API ID",
"name": "Htmlcsstoimg API"
}
},
"typeVersion": 1
},
{
"id": "24b92189-7f95-46a8-a65b-426070b99316",
"name": "Envoyer un message1",
"type": "n8n-nodes-base.gmail",
"position": [
2208,
0
],
"webhookId": "",
"parameters": {
"sendTo": "={{ $('Set - Extract Form Data').item.json.visitorEmail }}",
"message": "=<!DOCTYPE html>\n<html>\n<head>\n<style>\n body { font-family: 'Segoe UI', Arial, sans-serif; line-height: 1.6; color: #333; margin: 0; padding: 0; }\n .email-container { max-width: 600px; margin: 0 auto; background: #ffffff; }\n .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 40px 20px; text-align: center; }\n .header h1 { margin: 0; font-size: 28px; }\n .header p { margin: 10px 0 0; opacity: 0.9; }\n .content { padding: 40px 30px; }\n .badge-preview { text-align: center; margin: 30px 0; }\n .badge-preview img { max-width: 100%; height: auto; border-radius: 10px; box-shadow: 0 10px 30px rgba(0,0,0,0.2); }\n .info-box { background: #f8f9fa; border-left: 4px solid #667eea; padding: 20px; margin: 25px 0; border-radius: 5px; }\n .info-box h3 { margin: 0 0 15px; color: #667eea; font-size: 18px; }\n .info-row { display: flex; margin: 10px 0; }\n .info-label { font-weight: bold; min-width: 120px; color: #555; }\n .info-value { color: #333; }\n .instructions { background: #fff3cd; border: 1px solid #ffc107; padding: 20px; border-radius: 5px; margin: 25px 0; }\n .instructions h3 { margin: 0 0 10px; color: #856404; }\n .button { display: inline-block; padding: 15px 40px; background: #667eea; color: white; text-decoration: none; border-radius: 5px; margin: 20px 0; font-weight: bold; }\n .footer { background: #f1f3f5; padding: 30px; text-align: center; color: #666; font-size: 14px; }\n</style>\n</head>\n<body>\n<div class=\"email-container\">\n <div class=\"header\">\n <h1>✅ Visitor Pass Verified & Issued</h1>\n <p>Welcome to MediaJade Coworking Space</p>\n </div>\n \n <div class=\"content\">\n <p>Dear <strong>{{ $('Set - Extract Form Data').item.json.visitorName }}</strong>,</p>\n \n <p>Great news! Your visitor pass has been verified and is now ready to use. We look forward to welcoming you to our space.</p>\n \n <div class=\"info-box\">\n <h3>📋 Your Visit Details</h3>\n <div class=\"info-row\">\n <span class=\"info-label\">Visitor ID:</span>\n <span class=\"info-value\">{{ $('Function - Generate Visitor ID & QR').item.json.visitorId }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Visit Date:</span>\n <span class=\"info-value\">{{ $('Set - Extract Form Data').item.json.visitDateFormatted }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Purpose:</span>\n <span class=\"info-value\">{{ $('Set - Extract Form Data').item.json.purpose }}</span>\n </div>\n <div class=\"info-row\">\n <span class=\"info-label\">Company:</span>\n <span class=\"info-value\">{{ $('Set - Extract Form Data').item.json.company }}</span>\n </div>\n </div>\n \n <div class=\"badge-preview\">\n <h3>Your Digital Visitor Pass</h3>\n <img src=\"{{ $json.image_url }}\" alt=\"Your Visitor Pass\">\n <p style=\"color: #666; font-size: 14px; margin-top: 10px;\">Please save this pass or show this email at reception</p>\n </div>\n \n <div class=\"instructions\">\n <h3>📱 How to Use Your Pass</h3>\n <ol style=\"margin: 10px 0 0 20px; padding: 0;\">\n <li><strong>Digital:</strong> Show this email on your phone at reception</li>\n <li><strong>QR Code:</strong> Our staff will scan your QR code for instant verification</li>\n <li><strong>ID Check:</strong> Please bring a valid photo ID for security purposes</li>\n <li><strong>Arrival:</strong> Check in at the reception desk on arrival</li>\n </ol>\n </div>\n \n <div style=\"background: #e8f4fd; padding: 20px; border-radius: 5px; margin: 25px 0;\">\n <h3 style=\"color: #0066cc; margin: 0 0 10px;\">🏢 Location & Arrival</h3>\n <p style=\"margin: 5px 0;\"><strong>Address:</strong> MediaJade Coworking, 123 Business Street</p>\n <p style=\"margin: 5px 0;\"><strong>Reception Hours:</strong> Monday-Friday, 8:00 AM - 6:00 PM</p>\n <p style=\"margin: 5px 0;\"><strong>Contact:</strong> +1 (555) 123-4567</p>\n </div>\n \n <p><strong>Need to make changes?</strong> Please contact our reception team at least 24 hours before your visit.</p>\n \n <p style=\"margin-top: 30px;\">We're excited to host you!</p>\n \n <p>Best regards,<br>\n <strong>Reception Team</strong><br>\n MediaJade Coworking Space</p>\n </div>\n \n <div class=\"footer\">\n <p><strong>Contact Us</strong></p>\n <p>📧 reception@mediajade.com | 📞 +1 (555) 123-4567</p>\n <p style=\"margin-top: 20px; font-size: 12px;\">This is an automated message generated by our visitor management system.</p>\n </div>\n</div>\n</body>\n</html>",
"options": {},
"subject": "=🎫 Your Verified Visitor Pass - {{ $('Set - Extract Form Data').item.json.visitDateFormatted }}"
},
"credentials": {
"gmailOAuth2": {
"id": "YOUR GMAIL OAUTH2 ID",
"name": "Gmail OAuth2"
}
},
"typeVersion": 2.1
},
{
"id": "8b759709-dbea-4680-932d-4bffd248e037",
"name": "Slack - Notifier l'équipe de sécurité",
"type": "n8n-nodes-base.slack",
"position": [
2320,
288
],
"webhookId": "",
"parameters": {
"text": "=🟢 *New Verified Visitor*\n\n👤 *Name:* {{ $('Set - Extract Form Data').item.json.visitorName }}\n📧 *Email:* {{ $('Set - Extract Form Data').item.json.visitorEmail }}\n📅 *Visit Date:* {{ $('Set - Extract Form Data').item.json.visitDate }}\n🎯 *Purpose:* {{ $('Set - Extract Form Data').item.json.purpose }}\n🏢 *Company:* {{ $('Set - Extract Form Data').item.json.company }}\n🆔 *Visitor ID:* {{ $('Function - Generate Visitor ID & QR').item.json.visitorId }}\n✅ *Status:* Email Verified & Pass Sent\n⏰ *Submitted:* {{ $('Set - Extract Form Data').item.json[' timestamp'] }}\n\n📎 Badge Image: {{ $json.image_url }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "YOUR SLACK CHANNEL ID",
"cachedResultName": "YOUR SLACK CHANNEL NAME"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"id": "YOUR SLACK API ID",
"name": "Slack API"
}
},
"typeVersion": 2.2
},
{
"id": "8f13df6c-3418-464d-b333-4ff900c2ebc0",
"name": "Google Sheets - Journaliser le visiteur",
"type": "n8n-nodes-base.googleSheets",
"position": [
2224,
560
],
"parameters": {
"columns": {
"value": {
"Email": "={{ $('Set - Extract Form Data').item.json.visitorEmail }}",
"Status": "Pass Sent",
"Company": "={{ $('Set - Extract Form Data').item.json.company }}",
"Purpose": "={{ $('Set - Extract Form Data').item.json.purpose }}",
"Full Name": "={{ $('Set - Extract Form Data').item.json.visitorName }}",
"Timestamp": "={{ $('Set - Extract Form Data').item.json[\" timestamp\"] }}",
"Visit Date": "={{ $('Set - Extract Form Data').item.json.visitDate }}",
"Visitor ID": "={{ $('Function - Generate Visitor ID & QR').item.json.visitorId }}",
"Email Verified": "Yes",
"Badge Image URL": "={{ $json.image_url }}"
},
"schema": [
{
"id": "Timestamp",
"type": "string",
"display": true,
"required": false,
"displayName": "Timestamp",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Visitor ID",
"type": "string",
"display": true,
"required": false,
"displayName": "Visitor ID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Full Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Full Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email",
"type": "string",
"display": true,
"required": false,
"displayName": "Email",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Visit Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Visit Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Purpose",
"type": "string",
"display": true,
"required": false,
"displayName": "Purpose",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Company",
"type": "string",
"display": true,
"required": false,
"displayName": "Company",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Email Verified",
"type": "string",
"display": true,
"required": false,
"displayName": "Email Verified",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Badge Image URL",
"type": "string",
"display": true,
"required": false,
"displayName": "Badge Image URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"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",
"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": {
"id": "YOUR GOOGLE SHEETS OAUTH2 ID",
"name": "Google Sheets OAuth2"
}
},
"typeVersion": 4.5
},
{
"id": "0df8d27a-411a-4e4b-be7b-d40ea8c78691",
"name": "Vérifier email",
"type": "n8n-nodes-verifiemail.verifiEmail",
"position": [
592,
384
],
"parameters": {
"email": "={{ $json.visitorEmail }}"
},
"credentials": {
"verifiEmailApi": {
"id": "YOUR VERIFIEMAIL API ID",
"name": "VerifiEmail API"
}
},
"typeVersion": 1
},
{
"id": "d6dd5889-309a-4f37-a55a-b4c80425baa2",
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-224,
384
],
"webhookId": "",
"parameters": {
"path": "visitor-registration",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2.1
},
{
"id": "31b44373-0af2-46d4-8b0b-6fd85824bd12",
"name": "Arrêt et erreur",
"type": "n8n-nodes-base.stopAndError",
"position": [
1360,
528
],
"parameters": {
"errorMessage": "Invalid Email"
},
"typeVersion": 1
},
{
"id": "922d05d1-426d-426b-918c-36065bc8b2b1",
"name": "Note adhésive - Aperçu",
"type": "n8n-nodes-base.stickyNote",
"position": [
-736,
-736
],
"parameters": {
"color": 4,
"width": 347,
"height": 368,
"content": "## 🎯 WORKFLOW OVERVIEW\n\n**Purpose:** Automated Verified Visitor Pass System for Coworking Spaces\n\n**Key Benefits:**\n- ⚡ Instant visitor pass generation (30 seconds)\n- 🔒 Email verification prevents fake entries\n- 📱 Digital & printable passes\n- 🎨 Professional branded badges\n- 📊 Complete audit trail\n- 🤖 100% automated workflow\n\n**Processing Time:** ~30 seconds per visitor\n**Success Rate:** 99%+ with valid emails\n"
},
"typeVersion": 1
},
{
"id": "b3f56e5d-a276-4c20-aff6-f2ffe8cfd524",
"name": "Note adhésive - Identifiants",
"type": "n8n-nodes-base.stickyNote",
"position": [
-752,
-352
],
"parameters": {
"color": 5,
"width": 443,
"height": 660,
"content": "## 🔐 CREDENTIALS SETUP GUIDE\n\n### Required Credentials (5 Total)\n\n### 1️⃣ VerifiEmail API\n Go to: https://verifi.email\n\n### 2️⃣ HTMLCSSToImage API\n Go to: https://htmlcsstoimg.com\n\n### 3️⃣ Gmail OAuth2\n In n8n: Credentials → Add → Gmail OAuth2\n\n### 4️⃣ Slack API\n1. Go to: https://api.slack.com/apps\n2. Create New App → From scratch\n3. Name: \"Visitor Alerts\"\n\n### 5️⃣ Google Sheets OAuth2\n**Setup Steps:**\n1. Create spreadsheet: \"Visitor Log\"\n2. Add headers: Timestamp, Visitor ID, Full Name, Email, Visit Date, Purpose, Company, Email Verified, Badge Image URL, Status\n3. In n8n: Credentials → Add → Google Sheets OAuth2\n"
},
"typeVersion": 1
},
{
"id": "b24936a8-334b-4035-a367-fdc51a26e2b7",
"name": "Note adhésive - Webhook",
"type": "n8n-nodes-base.stickyNote",
"position": [
-288,
-16
],
"parameters": {
"color": 6,
"width": 367,
"height": 532,
"content": "## 📥 STEP 1: WEBHOOK TRIGGER\n\n**Expected Input Format:**\n```json\n{\n \"Full Name\": {\n \"first\": \"John\",\n \"last\": \"Doe\"\n },\n \"Email\": \"john@example.com\",\n \"Profile Photo\": \"https://...\",\n \"Visit Date \": {\n \"month\": \"11\",\n \"day\": \"05\",\n \"year\": \"2025\"\n },\n \"Purpose of Visit\": \"Meeting\",\n \"Company/Organization\": \"ABC Corp\"\n}\n```\n"
},
"typeVersion": 1
},
{
"id": "e0297444-b797-411b-9df5-b2c2ad9fe2dd",
"name": "Note adhésive - Set Extraire",
"type": "n8n-nodes-base.stickyNote",
"position": [
96,
112
],
"parameters": {
"color": 6,
"width": 383,
"height": 424,
"content": "## 🔄 STEP 2: EXTRACT & ORGANIZE DATA\n\n**What It Does:**\n- Extracts visitor information from nested JSON\n- Combines first and last name into full name\n- Formats visit date in multiple ways (ISO & display)\n- Adds submission timestamp\n- Creates unique submission ID\n- Normalizes all field names for easy reference\n\n"
},
"typeVersion": 1
},
{
"id": "a6716cea-e840-42d5-a632-860890132bab",
"name": "Note adhésive - Vérifier email",
"type": "n8n-nodes-base.stickyNote",
"position": [
496,
112
],
"parameters": {
"color": 6,
"width": 335,
"height": 416,
"content": "## ✅ STEP 3: EMAIL VERIFICATION\n\n**What It Does:**\n- Verifies email format is correct\n- Checks if domain exists and has MX records\n- Validates mailbox actually exists\n- Detects disposable/temporary emails\n- Identifies spam/risky addresses\n- Returns verification status and details\n\n"
},
"typeVersion": 1
},
{
"id": "c1760877-16f2-4416-ba40-89288fd91ff1",
"name": "Note adhésive - Nœud IF",
"type": "n8n-nodes-base.stickyNote",
"position": [
848,
144
],
"parameters": {
"color": 6,
"width": 383,
"height": 384,
"content": "## 🔀 STEP 4: VALIDATION DECISION POINT\n\n**What It Does:**\n- Checks if email verification passed\n- Splits workflow into two paths:\n - ✅ TRUE = Valid email → Continue to badge generation\n - ❌ FALSE = Invalid email → Stop with error\n\n"
},
"typeVersion": 1
},
{
"id": "373d6fcc-490c-4625-9606-4008585158af",
"name": "Note adhésive - Function",
"type": "n8n-nodes-base.stickyNote",
"position": [
1248,
48
],
"parameters": {
"color": 6,
"width": 383,
"height": 396,
"content": "## 🆔 STEP 5: GENERATE VISITOR ID & QR CODE\n\n**What It Does:**\n- Generates unique visitor ID with timestamp\n- Creates QR code data with full visitor info\n- Provides two QR formats (JSON & simple text)\n- Generates QR code image URLs\n- Adds verification timestamp\n\n"
},
"typeVersion": 1
},
{
"id": "7a69ca42-4c7a-4d27-a58a-a59ad8ebbab1",
"name": "Note adhésive - HTML vers image",
"type": "n8n-nodes-base.stickyNote",
"position": [
1648,
-160
],
"parameters": {
"color": 6,
"width": 367,
"height": 596,
"content": "## 🎨 STEP 6: CREATE VISITOR BADGE IMAGE\n\n**HTML Template Structure:**\n```\n┌─────────────────────────────┐\n│ [Logo] Visitor Pass │\n├─────────────────────────────┤\n│ [✓ Photo] │\n│ VISITOR NAME │\n│ ID: VIS-20251103-234567 │\n├─────────────────────────────┤\n│ 📅 Visit Date: 11/05/2025 │\n│ 🎯 Purpose: Meeting │\n│ 🏢 Company: ABC Corp │\n├─────────────────────────────┤\n│ [QR CODE IMAGE] │\n│ Scan for Entry │\n├─────────────────────────────┤\n│ ✓ VERIFIED ENTRY │\n│ MediaJade Coworking │\n│ 2025-11-03T14:55:30Z │\n└─────────────────────────────┘\n```\n\n"
},
"typeVersion": 1
},
{
"id": "ae0d79a7-33ae-457b-81c0-bd3658dbd972",
"name": "Note adhésive - Email",
"type": "n8n-nodes-base.stickyNote",
"position": [
2064,
-240
],
"parameters": {
"color": 6,
"width": 383,
"height": 388,
"content": "## 📧 STEP 7: EMAIL VISITOR PASS\n\n**What It Does:**\n- Sends professional HTML email\n- Includes visitor pass badge image\n- Provides visit details and instructions\n- Gives location and contact info\n- Confirms verification status\n"
},
"typeVersion": 1
},
{
"id": "0d44e4e6-add8-4e61-ac3a-aa0e6e1b0a6b",
"name": "Note adhésive - Slack",
"type": "n8n-nodes-base.stickyNote",
"position": [
2064,
192
],
"parameters": {
"color": 6,
"width": 479,
"height": 308,
"content": "## 💬 STEP 8: SLACK SECURITY ALERT\n\n**Why Slack Notifications:**\n- ✅ Real-time alerts (instant)\n- ✅ Mobile push notifications\n- ✅ Team collaboration\n- ✅ Searchable history\n- ✅ No email clutter\n- ✅ Easy to respond/discuss\n- ✅ Audit trail\n\n"
},
"typeVersion": 1
},
{
"id": "70256371-d8a1-4e0c-9118-30edcb8887ad",
"name": "Note adhésive - Sheets",
"type": "n8n-nodes-base.stickyNote",
"position": [
2064,
544
],
"parameters": {
"color": 6,
"width": 351,
"height": 712,
"content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n## 📊 STEP 9: LOG TO GOOGLE SHEETS\n\n**What It Does:**\n- Appends new row to spreadsheet\n- Records all visitor information\n- Logs badge image URL\n- Tracks verification status\n- Creates searchable audit trail\n\n**Spreadsheet Columns:**\n\n1. **Timestamp** \n2. **Visitor ID**\n3. **Full Name** \n4. **Email**\n5. **Visit Date**\n6. **Purpose**\n7. **Company**\n8. **Email Verified**\n9. **Badge Image URL** \n10. **Status**\n\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "0d03ee1f-d600-40c3-b34d-e7be412996f8",
"name": "Note adhésive - Arrêt erreur",
"type": "n8n-nodes-base.stickyNote",
"position": [
1248,
512
],
"parameters": {
"color": 6,
"width": 335,
"height": 448,
"content": "\n\n\n\n\n\n\n\n\n\n\n## ❌ STEP 4B: INVALID EMAIL HANDLING\n\n**What It Does:**\n- Terminates workflow execution\n- Shows error message: \"Invalid Email\"\n- Prevents fake visitor entries\n- No badge created\n- No email sent\n- No resources wasted\n\n**Error Message:**\n\"Invalid Email\"\n"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "",
"connections": {
"d6dd5889-309a-4f37-a55a-b4c80425baa2": {
"main": [
[
{
"node": "c897caf3-b83b-46fd-9eb3-a73ea8b563a1",
"type": "main",
"index": 0
}
]
]
},
"0df8d27a-411a-4e4b-be7b-d40ea8c78691": {
"main": [
[
{
"node": "01532eac-8645-4137-b17e-283a31800072",
"type": "main",
"index": 0
}
]
]
},
"d1630c9e-05c5-43ae-9370-e22a778d86d5": {
"main": [
[
{
"node": "24b92189-7f95-46a8-a65b-426070b99316",
"type": "main",
"index": 0
},
{
"node": "8b759709-dbea-4680-932d-4bffd248e037",
"type": "main",
"index": 0
},
{
"node": "8f13df6c-3418-464d-b333-4ff900c2ebc0",
"type": "main",
"index": 0
}
]
]
},
"01532eac-8645-4137-b17e-283a31800072": {
"main": [
[
{
"node": "d2f63287-e0f0-41e2-bc7a-141a8fa05367",
"type": "main",
"index": 0
}
],
[
{
"node": "31b44373-0af2-46d4-8b0b-6fd85824bd12",
"type": "main",
"index": 0
}
]
]
},
"c897caf3-b83b-46fd-9eb3-a73ea8b563a1": {
"main": [
[
{
"node": "0df8d27a-411a-4e4b-be7b-d40ea8c78691",
"type": "main",
"index": 0
}
]
]
},
"d2f63287-e0f0-41e2-bc7a-141a8fa05367": {
"main": [
[
{
"node": "d1630c9e-05c5-43ae-9370-e22a778d86d5",
"type": "main",
"index": 0
}
]
]
}
}
}Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Avancé - Extraction de documents
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
Jitesh Dugar
@jiteshdugarAI Automation Specialist - OpenAI, CRM & Automation Expert with a solid understanding of various tools that include Zapier, Make, Zoho CRM, Hubspot, Google Sheets, Airtable, Pipedrive, Google Analytics, and more.
Partager ce workflow