8
n8n 한국어amn8n.com

검증된 방문자 패스 생성기

고급

이것은Document Extraction분야의자동화 워크플로우로, 22개의 노드를 포함합니다.주로 If, Set, Code, Gmail, Slack 등의 노드를 사용하며. 이메일 확인, 패스 및 Slack 알림을 사용한 방문자 관리 자동화

사전 요구사항
  • Google 계정 및 Gmail API 인증 정보
  • Slack Bot Token 또는 Webhook URL
  • HTTP Webhook 엔드포인트(n8n이 자동으로 생성)
  • Google Sheets API 인증 정보

카테고리

워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
  "id": "",
  "meta": {
    "instanceId": ""
  },
  "name": "Verified Visitor Pass Generator",
  "tags": [],
  "nodes": [
    {
      "id": "c897caf3-b83b-46fd-9eb3-a73ea8b563a1",
      "name": "Set - 양식 데이터 추출",
      "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 - 이메일 유효성 확인",
      "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 - 방문자 ID 및 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를 이미지로 변환",
      "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": "메시지 전송1",
      "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 - 보안팀에 알림",
      "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 - 방문자 기록",
      "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": "중지 및 오류",
      "type": "n8n-nodes-base.stopAndError",
      "position": [
        1360,
        528
      ],
      "parameters": {
        "errorMessage": "Invalid Email"
      },
      "typeVersion": 1
    },
    {
      "id": "922d05d1-426d-426b-918c-36065bc8b2b1",
      "name": "Sticky Note - 개요",
      "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": "Sticky Note - 자격 증명",
      "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": "Sticky Note - 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": "Sticky Note - Set 추출",
      "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": "Sticky Note - Verifi 이메일",
      "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": "Sticky Note - 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": "Sticky Note - Function",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1248,
        48
      ],
      "parameters": {
        "color": 6,
        "width": 383,
        "height": 396,
        "content": "## 🆔 STEP 5: GENERATE VISITOR ID & QR CODE\n\n**What It Does:**\n- Generates unique visitor ID with timestamp\n- Creates QR code data with full visitor info\n- Provides two QR formats (JSON & simple text)\n- Generates QR code image URLs\n- Adds verification timestamp\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "7a69ca42-4c7a-4d27-a58a-a59ad8ebbab1",
      "name": "Sticky Note - HTML을 이미지로",
      "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": "Sticky Note - 이메일",
      "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": "Sticky Note - 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": "Sticky Note - Sheets",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2064,
        544
      ],
      "parameters": {
        "color": 6,
        "width": 351,
        "height": 712,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n## 📊 STEP 9: LOG TO GOOGLE SHEETS\n\n**What It Does:**\n- Appends new row to spreadsheet\n- Records all visitor information\n- Logs badge image URL\n- Tracks verification status\n- Creates searchable audit trail\n\n**Spreadsheet Columns:**\n\n1. **Timestamp** \n2. **Visitor ID**\n3. **Full Name** \n4. **Email**\n5. **Visit Date**\n6. **Purpose**\n7. **Company**\n8. **Email Verified**\n9. **Badge Image URL** \n10. **Status**\n\n\n\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0d03ee1f-d600-40c3-b34d-e7be412996f8",
      "name": "Sticky Note - 중지 오류",
      "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
          }
        ]
      ]
    }
  }
}
자주 묻는 질문

이 워크플로우를 어떻게 사용하나요?

위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.

이 워크플로우는 어떤 시나리오에 적합한가요?

고급 - 문서 추출

유료인가요?

이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.

워크플로우 정보
난이도
고급
노드 수22
카테고리1
노드 유형11
난이도 설명

고급 사용자를 위한 16+개 노드의 복잡한 워크플로우

저자
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.

외부 링크
n8n.io에서 보기

이 워크플로우 공유

카테고리

카테고리: 34