30 KiB
30 KiB
plaintext\nEvent Registration Flow:\nQR Code/Landing Page → Typebot → n8n → Sendy + Baserow + Formbricks\n ↓\nLive Event Polls → Claper → n8n → Sendy Segments + Analytics\n ↓\nPost-Event Follow-up → Automated Email Sequences + Survey Distribution\n\n\n## Sendy API Integration\n\n### Authentication & Setup\n\nbash\n# Sendy API Configuration\nSENDY_API_KEY="your-api-key"\nSENDY_INSTALLATION_URL="https://sendy.yourdomain.com"\nSENDY_LIST_ID="your-list-id"\n\n\n### Key API Endpoints\n\njavascript\n// Subscribe endpoint\nPOST /api/subscribe.php\n{\n "api_key": "your-api-key",\n "email": "attendee@example.com",\n "list": "list-id",\n "name": "Attendee Name",\n "custom_fields": {\n "registration_source": "rust-meetup-2025",\n "interest_level": "high",\n "experience": "intermediate"\n }\n}\n\n// Unsubscribe endpoint\nPOST /api/unsubscribe.php\n\n// Get subscriber status\nPOST /api/subscriber-status.php\n\n// Create campaign\nPOST /api/create-send.php\n\n\n## n8n Kubernetes Deployment\n\n### Namespace and ConfigMap\n\nyaml\n# n8n-namespace.yaml\napiVersion: v1\nkind: Namespace\nmetadata:\n name: n8n-automation\n labels:\n name: n8n-automation\n app: event-automation\n\n---\n# n8n-config.yaml\napiVersion: v1\nkind: ConfigMap\nmetadata:\n name: n8n-config\n namespace: n8n-automation\ndata:\n N8N_BASIC_AUTH_ACTIVE: "true"\n N8N_BASIC_AUTH_USER: "admin"\n N8N_HOST: "n8n.rust-meetup.local"\n N8N_PORT: "5678"\n N8N_PROTOCOL: "https"\n WEBHOOK_URL: "https://n8n.rust-meetup.local"\n GENERIC_TIMEZONE: "Europe/Madrid"\n N8N_METRICS: "true"\n N8N_LOG_LEVEL: "info"\n N8N_EDITOR_BASE_URL: "https://n8n.rust-meetup.local"\n N8N_DISABLE_UI: "false"\n N8N_PERSONALIZATION_ENABLED: "false"\n N8N_VERSION_NOTIFICATIONS_ENABLED: "false"\n N8N_DIAGNOSTICS_ENABLED: "false"\n N8N_PUBLIC_API_DISABLED: "false"\n EXECUTIONS_PROCESS: "main"\n EXECUTIONS_MODE: "regular"\n QUEUE_BULL_REDIS_HOST: "redis-cluster"\n QUEUE_BULL_REDIS_PORT: "6379"\n DB_TYPE: "postgresdb"\n DB_POSTGRESDB_HOST: "postgresql-ha-primary"\n DB_POSTGRESDB_PORT: "5432"\n DB_POSTGRESDB_DATABASE: "n8n"\n DB_POSTGRESDB_USER: "n8n"\n\n\n### Secrets\n\nyaml\n# n8n-secrets.yaml\napiVersion: v1\nkind: Secret\nmetadata:\n name: n8n-secrets\n namespace: n8n-automation\ntype: Opaque\nstringData:\n N8N_BASIC_AUTH_PASSWORD: "secure-password-here"\n DB_POSTGRESDB_PASSWORD: "postgres-password"\n ENCRYPTION_KEY: "your-encryption-key-32-chars-long"\n # Sendy Configuration\n SENDY_API_KEY: "your-sendy-api-key"\n SENDY_INSTALLATION_URL: "https://sendy.yourdomain.com"\n SENDY_LIST_ID: "rust-meetup-list-id"\n # Integration Keys\n TYPEBOT_API_KEY: "your-typebot-api-key"\n FORMBRICKS_API_KEY: "your-formbricks-api-key"\n BASEROW_API_KEY: "your-baserow-api-key"\n CLAPER_WEBHOOK_SECRET: "claper-webhook-secret"\n\n\n### PersistentVolumeClaim\n\nyaml\n# n8n-storage.yaml\napiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n name: n8n-data\n namespace: n8n-automation\nspec:\n accessModes:\n - ReadWriteOnce\n resources:\n requests:\n storage: 10Gi\n storageClassName: fast-ssd\n\n\n### Deployment\n\nyaml\n# n8n-deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: n8n\n namespace: n8n-automation\n labels:\n app: n8n\n version: v1\nspec:\n replicas: 1\n selector:\n matchLabels:\n app: n8n\n version: v1\n template:\n metadata:\n labels:\n app: n8n\n version: v1\n spec:\n containers:\n - name: n8n\n image: n8nio/n8n:1.57.0\n ports:\n - containerPort: 5678\n name: http\n envFrom:\n - configMapRef:\n name: n8n-config\n - secretRef:\n name: n8n-secrets\n volumeMounts:\n - name: n8n-data\n mountPath: /home/node/.n8n\n resources:\n requests:\n memory: "512Mi"\n cpu: "250m"\n limits:\n memory: "2Gi"\n cpu: "1000m"\n livenessProbe:\n httpGet:\n path: /healthz\n port: 5678\n initialDelaySeconds: 60\n periodSeconds: 30\n readinessProbe:\n httpGet:\n path: /healthz\n port: 5678\n initialDelaySeconds: 30\n periodSeconds: 10\n securityContext:\n runAsNonRoot: true\n runAsUser: 1000\n allowPrivilegeEscalation: false\n readOnlyRootFilesystem: false\n volumes:\n - name: n8n-data\n persistentVolumeClaim:\n claimName: n8n-data\n securityContext:\n fsGroup: 1000\n\n\n### Service\n\nyaml\n# n8n-service.yaml\napiVersion: v1\nkind: Service\nmetadata:\n name: n8n\n namespace: n8n-automation\n labels:\n app: n8n\nspec:\n selector:\n app: n8n\n ports:\n - name: http\n port: 80\n targetPort: 5678\n protocol: TCP\n type: ClusterIP\n\n\n### Ingress (Traditional)\n\nyaml\n# n8n-ingress.yaml\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: n8n-ingress\n namespace: n8n-automation\n annotations:\n kubernetes.io/ingress.class: "nginx"\n nginx.ingress.kubernetes.io/ssl-redirect: "true"\n nginx.ingress.kubernetes.io/force-ssl-redirect: "true"\n nginx.ingress.kubernetes.io/proxy-body-size: "50m"\n nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"\n nginx.ingress.kubernetes.io/proxy-send-timeout: "300"\n nginx.ingress.kubernetes.io/proxy-read-timeout: "300"\n cert-manager.io/cluster-issuer: "letsencrypt-prod"\nspec:\n tls:\n - hosts:\n - n8n.rust-meetup.local\n secretName: n8n-tls\n rules:\n - host: n8n.rust-meetup.local\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: n8n\n port:\n number: 80\n\n\n### Istio VirtualService\n\nyaml\n# n8n-virtualservice.yaml\napiVersion: networking.istio.io/v1beta1\nkind: VirtualService\nmetadata:\n name: n8n-vs\n namespace: n8n-automation\nspec:\n hosts:\n - n8n.rust-meetup.local\n gateways:\n - rust-meetup-gateway\n http:\n - match:\n - uri:\n prefix: /\n route:\n - destination:\n host: n8n.n8n-automation.svc.cluster.local\n port:\n number: 80\n timeout: 300s\n headers:\n request:\n add:\n X-Forwarded-Proto: "https"\n X-Forwarded-For: "%DOWNSTREAM_REMOTE_ADDRESS%"\n\n---\napiVersion: networking.istio.io/v1beta1\nkind: DestinationRule\nmetadata:\n name: n8n-dr\n namespace: n8n-automation\nspec:\n host: n8n.n8n-automation.svc.cluster.local\n trafficPolicy:\n connectionPool:\n tcp:\n maxConnections: 50\n http:\n http1MaxPendingRequests: 100\n maxRequestsPerConnection: 10\n outlierDetection:\n consecutiveErrors: 3\n interval: 30s\n baseEjectionTime: 30s\n\n\n## n8n Workflow Templates\n\n### 1. Event Registration Workflow\n\njson\n{\n "name": "Rust Meetup Registration Flow",\n "nodes": [\n {\n "parameters": {\n "httpMethod": "POST",\n "path": "registration",\n "responseMode": "responseNode"\n },\n "id": "webhook-registration",\n "name": "Registration Webhook",\n "type": "n8n-nodes-base.webhook",\n "position": [240, 300]\n },\n {\n "parameters": {\n "url": "={{ $env.SENDY_INSTALLATION_URL }}/api/subscribe.php",\n "sendHeaders": true,\n "headerParameters": {\n "parameters": [\n {\n "name": "Content-Type",\n "value": "application/x-www-form-urlencoded"\n }\n ]\n },\n "sendBody": true,\n "bodyParameters": {\n "parameters": [\n {\n "name": "api_key",\n "value": "={{ $env.SENDY_API_KEY }}"\n },\n {\n "name": "email",\n "value": "={{ $json.email }}"\n },\n {\n "name": "list",\n "value": "={{ $env.SENDY_LIST_ID }}"\n },\n {\n "name": "name",\n "value": "={{ $json.name }}"\n },\n {\n "name": "custom_fields",\n "value": "{{ JSON.stringify({ registration_source: 'rust-meetup-2025', interest_level: $json.interest_level, experience: $json.experience, registration_date: new Date().toISOString() }) }}"\n }\n ]\n }\n },\n "id": "sendy-subscribe",\n "name": "Add to Sendy List",\n "type": "n8n-nodes-base.httpRequest",\n "position": [460, 300]\n },\n {\n "parameters": {\n "url": "={{ $env.BASEROW_API_URL }}/api/database/rows/table/{{ $env.BASEROW_ATTENDEES_TABLE_ID }}/",\n "sendHeaders": true,\n "headerParameters": {\n "parameters": [\n {\n "name": "Authorization",\n "value": "Token {{ $env.BASEROW_API_KEY }}"\n }\n ]\n },\n "sendBody": true,\n "bodyParameters": {\n "parameters": [\n {\n "name": "name",\n "value": "={{ $json.name }}"\n },\n {\n "name": "email",\n "value": "={{ $json.email }}"\n },\n {\n "name": "registration_source",\n "value": "typebot"\n },\n {\n "name": "registration_date",\n "value": "={{ new Date().toISOString() }}"\n },\n {\n "name": "status",\n "value": "registered"\n }\n ]\n }\n },\n "id": "baserow-create",\n "name": "Save to Baserow",\n "type": "n8n-nodes-base.httpRequest",\n "position": [680, 300]\n }\n ],\n "connections": {\n "Registration Webhook": {\n "main": [\n [\n {\n "node": "Add to Sendy List",\n "type": "main",\n "index": 0\n }\n ]\n ]\n },\n "Add to Sendy List": {\n "main": [\n [\n {\n "node": "Save to Baserow",\n "type": "main",\n "index": 0\n }\n ]\n ]\n }\n }\n}\n\n\n### 2. Pre-Event Email Sequence\n\njson\n{\n "name": "Pre-Event Email Automation",\n "nodes": [\n {\n "parameters": {\n "rule": {\n "interval": [\n {\n "field": "cronExpression",\n "value": "0 9 * * *"\n }\n ]\n }\n },\n "id": "daily-trigger",\n "name": "Daily Check Trigger",\n "type": "n8n-nodes-base.cron",\n "position": [240, 300]\n },\n {\n "parameters": {\n "url": "={{ $env.SENDY_INSTALLATION_URL }}/api/create-send.php",\n "sendBody": true,\n "bodyParameters": {\n "parameters": [\n {\n "name": "api_key",\n "value": "={{ $env.SENDY_API_KEY }}"\n },\n {\n "name": "from_name",\n "value": "Rust Meetup Team"\n },\n {\n "name": "from_email",\n "value": "hello@rust-meetup.com"\n },\n {\n "name": "reply_to",\n "value": "hello@rust-meetup.com"\n },\n {\n "name": "subject",\n "value": "¡Solo quedan {{ $json.days_remaining }} días para el Rust Meetup!"\n },\n {\n "name": "html_text",\n "value": "{{ $json.email_template }}"\n },\n {\n "name": "list_ids",\n "value": "={{ $env.SENDY_LIST_ID }}"\n },\n {\n "name": "send_campaign",\n "value": "1"\n }\n ]\n }\n },\n "id": "send-reminder",\n "name": "Send Reminder Email",\n "type": "n8n-nodes-base.httpRequest",\n "position": [680, 300]\n }\n ]\n}\n\n\n### 3. Live Event Integration\n\njson\n{\n "name": "Live Event Poll Integration",\n "nodes": [\n {\n "parameters": {\n "httpMethod": "POST",\n "path": "poll-response",\n "responseMode": "responseNode"\n },\n "id": "poll-webhook",\n "name": "Poll Response Webhook",\n "type": "n8n-nodes-base.webhook",\n "position": [240, 300]\n },\n {\n "parameters": {\n "url": "={{ $env.BASEROW_API_URL }}/api/database/rows/table/{{ $env.BASEROW_LIVE_ENGAGEMENT_TABLE_ID }}/",\n "sendHeaders": true,\n "headerParameters": {\n "parameters": [\n {\n "name": "Authorization",\n "value": "Token {{ $env.BASEROW_API_KEY }}"\n }\n ]\n },\n "sendBody": true,\n "bodyParameters": {\n "parameters": [\n {\n "name": "attendee_email",\n "value": "={{ $json.email }}"\n },\n {\n "name": "poll_question",\n "value": "={{ $json.question }}"\n },\n {\n "name": "response",\n "value": "={{ $json.answer }}"\n },\n {\n "name": "timestamp",\n "value": "={{ new Date().toISOString() }}"\n },\n {\n "name": "engagement_score",\n "value": "={{ $json.engagement_points || 10 }}"\n }\n ]\n }\n },\n "id": "save-engagement",\n "name": "Save Engagement Data",\n "type": "n8n-nodes-base.httpRequest",\n "position": [460, 300]\n },\n {\n "parameters": {\n "conditions": {\n "string": [\n {\n "value1": "={{ $json.engagement_score }}",\n "operation": "largerEqual",\n "value2": "50"\n }\n ]\n }\n },\n "id": "check-engagement",\n "name": "High Engagement?",\n "type": "n8n-nodes-base.if",\n "position": [680, 300]\n },\n {\n "parameters": {\n "url": "={{ $env.SENDY_INSTALLATION_URL }}/api/subscribe.php",\n "sendBody": true,\n "bodyParameters": {\n "parameters": [\n {\n "name": "api_key",\n "value": "={{ $env.SENDY_API_KEY }}"\n },\n {\n "name": "email",\n "value": "={{ $json.email }}"\n },\n {\n "name": "list",\n "value": "={{ $env.SENDY_HIGH_ENGAGEMENT_LIST_ID }}"\n },\n {\n "name": "custom_fields",\n "value": "{{ JSON.stringify({ segment: 'high_engagement', last_interaction: new Date().toISOString() }) }}"\n }\n ]\n }\n },\n "id": "segment-high-engagement",\n "name": "Add to High Engagement Segment",\n "type": "n8n-nodes-base.httpRequest",\n "position": [900, 200]\n }\n ]\n}\n\n\n## QR Code Integration Strategy\n\n### 1. Dynamic QR Code Generation\n\njavascript\n// QR Code Generation Service\nconst QRCode = require('qrcode');\n\nasync function generateEventQR(attendeeEmail, source = 'general') {\n const registrationUrl = `https://typebot.rust-meetup.local/rust-meetup-registration?email=${encodeURIComponent(attendeeEmail)}&source=${source}&utm_campaign=rust-meetup-2025`;\n\n const qrOptions = {\n errorCorrectionLevel: 'M',\n type: 'image/png',\n quality: 0.92,\n margin: 1,\n color: {\n dark: '#000000',\n light: '#FFFFFF',\n },\n width: 256\n };\n\n return await QRCode.toDataURL(registrationUrl, qrOptions);\n}\n\n\n### 2. Landing Page Integration\n\nhtml\n<!-- Landing Page Template -->\n<!DOCTYPE html>\n<html lang="es">\n<head>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <title>Rust Meetup 2025 - Registro</title>\n <meta name="description" content="Únete al Rust Meetup 2025: Infrastructure Automation with Rust, Nushell & KCL">\n <link rel="canonical" href="https://rust-meetup.local/registro">\n\n <!-- Open Graph -->\n <meta property="og:title" content="Rust Meetup 2025 - Infrastructure Automation">\n <meta property="og:description" content="Aprende sobre automatización de infraestructura con Rust, Nushell y KCL">\n <meta property="og:image" content="https://rust-meetup.local/images/meetup-banner.jpg">\n <meta property="og:url" content="https://rust-meetup.local/registro">\n\n <style>\n body {\n font-family: 'Inter', sans-serif;\n margin: 0;\n padding: 20px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n min-height: 100vh;\n }\n .container {\n max-width: 600px;\n margin: 0 auto;\n background: white;\n padding: 40px;\n border-radius: 12px;\n box-shadow: 0 10px 25px rgba(0,0,0,0.1);\n }\n .logo {\n text-align: center;\n margin-bottom: 30px;\n }\n .rust-logo {\n width: 80px;\n height: 80px;\n margin-bottom: 20px;\n }\n h1 {\n color: #2c3e50;\n text-align: center;\n margin-bottom: 10px;\n font-size: 2.2em;\n }\n .subtitle {\n text-align: center;\n color: #7f8c8d;\n margin-bottom: 30px;\n font-size: 1.1em;\n }\n .typebot-container {\n width: 100%;\n height: 600px;\n border: none;\n border-radius: 8px;\n box-shadow: 0 4px 6px rgba(0,0,0,0.1);\n }\n .event-info {\n background: #f8f9fa;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 30px;\n }\n .info-item {\n display: flex;\n align-items: center;\n margin-bottom: 10px;\n }\n .info-icon {\n width: 20px;\n margin-right: 10px;\n color: #e74c3c;\n }\n </style>\n</head>\n<body>\n <div class="container">\n <div class="logo">\n <img src="/images/rust-logo.svg" alt="Rust Logo" class="rust-logo">\n <h1>Rust Meetup 2025</h1>\n <p class="subtitle">Infrastructure Automation with Rust, Nushell & KCL</p>\n </div>\n\n <div class="event-info">\n <div class="info-item">\n <span class="info-icon">📅</span>\n <span><strong>Fecha:</strong> 15 de Marzo, 2025</span>\n </div>\n <div class="info-item">\n <span class="info-icon">🕕</span>\n <span><strong>Hora:</strong> 18:00 - 21:00 CET</span>\n </div>\n <div class="info-item">\n <span class="info-icon">📍</span>\n <span><strong>Lugar:</strong> Tech Hub Madrid</span>\n </div>\n <div class="info-item">\n <span class="info-icon">👥</span>\n <span><strong>Capacidad:</strong> 100 asistentes</span>\n </div>\n </div>\n\n <!-- Typebot Integration -->\n <iframe\n src="https://typebot.rust-meetup.local/rust-meetup-registration?utm_source=landing&utm_campaign=rust-meetup-2025"\n class="typebot-container"\n title="Registro Rust Meetup 2025">\n </iframe>\n </div>\n\n <!-- Analytics -->\n <script>\n // Track page view\n fetch('/api/analytics/pageview', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n page: 'landing-registration',\n timestamp: new Date().toISOString(),\n referrer: document.referrer,\n utm_source: new URLSearchParams(window.location.search).get('utm_source') || 'direct'\n })\n });\n </script>\n</body>\n</html>\n\n\n## Email Template System\n\n### Welcome Email Template\n\nhtml\n<!-- Sendy Email Template -->\n<html>\n<head>\n <meta charset="UTF-8">\n <meta name="viewport" content="width=device-width, initial-scale=1.0">\n <title>¡Bienvenido al Rust Meetup 2025!</title>\n</head>\n<body style="margin:0;padding:0;font-family:Arial,sans-serif;background-color:#f4f4f4;">\n <table width="100%" cellpadding="0" cellspacing="0" style="background-color:#f4f4f4;">\n <tr>\n <td align="center">\n <table width="600" cellpadding="0" cellspacing="0" style="background-color:#ffffff;margin:20px auto;border-radius:8px;overflow:hidden;box-shadow:0 4px 6px rgba(0,0,0,0.1);">\n <!-- Header -->\n <tr>\n <td style="background:linear-gradient(135deg,#667eea 0%,#764ba2 100%);padding:40px;text-align:center;">\n <img src="https://rust-meetup.local/images/rust-logo.png" alt="Rust Logo" style="width:60px;height:60px;margin-bottom:20px;">\n <h1 style="color:#ffffff;margin:0;font-size:28px;">¡Registro Confirmado!</h1>\n <p style="color:#ffffff;margin:10px 0 0 0;font-size:16px;">Rust Meetup 2025</p>\n </td>\n </tr>\n\n <!-- Content -->\n <tr>\n <td style="padding:40px;">\n <h2 style="color:#2c3e50;margin:0 0 20px 0;">Hola [name],</h2>\n\n <p style="color:#34495e;font-size:16px;line-height:1.6;margin:0 0 20px 0;">\n ¡Gracias por registrarte en el <strong>Rust Meetup 2025</strong>! Estamos emocionados de tenerte con nosotros para explorar Infrastructure Automation with Rust, Nushell & KCL.\n </p>\n\n <div style="background:#f8f9fa;padding:25px;border-radius:8px;margin:25px 0;">\n <h3 style="color:#2c3e50;margin:0 0 15px 0;font-size:18px;">📅 Detalles del Evento</h3>\n <p style="margin:5px 0;color:#34495e;"><strong>Fecha:</strong> 15 de Marzo, 2025</p>\n <p style="margin:5px 0;color:#34495e;"><strong>Hora:</strong> 18:00 - 21:00 CET</p>\n <p style="margin:5px 0;color:#34495e;"><strong>Lugar:</strong> Tech Hub Madrid</p>\n <p style="margin:5px 0;color:#34495e;"><strong>Dirección:</strong> Calle Innovation 42, Madrid</p>\n </div>\n\n <div style="background:#e8f5e8;border-left:4px solid #27ae60;padding:20px;margin:25px 0;">\n <h4 style="color:#27ae60;margin:0 0 10px 0;">🎯 Lo que aprenderás:</h4>\n <ul style="color:#34495e;margin:0;padding-left:20px;">\n <li>Automatización de infraestructura con Rust</li>\n <li>Uso avanzado de Nushell para DevOps</li>\n <li>Configuración declarativa con KCL</li>\n <li>Mejores prácticas de Cloud Native</li>\n </ul>\n </div>\n\n <div style="text-align:center;margin:30px 0;">\n <a href="https://calendar.rust-meetup.local/add-event?token=[calendar_token]"\n style="background:#e74c3c;color:#ffffff;text-decoration:none;padding:15px 30px;border-radius:5px;font-weight:bold;display:inline-block;">\n 📅 Añadir al Calendario\n </a>\n </div>\n\n <div style="background:#fff3cd;border:1px solid #ffeaa7;padding:20px;border-radius:8px;margin:25px 0;">\n <h4 style="color:#856404;margin:0 0 10px 0;">📋 Antes del evento:</h4>\n <p style="color:#856404;margin:0;">\n Te enviaremos un cuestionario previo para personalizar mejor la experiencia.\n ¡Mantente atento a tu email!\n </p>\n </div>\n\n <p style="color:#34495e;font-size:16px;line-height:1.6;margin:25px 0 0 0;">\n Si tienes alguna pregunta, no dudes en responder este email.\n </p>\n\n <p style="color:#34495e;font-size:16px;line-height:1.6;margin:20px 0 0 0;">\n ¡Nos vemos pronto!<br>\n <strong>El equipo de Rust Meetup</strong>\n </p>\n </td>\n </tr>\n\n <!-- Footer -->\n <tr>\n <td style="background:#2c3e50;padding:30px;text-align:center;">\n <p style="color:#bdc3c7;margin:0 0 15px 0;font-size:14px;">\n Síguenos en redes sociales:\n </p>\n <a href="https://twitter.com/rustmeetup" style="color:#3498db;text-decoration:none;margin:0 10px;">Twitter</a>\n <a href="https://github.com/rust-meetup" style="color:#3498db;text-decoration:none;margin:0 10px;">GitHub</a>\n <a href="https://linkedin.com/company/rust-meetup" style="color:#3498db;text-decoration:none;margin:0 10px;">LinkedIn</a>\n\n <p style="color:#95a5a6;margin:20px 0 10px 0;font-size:12px;">\n Rust Meetup Madrid | Tech Hub Madrid<br>\n Calle Innovation 42, 28001 Madrid\n </p>\n\n <a href="[unsubscribe]" style="color:#95a5a6;font-size:12px;text-decoration:underline;">\n Darse de baja\n </a>\n </td>\n </tr>\n </table>\n </td>\n </tr>\n </table>\n</body>\n</html>\n\n\n## Integration Monitoring\n\n### Prometheus Metrics\n\nyaml\n# n8n-monitoring.yaml\napiVersion: v1\nkind: ServiceMonitor\nmetadata:\n name: n8n-metrics\n namespace: n8n-automation\n labels:\n app: n8n\nspec:\n selector:\n matchLabels:\n app: n8n\n endpoints:\n - port: http\n path: /metrics\n interval: 30s\n\n\n### Grafana Dashboard\n\njson\n{\n "dashboard": {\n "title": "Rust Meetup - n8n & Sendy Integration",\n "panels": [\n {\n "title": "Registration Rate",\n "type": "stat",\n "targets": [\n {\n "expr": "rate(n8n_workflow_executions_total{workflow_name=\"Rust Meetup Registration Flow\"}[5m])",\n "legendFormat": "Registrations/min"\n }\n ]\n },\n {\n "title": "Email Delivery Success Rate",\n "type": "stat",\n "targets": [\n {\n "expr": "rate(n8n_workflow_executions_total{workflow_name=\"Pre-Event Email Automation\",status=\"success\"}[1h]) / rate(n8n_workflow_executions_total{workflow_name=\"Pre-Event Email Automation\"}[1h])",\n "legendFormat": "Success Rate %"\n }\n ]\n },\n {\n "title": "Live Engagement Score",\n "type": "graph",\n "targets": [\n {\n "expr": "avg(baserow_engagement_score) by (poll_question)",\n "legendFormat": "{{ poll_question }}"\n }\n ]\n }\n ]\n }\n}\n\n\n## Best Practices\n\n### 1. Registration Flow Optimization\n\n- Multiple Entry Points: QR codes, direct URLs, social media links\n- Progressive Profiling: Collect minimal info initially, expand during event\n- A/B Testing: Test different landing page versions\n- Mobile First: Ensure perfect mobile experience\n\n### 2. Segmentation Strategy\n\njavascript\n// Sendy Custom Fields for Segmentation\nconst segmentationFields = {\n experience_level: ['beginner', 'intermediate', 'advanced'],\n interest_areas: ['infrastructure', 'automation', 'rust', 'devops'],\n company_size: ['startup', 'small', 'medium', 'enterprise'],\n role: ['developer', 'devops', 'architect', 'manager'],\n previous_attendee: ['yes', 'no'],\n engagement_score: 'numeric',\n last_interaction: 'datetime'\n};\n\n\n### 3. Email Automation Sequences\n\nplaintext\nPre-Event Sequence:\nDay -7: Welcome + Event Details + Calendar Invite\nDay -3: Pre-event Survey + Preparation Materials\nDay -1: Final Reminder + Access Instructions\nDay 0: Event Day - Location & Last-minute Updates\n\nPost-Event Sequence:\nDay +1: Thank You + Survey + Resources\nDay +3: Presentation Slides + Additional Resources\nDay +7: Community Follow-up + Next Events\nDay +30: Long-term Engagement Survey\n\n\n### 4. Security Considerations\n\nyaml\n# Security Headers for n8n\nannotations:\n nginx.ingress.kubernetes.io/configuration-snippet: |\n add_header X-Frame-Options "SAMEORIGIN" always;\n add_header X-Content-Type-Options "nosniff" always;\n add_header X-XSS-Protection "1; mode=block" always;\n add_header Referrer-Policy "strict-origin-when-cross-origin" always;\n add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;\n\n\n## Deployment Commands\n\nbash\n# Deploy n8n\nkubectl apply -f n8n-namespace.yaml\nkubectl apply -f n8n-secrets.yaml\nkubectl apply -f n8n-config.yaml\nkubectl apply -f n8n-storage.yaml\nkubectl apply -f n8n-deployment.yaml\nkubectl apply -f n8n-service.yaml\nkubectl apply -f n8n-ingress.yaml\nkubectl apply -f n8n-virtualservice.yaml\n\n# Verify deployment\nkubectl get pods -n n8n-automation\nkubectl logs -f deployment/n8n -n n8n-automation\n\n# Access n8n\nkubectl port-forward svc/n8n 8080:80 -n n8n-automation\n# Then access: http://localhost:8080\n\n\nThis complete setup provides a robust, scalable integration between Sendy and your event management tools using n8n on Kubernetes with both traditional Ingress and Istio support.