Generador de pases de visitante verificados

Avanzado

Este es unDocument Extractionflujo de automatización del dominio deautomatización que contiene 22 nodos.Utiliza principalmente nodos como If, Set, Code, Gmail, Slack. Automatizar la gestión de visitantes con verificación de correo, passes y recordatorios de Slack

Requisitos previos
  • Cuenta de Google y credenciales de API de Gmail
  • Bot Token de Slack o URL de Webhook
  • Punto final de HTTP Webhook (n8n generará automáticamente)
  • Credenciales de API de Google Sheets
Vista previa del flujo de trabajo
Visualización de las conexiones entre nodos, con soporte para zoom y panorámica
Exportar flujo de trabajo
Copie la siguiente configuración JSON en n8n para importar y usar este flujo de trabajo
{
  "id": "",
  "meta": {
    "instanceId": ""
  },
  "name": "Verified Visitor Pass Generator",
  "tags": [],
  "nodes": [
    {
      "id": "c897caf3-b83b-46fd-9eb3-a73ea8b563a1",
      "name": "Set - Extraer Datos del Formulario",
      "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 - Verificar Correo Válido",
      "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 - Generar ID de Visitante y 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 a Imagen",
      "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": "Enviar un mensaje1",
      "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 - Notificar al Equipo de Seguridad",
      "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 - Registrar Visitante",
      "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": "Verifi 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": "Detener y Error",
      "type": "n8n-nodes-base.stopAndError",
      "position": [
        1360,
        528
      ],
      "parameters": {
        "errorMessage": "Invalid Email"
      },
      "typeVersion": 1
    },
    {
      "id": "922d05d1-426d-426b-918c-36065bc8b2b1",
      "name": "Nota Adhesiva - Descripción General",
      "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": "Nota Adhesiva - Credenciales",
      "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": "Nota Adhesiva - 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": "Nota Adhesiva - Set Extraer",
      "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": "Nota Adhesiva - Verifi 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": "Nota Adhesiva - Nodo 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": "Nota Adhesiva - Función",
      "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": "Nota Adhesiva - HTML a Imagen",
      "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": "Nota Adhesiva - Correo",
      "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": "Nota Adhesiva - 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": "Nota Adhesiva - Hojas de Cálculo",
      "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": "Nota Adhesiva - Error de Detención",
      "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
          }
        ]
      ]
    }
  }
}
Preguntas frecuentes

¿Cómo usar este flujo de trabajo?

Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.

¿En qué escenarios es adecuado este flujo de trabajo?

Avanzado - Extracción de documentos

¿Es de pago?

Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.

Información del flujo de trabajo
Nivel de dificultad
Avanzado
Número de nodos22
Categoría1
Tipos de nodos11
Descripción de la dificultad

Adecuado para usuarios avanzados, flujos de trabajo complejos con 16+ nodos

Autor
Jitesh Dugar

Jitesh Dugar

@jiteshdugar

AI 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.

Enlaces externos
Ver en n8n.io

Compartir este flujo de trabajo

Categorías

Categorías: 34