Generador de Insignias de Eventos

Avanzado

Este es unDocument Extractionflujo de automatización del dominio deautomatización que contiene 22 nodos.Utiliza principalmente nodos como If, Code, Gmail, Webhook, HttpRequest. Usar códigos QR, HTMLCSStoImage, Gmail y Google Sheets para generar insignias de evento

Requisitos previos
  • Cuenta de Google y credenciales de API de Gmail
  • Punto final de HTTP Webhook (n8n generará automáticamente)
  • Pueden requerirse credenciales de autenticación para la API de destino
  • 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": "",
    "templateCredsSetupCompleted": false
  },
  "name": "Event Badge Generator",
  "tags": [
    {
      "id": "event-registration",
      "name": "Event Registration"
    },
    {
      "id": "conference",
      "name": "Conference"
    },
    {
      "id": "automation",
      "name": "Automation"
    },
    {
      "id": "productivity",
      "name": "Productivity"
    }
  ],
  "nodes": [
    {
      "id": "4c1e6d44-4f5e-4f4e-a6ad-038860f9e11f",
      "name": "Extraer URL de Imagen",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2912,
        -112
      ],
      "parameters": {
        "url": "={{ $json['Badge URL'] }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file",
              "outputPropertyName": "badge"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "f875b20b-393e-470c-8bf9-3c4cdfad8fb7",
      "name": "Diseño de Credencial",
      "type": "n8n-nodes-htmlcsstoimage.htmlCssToImage",
      "position": [
        2048,
        -16
      ],
      "parameters": {
        "html_content": "=<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <style>\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n        \n        body {\n            font-family: 'Arial', sans-serif;\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            min-height: 100vh;\n            background: transparent;\n            padding: 20px;\n        }\n        \n        .badge-container {\n            width: 400px;\n            height: 650px;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            border-radius: 20px;\n            padding: 25px;\n            box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n            position: relative;\n            overflow: hidden;\n        }\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        }\n        \n        .badge-header {\n            text-align: center;\n            margin-bottom: 20px;\n            position: relative;\n            z-index: 1;\n        }\n        \n        .event-logo {\n            width: 70px;\n            height: 70px;\n            background: white;\n            border-radius: 50%;\n            margin: 0 auto 12px;\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            font-size: 32px;\n            font-weight: bold;\n            color: #667eea;\n            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);\n        }\n        \n        .event-title {\n            font-size: 22px;\n            font-weight: bold;\n            color: white;\n            text-transform: uppercase;\n            letter-spacing: 2px;\n            margin-bottom: 5px;\n        }\n        \n        .event-date {\n            font-size: 13px;\n            color: rgba(255, 255, 255, 0.9);\n            font-weight: 500;\n        }\n        \n        .badge-body {\n            background: white;\n            border-radius: 15px;\n            padding: 25px 20px;\n            text-align: center;\n            position: relative;\n            z-index: 1;\n            box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);\n        }\n        \n        .attendee-photo {\n            width: 100px;\n            height: 100px;\n            border-radius: 50%;\n            margin: 0 auto 15px;\n            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n            display: flex;\n            align-items: center;\n            justify-content: center;\n            font-size: 42px;\n            color: white;\n            font-weight: bold;\n            border: 4px solid #f0f0f0;\n        }\n        \n        .attendee-name {\n            font-size: 26px;\n            font-weight: bold;\n            color: #2d3748;\n            margin-bottom: 6px;\n            line-height: 1.2;\n        }\n        \n        .attendee-role {\n            font-size: 15px;\n            color: #718096;\n            margin-bottom: 18px;\n            font-weight: 500;\n        }\n        \n        .qr-code-container {\n            margin: 20px auto 12px;\n            padding: 12px;\n            background: #f7fafc;\n            border-radius: 10px;\n            display: inline-block;\n        }\n        \n        .qr-code-container img {\n            width: 140px;\n            height: 140px;\n            display: block;\n        }\n        \n        .attendee-id {\n            font-size: 11px;\n            color: #a0aec0;\n            font-weight: 600;\n            letter-spacing: 1px;\n            margin-top: 8px;\n        }\n        \n        .badge-footer {\n            text-align: center;\n            margin-top: 18px;\n            position: relative;\n            z-index: 1;\n        }\n        \n        .badge-footer p {\n            font-size: 10px;\n            color: rgba(255, 255, 255, 0.85);\n            line-height: 1.4;\n        }\n    </style>\n</head>\n<body>\n    <div class=\"badge-container\">\n        <div class=\"badge-header\">\n            <div class=\"event-logo\">{{ $json.initials }}</div>\n            <div class=\"event-title\">{{ $json.event }}</div>\n            <div class=\"event-date\">{{ $json.eventDate }}</div>\n        </div>\n        \n        <div class=\"badge-body\">\n            <div class=\"attendee-photo\">{{ $json.initials }}</div>\n            <div class=\"attendee-name\">{{ $json.name }}</div>\n            <div class=\"attendee-role\">{{ $json.role }}</div>\n            \n            <div class=\"qr-code-container\">\n                <img src=\"{{ $json.qrCodeUrl }}\" alt=\"QR Code\">\n            </div>\n            \n            <div class=\"attendee-id\">ID: {{ $json.attendeeId }}</div>\n        </div>\n        \n        <div class=\"badge-footer\">\n            <p>Please present this badge at the entrance<br>Valid for event duration only</p>\n        </div>\n    </div>\n</body>\n</html>"
      },
      "credentials": {
        "htmlcsstoimgApi": {
          "id": "YOUR_Htmlcsstoimg_API_Key",
          "name": "Htmlcsstoimg API"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d6843d6d-6411-4183-94b0-338bd2e51324",
      "name": "Nota Adhesiva10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        240,
        -304
      ],
      "parameters": {
        "color": 7,
        "width": 464,
        "height": 500,
        "content": "## SETUP CREDENTIALS FIRST\n\n**🔐 HTMLCSStoImage API**\n• Sign up: https://htmlcsstoimg.com\n• Get API credentials from dashboard\n• Add to n8n: Basic Auth credential\n\n**📧 Gmail OAuth2**\n• Select: \"Gmail OAuth2 API\"\n• Connect your Gmail account\n• Grant send permissions\n\n**📊 Google Sheets API**  \n• Select: \"Google Sheets OAuth2\"\n• Authenticate with Google\n• Grant read/write access\n\n**Test each credential before running the workflow**\n\n\n**💡 Pro Tips:**\n• Use a dedicated Gmail for automation\n• Create a new Sheet for each event\n• Monitor API rate limits"
      },
      "typeVersion": 1
    },
    {
      "id": "6bdd8ff7-3561-439c-afb9-cfa4ed7828dd",
      "name": "Nota Adhesiva9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2624,
        112
      ],
      "parameters": {
        "color": 7,
        "width": 260,
        "height": 568,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n## ERROR HANDLING\n\nTriggered when badge generation fails\n\nSends admin alert with:\n- Full attendee details\n- Attendee ID\n- Timestamp\n- Possible failure causes\n- Action items\n\nTo: admin@example.com\n\nNext steps:\n- Check API status\n- Review logs\n- Retry manually"
      },
      "typeVersion": 1
    },
    {
      "id": "116af5fb-934d-435d-8038-bffd493a2f37",
      "name": "Nota Adhesiva8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3136,
        -416
      ],
      "parameters": {
        "color": 7,
        "width": 372,
        "height": 468,
        "content": "## STEP 9: SEND BADGE EMAIL\n\nSends via Gmail with:\n- Personalized HTML email\n- Badge download link\n- Event instructions\n- Check-in details\n- Contact information\n\nTo: Attendee email\nAttachment: Badge PNG from URL\n\nContinue on fail: ON"
      },
      "typeVersion": 1
    },
    {
      "id": "ee261506-4c6f-4f6a-a30d-cb455be0ddb1",
      "name": "Nota Adhesiva7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2848,
        -368
      ],
      "parameters": {
        "color": 7,
        "height": 396,
        "content": "## STEP 8: EXTRACT BADGE URL\n\nExtracts image URL from API response\n\nReturns clean data:\n- binary file named badge\n\nUsed for: Logging & email"
      },
      "typeVersion": 1
    },
    {
      "id": "7c784e20-dd16-4f47-94cc-7c905603ce3e",
      "name": "Nota Adhesiva6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2256,
        -384
      ],
      "parameters": {
        "color": 7,
        "width": 272,
        "height": 524,
        "content": "## STEP 6: CONDITIONAL LOGIC\n\nCONDITIONAL CHECK\n\nVerifies badge generation success\n\nCondition: {{ $json.image_url }} is not empty\n\nTRUE (Green):\n→ Badge generated successfully\n→ Continue to email delivery\n\nFALSE (Red):\n→ Generation failed\n→ Send error alert to admin"
      },
      "typeVersion": 1
    },
    {
      "id": "e44f9c73-c536-4304-8f18-3a5efea15d8c",
      "name": "Nota Adhesiva5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1984,
        -368
      ],
      "parameters": {
        "color": 7,
        "height": 500,
        "content": "## STEP 5: BUILD HTML BADGE\n\nUses HTMLCSStoImage AP\n\nSends:\n- Full HTML code\n- Viewport: 400x680px\n\nReturns: Image URL\n\nAuth: Basic Auth with API credentials\n\nContinue on fail: ON"
      },
      "typeVersion": 1
    },
    {
      "id": "f450caab-0b6b-42ce-828e-d1bcffb4ef28",
      "name": "Nota Adhesiva4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1680,
        -256
      ],
      "parameters": {
        "color": 7,
        "width": 288,
        "height": 368,
        "content": "## STEP 4: PREPARE QR URL\n\nConverts binary QR to accessible URL\n\nCreates URL:\nhttps://api.qrserver.com/...?data=ATD-XXX\n\nUsed for: Embedding in HTML badge template"
      },
      "typeVersion": 1
    },
    {
      "id": "ae2d3024-f48b-4fc9-844b-c8fe61350c64",
      "name": "Nota Adhesiva3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1424,
        -352
      ],
      "parameters": {
        "color": 7,
        "height": 492,
        "content": "## STEP 3: QR CODE GENERATION\n\nCreates QR code via qrserver.com API\n\nParameters:\n- Size: 300x300px\n- Data: Attendee ID\n- Format: PNG image\n\nOutput: Binary QR code file\n\nContinue on fail: ON"
      },
      "typeVersion": 1
    },
    {
      "id": "aedbf094-b3b9-4230-ac41-9f516fe5ad5d",
      "name": "Nota Adhesiva2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1136,
        -400
      ],
      "parameters": {
        "color": 7,
        "width": 256,
        "height": 528,
        "content": "## STEP 2: DATA VALIDATION\n\nOperations:\n✓ Validates email format\n✓ Checks name exists\n✓ Generates unique attendee ID\n✓ Capitalizes name properly\n✓ Extracts initials (2 letters)\n✓ Normalizes email to lowercase\n✓ Sets default event/role if missing\n✓ Adds timestamp\n\nThrows error if:\n- Email invalid\n- Name missing"
      },
      "typeVersion": 1
    },
    {
      "id": "2d4702e5-361d-4259-b590-2566225db67e",
      "name": "Nota Adhesiva1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        752,
        -304
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 420,
        "content": "## STEP 1: WEBHOOK TRIGGER\n\n**Test with cURL:**\n```bash\ncurl -X POST https://your-n8n.com/webhook/admissio\n-H \"Content-Type: application/json\" \\\n-d '{\n    \"name\": \"Jane Smith\",\n    \"email\": \"your-email@gmail.com\",\n    \"event\": \"TechCon 2025\",\n    \"role\": \"VIP Speaker\"\n}'\n```"
      },
      "typeVersion": 1
    },
    {
      "id": "9af27c62-c599-4ace-88b5-2f59ade4770e",
      "name": "Nota Adhesiva",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        336,
        -960
      ],
      "parameters": {
        "color": 7,
        "width": 380,
        "height": 588,
        "content": "## WORKFLOW OVERVIEW\n\n**Purpose:** Automated event badge generation system\n\n**Processing Time:** 5-8 seconds end-to-end\n\n**Workflow Steps:**\n1. Receive registration data via webhook (POST)\n2. Validate email and format inputs\n3. Generate unique QR code with attendee ID\n4. Create custom HTML badge design\n5. Convert HTML to downloadable PNG\n6. Log all data to Google Sheets\n7. Send badge via email with instructions\n\n**Success Path:**\n✅ Valid data → Badge generated → Email sent\n\n**Error Path:**\n❌ Invalid data → Workflow stopped → Error logged\n\n**Perfect For:**\n• Universities & colleges\n• Corporate events\n• Conferences & seminars\n• Training programs"
      },
      "typeVersion": 1
    },
    {
      "id": "10d6aab4-3b05-45e7-a9f2-a724bc4788f6",
      "name": "Enviar Alerta de Error",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2688,
        128
      ],
      "webhookId": "",
      "parameters": {
        "sendTo": "admin@example.com",
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n    <style>\n        body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }\n        .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n        .alert-header { background: #dc3545; color: white; padding: 20px; text-align: center; border-radius: 8px 8px 0 0; }\n        .alert-content { background: #f8d7da; padding: 20px; border: 1px solid #f5c6cb; border-radius: 0 0 8px 8px; }\n        .info-box { background: white; padding: 15px; border-radius: 5px; margin: 15px 0; }\n        .info-row { padding: 8px 0; border-bottom: 1px solid #dee2e6; }\n        .label { font-weight: bold; color: #495057; }\n        .value { color: #212529; }\n    </style>\n</head>\n<body>\n    <div class=\"container\">\n        <div class=\"alert-header\">\n            <h2>⚠️ Badge Generation Failed</h2>\n        </div>\n        \n        <div class=\"alert-content\">\n            <p><strong>A badge generation request has failed.</strong></p>\n            \n            <div class=\"info-box\">\n                <h3>Attendee Details:</h3>\n                <div class=\"info-row\">\n                    <span class=\"label\">Name:</span>\n                    <span class=\"value\">{{ $('Validate & Sanitize').item.json.name }}</span>\n                </div>\n                <div class=\"info-row\">\n                    <span class=\"label\">Email:</span>\n                    <span class=\"value\">{{ $('Validate & Sanitize').item.json.email }}</span>\n                </div>\n                <div class=\"info-row\">\n                    <span class=\"label\">Event:</span>\n                    <span class=\"value\">{{ $('Validate & Sanitize').item.json.event }}</span>\n                </div>\n                <div class=\"info-row\">\n                    <span class=\"label\">Role:</span>\n                    <span class=\"value\">{{ $('Validate & Sanitize').item.json.role }}</span>\n                </div>\n                <div class=\"info-row\">\n                    <span class=\"label\">Attendee ID:</span>\n                    <span class=\"value\">{{ $('Validate & Sanitize').item.json.attendeeId }}</span>\n                </div>\n                <div class=\"info-row\">\n                    <span class=\"label\">Timestamp:</span>\n                    <span class=\"value\">{{ $('Validate & Sanitize').item.json.timestamp }}</span>\n                </div>\n            </div>\n            \n            <h3>Possible Causes:</h3>\n            <ul>\n                <li>HTMLCSStoImage API is down or rate limited</li>\n                <li>API credentials expired or invalid</li>\n                <li>Network connectivity issues</li>\n                <li>Invalid HTML in badge template</li>\n            </ul>\n            \n            <h3>Action Required:</h3>\n            <ol>\n                <li>Check n8n workflow execution logs</li>\n                <li>Verify HTMLCSStoImage API status</li>\n                <li>Manually regenerate badge for this attendee</li>\n                <li>Contact attendee if urgent</li>\n            </ol>\n            \n            <p><strong>Workflow Name:</strong> Event Badge Generator</p>\n            <p><strong>n8n Instance:</strong> n8n.mediajade.com</p>\n        </div>\n    </div>\n</body>\n</html>",
        "options": {},
        "subject": "⚠️ Badge Generation Failed"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "YOUR_GMAIL_OAUTH2_KEY",
          "name": "Gmail OAuth2"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "f1a3b78b-c10f-4595-9339-963b6f298d24",
      "name": "Enviar Correo de Credencial",
      "type": "n8n-nodes-base.gmail",
      "onError": "continueRegularOutput",
      "position": [
        3216,
        -112
      ],
      "webhookId": "",
      "parameters": {
        "sendTo": "={{ $json.Email }}",
        "message": "=<!DOCTYPE html>\n<html>\n<head>\n    <style>\n        body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }\n        .container { max-width: 600px; margin: 0 auto; padding: 20px; }\n        .header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; text-align: center; border-radius: 10px 10px 0 0; }\n        .content { background: #f7fafc; padding: 30px; }\n        .badge-info { background: white; padding: 20px; border-radius: 10px; margin: 20px 0; }\n        .badge-info h3 { color: #667eea; margin-bottom: 15px; }\n        .info-row { display: flex; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #e2e8f0; }\n        .info-label { font-weight: bold; color: #4a5568; }\n        .info-value { color: #2d3748; }\n        .button { display: inline-block; background: #667eea; color: white; padding: 15px 30px; text-decoration: none; border-radius: 8px; margin: 20px 0; font-weight: bold; }\n        .instructions { background: #fff3cd; padding: 15px; border-radius: 8px; border-left: 4px solid #ffc107; margin: 20px 0; }\n        .footer { text-align: center; padding: 20px; color: #718096; font-size: 14px; }\n    </style>\n</head>\n<body>\n    <div class=\"container\">\n        <div class=\"header\">\n            <h1>🎉 Your Event Badge is Ready!</h1>\n            <p>Welcome to {{ $json.Event }}</p>\n        </div>\n        \n        <div class=\"content\">\n            <p>Hello <strong>{{ $json.Name }}</strong>,</p>\n            \n            <p>Great news! Your personalized event badge for <strong>{{ $json.Event }}</strong> has been generated successfully.</p>\n            \n            <div class=\"badge-info\">\n                <h3>📋 Your Badge Details</h3>\n                <div class=\"info-row\">\n                    <span class=\"info-label\">Name:</span>\n                    <span class=\"info-value\">{{ $json.Name }}</span>\n                </div>\n                <div class=\"info-row\">\n                    <span class=\"info-label\">Role:</span>\n                    <span class=\"info-value\">{{ $json.Role }}</span>\n                </div>\n                <div class=\"info-row\">\n                    <span class=\"info-label\">Attendee ID:</span>\n                    <span class=\"info-value\">{{ $json['Attendee ID'] }}</span>\n                </div>\n                <div class=\"info-row\">\n                    <span class=\"info-label\">Event:</span>\n                    <span class=\"info-value\">{{ $json.Event }}</span>\n                </div>\n            </div>\n            \n            <div style=\"text-align: center;\">\n                <a href=\"{{ $json['Badge URL'] }}\" class=\"button\">📥 Download Your Badge</a>\n            </div>\n            \n            <div class=\"instructions\">\n                <h4>📌 Important Instructions:</h4>\n                <ul>\n                    <li><strong>Download</strong> your badge using the button above</li>\n                    <li><strong>Print</strong> it in color on standard paper OR save it on your phone</li>\n                    <li><strong>Present</strong> your badge at the event entrance for check-in</li>\n                    <li>The QR code on your badge will be scanned for quick entry</li>\n                </ul>\n            </div>\n            \n            <p><strong>Event Details:</strong></p>\n            <ul>\n                <li>📅 <strong>Date:</strong> October 25-27, 2025</li>\n                <li>📍 <strong>Venue:</strong> Convention Center</li>\n                <li>🕐 <strong>Check-in:</strong> Opens 8:00 AM daily</li>\n            </ul>\n            \n            <p>If you have any questions or need assistance, please reply to this email or contact our support team.</p>\n            \n            <p>We look forward to seeing you at the event! 🎊</p>\n            \n            <p>Best regards,<br>\n            <strong>TechCon 2025 Team</strong></p>\n        </div>\n        \n        <div class=\"footer\">\n            <p>This is an automated email. Please do not reply to this message.</p>\n            <p>© 2025 TechCon. All rights reserved.</p>\n        </div>\n    </div>\n</body>\n</html>",
        "options": {
          "attachmentsUi": {
            "attachmentsBinary": [
              {
                "property": "badge"
              }
            ]
          }
        },
        "subject": "=Your Event Badge for {{ $json.Event }} 🎫"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "YOUR_GMAIL_OAUTH2_KEY",
          "name": "Gmail OAuth2"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "160ee018-7b7f-40ef-b448-f453e5ffadb2",
      "name": "Registrar en Hojas",
      "type": "n8n-nodes-base.googleSheets",
      "onError": "continueRegularOutput",
      "position": [
        2672,
        -112
      ],
      "parameters": {
        "columns": {
          "value": {
            "Name": "={{ $('Prepare QR URL').item.json.name }}",
            "Role": "={{ $('Prepare QR URL').item.json.role }}",
            "Email": "={{ $('Prepare QR URL').item.json.email }}",
            "Event": "={{ $('Prepare QR URL').item.json.event }}",
            "Status": "Sent",
            "Badge URL": "={{ $json.image_url }}",
            "Timestamp": "={{ $('Prepare QR URL').item.json.timestamp }}",
            "Attendee ID": "={{ $('Prepare QR URL').item.json.attendeeId }}"
          },
          "schema": [
            {
              "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": "Event",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Event",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Role",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Role",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Attendee ID",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Attendee ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Badge URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Badge URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Timestamp",
              "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",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_ID/edit#gid=0",
          "cachedResultName": "BadgesLog"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEETS_ID",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEETS_ID/edit?usp=drivesdk",
          "cachedResultName": "Event Badge Tracker"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "YOUR_GOOGLE_SHEETS_OAUTH2_KEY",
          "name": "Google Sheets OAuth2"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "b06c61ed-c72a-434f-8963-8a9d971553e1",
      "name": "¿Se Generó la Credencial?",
      "type": "n8n-nodes-base.if",
      "position": [
        2352,
        -16
      ],
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json.image_url }}",
              "operation": "isNotEmpty"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "046da474-268b-4274-9741-6c73fa1cc462",
      "name": "Preparar URL para QR",
      "type": "n8n-nodes-base.code",
      "position": [
        1760,
        -16
      ],
      "parameters": {
        "jsCode": "// Get attendee data from previous node\nconst data = $input.first().json;\n\n// Create QR code URL that can be used in HTML\nconst qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodeURIComponent(data.attendeeId)}`;\n\n// Return all data with QR URL\nreturn {\n  name: data.name,\n  email: data.email,\n  event: data.event,\n  role: data.role,\n  attendeeId: data.attendeeId,\n  initials: data.initials,\n  eventDate: data.eventDate,\n  timestamp: data.timestamp,\n  qrCodeUrl: qrCodeUrl\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "ae88dca5-7d9d-47cc-a26c-99b1fd937476",
      "name": "Generar Código QR",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueRegularOutput",
      "position": [
        1504,
        -16
      ],
      "parameters": {
        "url": "https://api.qrserver.com/v1/create-qr-code/",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file",
              "outputPropertyName": "qrcode"
            }
          }
        },
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "size",
              "value": "300x300"
            },
            {
              "name": "data",
              "value": "={{ $json.attendeeId }}"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "fbd2eb39-1544-4697-8a48-21439fd1eddc",
      "name": "Validar y Sanitizar",
      "type": "n8n-nodes-base.code",
      "position": [
        1232,
        -16
      ],
      "parameters": {
        "jsCode": "// Get input data from webhook body\nconst webhookData = $input.item.json.body;\n\n// Validation function\nfunction validateEmail(email) {\n  const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n  return emailRegex.test(email);\n}\n\n// Extract and validate data\nconst name = webhookData.name?.trim() || '';\nconst email = webhookData.email?.trim().toLowerCase() || '';\nconst eventTitle = webhookData.event || 'TechCon 2025';\nconst role = webhookData.role || 'Attendee';\n\n// Check for required fields\nif (!name) {\n  throw new Error('Name is required');\n}\n\nif (!email || !validateEmail(email)) {\n  throw new Error('Valid email is required');\n}\n\n// Generate unique attendee ID\nconst attendeeId = 'ATD-' + Date.now().toString(36).toUpperCase() + '-' + Math.random().toString(36).substr(2, 4).toUpperCase();\n\n// Capitalize name properly\nconst capitalizedName = name\n  .toLowerCase()\n  .split(' ')\n  .map(word => word.charAt(0).toUpperCase() + word.slice(1))\n  .join(' ');\n\n// Get initials for badge\nconst initials = capitalizedName\n  .split(' ')\n  .map(word => word[0])\n  .join('')\n  .toUpperCase()\n  .substr(0, 2);\n\n// Current date for event\nconst eventDate = 'October 25-27, 2025';\n\n// Return sanitized data\nreturn {\n  name: capitalizedName,\n  email: email,\n  event: eventTitle,\n  role: role,\n  attendeeId: attendeeId,\n  initials: initials,\n  eventDate: eventDate,\n  timestamp: new Date().toISOString()\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "3855779b-e567-4b44-8ac8-18ea02328f5c",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        992,
        -16
      ],
      "webhookId": "",
      "parameters": {
        "path": "new-attendee",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 1.1
    },
    {
      "id": "dd40ecde-5b4c-455d-998f-06c3f8b15a23",
      "name": "Nota Adhesiva11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2576,
        -448
      ],
      "parameters": {
        "color": 7,
        "height": 480,
        "content": "## STEP 9: LOG TO GOOGLE SHEETS\n\nAppends row to tracking sheet:\n- Name\n- Email\n- Event\n- Role\n- Attendee ID\n- Badge URL\n- Timestamp\n\nSheet: Event Badge Tracker\nContinue on fail: ON"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "",
  "connections": {
    "3855779b-e567-4b44-8ac8-18ea02328f5c": {
      "main": [
        [
          {
            "node": "fbd2eb39-1544-4697-8a48-21439fd1eddc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f875b20b-393e-470c-8bf9-3c4cdfad8fb7": {
      "main": [
        [
          {
            "node": "b06c61ed-c72a-434f-8963-8a9d971553e1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "160ee018-7b7f-40ef-b448-f453e5ffadb2": {
      "main": [
        [
          {
            "node": "4c1e6d44-4f5e-4f4e-a6ad-038860f9e11f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "046da474-268b-4274-9741-6c73fa1cc462": {
      "main": [
        [
          {
            "node": "f875b20b-393e-470c-8bf9-3c4cdfad8fb7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ae88dca5-7d9d-47cc-a26c-99b1fd937476": {
      "main": [
        [
          {
            "node": "046da474-268b-4274-9741-6c73fa1cc462",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4c1e6d44-4f5e-4f4e-a6ad-038860f9e11f": {
      "main": [
        [
          {
            "node": "f1a3b78b-c10f-4595-9339-963b6f298d24",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "b06c61ed-c72a-434f-8963-8a9d971553e1": {
      "main": [
        [
          {
            "node": "160ee018-7b7f-40ef-b448-f453e5ffadb2",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "10d6aab4-3b05-45e7-a9f2-a724bc4788f6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fbd2eb39-1544-4697-8a48-21439fd1eddc": {
      "main": [
        [
          {
            "node": "ae88dca5-7d9d-47cc-a26c-99b1fd937476",
            "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 nodos8
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