이벤트 메달 생성기
고급
이것은Document Extraction분야의자동화 워크플로우로, 22개의 노드를 포함합니다.주로 If, Code, Gmail, Webhook, HttpRequest 등의 노드를 사용하며. 사용하여 QR 코드, HTMLCSS to Image, Gmail, Google Sheets를 통해 이벤트 메달 생성
사전 요구사항
- •Google 계정 및 Gmail API 인증 정보
- •HTTP Webhook 엔드포인트(n8n이 자동으로 생성)
- •대상 API의 인증 정보가 필요할 수 있음
- •Google Sheets API 인증 정보
카테고리
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 n8n에 가져오면 이 워크플로우를 사용할 수 있습니다
{
"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": "이미지 URL 추출",
"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": "배지 디자인",
"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": "고정 메모10",
"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": "고정 메모9",
"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": "고정 메모8",
"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": "고정 메모7",
"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": "고정 메모6",
"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": "고정 메모5",
"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": "고정 메모4",
"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": "고정 메모3",
"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": "고정 메모2",
"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": "고정 메모1",
"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": "고정 메모",
"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": "오류 알림 전송",
"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": "배지 이메일 전송",
"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": "시트에 기록",
"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": "배지 생성 여부 확인",
"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": "QR URL 준비",
"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": "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": "유효성 검사 및 정제",
"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": "고정 메모11",
"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
}
]
]
}
}
}자주 묻는 질문
이 워크플로우를 어떻게 사용하나요?
위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.
이 워크플로우는 어떤 시나리오에 적합한가요?
고급 - 문서 추출
유료인가요?
이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.
관련 워크플로우 추천
검증된 방문자 패스 생성기
이메일 확인, 패스 및 Slack 알림을 사용한 방문자 관리 자동화
If
Set
Code
+
If
Set
Code
22 노드Jitesh Dugar
문서 추출
학부모 동의 자동화
이메일 검증, PDF 생성 및 Google Drive를 사용한 학교 여행 동의서 자동화
If
Code
Gmail
+
If
Code
Gmail
22 노드Jitesh Dugar
문서 추출
세미나 증명서 사전 발급 시스템
JotForm, 이메일 검증, Google Workspace를 통합한 자동화 세미나 인증서 시스템
If
Code
Gmail
+
If
Code
Gmail
24 노드Jitesh Dugar
문서 추출
인증된 사용자 프로필 생성
이메일 확인, PDF 생성, Gmail 배달을 사용하여 검증된 사용자 프로필 만들기
If
Set
Gmail
+
If
Set
Gmail
20 노드Jitesh Dugar
문서 추출
인플루언서 마케팅 캠페인 관리 시스템 자동화
Instagram/YouTube API를 활용한 인플루언서 평가 및 캠페인 관리 자동화
If
Code
Gmail
+
If
Code
Gmail
24 노드Jitesh Dugar
콘텐츠 제작
fraud 방지 잠재 고객 캡처 및 성장 시스템
AI 평점, 테이블 추적, 다중 채널 알림을 통해防欺诈 잠재 고객을捕获하고 키우습니다.
If
Set
Code
+
If
Set
Code
28 노드Jitesh Dugar
콘텐츠 제작
워크플로우 정보
난이도
고급
노드 수22
카테고리1
노드 유형8
저자
Jitesh Dugar
@jiteshdugarAI Automation Specialist - OpenAI, CRM & Automation Expert with a solid understanding of various tools that include Zapier, Make, Zoho CRM, Hubspot, Google Sheets, Airtable, Pipedrive, Google Analytics, and more.
외부 링크
n8n.io에서 보기 →
이 워크플로우 공유