{"workflow":{"id":13546,"name":"Analyze support screenshots with UploadToURL, GPT-4o Vision, Zendesk, and Jira","views":18,"recentViews":0,"totalViews":18,"createdAt":"2026-02-20T12:45:16.827Z","description":"Eliminate the manual chaos of HR and legal document management. This workflow automates the transition from a raw document upload to a structured, audit-ready archive by combining **UploadToURL** for instant CDN hosting, **Google Drive** for long-term storage, and **Airtable** for status tracking and database management.\n\n## 🎯 What This Workflow Does\n\nTransforms loose document scans into a structured corporate filing system:\n\n1. **📝 Captures Legal Assets** - Receives signed contracts or IDs via mobile scan (binary) or remote URL.\n2. **🛡️ Duplicate Prevention** - Checks Airtable first to ensure a contract isn't already filed for that specific Employee ID.\n3. **☁️ Instant CDN Hosting** - **UploadToURL** hosts the document to provide a high-speed link for immediate HR review.\n4. **📁 Smart Folder Logic** - Automatically navigates or creates a structured Google Drive path: `HR/Contracts/{Year}/{Department}/{EmployeeName}/`.\n5. **🗃️ Database Synchronization** - Updates (or creates) an Airtable record to tick \"Contract Received,\" logging both the Drive URL and the CDN backup.\n6. **📧 Automated Confirmation** - Sends a professional HTML email to HR and the employee with access links and filing metadata.\n\n## ✨ Key Features\n\n- **UploadToURL Integration**: Provides a redundant, accessible CDN link stored alongside your primary Drive storage for total data reliability.\n- **Auto-Nomenclature**: Renames files using a strict audit-ready format: `{EmployeeID}_{LastName}_{Type}_{Date}.pdf`.\n- **Intelligent Folder Creation**: Never manually create a folder again; the workflow builds the entire hierarchy on the fly.\n- **Audit Trail Generation**: Captures \"Filed By,\" \"Filed At,\" and unique \"Upload IDs\" for every document.\n- **Conflict Handling**: Built-in `409 Conflict` logic prevents accidental overwrites or double-filing of critical legal papers.\n\n## 💼 Perfect For\n\n- **HR Teams**: Managing onboarding documents and employment contracts at scale.\n- **Legal Departments**: Archiving NDAs, vendor agreements, and compliance certifications.\n- **Small Businesses**: Moving away from \"loose files in folders\" to a searchable, automated database.\n- **Remote Teams**: Enabling employees to \"upload and forget\" their paperwork via a simple link.\n\n## 🔧 What You'll Need\n\n### Required Integrations\n- **[UploadToURL](https://uploadtourl.com)** - To host documents and provide public CDN backup links.\n- **n8n Community Node** - `n8n-nodes-uploadtourl` must be installed.\n- **Google Drive** - OAuth2 credentials for secure document storage.\n- **Airtable** - Personal Access Token to manage your employee/document database.\n- **Gmail / SMTP** - To send automated filing confirmations.\n\n### Configuration Variables\n- `GDRIVE_ROOT_FOLDER_ID`: The ID of your main HR folder in Google Drive.\n- `AIRTABLE_BASE_ID`: Your specific Airtable base for HR/Legal tracking.\n\n## 🚀 Quick Start\n\n1. **Import Template** - Copy the JSON and import it into your n8n workspace.\n2. **Install Node** - Ensure the **UploadToURL** community node is active.\n3. **Set Credentials** - Link your UploadToURL, Google Drive, Airtable, and Gmail accounts.\n4. **Define Variables** - Set your Root Folder ID and Airtable Base details in n8n variables.\n5. **Test the Pipeline** - Send a test `POST` with a sample PDF to the Webhook URL.\n6. **Activate** - Enable the workflow to begin hands-free archiving.\n\n## 🎨 Customization Options\n\n- **Expiration Alerts**: Add a node to calculate 1-year expiry dates and set an automated reminder in Slack.\n- **OCR Processing**: Integrate an OCR step to read the content of scans and verify names automatically.\n- **Watermarking**: Add a \"Confidential\" or \"Draft\" watermark to documents before they are uploaded to the CDN.\n- **Multi-Base Routing**: Route documents to different Airtable bases depending on the \"Department\" field.\n\n## 📈 Expected Results\n\n- **100% Consistency** in file naming and folder structures across the entire organization.\n- **Zero manual data entry**—employee records and checkboxes update automatically.\n- **Audit-ready in minutes**: Every file has a timestamped trail and redundant storage links.\n- **Instant Accessibility**: HR can view documents via the CDN link before Drive permissions even propagate.\n\n## 🏆 Use Cases\n\n### High-Growth Onboarding\nA startup hiring 20 people a month can automate all contract filings, ensuring the \"Contract Received\" flag is always accurate for payroll.\n\n### Compliance Audits\nWhen auditors ask for specific contracts, use the Airtable \"Structured Filename\" column to find and share the relevant Drive or CDN links in seconds.\n\n### Field Service Scans\nTechnicians in the field can upload signed site reports via a mobile app; the workflow handles the filing and notifies the office immediately.\n\n## 💡 Pro Tips\n\n- **Folder IDs**: You can find your `GDRIVE_ROOT_FOLDER_ID` by looking at the last string in the URL when you are inside that folder in your browser.\n- **Structured JSON**: Use the returned `auditTrail` object to build a log of all uploads in a separate \"Master Audit\" spreadsheet.\n- **Employee IDs**: If no ID is provided, the workflow generates a temporary one using a timestamp to ensure the archive never breaks.\n\n---\n\n**Ready to secure your document pipeline?** Import this template and connect **UploadToURL** to build a world-class archiving system in under 20 minutes.\n\n**Need help with Airtable field mapping?** The workflow includes detailed sticky notes explaining the exact field names required for the automation to run.","workflow":{"meta":{"instanceId":"277842713620d9f5554de3b1518b865a152c8c4db680008bd8aec536fc18b4a8"},"nodes":[{"id":"213a081f-853e-4f1a-a72c-cef27817a89b","name":"📋 Overview","type":"n8n-nodes-base.stickyNote","position":[-80,-272],"parameters":{"width":650,"height":488,"content":"Analyze support screenshots with UploadToURL, OpenAI Vision, and Zendesk/Jira\nThe Problem: Large image attachments clog support inboxes and often reach developers without technical context, leading to slow resolution times.\nThe Solution: A support-to-dev pipeline that hosts visual proof via UploadToURL, uses AI Vision to transcribe errors, and syncs the data to Zendesk or Jira.\n\n⚙️ How it Works\nWebhook: Receives a screenshot/video (Binary or URL) and Ticket ID.\n\nUploadToURL: Hosts the file instantly and returns a public CDN link.\n\nGPT-4o Vision: Analyzes the image to identify error messages and UI states.\n\nTicket Update: Attaches the link and AI analysis to the relevant Zendesk or Jira ticket.\n\n🔐 Credentials & Setup\nNode: Install n8n-nodes-uploadtourl via Community Nodes.\n\nAPIs: UploadToURL, OpenAI (Vision), and Zendesk/Jira.\n\nVariables: Set ZENDESK_SUBDOMAIN or JIRA_BASE_URL."},"typeVersion":1},{"id":"6591ef98-d557-430e-9c61-e5ee20217487","name":"Entry & Upload","type":"n8n-nodes-base.stickyNote","position":[704,-128],"parameters":{"color":7,"width":984,"height":727,"content":"## 🚪 Entry, Validation & Upload\n**Nodes:** Webhook → Validate & Enrich → Has Remote URL? → Upload to URL (×2) → Extract CDN URL\n\n- Accepts `POST` with screenshot/video + ticket metadata. Supports both `fileUrl` (remote) and binary multipart upload\n- Validates ticket ID format per platform (Zendesk: numeric, Jira: `PROJECT-123` pattern), sanitises all string inputs\n- Detects file type from extension — allowlist: `png`, `jpg`, `jpeg`, `gif`, `webp`, `mp4`, `mov`; rejects all others with `400`\n- Native **Upload to URL** node handles both paths — no custom HTTP node needed\n- `Extract CDN URL` normalises the response shape and force-upgrades to HTTPS"},"typeVersion":1},{"id":"f74f9f4a-bf0f-4c8d-ace7-e0ad44cd3cdb","name":"AI Vision Analysis","type":"n8n-nodes-base.stickyNote","position":[1712,-96],"parameters":{"color":7,"width":456,"height":551,"content":"## 🤖 GPT-4o Vision Analysis\n**Nodes:** GPT-4o Vision → Parse AI Analysis → Determine Severity\n\n- Sends the hosted CDN image URL directly to GPT-4o Vision — no base64 encoding, no file passing\n- Prompt instructs the model to return structured JSON: `errorSummary`, `visibleErrorMessage`, `affectedComponent`, `browserOrOS`, `reproducibilityHint`, `developerNotes`, `suggestedPriority`, `detectedKeywords[]`, and `confidenceScore`\n- `Parse AI Analysis` validates JSON, falls back gracefully if vision confidence is low\n- `Determine Severity` maps AI keywords (`crash`, `500`, `null`, `payment`, `data loss`) to `critical | high | medium | low` — overrides AI suggestion if hard keywords are detected"},"typeVersion":1},{"id":"2dc97cc4-91d7-4af2-8f00-e0cc03aef66c","name":"Platform Routing","type":"n8n-nodes-base.stickyNote","position":[2192,-128],"parameters":{"color":7,"width":840,"height":695,"content":"## 🎫 Platform Routing — Zendesk & Jira\n**Nodes:** Route by Platform → Zendesk Add Comment → Jira Add Comment → Jira Attach File\n\n- Switch node routes on `platform` field (`zendesk` or `jira`) — add more outputs for Linear, GitHub Issues, Freshdesk, etc.\n- **Zendesk:** Posts a rich internal note with inline image embed (`![screenshot](url)`), full AI analysis table, severity badge, and a collapsible developer notes section. Also updates ticket tags with `visual-proof` and the severity label\n- **Jira:** Adds a formatted comment in Jira wiki markup with the CDN image URL, AI breakdown, and affected component. A second API call attaches the raw file to the issue for download"},"typeVersion":1},{"id":"e65a544e-9cc2-4938-b420-8f28a7cd5e70","name":"Escalation & Response","type":"n8n-nodes-base.stickyNote","position":[3072,-128],"parameters":{"color":7,"width":680,"height":744,"content":"## 📣 Severity Escalation & Response\n**Nodes:** IF Critical/High? → Slack Alert → Build Final Response → Respond to Webhook\n\n- IF node checks severity — only `critical` and `high` tickets trigger the Slack alert\n- Slack message includes: ticket ID, customer name, product area, AI error summary, severity badge, CDN image link, and a direct link to the ticket\n- `Build Final Response` assembles the full enriched summary: ticket URL, CDN URL, AI analysis, severity, detected keywords, and agent metadata\n- Returns `200 OK` with the complete ticket enrichment record — ready to log or forward to a dashboard"},"typeVersion":1},{"id":"4e572be6-268a-483e-990d-99f91d7afb1b","name":"Webhook - Receive Screenshot","type":"n8n-nodes-base.webhook","position":[704,272],"webhookId":"d25fa786-d4c4-4942-956d-3912f22a2977","parameters":{"path":"visual-proof-ticket","options":{"allowedOrigins":"*"},"httpMethod":"POST","responseMode":"responseNode"},"typeVersion":2},{"id":"be6cd236-30b0-4564-84e0-a294a9da87fe","name":"Validate & Enrich Payload","type":"n8n-nodes-base.code","position":[928,272],"parameters":{"jsCode":"const body = $input.first().json.body || $input.first().json;\n\n// ── Platform validation ───────────────────────────────────────\nconst allowedPlatforms = ['zendesk', 'jira'];\nconst platform = (body.platform || 'zendesk').toLowerCase();\nif (!allowedPlatforms.includes(platform)) {\n  throw new Error(`Invalid platform \"${platform}\". Must be: zendesk | jira`);\n}\n\n// ── File source check ─────────────────────────────────────────\nif (!body.fileUrl && !body.filename) {\n  throw new Error('Provide either fileUrl (remote screenshot) or filename (for binary upload).');\n}\n\n// ── Ticket ID validation per platform ────────────────────────\nconst rawTicketId = String(body.ticketId || '').trim();\nif (!rawTicketId) throw new Error('ticketId is required.');\n\nlet ticketId = rawTicketId;\nif (platform === 'zendesk') {\n  if (!/^\\d+$/.test(rawTicketId.replace(/^ZD-/i, ''))) {\n    throw new Error('Zendesk ticket ID must be numeric (e.g. 10482 or ZD-10482).');\n  }\n  ticketId = rawTicketId.replace(/^ZD-/i, '');\n}\nif (platform === 'jira') {\n  if (!/^[A-Z]+-\\d+$/.test(rawTicketId.toUpperCase())) {\n    throw new Error('Jira issue key must match pattern PROJECT-123 (e.g. SUP-482).');\n  }\n  ticketId = rawTicketId.toUpperCase();\n}\n\n// ── Filename & extension allowlist ───────────────────────────\nconst filename = body.filename || body.fileUrl?.split('?')[0].split('/').pop() || 'screenshot.png';\nconst ext = filename.split('.').pop()?.toLowerCase() || 'png';\nconst allowedExts = ['png', 'jpg', 'jpeg', 'gif', 'webp', 'mp4', 'mov'];\nif (!allowedExts.includes(ext)) {\n  throw new Error(`File type .${ext} not allowed. Accepted: ${allowedExts.join(', ')}`);\n}\n\n// ── MIME map ──────────────────────────────────────────────────\nconst mimeMap = {\n  png: 'image/png', jpg: 'image/jpeg', jpeg: 'image/jpeg',\n  gif: 'image/gif', webp: 'image/webp',\n  mp4: 'video/mp4', mov: 'video/quicktime'\n};\nconst mimeType = mimeMap[ext] || 'application/octet-stream';\nconst isVideo = ['mp4', 'mov'].includes(ext);\n\n// ── Sanitise string fields ────────────────────────────────────\nconst sanitise = (s) => String(s || '').trim().slice(0, 500);\n\n// ── Structured filename for attachment ───────────────────────\nconst ts = new Date().toISOString().split('T')[0];\nconst structuredFilename = `${ticketId}_screenshot_${ts}.${ext}`;\n\nreturn [{\n  json: {\n    // Source\n    fileUrl: body.fileUrl || null,\n    filename,\n    structuredFilename,\n    mimeType,\n    isVideo,\n    ext,\n    // Routing\n    platform,\n    ticketId,\n    // People\n    customerName: sanitise(body.customerName),\n    customerEmail: sanitise(body.customerEmail),\n    agentName: sanitise(body.agentName),\n    // Context\n    productArea: sanitise(body.productArea) || 'Unknown',\n    userDescription: sanitise(body.description),\n    // Config\n    notifyDev: body.notifyDev !== false,\n    submittedAt: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"2dc42ca7-3eb9-41ca-bcad-bf0f89fadb66","name":"Has Remote URL?","type":"n8n-nodes-base.if","position":[1152,272],"parameters":{"options":{},"conditions":{"options":{"caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"cond-fileurl","operator":{"type":"string","operation":"notEmpty"},"leftValue":"={{ $json.fileUrl }}","rightValue":""}]}},"typeVersion":2},{"id":"dcfa2c80-9351-4a88-b3e5-dbd43addbf1f","name":"Upload to URL - Remote","type":"n8n-nodes-uploadtourl.uploadToUrl","position":[1360,144],"parameters":{"operation":"uploadFile"},"credentials":{"uploadToUrlApi":{"id":"aTtpEWKPdBd8vRfH","name":"Upload to URL account 3"}},"typeVersion":1},{"id":"691eb389-788e-470c-8a69-2df6efb7bcf7","name":"Upload to URL - Binary","type":"n8n-nodes-uploadtourl.uploadToUrl","position":[1360,384],"parameters":{"operation":"uploadFile"},"credentials":{"uploadToUrlApi":{"id":"aTtpEWKPdBd8vRfH","name":"Upload to URL account 3"}},"typeVersion":1},{"id":"f4e80de1-dbdb-4eb8-8732-12dc81e6c3a5","name":"Extract CDN URL","type":"n8n-nodes-base.code","position":[1584,272],"parameters":{"jsCode":"const uploadResp = $input.first().json;\nconst meta = $('Validate & Enrich Payload').first().json;\n\nconst cdnUrl =\n  uploadResp.url ||\n  uploadResp.link ||\n  uploadResp.data?.url ||\n  uploadResp.file?.url ||\n  uploadResp.shortUrl;\n\nif (!cdnUrl) {\n  throw new Error('Upload to URL returned no public URL. Raw: ' + JSON.stringify(uploadResp).slice(0, 400));\n}\n\nreturn [{\n  json: {\n    ...meta,\n    cdnUrl: cdnUrl.replace(/^http:\\/\\//, 'https://'),\n    uploadId: uploadResp.id || uploadResp.data?.id || null,\n    fileSizeBytes: uploadResp.size || uploadResp.data?.size || null\n  }\n}];"},"typeVersion":2},{"id":"360a2173-f68d-441c-b7ed-cb7a0a031a32","name":"GPT-4o Vision - Analyse Screenshot","type":"@n8n/n8n-nodes-langchain.openAi","notes":"Passes the CDN URL to GPT-4o Vision. Returns structured error analysis: visible error message, affected component, browser/OS, developer notes, suggested priority, and keywords.","position":[1760,272],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"ft:gpt-3.5-turbo-0125:bar-juice::91x6k9Fc","cachedResultName":"FT:GPT-3.5-TURBO-0125:BAR-JUICE::91X6K9FC"},"options":{"maxTokens":1000,"temperature":0.3},"messages":{"values":[{"role":"system","content":"You are a senior software QA engineer and technical support specialist. Analyse the provided screenshot or screen recording URL and produce a structured developer-ready bug report. Return ONLY valid JSON — no markdown, no preamble."},{"content":"=Analyse this customer support screenshot.\n\nImage/Video URL: {{ $json.cdnUrl }}\nProduct Area: {{ $json.productArea }}\nCustomer Description: {{ $json.userDescription || 'No description provided' }}\nPlatform: {{ $json.platform }}\nTicket ID: {{ $json.ticketId }}\n\nReturn ONLY this JSON:\n{\n  \"errorSummary\": \"One-sentence plain English summary of what the customer is experiencing\",\n  \"visibleErrorMessage\": \"Exact error text visible in the screenshot, or null if none\",\n  \"errorCode\": \"HTTP status code or app error code if visible, or null\",\n  \"affectedComponent\": \"Specific UI component, page, or feature affected\",\n  \"affectedUrl\": \"URL visible in browser address bar if present, or null\",\n  \"browserOrOS\": \"Browser name/version or OS if identifiable from screenshot, or null\",\n  \"reproducibilityHint\": \"What state the UI appears to be in that might help reproduce the bug\",\n  \"developerNotes\": \"Technical observations: console errors visible, network state, loading indicators, broken elements\",\n  \"suggestedPriority\": \"critical|high|medium|low\",\n  \"detectedKeywords\": [\"array\", \"of\", \"technical\", \"keywords\", \"found\"],\n  \"suggestedLabels\": [\"frontend\", \"checkout\", \"etc\"],\n  \"isScreenRecording\": false,\n  \"confidenceScore\": 0.92\n}"}]}},"credentials":{"openAiApi":{"id":"8IkhtT3EbXygnvcr","name":"Mediajade"}},"typeVersion":1.5},{"id":"c962207d-40fd-4def-a363-a7bf6e9873fa","name":"Parse AI Analysis & Compute Severity","type":"n8n-nodes-base.code","position":[2032,272],"parameters":{"jsCode":"const aiRaw = $input.first().json;\nconst meta = $('Extract CDN URL').first().json;\n\n// ── Parse AI JSON ─────────────────────────────────────────────\nlet ai;\ntry {\n  const raw =\n    aiRaw.message?.content ||\n    aiRaw.choices?.[0]?.message?.content ||\n    aiRaw.content ||\n    aiRaw.text;\n  ai = typeof raw === 'string' ? JSON.parse(raw) : raw;\n} catch (e) {\n  throw new Error('Failed to parse GPT-4o Vision JSON: ' + e.message);\n}\n\n// ── Severity override logic ───────────────────────────────────\n// Hard keywords always escalate to critical regardless of AI suggestion\nconst criticalKeywords = ['crash', 'data loss', 'payment failed', 'stripe', 'checkout broken', '500', '503', 'null pointer', 'undefined', 'white screen', 'blank page'];\nconst highKeywords = ['404', 'timeout', 'login failed', 'auth', 'permission denied', 'infinite loop', 'spinner'];\n\nconst allText = [\n  ai.errorSummary || '',\n  ai.visibleErrorMessage || '',\n  ai.developerNotes || '',\n  ...(ai.detectedKeywords || [])\n].join(' ').toLowerCase();\n\nlet severity = ai.suggestedPriority || 'medium';\nif (criticalKeywords.some(kw => allText.includes(kw))) severity = 'critical';\nelse if (highKeywords.some(kw => allText.includes(kw)) && severity !== 'critical') severity = 'high';\n\n// ── Emoji badge for ticket comments ──────────────────────────\nconst severityBadge = { critical: '🔴 CRITICAL', high: '🟠 HIGH', medium: '🟡 MEDIUM', low: '🟢 LOW' };\n\nreturn [{\n  json: {\n    ...meta,\n    // AI analysis\n    errorSummary: ai.errorSummary || 'Unable to determine error from screenshot.',\n    visibleErrorMessage: ai.visibleErrorMessage || null,\n    errorCode: ai.errorCode || null,\n    affectedComponent: ai.affectedComponent || meta.productArea,\n    affectedUrl: ai.affectedUrl || null,\n    browserOrOS: ai.browserOrOS || null,\n    reproducibilityHint: ai.reproducibilityHint || null,\n    developerNotes: ai.developerNotes || null,\n    detectedKeywords: ai.detectedKeywords || [],\n    suggestedLabels: ai.suggestedLabels || [],\n    isScreenRecording: ai.isScreenRecording || false,\n    confidenceScore: ai.confidenceScore || null,\n    // Computed severity\n    severity,\n    severityBadge: severityBadge[severity],\n    // Ticket comment body (pre-built for both platforms)\n    richComment: `## 📸 Visual Proof Attached\\n\\n**${severityBadge[severity]}** | Ticket: ${meta.ticketId} | Product Area: ${meta.productArea}\\n\\n### 🔗 Screenshot\\n![Customer Screenshot](${meta.cdnUrl})\\n[Direct Link](${meta.cdnUrl})\\n\\n### 🤖 AI Error Analysis\\n| Field | Value |\\n|---|---|\\n| **Error Summary** | ${ai.errorSummary || 'N/A'} |\\n| **Visible Error** | \\`${ai.visibleErrorMessage || 'None detected'}\\` |\\n| **Error Code** | ${ai.errorCode || 'N/A'} |\\n| **Affected Component** | ${ai.affectedComponent || 'N/A'} |\\n| **Affected URL** | ${ai.affectedUrl || 'N/A'} |\\n| **Browser / OS** | ${ai.browserOrOS || 'Not identified'} |\\n\\n### 🛠 Developer Notes\\n${ai.developerNotes || 'No additional technical observations.'}\\n\\n### 🔁 Reproducibility\\n${ai.reproducibilityHint || 'Unknown — see screenshot for UI state.'}\\n\\n**Labels:** ${(ai.suggestedLabels || []).join(', ')} | **Keywords:** ${(ai.detectedKeywords || []).join(', ')}\\n**Filed by:** ${meta.agentName || 'Support System'} | **Customer:** ${meta.customerName} (${meta.customerEmail})`,\n    jiraComment: `h2. 📸 Visual Proof Attached\\n\\n*${severityBadge[severity]}* | Ticket: ${meta.ticketId}\\n\\n*Screenshot:* [View Image|${meta.cdnUrl}]\\n!${meta.cdnUrl}|thumbnail!\\n\\nh3. AI Error Analysis\\n||Field||Value||\\n|Error Summary|${ai.errorSummary || 'N/A'}|\\n|Visible Error|{{${ai.visibleErrorMessage || 'None'}}}|\\n|Error Code|${ai.errorCode || 'N/A'}|\\n|Affected Component|${ai.affectedComponent || 'N/A'}|\\n|Browser/OS|${ai.browserOrOS || 'N/A'}|\\n\\nh3. Developer Notes\\n${ai.developerNotes || 'No additional observations.'}\\n\\nh3. Reproducibility\\n${ai.reproducibilityHint || 'Unknown.'}\\n\\n*Filed by:* ${meta.agentName || 'Support System'} | *Customer:* ${meta.customerName}`\n  }\n}];"},"typeVersion":2},{"id":"f351e33b-f202-4a95-9914-a822c39f31cb","name":"Route by Platform","type":"n8n-nodes-base.switch","position":[2240,272],"parameters":{"rules":{"values":[{"outputKey":"Zendesk","conditions":{"options":{"caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.platform }}","rightValue":"zendesk"}]},"renameOutput":true},{"outputKey":"Jira","conditions":{"options":{"caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.platform }}","rightValue":"jira"}]},"renameOutput":true}]},"options":{"fallbackOutput":"extra"}},"typeVersion":3},{"id":"6d214aa5-6e58-40f2-9b88-32a7ff367aa2","name":"Zendesk - Add Internal Note","type":"n8n-nodes-base.zendesk","notes":"Posts a rich internal note with inline image embed, AI analysis table, developer notes, and reproducibility hints. Tags ticket with severity and visual-proof labels.","position":[2464,128],"parameters":{"id":"={{ $json.ticketId }}","operation":"update","updateFields":{"tags":"visual-proof,ai-analysed,{{ $json.severity }}"}},"typeVersion":1},{"id":"5cf40aa1-8d93-4afe-971a-0f4e2e253c2b","name":"Jira - Update Issue Labels","type":"n8n-nodes-base.jira","notes":"Updates Jira issue with AI-generated summary and labels before adding the comment.","position":[2464,304],"parameters":{"issueKey":"={{ $json.ticketId }}","operation":"update","updateFields":{"labels":"={{ [...$json.suggestedLabels, 'visual-proof', $json.severity].join(',') }}","summary":"={{ $json.errorSummary }}"}},"typeVersion":1},{"id":"33056cb7-c70b-40c3-803e-e559e46bb6ff","name":"Jira - Add Comment","type":"n8n-nodes-base.jira","notes":"Adds a Jira wiki-markup formatted comment with image thumbnail, AI analysis table, developer notes, and reproducibility hints.","position":[2688,304],"parameters":{"resource":"issueComment","operation":"create"},"typeVersion":1},{"id":"5e6b35e0-36a3-4c1e-8575-7b052141d34f","name":"Merge Platform Response","type":"n8n-nodes-base.code","position":[2912,240],"parameters":{"jsCode":"// Normalise response from both Zendesk and Jira branches\nconst platformResp = $input.first().json;\nconst data = $('Parse AI Analysis & Compute Severity').first().json;\n\nconst isZendesk = data.platform === 'zendesk';\n\n// Build ticket URL\nconst ticketUrl = isZendesk\n  ? `https://${$vars.ZENDESK_SUBDOMAIN || 'your-domain'}.zendesk.com/agent/tickets/${data.ticketId}`\n  : `${$vars.JIRA_BASE_URL || 'https://your-domain.atlassian.net'}/browse/${data.ticketId}`;\n\nreturn [{\n  json: {\n    ...data,\n    ticketUrl,\n    platformCommentId:\n      platformResp.comment?.id ||\n      platformResp.audit?.events?.[0]?.id ||\n      platformResp.id ||\n      null\n  }\n}];"},"typeVersion":2},{"id":"aa43cb6b-3c03-4db2-ae4d-fa32a14ca178","name":"IF Critical or High?","type":"n8n-nodes-base.if","position":[3120,240],"parameters":{"options":{},"conditions":{"options":{"caseSensitive":false,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"cond-severity","operator":{"type":"string","operation":"notEquals"},"leftValue":"={{ $json.severity }}","rightValue":"medium"},{"id":"cond-notify","operator":{"type":"boolean","operation":"true"},"leftValue":"={{ $json.notifyDev }}","rightValue":true}]}},"typeVersion":2},{"id":"ab65d1aa-8fc7-45c5-941d-cd056a3aff2d","name":"Slack - Escalate to Dev Channel","type":"n8n-nodes-base.slack","notes":"Only fires for critical and high severity tickets when notifyDev is true. Posts to the configured dev channel with full error context, CDN image link, and direct ticket URL.","position":[3344,128],"webhookId":"a663e398-cbe9-4ad3-a87d-88945ab75896","parameters":{"text":"={{ $json.severityBadge }} *New Visual Proof Ticket Escalated*\n\n*Ticket:* <{{ $json.ticketUrl }}|{{ $json.ticketId }}> | *Product Area:* {{ $json.productArea }}\n*Customer:* {{ $json.customerName }} ({{ $json.customerEmail }})\n*Agent:* {{ $json.agentName }}\n\n*Error Summary:* {{ $json.errorSummary }}\n*Visible Error:* `{{ $json.visibleErrorMessage || 'None detected' }}`\n*Affected Component:* {{ $json.affectedComponent }}\n*Browser/OS:* {{ $json.browserOrOS || 'Unknown' }}\n\n:frame_with_picture: <{{ $json.cdnUrl }}|View Screenshot>\n:jira: <{{ $json.ticketUrl }}|Open Ticket>\n\n_Keywords: {{ $json.detectedKeywords.join(', ') }} | AI confidence: {{ Math.round(($json.confidenceScore || 0) * 100) }}%_","otherOptions":{},"authentication":"oAuth2"},"credentials":{"slackOAuth2Api":{"id":"RYkcspsGW073XNK0","name":"Mediajade Slack"}},"typeVersion":2.2},{"id":"9569c065-e78b-4dd7-bb55-62a4cc8d860c","name":"Build Final Response","type":"n8n-nodes-base.code","position":[3344,352],"parameters":{"jsCode":"const slackResp = $input.first();\nconst data = $('Merge Platform Response').first().json;\n\nreturn [{\n  json: {\n    success: true,\n    message: `Visual proof attached to ${data.platform} ticket ${data.ticketId} with severity ${data.severity}.`,\n    // Ticket\n    platform: data.platform,\n    ticketId: data.ticketId,\n    ticketUrl: data.ticketUrl,\n    platformCommentId: data.platformCommentId,\n    // Asset\n    cdnUrl: data.cdnUrl,\n    structuredFilename: data.structuredFilename,\n    fileSizeBytes: data.fileSizeBytes,\n    isScreenRecording: data.isScreenRecording,\n    // AI Analysis\n    severity: data.severity,\n    severityBadge: data.severityBadge,\n    errorSummary: data.errorSummary,\n    visibleErrorMessage: data.visibleErrorMessage,\n    errorCode: data.errorCode,\n    affectedComponent: data.affectedComponent,\n    affectedUrl: data.affectedUrl,\n    browserOrOS: data.browserOrOS,\n    developerNotes: data.developerNotes,\n    detectedKeywords: data.detectedKeywords,\n    suggestedLabels: data.suggestedLabels,\n    confidenceScore: data.confidenceScore,\n    // Meta\n    agentName: data.agentName,\n    customerName: data.customerName,\n    customerEmail: data.customerEmail,\n    devNotified: data.notifyDev && ['critical', 'high'].includes(data.severity),\n    submittedAt: data.submittedAt,\n    processedAt: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"cb02125b-2d56-4916-ad75-b85ed5b67a80","name":"Respond to Webhook","type":"n8n-nodes-base.respondToWebhook","position":[3568,352],"parameters":{"options":{"responseCode":200,"responseHeaders":{"entries":[{"name":"Content-Type","value":"application/json"}]}},"respondWith":"json","responseBody":"={{ $json }}"},"typeVersion":1.1}],"pinData":{},"connections":{"Extract CDN URL":{"main":[[{"node":"GPT-4o Vision - Analyse Screenshot","type":"main","index":0}]]},"Has Remote URL?":{"main":[[{"node":"Upload to URL - Remote","type":"main","index":0}],[{"node":"Upload to URL - Binary","type":"main","index":0}]]},"Route by Platform":{"main":[[{"node":"Zendesk - Add Internal Note","type":"main","index":0}],[{"node":"Jira - Update Issue Labels","type":"main","index":0}]]},"Jira - Add Comment":{"main":[[{"node":"Merge Platform Response","type":"main","index":0}]]},"Build Final Response":{"main":[[{"node":"Respond to Webhook","type":"main","index":0}]]},"IF Critical or High?":{"main":[[{"node":"Slack - Escalate to Dev Channel","type":"main","index":0}],[{"node":"Build Final Response","type":"main","index":0}]]},"Upload to URL - Binary":{"main":[[{"node":"Extract CDN URL","type":"main","index":0}]]},"Upload to URL - Remote":{"main":[[{"node":"Extract CDN URL","type":"main","index":0}]]},"Merge Platform Response":{"main":[[{"node":"IF Critical or High?","type":"main","index":0}]]},"Validate & Enrich Payload":{"main":[[{"node":"Has Remote URL?","type":"main","index":0}]]},"Jira - Update Issue Labels":{"main":[[{"node":"Jira - Add Comment","type":"main","index":0}]]},"Zendesk - Add Internal Note":{"main":[[{"node":"Merge Platform Response","type":"main","index":0}]]},"Webhook - Receive Screenshot":{"main":[[{"node":"Validate & Enrich Payload","type":"main","index":0}]]},"Slack - Escalate to Dev Channel":{"main":[[{"node":"Build Final Response","type":"main","index":0}]]},"GPT-4o Vision - Analyse Screenshot":{"main":[[{"node":"Parse AI Analysis & Compute Severity","type":"main","index":0}]]},"Parse AI Analysis & Compute Severity":{"main":[[{"node":"Route by Platform","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":22,"nodeTypes":{"n8n-nodes-base.if":{"count":2},"n8n-nodes-base.code":{"count":5},"n8n-nodes-base.jira":{"count":2},"n8n-nodes-base.slack":{"count":1},"n8n-nodes-base.switch":{"count":1},"n8n-nodes-base.webhook":{"count":1},"n8n-nodes-base.zendesk":{"count":1},"n8n-nodes-base.stickyNote":{"count":5},"@n8n/n8n-nodes-langchain.openAi":{"count":1},"n8n-nodes-base.respondToWebhook":{"count":1},"n8n-nodes-uploadtourl.uploadToUrl":{"count":2}}},"status":"published","readyToDemo":null,"user":{"name":"Jitesh Dugar","username":"jiteshdugar","bio":"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.","verified":true,"links":["https://www.linkedin.com/in/jiteshdugar"],"avatar":"https://gravatar.com/avatar/edaa3abb99806b0586dced559d0a5417f24a507e7c4464a63960f0638a4b1b90?r=pg&d=retro&size=200"},"nodes":[{"id":20,"icon":"fa:map-signs","name":"n8n-nodes-base.if","codex":{"data":{"alias":["Router","Filter","Condition","Logic","Boolean","Branch"],"details":"The IF node can be used to implement binary conditional logic in your workflow. You can set up one-to-many conditions to evaluate each item of data being inputted into the node. That data will either evaluate to TRUE or FALSE and route out of the node accordingly.\n\nThis node has multiple types of conditions: Bool, String, Number, and Date & Time.","resources":{"generic":[{"url":"https://n8n.io/blog/learn-to-automate-your-factorys-incident-reporting-a-step-by-step-guide/","icon":"🏭","label":"Learn to Automate Your Factory's Incident Reporting: A Step by Step Guide"},{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/","icon":"🧬","label":"Why business process automation with n8n can change your daily life"},{"url":"https://n8n.io/blog/create-a-toxic-language-detector-for-telegram/","icon":"🤬","label":"Create a toxic language detector for Telegram in 4 step"},{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/automate-google-apps-for-productivity/","icon":"💡","label":"15 Google apps you can combine and automate to increase productivity"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"},{"url":"https://n8n.io/blog/how-uproc-scraped-a-multi-page-website-with-a-low-code-workflow/","icon":" 🕸️","label":"How uProc scraped a multi-page website with a low-code workflow"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/","icon":"🙌","label":"Sending Automated Congratulations with Google Sheets, Twilio, and n8n "},{"url":"https://n8n.io/blog/how-to-set-up-a-ci-cd-pipeline-with-no-code/","icon":"🎡","label":"How to set up a no-code CI/CD pipeline with GitHub and TravisCI"},{"url":"https://n8n.io/blog/benefits-of-automation-and-n8n-an-interview-with-hubspots-hugh-durkin/","icon":"🎖","label":"Benefits of automation and n8n: An interview with HubSpot's Hugh Durkin"},{"url":"https://n8n.io/blog/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.if/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"If","color":"#408000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"If","typeVersion":2,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":40,"icon":"file:slack.svg","name":"n8n-nodes-base.slack","codex":{"data":{"alias":["human","form","wait","hitl","approval"],"resources":{"generic":[{"url":"https://n8n.io/blog/no-code-ecommerce-workflow-automations/","icon":"store","label":"6 e-commerce workflows to power up your Shopify s"},{"url":"https://n8n.io/blog/automate-your-data-processing-pipeline-in-9-steps-with-n8n/","icon":"⚙️","label":"Automate your data processing pipeline in 9 steps"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, and n8n"},{"url":"https://n8n.io/blog/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/slack/"}]},"categories":["Communication","HITL"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"HITL":["Human in the Loop"]}}},"group":"[\"output\"]","defaults":{"name":"Slack"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgMTUwLjg1MiAxNTAuODUyIj48dXNlIHhsaW5rOmhyZWY9IiNhIiB4PSIuOTI2IiB5PSIuOTI2Ii8+PHN5bWJvbCBpZD0iYSIgb3ZlcmZsb3c9InZpc2libGUiPjxnIHN0cm9rZS13aWR0aD0iMS44NTIiPjxwYXRoIGZpbGw9IiNlMDFlNWEiIHN0cm9rZT0iI2UwMWU1YSIgZD0iTTQwLjc0MSA5My41NWMwLTguNzM1IDYuNjA3LTE1Ljc3MiAxNC44MTUtMTUuNzcyczE0LjgxNSA3LjAzNyAxNC44MTUgMTUuNzcydjM4LjgyNGMwIDguNzM3LTYuNjA3IDE1Ljc3NC0xNC44MTUgMTUuNzc0cy0xNC44MTUtNy4wMzctMTQuODE1LTE1Ljc3MnoiLz48cGF0aCBmaWxsPSIjZWNiMjJkIiBzdHJva2U9IiNlY2IyMmQiIGQ9Ik05My41NSAxMDcuNDA4Yy04LjczNSAwLTE1Ljc3Mi02LjYwNy0xNS43NzItMTQuODE1czcuMDM3LTE0LjgxNSAxNS43NzItMTQuODE1aDM4LjgyNmM4LjczNSAwIDE1Ljc3MiA2LjYwNyAxNS43NzIgMTQuODE1cy03LjAzNyAxNC44MTUtMTUuNzcyIDE0LjgxNXoiLz48cGF0aCBmaWxsPSIjMmZiNjdjIiBzdHJva2U9IiMyZmI2N2MiIGQ9Ik03Ny43NzggMTUuNzcyQzc3Ljc3OCA3LjAzNyA4NC4zODUgMCA5Mi41OTMgMHMxNC44MTUgNy4wMzcgMTQuODE1IDE1Ljc3MnYzOC44MjZjMCA4LjczNS02LjYwNyAxNS43NzItMTQuODE1IDE1Ljc3MnMtMTQuODE1LTcuMDM3LTE0LjgxNS0xNS43NzJ6Ii8+PHBhdGggZmlsbD0iIzM2YzVmMSIgc3Ryb2tlPSIjMzZjNWYxIiBkPSJNMTUuNzcyIDcwLjM3MUM3LjAzNyA3MC4zNzEgMCA2My43NjMgMCA1NS41NTZzNy4wMzctMTQuODE1IDE1Ljc3Mi0xNC44MTVoMzguODI2YzguNzM1IDAgMTUuNzcyIDYuNjA3IDE1Ljc3MiAxNC44MTVzLTcuMDM3IDE0LjgxNS0xNS43NzIgMTQuODE1eiIvPjxnIHN0cm9rZS1saW5lam9pbj0ibWl0ZXIiPjxwYXRoIGZpbGw9IiNlY2IyMmQiIHN0cm9rZT0iI2VjYjIyZCIgZD0iTTc3Ljc3OCAxMzMuMzMzYzAgOC4yMDggNi42MDcgMTQuODE1IDE0LjgxNSAxNC44MTVzMTQuODE1LTYuNjA3IDE0LjgxNS0xNC44MTUtNi42MDctMTQuODE1LTE0LjgxNS0xNC44MTVINzcuNzc4eiIvPjxwYXRoIGZpbGw9IiMyZmI2N2MiIHN0cm9rZT0iIzJmYjY3YyIgZD0iTTEzMy4zMzQgNzAuMzcxaC0xNC44MTVWNTUuNTU2YzAtOC4yMDcgNi42MDctMTQuODE1IDE0LjgxNS0xNC44MTVzMTQuODE1IDYuNjA3IDE0LjgxNSAxNC44MTUtNi42MDcgMTQuODE1LTE0LjgxNSAxNC44MTV6Ii8+PHBhdGggZmlsbD0iI2UwMWU1YSIgc3Ryb2tlPSIjZTAxZTVhIiBkPSJNMTQuODE1IDc3Ljc3OEgyOS42M3YxNC44MTVjMCA4LjIwNy02LjYwNyAxNC44MTUtMTQuODE1IDE0LjgxNVMwIDEwMC44IDAgOTIuNTkzczYuNjA3LTE0LjgxNSAxNC44MTUtMTQuODE1eiIvPjxwYXRoIGZpbGw9IiMzNmM1ZjEiIHN0cm9rZT0iIzM2YzVmMSIgZD0iTTcwLjM3MSAxNC44MTVWMjkuNjNINTUuNTU2Yy04LjIwNyAwLTE0LjgxNS02LjYwNy0xNC44MTUtMTQuODE1UzQ3LjM0OCAwIDU1LjU1NiAwczE0LjgxNSA2LjYwNyAxNC44MTUgMTQuODE1eiIvPjwvZz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Slack","typeVersion":2,"nodeCategories":[{"id":6,"name":"Communication"},{"id":28,"name":"HITL"}]},{"id":47,"icon":"file:webhook.svg","name":"n8n-nodes-base.webhook","codex":{"data":{"alias":["HTTP","API","Build","WH"],"resources":{"generic":[{"url":"https://n8n.io/blog/learn-how-to-automatically-cross-post-your-content-with-n8n/","icon":"✍️","label":"Learn how to automatically cross-post your content with n8n"},{"url":"https://n8n.io/blog/running-n8n-on-ships-an-interview-with-maranics/","icon":"🛳","label":"Running n8n on ships: An interview with Maranics"},{"url":"https://n8n.io/blog/how-to-build-a-low-code-self-hosted-url-shortener/","icon":"🔗","label":"How to build a low-code, self-hosted URL shortener in 3 steps"},{"url":"https://n8n.io/blog/what-are-apis-how-to-use-them-with-no-code/","icon":" 🪢","label":"What are APIs and how to use them with no code"},{"url":"https://n8n.io/blog/5-tasks-you-can-automate-with-notion-api/","icon":"⚡️","label":"5 tasks you can automate with the new Notion API "},{"url":"https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/","icon":"💻","label":"How a digital strategist uses n8n for online marketing"},{"url":"https://n8n.io/blog/the-ultimate-guide-to-automate-your-video-collaboration-with-whereby-mattermost-and-n8n/","icon":"📹","label":"The ultimate guide to automate your video collaboration with Whereby, Mattermost, and n8n"},{"url":"https://n8n.io/blog/how-to-automatically-give-kudos-to-contributors-with-github-slack-and-n8n/","icon":"👏","label":"How to automatically give kudos to contributors with GitHub, Slack, and n8n"},{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/","icon":"🧠","label":"Why this Product Manager loves workflow automation with n8n"},{"url":"https://n8n.io/blog/creating-custom-incident-response-workflows-with-n8n/","label":"How to automate every step of an incident response workflow"},{"url":"https://n8n.io/blog/learn-to-build-powerful-api-endpoints-using-webhooks/","icon":"🧰","label":"Learn to Build Powerful API Endpoints Using Webhooks"},{"url":"https://n8n.io/blog/learn-how-to-use-webhooks-with-mattermost-slash-commands/","icon":"🦄","label":"Learn how to use webhooks with Mattermost slash commands"},{"url":"https://n8n.io/blog/how-goomer-automated-their-operations-with-over-200-n8n-workflows/","icon":"🛵","label":"How Goomer automated their operations with over 200 n8n workflows"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.webhook/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"trigger\"]","defaults":{"name":"Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Webhook","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":77,"icon":"file:jira.svg","name":"n8n-nodes-base.jira","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/5-workflow-automations-for-mattermost-that-we-love-at-n8n/","icon":"🤖","label":"5 workflow automations for Mattermost that we love at n8n"},{"url":"https://n8n.io/blog/creating-custom-incident-response-workflows-with-n8n/","label":"How to automate every step of an incident response workflow"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.jira/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/jira/"}]},"categories":["Development","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"output\"]","defaults":{"name":"Jira Software"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgNjguMjUgNzEuMjUiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9IjMuMTI1IiB5PSIzLjEyNSIvPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYiIgeDE9IjkxLjklIiB4Mj0iMjguNDklIiB5MT0iNDAuMjIlIiB5Mj0iODEuNjMlIj48c3RvcCBvZmZzZXQ9IjE4JSIgc3RvcC1jb2xvcj0iIzAwNTJjYyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzI2ODRmZiIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJjIiB4MT0iOC43JSIgeDI9IjcyLjI2JSIgeTE9IjU5LjE3JSIgeTI9IjE3Ljk5JSI+PHN0b3Agb2Zmc2V0PSIxOCUiIHN0b3AtY29sb3I9IiMwMDUyY2MiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMyNjg0ZmYiLz48L2xpbmVhckdyYWRpZW50PjwvZGVmcz48c3ltYm9sIGlkPSJhIiBvdmVyZmxvdz0idmlzaWJsZSI+PGcgZmlsbC1ydWxlPSJub256ZXJvIiBzdHJva2U9Im5vbmUiPjxwYXRoIGZpbGw9IiMyNjg0ZmYiIGQ9Ik02MS4xNjEgMzAuMjExIDMwLjk1IDAgLjc0IDMwLjIxMWEyLjU0IDIuNTQgMCAwIDAgMCAzLjU4MWwzMC4yMTEgMzAuMjEgMzAuMjExLTMwLjIxYTIuNTQgMi41NCAwIDAgMCAwLTMuNTgxek0zMC45NSA0MS40NmwtOS40NjItOS40NjIgOS40NjItOS40NjIgOS40NjIgOS40NjJ6Ii8+PHBhdGggZmlsbD0idXJsKCNiKSIgZD0iTTMwLjk1IDIyLjU5OUMyNC43NTUgMTYuNDA1IDI0LjcyNCA2LjM3IDMwLjg4MS4xMzhMMTAuMTE0IDIwLjc3NGwxMS4yNjggMTEuMjY4eiIvPjxwYXRoIGZpbGw9InVybCgjYykiIGQ9Ik00MC40MzcgMzEuOTczIDMwLjk1IDQxLjQ2YTE1LjkzIDE1LjkzIDAgMCAxIDAgMjIuNTM2bDIwLjc0OS0yMC43NDl6Ii8+PC9nPjwvc3ltYm9sPjwvc3ZnPg=="},"displayName":"Jira Software","typeVersion":1,"nodeCategories":[{"id":4,"name":"Productivity"},{"id":5,"name":"Development"}]},{"id":112,"icon":"fa:map-signs","name":"n8n-nodes-base.switch","codex":{"data":{"alias":["Router","If","Path","Filter","Condition","Logic","Branch","Case"],"resources":{"generic":[{"url":"https://n8n.io/blog/2021-the-year-to-automate-the-new-you-with-n8n/","icon":"☀️","label":"2021: The Year to Automate the New You with n8n"},{"url":"https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/","icon":"👥","label":"How to get started with CRM automation (with 3 no-code workflow ideas"},{"url":"https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/","icon":"👦","label":"Build your own virtual assistant with n8n: A step by step guide"},{"url":"https://n8n.io/blog/automation-for-maintainers-of-open-source-projects/","icon":"🏷️","label":"How to automatically manage contributions to open-source projects"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.switch/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"transform\"]","defaults":{"name":"Switch","color":"#506000"},"iconData":{"icon":"map-signs","type":"icon"},"displayName":"Switch","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":123,"icon":"file:zendesk.svg","name":"n8n-nodes-base.zendesk","codex":{"data":{"resources":{"generic":[{"url":"https://n8n.io/blog/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.zendesk/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/zendesk/"}]},"categories":["Communication"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"output\"]","defaults":{"name":"Zendesk"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCIgZmlsbD0ibm9uZSI+PHBhdGggZmlsbD0iI2ZmZiIgZD0iTTAgMjRDMCAxMC43NDUgMTAuNzQ1IDAgMjQgMHMyNCAxMC43NDUgMjQgMjQtMTAuNzQ1IDI0LTI0IDI0UzAgMzcuMjU1IDAgMjQiLz48cGF0aCBmaWxsPSIjMDMzNjNEIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNS40NDggMTguNjUzYzQuMDUgMCA3LjMzMi0zLjM3NSA3LjMzMi03LjUzOEg4LjExNmMwIDQuMTYzIDMuMjgzIDcuNTM4IDcuMzMyIDcuNTM4bTcuMzMyIDE3LjE5OVYxNy42NDhMOC4xMTYgMzUuODUyem0yLjQxNSAwYzAtNC4xNjQgMy4yODMtNy41NCA3LjMzMi03LjU0IDQuMDUgMCA3LjMzMiAzLjM3NiA3LjMzMiA3LjU0em0wLTI0LjczN3YxOC4yMDNMMzkuODYgMTEuMTE1eiIgY2xpcC1ydWxlPSJldmVub2RkIi8+PC9zdmc+"},"displayName":"Zendesk","typeVersion":1,"nodeCategories":[{"id":6,"name":"Communication"}]},{"id":535,"icon":"file:webhook.svg","name":"n8n-nodes-base.respondToWebhook","codex":{"data":{"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.respondtowebhook/"}]},"categories":["Core Nodes","Utility"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"transform\"]","defaults":{"name":"Respond to Webhook"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI0OCIgaGVpZ2h0PSI0OCI+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTM1IDM3Yy0yLjIgMC00LTEuOC00LTRzMS44LTQgNC00IDQgMS44IDQgNC0xLjggNC00IDQiLz48cGF0aCBmaWxsPSIjMzc0NzRmIiBkPSJNMzUgNDNjLTMgMC01LjktMS40LTcuOC0zLjdsMy4xLTIuNWMxLjEgMS40IDIuOSAyLjMgNC43IDIuMyAzLjMgMCA2LTIuNyA2LTZzLTIuNy02LTYtNmMtMSAwLTIgLjMtMi45LjdsLTEuNyAxTDIzLjMgMTZsMy41LTEuOSA1LjMgOS40YzEtLjMgMi0uNSAzLS41IDUuNSAwIDEwIDQuNSAxMCAxMFM0MC41IDQzIDM1IDQzIi8+PHBhdGggZmlsbD0iIzM3NDc0ZiIgZD0iTTE0IDQzQzguNSA0MyA0IDM4LjUgNCAzM2MwLTQuNiAzLjEtOC41IDcuNS05LjdsMSAzLjlDOS45IDI3LjkgOCAzMC4zIDggMzNjMCAzLjMgMi43IDYgNiA2czYtMi43IDYtNnYtMmgxNXY0SDIzLjhjLS45IDQuNi01IDgtOS44IDgiLz48cGF0aCBmaWxsPSIjZTkxZTYzIiBkPSJNMTQgMzdjLTIuMiAwLTQtMS44LTQtNHMxLjgtNCA0LTQgNCAxLjggNCA0LTEuOCA0LTQgNCIvPjxwYXRoIGZpbGw9IiMzNzQ3NGYiIGQ9Ik0yNSAxOWMtMi4yIDAtNC0xLjgtNC00czEuOC00IDQtNCA0IDEuOCA0IDQtMS44IDQtNCA0Ii8+PHBhdGggZmlsbD0iI2U5MWU2MyIgZD0ibTE1LjcgMzQtMy40LTIgNS45LTkuN2MtMi0xLjktMy4yLTQuNS0zLjItNy4zIDAtNS41IDQuNS0xMCAxMC0xMHMxMCA0LjUgMTAgMTBjMCAuOS0uMSAxLjctLjMgMi41bC0zLjktMWMuMS0uNS4yLTEgLjItMS41IDAtMy4zLTIuNy02LTYtNnMtNiAyLjctNiA2YzAgMi4xIDEuMSA0IDIuOSA1LjFsMS43IDF6Ii8+PC9zdmc+"},"displayName":"Respond to Webhook","typeVersion":2,"nodeCategories":[{"id":7,"name":"Utility"},{"id":9,"name":"Core Nodes"}]},{"id":565,"icon":"fa:sticky-note","name":"n8n-nodes-base.stickyNote","codex":{"data":{"alias":["Comments","Notes","Sticky"],"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"input\"]","defaults":{"name":"Sticky Note","color":"#FFD233"},"iconData":{"icon":"sticky-note","type":"icon"},"displayName":"Sticky Note","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":834,"icon":"file:code.svg","name":"n8n-nodes-base.code","codex":{"data":{"alias":["cpde","Javascript","JS","Python","Script","Custom Code","Function"],"details":"The Code node allows you to execute JavaScript in your workflow.","resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Code"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Code","typeVersion":2,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":1250,"icon":"file:openAi.svg","name":"@n8n/n8n-nodes-langchain.openAi","codex":{"data":{"alias":["LangChain","ChatGPT","Sora","DallE","whisper","audio","transcribe","tts","assistant"],"resources":{"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-langchain.openai/"}]},"categories":["AI","Langchain"],"subcategories":{"AI":["Agents","Miscellaneous","Root Nodes"]}}},"group":"[\"transform\"]","defaults":{"name":"OpenAI"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTM2Ljg2NzEgMTYuMzcxOEMzNy43NzQ2IDEzLjY0OCAzNy40NjIxIDEwLjY2NDIgMzYuMDEwOCA4LjE4NjYxQzMzLjgyODIgNC4zODY1MyAyOS40NDA3IDIuNDMxNDkgMjUuMTU1NiAzLjM1MTUxQzIzLjI0OTMgMS4yMDM5NiAyMC41MTA1IC0wLjAxNzMxNDggMTcuNjM5MiAwLjAwMDE4NTUzM0MxMy4yNTkxIC0wLjAwOTgxNDY4IDkuMzcyNzMgMi44MTAyNSA4LjAyNTIgNi45Nzc4M0M1LjIxMTM5IDcuNTU0MSAyLjc4MjU4IDkuMzE1MzggMS4zNjEzIDExLjgxMTdDLTAuODM3NDkzIDE1LjYwMTggLTAuMzM2MjMyIDIwLjM3OTQgMi42MDEzMyAyMy42Mjk0QzEuNjkzODEgMjYuMzUzMiAyLjAwNjMyIDI5LjMzNzEgMy40NTc2IDMxLjgxNDZDNS42NDAxNSAzNS42MTQ3IDEwLjAyNzcgMzcuNTY5NyAxNC4zMTI4IDM2LjY0OTdDMTYuMjE3OSAzOC43OTczIDE4Ljk1NzkgNDAuMDE4NSAyMS44MjkyIDM5Ljk5OThDMjYuMjExOCA0MC4wMTEgMzAuMDk5NCAzNy4xODg1IDMxLjQ0NjkgMzMuMDE3MUMzNC4yNjA4IDMyLjQ0MDkgMzYuNjg5NiAzMC42Nzk2IDM4LjExMDggMjguMTgzM0M0MC4zMDcxIDI0LjM5MzIgMzkuODA0NiAxOS42MTk0IDM2Ljg2ODMgMTYuMzY5M0wzNi44NjcxIDE2LjM3MThaTTIxLjgzMTcgMzcuMzg2QzIwLjA3OCAzNy4zODg1IDE4LjM3OTIgMzYuNzc0NyAxNy4wMzI5IDM1LjY1MDlDMTcuMDk0MSAzNS42MTg1IDE3LjIwMDQgMzUuNTU5NyAxNy4yNjkxIDM1LjUxNzJMMjUuMjM0MyAzMC45MTcxQzI1LjY0MTggMzAuNjg1OCAyNS44OTE4IDMwLjI1MjEgMjUuODg5MyAyOS43ODMzVjE4LjU1NDNMMjkuMjU1NiAyMC40OTgxQzI5LjI5MTkgMjAuNTE1NiAyOS4zMTU3IDIwLjU1MDYgMjkuMzIwNyAyMC41OTA2VjI5Ljg4OTZDMjkuMzE1NyAzNC4wMjQ3IDI1Ljk2NjggMzcuMzc3MiAyMS44MzE3IDM3LjM4NlpNNS43MjY0IDMwLjUwNzFDNC44NDc2MyAyOC45ODk2IDQuNTMxMzcgMjcuMjEwOCA0LjgzMjYzIDI1LjQ4NDVDNC44OTEzOCAyNS41MTk1IDQuOTk1MTMgMjUuNTgzMiA1LjA2ODg4IDI1LjYyNTdMMTMuMDM0MSAzMC4yMjU4QzEzLjQzNzggMzAuNDYyMSAxMy45Mzc4IDMwLjQ2MjEgMTQuMzQyOCAzMC4yMjU4TDI0LjA2NjggMjQuNjEwN1YyOC40OTgzQzI0LjA2OTMgMjguNTM4MyAyNC4wNTA1IDI4LjU3NyAyNC4wMTkzIDI4LjYwMkwxNS45Njc5IDMzLjI1MDlDMTIuMzgxNSAzNS4zMTU5IDcuODAxNDQgMzQuMDg4NCA1LjcyNzY1IDMwLjUwNzFINS43MjY0Wk0zLjYzMDEgMTMuMTIwNUM0LjUwNTEyIDExLjYwMDQgNS44ODY0IDEwLjQzNzkgNy41MzE0NCA5LjgzNDE1QzcuNTMxNDQgOS45MDI5IDcuNTI3NjkgMTAuMDI0MSA3LjUyNzY5IDEwLjEwOTJWMTkuMzEwNkM3LjUyNTE5IDE5Ljc3ODEgNy43NzUxOSAyMC4yMTE5IDguMTgxNDUgMjAuNDQzMUwxNy45MDU0IDI2LjA1N0wxNC41MzkxIDI4LjAwMDhDMTQuNTA1MyAyOC4wMjMzIDE0LjQ2MjggMjguMDI3IDE0LjQyNTMgMjguMDEwOEw2LjM3MjY2IDIzLjM1ODJDMi43OTM4MyAyMS4yODU2IDEuNTY2MzEgMTYuNzA2OCAzLjYyODg1IDEzLjEyMTdMMy42MzAxIDEzLjEyMDVaTTMxLjI4ODIgMTkuNTU2OUwyMS41NjQyIDEzLjk0MTdMMjQuOTMwNiAxMS45OTkyQzI0Ljk2NDMgMTEuOTc2NyAyNS4wMDY4IDExLjk3MjkgMjUuMDQ0MyAxMS45ODkyTDMzLjA5NyAxNi42MzhDMzYuNjgyMSAxOC43MDkzIDM3LjkxMDggMjMuMjk1NyAzNS44Mzk1IDI2Ljg4MDhDMzQuOTYzMyAyOC4zOTgzIDMzLjU4MzIgMjkuNTYwOCAzMS45Mzk1IDMwLjE2NThWMjAuNjg5NEMzMS45NDMyIDIwLjIyMTkgMzEuNjk0NSAxOS43ODk0IDMxLjI4OTQgMTkuNTU2OUgzMS4yODgyWk0zNC42MzgzIDE0LjUxNDJDMzQuNTc5NSAxNC40NzggMzQuNDc1OCAxNC40MTU1IDM0LjQwMiAxNC4zNzNMMjYuNDM2OCA5Ljc3Mjg5QzI2LjAzMzEgOS41MzY2NCAyNS41MzMxIDkuNTM2NjQgMjUuMTI4MSA5Ljc3Mjg5TDE1LjQwNDEgMTUuMzg4VjExLjUwMDRDMTUuNDAxNiAxMS40NjA0IDE1LjQyMDQgMTEuNDIxNyAxNS40NTE2IDExLjM5NjdMMjMuNTAzIDYuNzUxNThDMjcuMDg5NCA0LjY4Mjc5IDMxLjY3NDUgNS45MTQwNiAzMy43NDIgOS41MDE2NEMzNC42MTU4IDExLjAxNjcgMzQuOTMyIDEyLjc5MDUgMzQuNjM1OCAxNC41MTQySDM0LjYzODNaTTEzLjU3NDEgMjEuNDQzMUwxMC4yMDY1IDE5LjQ5OTRDMTAuMTcwMiAxOS40ODE5IDEwLjE0NjUgMTkuNDQ2OCAxMC4xNDE1IDE5LjQwNjhWMTAuMTA3OUMxMC4xNDQgNS45Njc4MSAxMy41MDI4IDIuNjEyNzQgMTcuNjQyOSAyLjYxNTI0QzE5LjM5NDIgMi42MTUyNCAyMS4wODkyIDMuMjMwMjUgMjIuNDM1NSA0LjM1MDI4QzIyLjM3NDMgNC4zODI3OCAyMi4yNjkzIDQuNDQxNTMgMjIuMTk5MiA0LjQ4NDAzTDE0LjIzNDEgOS4wODQxM0MxMy44MjY2IDkuMzE1MzggMTMuNTc2NiA5Ljc0Nzg5IDEzLjU3OTEgMTAuMjE2N0wxMy41NzQxIDIxLjQ0MDZWMjEuNDQzMVpNMTUuNDAyOSAxNy41MDA2TDE5LjczNDIgMTQuOTk5M0wyNC4wNjU1IDE3LjQ5OTNWMjIuNTAwN0wxOS43MzQyIDI1LjAwMDdMMTUuNDAyOSAyMi41MDA3VjE3LjUwMDZaIiBmaWxsPSJibGFjayIvPgo8L3N2Zz4K"},"displayName":"OpenAI","typeVersion":2,"nodeCategories":[{"id":25,"name":"AI"},{"id":26,"name":"Langchain"}]}],"categories":[{"id":41,"name":"Ticket Management"},{"id":49,"name":"AI Summarization"}],"image":[]}}