{"workflow":{"id":14256,"name":"Generate UGC product videos from Google Sheets with DALL·E, GPT-4 and Sora","views":38,"recentViews":1,"totalViews":38,"createdAt":"2026-03-23T04:32:36.515Z","description":"## This n8n template demonstrates how to fully automate the creation of UGC-style product videos using AI, starting from a simple Google Sheet.\n\nIt transforms product data into AI-generated images, cinematic video scripts, and final videos, then uploads everything to Google Drive and updates your sheet automatically. \n\n## 💡 Use cases\n- Generate UGC ads at scale for e-commerce products\n- Create TikTok / Reels content automatically\n- Build content pipelines for agencies or creators\n- Rapidly test different product angles, audiences, and messaging\n- Automate creative production from structured data (Google Sheets)\n\n\n## Good to know\n\n1. This workflow uses multiple AI services (image + video), so cost depends on usage:\n- Image generation (DALL·E)\n- Video generation (Sora)\n\n2. Video generation is asynchronous and may take several minutes per item\n3. Some AI models (like Sora) may be region-restricted or limited access\n4. Generated image URLs may expire, so storing them (as done here) is important\n\n## How it works\n1. Reads product data from Google Sheets and selects rows marked \"Pending\".\n2. Creates a prompt and generates a product image.\n3. Analyzes the image and turns it into a video script.\n4. Sends the script to Sora and waits until the video is ready.\n5. Uploads the video to Google Drive and updates the sheet.\n6. Logs errors and marks the row as \"Error\".\n\n## How to use\n\n1. Add products to Google Sheets with name, description, audience, and set status to \"Pending\".\n2. Run the workflow or let the schedule trigger process items automatically.\n3. The system generates image → script → video, uploads them, and updates your sheet.\n\n## Requirements\n\n1. Requires OpenAI, Google Sheets, and Google Drive accounts.\n2. Requires an n8n instance with credentials configured.\n\n\n## Customizing this workflow\n\n1. Replace the schedule trigger with a webhook or form for real-time use.\n2. Generate multiple videos per product.\n3. Send outputs to platforms like TikTok, Meta Ads, or CMS tools.\n4. Add voiceovers, captions, or permanent asset storage.\n\n\n","workflow":{"id":"SHYB21Rqgvpck1Tz","meta":{"instanceId":"f58e4f0a3282e3b40e4ce7f833a4918305cab32b8a229f343740990cecd4663c","templateCredsSetupCompleted":true},"name":"Automated UGC Video Generator from Google Sheets","tags":[{"id":"RWoirf4893qm4Odj","name":"Error Handler","createdAt":"2026-03-23T00:52:39.664Z","updatedAt":"2026-03-23T00:52:39.664Z"},{"id":"TxZURGobldQjD44j","name":"Video Generation","createdAt":"2026-03-23T00:52:24.378Z","updatedAt":"2026-03-23T00:52:24.378Z"},{"id":"Vi4cvKWoEWH4wp1M","name":"UGC","createdAt":"2026-03-23T00:52:24.404Z","updatedAt":"2026-03-23T00:52:24.404Z"},{"id":"hZxLr6tZp8JB3yH9","name":"AI Automation","createdAt":"2026-03-23T00:52:24.341Z","updatedAt":"2026-03-23T00:52:24.341Z"}],"nodes":[{"id":"15ba86f1-e3d3-46cd-a1d7-0005287509d6","name":"Error Trigger","type":"n8n-nodes-base.errorTrigger","position":[-2896,848],"parameters":{},"typeVersion":1},{"id":"c431d2a6-b0e7-4b21-81ef-b9ec1efe379a","name":"Parse Error Details","type":"n8n-nodes-base.code","position":[-2672,848],"parameters":{"jsCode":"// Extract error details and the row number from the failed execution\nconst errorData = $input.first().json;\n\n// The execution data contains the workflow data from when it failed\n// We need to find the sheetRowNumber that was being processed\nlet sheetRowNumber = null;\nlet productName = 'Unknown';\nlet errorMessage = 'Unknown error';\n\n// Extract error message\nif (errorData.execution?.error?.message) {\n  errorMessage = errorData.execution.error.message;\n} else if (errorData.execution?.lastNodeExecuted) {\n  errorMessage = `Failed at node: ${errorData.execution.lastNodeExecuted}`;\n}\n\n// Try to extract the row number from the execution data\n// Walk through the execution's result data to find sheetRowNumber\ntry {\n  const resultData = errorData.execution?.data?.resultData;\n  if (resultData?.runData) {\n    // Check nodes in reverse order to find the most recent data with sheetRowNumber\n    const nodeNames = Object.keys(resultData.runData);\n    for (const nodeName of nodeNames.reverse()) {\n      const nodeRuns = resultData.runData[nodeName];\n      if (nodeRuns && nodeRuns.length > 0) {\n        const lastRun = nodeRuns[nodeRuns.length - 1];\n        const outputData = lastRun?.data?.main?.[0];\n        if (outputData && outputData.length > 0) {\n          const jsonData = outputData[0]?.json;\n          if (jsonData?.sheetRowNumber) {\n            sheetRowNumber = jsonData.sheetRowNumber;\n            productName = jsonData.productName || productName;\n            break;\n          }\n        }\n      }\n    }\n  }\n} catch (e) {\n  // If we can't extract row data, we'll log what we can\n  errorMessage += ` (Could not determine sheet row: ${e.message})`;\n}\n\nreturn [{\n  json: {\n    sheetRowNumber: sheetRowNumber,\n    productName: productName,\n    errorMessage: errorMessage.substring(0, 500),\n    failedNode: errorData.execution?.lastNodeExecuted || 'Unknown',\n    executionId: errorData.execution?.id || 'Unknown',\n    timestamp: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"4746134f-3714-45e5-9cca-a5751b070dd8","name":"Row Number Known?","type":"n8n-nodes-base.if","position":[-2448,848],"parameters":{"options":{},"conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"check-row-exists","operator":{"name":"filter.operator.exists","type":"number","operation":"exists"},"leftValue":"={{ $json.sheetRowNumber }}","rightValue":""}]}},"typeVersion":2.2},{"id":"3b2456ed-3507-48a0-b4c5-b92d5f26e271","name":"Update Sheet — Error","type":"n8n-nodes-base.googleSheets","position":[-2224,752],"parameters":{"columns":{"value":{"Status":"Error","Error Message":"={{ $json.errorMessage + ' | Node: ' + $json.failedNode + ' | Execution: ' + $json.executionId }}"},"schema":[{"id":"Status","type":"string","display":true,"required":false,"displayName":"Status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Error Message","type":"string","display":true,"required":false,"displayName":"Error Message","defaultMatch":false,"canBeUsedToMatch":false}],"mappingMode":"defineBelow","matchingColumns":["row_number"]},"options":{"cellFormat":"USER_ENTERED"},"operation":"update","sheetName":{"__rl":true,"mode":"byName","value":"Products"},"documentId":{"__rl":true,"mode":"list","value":"1SaqB-z6WD5QDudhkZfcVmKpvu0-fteQcwE02_YK0ufs","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1SaqB-z6WD5QDudhkZfcVmKpvu0-fteQcwE02_YK0ufs/edit?usp=drivesdk","cachedResultName":"UGC Automation"}},"credentials":{"googleSheetsOAuth2Api":{"id":"2osqmyVpITuA9IWt","name":"Google Sheets account"}},"typeVersion":4.5},{"id":"35d1f8da-c092-4eab-aa3d-980767a288ef","name":"Log Error (Unknown Row)","type":"n8n-nodes-base.code","position":[-2224,944],"parameters":{"jsCode":"// Log the error for cases where we couldn't determine the row\nconst item = $input.first().json;\nconsole.warn('UGC Pipeline Error (unknown row):', JSON.stringify(item));\n\nreturn [{\n  json: {\n    logged: true,\n    ...item\n  }\n}];"},"typeVersion":2},{"id":"3f5dc41d-654e-4a6c-afe8-5bff56034a60","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-2944,624],"parameters":{"color":2,"width":920,"height":536,"content":"## ERROR HANDLER WORKFLOW\nThis workflow is triggered when the main UGC pipeline fails.\nIt extracts the error details and row number, then updates\nthe Google Sheet with Status = \"Error\" and the error message.\n\nSETUP: In the main workflow settings, set this workflow\nas the \"Error Workflow\"."},"typeVersion":1},{"id":"14d935a8-8970-4289-9a6b-79922ea48d7d","name":"Sticky Note — Complete1","type":"n8n-nodes-base.stickyNote","position":[-896,-80],"parameters":{"color":5,"width":1248,"height":492,"content":"## 5. GOOGLE DRIVE UPLOAD & SHEET UPDATE\nFetches the video binary from Sora API.\nUploads MP4 to Google Drive.\nSets file to public (anyone with link).\nBuilds shareable Drive URL.\nWrites Image URL + Video URL back to the\ncorrect row. Sets Status = \"Done\".\nLoops back for next pending product.\nOn error, the Error Handler workflow sets\nStatus = \"Error\" + error message."},"typeVersion":1},{"id":"91e74ed5-93b8-4060-b6b1-a55d20ed26d3","name":"Sticky Note — Sora Poll Loop1","type":"n8n-nodes-base.stickyNote","position":[-1840,-80],"parameters":{"width":916,"height":492,"content":"## 4b. SORA POLLING LOOP\nPolls GET /v1/videos/{videoId} every 30s. Check Sora Status merges poll response with\ncarried product data from Extract Sora Job ID.\n\nIF node checks isDone === true:\n  TRUE  -> Fetch video content + upload to Drive\n  FALSE -> Loop back to Wait 30 Seconds\nMax 40 polls = 20 minute timeout safety."},"typeVersion":1},{"id":"028d4623-9249-49b1-ab7d-a87d5effba36","name":"Sticky Note — Sora Async Polling1","type":"n8n-nodes-base.stickyNote","position":[-2464,-80],"parameters":{"width":592,"height":492,"content":"## 4. SORA VIDEO GENERATION (Async + Polling)\nWaits 60s for rate limiting, then POSTs to Sora API. Sora returns a queued job ID (not a video URL).\n\nExtracts the job ID, then enters a polling loop:\n  - Wait 30s between polls\n  - GET /v1/videos/{id} to check status\n  - If status != \"completed\", loop back to wait\n  - Max 40 polls (20 min timeout)\nOnce completed, fetches video content URL."},"typeVersion":1},{"id":"41f09387-5c2b-46be-91e7-905f9d99b17f","name":"Sticky Note — Vision & Script1","type":"n8n-nodes-base.stickyNote","position":[-3168,32],"parameters":{"color":3,"width":680,"height":376,"content":"## 3. VISION ANALYSIS & VIDEO SCRIPT\nGPT-4 Vision analyzes the generated image for mood, colors, composition. This enriches the video script with visual continuity. Script optimized for Sora's prompt format."},"typeVersion":1},{"id":"a858e198-91f1-459e-a02c-dafff58d809e","name":"Sticky Note — Image Gen1","type":"n8n-nodes-base.stickyNote","position":[-3824,32],"parameters":{"color":6,"width":632,"height":376,"content":"## 2. IMAGE GENERATION\n\nFor each pending product, a code node builds a detailed DALL·E 3 prompt with UGC aesthetic direction. The prompt is sent to the OpenAI API to generate an HD image, and the returned image URL is extracted for downstream use."},"typeVersion":1},{"id":"f3480891-ef64-4a0e-a223-980b307496e5","name":"Sticky Note — Trigger1","type":"n8n-nodes-base.stickyNote","position":[-4704,32],"parameters":{"color":4,"width":648,"height":328,"content":"## Stage 1 — Trigger & data fetch. \n\nA schedule trigger fires on a set interval. It reads all rows from a Google Sheets \"Products\" tab, then a code node filters down to only rows where Status = \"Pending\", tracking each row number for later updates."},"typeVersion":1},{"id":"b0db93d6-486b-4c91-8e65-357c07d58a32","name":"Loop Complete1","type":"n8n-nodes-base.noOp","position":[512,176],"parameters":{},"typeVersion":1},{"id":"4a816411-f497-4d10-90fd-bef7e15792bd","name":"Update Sheet — Done2","type":"n8n-nodes-base.googleSheets","position":[144,176],"parameters":{"columns":{"value":{"Status":"Done","Image URL":"={{ $json.imageUrl }}","Video URL":"={{ $json.videoUrl }}","row_number":"={{ $json.sheetRowNumber }}","Description":"={{ $json.description }}","Product Name":"={{ $json.productName }}","Target Audience":"={{ $json.targetAudience }}"},"schema":[{"id":"Product Name","type":"string","display":true,"removed":false,"required":false,"displayName":"Product Name","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Description","type":"string","display":true,"removed":false,"required":false,"displayName":"Description","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Target Audience","type":"string","display":true,"removed":false,"required":false,"displayName":"Target Audience","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Status","type":"string","display":true,"required":false,"displayName":"Status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Image URL","type":"string","display":true,"required":false,"displayName":"Image URL","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Video URL","type":"string","display":true,"required":false,"displayName":"Video URL","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Error","type":"string","display":true,"removed":false,"required":false,"displayName":"Error","defaultMatch":false,"canBeUsedToMatch":true},{"id":"row_number","type":"number","display":true,"removed":false,"readOnly":true,"required":false,"displayName":"row_number","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["row_number"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{"cellFormat":"USER_ENTERED"},"operation":"update","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1SaqB-z6WD5QDudhkZfcVmKpvu0-fteQcwE02_YK0ufs/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1SaqB-z6WD5QDudhkZfcVmKpvu0-fteQcwE02_YK0ufs","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1SaqB-z6WD5QDudhkZfcVmKpvu0-fteQcwE02_YK0ufs/edit?usp=drivesdk","cachedResultName":"UGC Automation"}},"credentials":{"googleSheetsOAuth2Api":{"id":"2osqmyVpITuA9IWt","name":"Google Sheets account"}},"typeVersion":4.5},{"id":"4b2ef789-11da-4f36-aeda-9c8fb0b03c3f","name":"Build Public Drive URL1","type":"n8n-nodes-base.code","position":[-176,176],"parameters":{"jsCode":"const driveFile = $('Upload Video to Google Drive1').first().json;\nconst carried = $('Check Sora Status1').first().json;\n\nconst fileId = driveFile.id;\n// Direct shareable link format\nconst videoUrl = `https://drive.google.com/file/d/${fileId}/view?usp=sharing`;\n\nreturn [{\n  json: {\n    productName: carried.productName,\n    description: carried.description,\n    targetAudience: carried.targetAudience,\n    sheetRowNumber: carried.sheetRowNumber,\n    imageUrl: carried.imageUrl,\n    videoUrl: videoUrl,\n    videoId: carried.videoId,\n    driveFileId: fileId\n  }\n}];"},"typeVersion":2},{"id":"1b8ed01a-0222-4890-a4f5-49a26f8cf35b","name":"Make File Public1","type":"n8n-nodes-base.httpRequest","position":[-400,176],"parameters":{"url":"=https://www.googleapis.com/drive/v3/files/{{ $json.id }}/permissions","method":"POST","options":{"timeout":30000},"jsonBody":"{\n  \"role\": \"reader\",\n  \"type\": \"anyone\"\n}","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"googleDriveOAuth2Api"},"credentials":{"googleDriveOAuth2Api":{"id":"P6qjX3NtTlT8K5qY","name":"Google Drive account"}},"typeVersion":4.2},{"id":"e6da9b30-d9bb-47e7-99a4-64899060732a","name":"Upload Video to Google Drive1","type":"n8n-nodes-base.googleDrive","position":[-624,176],"parameters":{"name":"={{ $('Check Sora Status1').first().json.productName || 'ugc-video' }}_{{ $('Check Sora Status1').first().json.videoId }}.mp4","driveId":{"__rl":true,"mode":"list","value":"My Drive","cachedResultUrl":"https://drive.google.com/drive/my-drive","cachedResultName":"My Drive"},"options":{},"folderId":{"__rl":true,"mode":"list","value":"140oet5FuceF8z56hI8u41JcJQbPuTtR7","cachedResultUrl":"https://drive.google.com/drive/folders/140oet5FuceF8z56hI8u41JcJQbPuTtR7","cachedResultName":"UGC Videos"}},"credentials":{"googleDriveOAuth2Api":{"id":"P6qjX3NtTlT8K5qY","name":"Google Drive account"}},"typeVersion":3},{"id":"53d8ace4-c965-48f2-97fd-755cdef262c1","name":"Fetch Sora Video Content1","type":"n8n-nodes-base.httpRequest","position":[-848,176],"parameters":{"url":"=https://api.openai.com/v1/videos/{{ $json.videoId }}/content","options":{"timeout":120000,"response":{"response":{"responseFormat":"file"}}},"authentication":"predefinedCredentialType","nodeCredentialType":"openAiApi"},"credentials":{"openAiApi":{"id":"oTBPZheNyhtHU7nY","name":"OpenAi account"}},"typeVersion":4.2},{"id":"b541ed0b-1437-4146-a64e-7cee7436a0a8","name":"Video Ready?1","type":"n8n-nodes-base.if","position":[-1072,176],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"sora-video-ready-condition","operator":{"name":"filter.operator.equals","type":"boolean","operation":"equals"},"leftValue":"={{ $json.isDone }}","rightValue":true}]}},"typeVersion":2.2},{"id":"77c8f941-9d0e-49d9-b54d-a57dcc83d712","name":"Check Sora Status1","type":"n8n-nodes-base.code","position":[-1296,112],"parameters":{"jsCode":"const raw = $input.first().json;\nconst response = Array.isArray(raw) ? raw[0] : raw;\n\n// Get carried data from the job ID node\nconst carried = $('Extract Sora Job ID1').first().json;\n\nconst status = response.status || '';\nconst progress = response.progress || 0;\nconst pollCount = (carried.pollCount || 0) + 1;\nconst maxPolls = 40; // 20 minutes max\n\nif (response.error) {\n  throw new Error('Sora video generation failed: ' + JSON.stringify(response.error));\n}\n\nif (pollCount >= maxPolls) {\n  throw new Error('Sora video generation timed out after ' + maxPolls + ' polls (20 minutes)');\n}\n\nreturn [{\n  json: {\n    productName: carried.productName,\n    description: carried.description,\n    targetAudience: carried.targetAudience,\n    sheetRowNumber: carried.sheetRowNumber,\n    imageUrl: carried.imageUrl,\n    videoId: carried.videoId,\n    videoStatus: status,\n    progress: progress,\n    pollCount: pollCount,\n    isDone: status === 'completed'\n  }\n}];"},"typeVersion":2},{"id":"4f0a27cf-59c0-4e20-9ddc-6494695133af","name":"Poll Sora Status1","type":"n8n-nodes-base.httpRequest","position":[-1520,112],"parameters":{"url":"=https://api.openai.com/v1/videos/{{ $json.videoId }}","options":{"timeout":30000},"authentication":"predefinedCredentialType","nodeCredentialType":"openAiApi"},"credentials":{"openAiApi":{"id":"oTBPZheNyhtHU7nY","name":"OpenAi account"}},"typeVersion":4.2},{"id":"7e2196bd-3f07-46eb-a2d5-58d9c2429712","name":"Wait 30 Seconds1","type":"n8n-nodes-base.wait","position":[-1744,176],"webhookId":"ugc-sora-poll-wait","parameters":{"amount":30},"typeVersion":1.1},{"id":"a264934c-b7d4-4b9f-aa12-c08c8ccd46d8","name":"Extract Sora Job ID1","type":"n8n-nodes-base.code","position":[-1968,176],"parameters":{"jsCode":"const raw = $input.first().json;\nconst prevData = $('Video Script Builder1').first().json;\nconst response = Array.isArray(raw) ? raw[0] : raw;\n\nif (!response || !response.id) {\n  throw new Error('Could not extract video job ID from Sora response: ' + JSON.stringify(raw).substring(0, 500));\n}\n\nreturn [{\n  json: {\n    productName: prevData.productName,\n    description: prevData.description,\n    targetAudience: prevData.targetAudience,\n    sheetRowNumber: prevData.sheetRowNumber,\n    imageUrl: prevData.imageUrl,\n    videoId: response.id,\n    videoStatus: response.status,\n    progress: response.progress || 0,\n    pollCount: 0\n  }\n}];"},"typeVersion":2},{"id":"5438f0c9-dd1c-4e1d-97c4-37fdb13446c1","name":"Sora Generate Video1","type":"n8n-nodes-base.httpRequest","position":[-2192,176],"parameters":{"url":"https://api.openai.com/v1/videos","method":"POST","options":{"timeout":300000},"jsonBody":"={{ JSON.stringify({\n  model: \"sora-2\",\n  prompt: $json.videoScript,\n  seconds: '8',\n  size: \"720x1280\"\n}) }}","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"openAiApi"},"credentials":{"openAiApi":{"id":"oTBPZheNyhtHU7nY","name":"OpenAi account"}},"typeVersion":4.2},{"id":"1b949498-28e8-4be0-b6d8-bc7af87fc8a2","name":"Wait for Sora Rate Limit1","type":"n8n-nodes-base.wait","position":[-2416,176],"webhookId":"ugc-sora-rate-limit-wait","parameters":{"amount":60},"typeVersion":1.1},{"id":"339acd53-88b0-412b-9d3f-e3df4415d62c","name":"Video Script Builder1","type":"n8n-nodes-base.code","position":[-2640,176],"parameters":{"jsCode":"// Build a structured UGC video script for OpenAI Sora\nconst item = $input.first().json;\n\nconst product = item.productName || 'this product';\nconst description = item.description || '';\nconst audience = item.targetAudience || 'young adults';\nconst vision = item.visionAnalysis || {};\n\nconst mood = vision.mood || 'warm and authentic';\nconst colors = (vision.dominantColors || ['warm tones']).join(', ');\nconst lighting = vision.lighting || 'natural lighting';\nconst setting = vision.settingDetails || 'casual everyday setting';\nconst emotion = vision.emotionalTone || 'relatable';\nconst cameraMovements = (vision.suggestedCameraMovements || ['slow zoom in']).join(', ');\n\n// Build a concise video prompt optimized for Sora\n// Sora works best with clear, descriptive scene prompts rather than screenplay-style scripts\nconst videoScript = [\n  `UGC-style smartphone video of ${audience} authentically using ${product} in ${setting}.`,\n  description ? `The product is ${description}.` : '',\n  `Visual style: ${mood} mood, ${colors} color palette, ${lighting}.`,\n  `Camera: ${cameraMovements}, handheld smartphone feel.`,\n  `The person picks up ${product} with genuine curiosity, uses it naturally, and reacts with authentic satisfaction.`,\n  `Emotional tone: ${emotion}, relatable, candid.`,\n  'Natural ambient lighting, shallow depth of field, no text overlays or logos.'\n].filter(Boolean).join(' ');\n\nreturn [{\n  json: {\n    ...item,\n    videoScript: videoScript\n  }\n}];"},"typeVersion":2},{"id":"718f66b9-df1d-4ffa-98c4-d8da3135e29c","name":"Parse Vision Analysis1","type":"n8n-nodes-base.code","position":[-2864,176],"parameters":{"jsCode":"// Parse GPT-4 Vision analysis and carry forward\nconst input = $input.first().json;\nconst prevData = $('Extract DALL-E URL1').first().json;\n\nconst content = input?.choices?.[0]?.message?.content || '{}';\n\nlet visionAnalysis;\ntry {\n  // Strip markdown code fences if present\n  const cleaned = content.replace(/```json\\n?/g, '').replace(/```\\n?/g, '').trim();\n  visionAnalysis = JSON.parse(cleaned);\n} catch (e) {\n  // If JSON parsing fails, use raw text\n  visionAnalysis = {\n    mood: 'warm and authentic',\n    dominantColors: ['warm tones'],\n    composition: content,\n    lighting: 'natural',\n    subjectExpression: 'genuine',\n    settingDetails: 'casual setting',\n    suggestedCameraMovements: ['slow zoom in', 'pan across product'],\n    emotionalTone: 'relatable'\n  };\n}\n\nreturn [{\n  json: {\n    ...prevData,\n    visionAnalysis: visionAnalysis\n  }\n}];"},"typeVersion":2},{"id":"76b6c96b-ec5d-4a19-92f9-4f2616353a45","name":"GPT-4 Vision Analysis1","type":"n8n-nodes-base.httpRequest","position":[-3088,176],"parameters":{"url":"https://api.openai.com/v1/chat/completions","method":"POST","options":{"timeout":60000},"jsonBody":"={{ JSON.stringify({\n  model: \"gpt-4o\",\n  messages: [\n    {\n      role: \"system\",\n      content: \"You are a visual analyst for UGC video production. Analyze the image and return a JSON object with these fields: mood (string), dominantColors (array of strings), composition (string describing layout), lighting (string), subjectExpression (string), settingDetails (string), suggestedCameraMovements (array of strings for video), emotionalTone (string). Be specific and cinematic in your descriptions.\"\n    },\n    {\n      role: \"user\",\n      content: [\n        {\n          type: \"text\",\n          text: \"Analyze this UGC product image for video production planning. Product: \" + $json.productName + \". Return structured JSON only, no markdown.\"\n        },\n        {\n          type: \"image_url\",\n          image_url: {\n            url: $json.imageUrl,\n            detail: \"high\"\n          }\n        }\n      ]\n    }\n  ],\n  max_tokens: 1000,\n  temperature: 0.3\n}) }}","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"openAiApi"},"credentials":{"openAiApi":{"id":"oTBPZheNyhtHU7nY","name":"OpenAi account"}},"typeVersion":4.2},{"id":"4a84b896-8b39-45a6-aee5-f42ab91e5269","name":"Extract DALL-E URL1","type":"n8n-nodes-base.code","position":[-3312,176],"parameters":{"jsCode":"// Extract the DALL-E image URL directly and carry forward all product data\nconst response = $input.first().json;\nconst prevData = $('AI Prompt Builder1').first().json;\n\nconst imageUrl = response.data?.[0]?.url || response.data?.[0]?.revised_url || '';\n\nif (!imageUrl) {\n  throw new Error('No image URL returned from DALL-E 3: ' + JSON.stringify(response));\n}\n\nreturn [{\n  json: {\n    ...prevData,\n    imageUrl: imageUrl,\n    dalleRevisedPrompt: response.data?.[0]?.revised_prompt || ''\n  }\n}];"},"typeVersion":2},{"id":"168cbb8e-8baa-4e77-8101-4aaa8ba88cfc","name":"DALL-E 3 Generate Image1","type":"n8n-nodes-base.httpRequest","position":[-3536,176],"parameters":{"url":"https://api.openai.com/v1/images/generations","method":"POST","options":{"timeout":120000},"jsonBody":"={{ JSON.stringify({\n  model: \"dall-e-3\",\n  prompt: $json.imagePrompt,\n  n: 1,\n  size: \"1024x1024\",\n  quality: \"hd\",\n  style: \"natural\"\n}) }}","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"openAiApi"},"credentials":{"openAiApi":{"id":"oTBPZheNyhtHU7nY","name":"OpenAi account"}},"typeVersion":4.2},{"id":"d98ee411-296b-40fb-b480-8463f1902ba7","name":"AI Prompt Builder1","type":"n8n-nodes-base.code","position":[-3760,176],"parameters":{"jsCode":"// Build a UGC-style image generation prompt from product data\nconst item = $input.first().json;\n\nconst productName = item.productName || 'product';\nconst description = item.description || '';\nconst targetAudience = item.targetAudience || 'young adults';\n\n// Construct a detailed DALL-E 3 prompt with UGC aesthetic\nconst prompt = [\n  `A lifestyle photograph of ${productName} being used by ${targetAudience}.`,\n  description ? `The product is ${description}.` : '',\n  'Shot on iPhone, natural window lighting, casual home or cafe setting.',\n  'UGC aesthetic: authentic, unposed, relatable feel.',\n  'Warm color grading, shallow depth of field, genuine emotion.',\n  'No text overlays, no logos, no watermarks.',\n  'Photorealistic, editorial quality, candid moment.'\n].filter(Boolean).join(' ');\n\nreturn [{\n  json: {\n    ...item,\n    imagePrompt: prompt\n  }\n}];"},"typeVersion":2},{"id":"708a0f76-2a80-44dc-aeb1-43f19074864b","name":"Loop Over Items1","type":"n8n-nodes-base.splitInBatches","position":[-3984,176],"parameters":{"options":{}},"typeVersion":3},{"id":"ae1ccc94-f9d6-4144-b940-2fc5ede0b2bd","name":"Filter Pending Rows1","type":"n8n-nodes-base.code","position":[-4208,176],"parameters":{"jsCode":"// Filter to only rows with Status = \"Pending\"\n// n8n Google Sheets node returns rows with 0-based row_number\n// but the actual sheet row is row_number + 2 (header row + 0-index offset)\n\nconst items = $input.all();\nconst pendingItems = [];\n\nfor (let i = 0; i < items.length; i++) {\n  const item = items[i];\n  const status = (item.json['Status'] || '').toString().trim();\n  \n  if (status === 'Pending') {\n    pendingItems.push({\n      json: {\n        productName: item.json['Product Name'] || '',\n        description: item.json['Description'] || '',\n        targetAudience: item.json['Target Audience'] || '',\n        status: item.json['Status'] || '',\n        imageUrl: item.json['Image URL'] || '',\n        videoUrl: item.json['Video URL'] || '',\n        errorMessage: item.json['Error Message'] || '',\n        // row_number is the index in the sheet (0-based from data rows)\n        // Actual sheet row = index + 2 (1 for header, 1 for 0-index)\n        sheetRowNumber: i + 2\n      }\n    });\n  }\n}\n\nif (pendingItems.length === 0) {\n  // Return empty array — workflow stops naturally\n  return [];\n}\n\nreturn pendingItems;"},"typeVersion":2},{"id":"ee9d2866-355d-4c73-aaf3-bf46c09b365e","name":"Read Product Sheet1","type":"n8n-nodes-base.googleSheets","position":[-4432,176],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1SaqB-z6WD5QDudhkZfcVmKpvu0-fteQcwE02_YK0ufs/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1SaqB-z6WD5QDudhkZfcVmKpvu0-fteQcwE02_YK0ufs","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1SaqB-z6WD5QDudhkZfcVmKpvu0-fteQcwE02_YK0ufs/edit?usp=drivesdk","cachedResultName":"UGC Automation"}},"credentials":{"googleSheetsOAuth2Api":{"id":"2osqmyVpITuA9IWt","name":"Google Sheets account"}},"typeVersion":4.5},{"id":"5969cd10-3860-488e-a9b1-8bf89383bd73","name":"Schedule Trigger1","type":"n8n-nodes-base.scheduleTrigger","position":[-4656,176],"parameters":{"rule":{"interval":[{"field":"hours"}]}},"typeVersion":1.2},{"id":"4b0a9306-c78e-4f47-99ce-e11b7650c14b","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-5488,-96],"parameters":{"width":496,"height":352,"content":"## Workflow overview\n\nThis is an n8n automation workflow that turns product listings in a Google Sheet into UGC-style videos, fully hands-off.\n\nIt runs on a schedule, picks up any row marked \"Pending\" in the sheet, and for each product it: generates a product image with DALL·E 3, analyzes that image with GPT-4 Vision to inform the video style, sends a tailored prompt to Sora to generate a short video, uploads the finished video to Google Drive, and writes the public links back to the sheet. The row's status gets updated to \"Done\" when complete, or \"Error\" with details if something fails along the way.\n\nIn short: you fill in product info in a spreadsheet, and the workflow automatically produces and delivers AI-generated marketing videos for each one."},"typeVersion":1},{"id":"5178b44c-46aa-47a8-88f5-a5c9a70ee9ed","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[-5488,304],"parameters":{"width":496,"height":560,"content":"## Setup instructions\n\nBefore running this workflow, configure the following:\n\n1. **Google Sheets OAuth** — Connect your Google account so the workflow can read product rows and write back status updates, image URLs, and video URLs.\n2. **Google Drive credentials** — Needed for uploading finished MP4 videos and setting them to public access.\n3. **OpenAI API key** — Used for both DALL·E 3 image generation and GPT-4 Vision analysis. Set this in the HTTP Request nodes for those calls.\n4. **Sora API key** — Used for video generation. Configure in the Sora Generate Video and Poll Sora Status HTTP Request nodes.\n5. **Google Sheet setup** — Create a sheet named \"Products\" with columns for product info, Status, Image URL, Video URL, and Error Message. Mark rows you want processed with Status = \"Pending\".\n6. **Google Drive folder** — Set the target folder ID in the Upload Video node where finished videos will be stored.\n7. **Schedule interval** — Adjust the Schedule Trigger to your preferred frequency (e.g. every 15 minutes, hourly).\n8. **Error handler workflow** — Import the error handler as a separate workflow and link it in this workflow's settings under \"Error Workflow\" so failed rows get logged back to the sheet."},"typeVersion":1}],"active":false,"pinData":{},"settings":{"binaryMode":"separate","availableInMCP":false,"executionOrder":"v1"},"versionId":"c4835390-8a09-402e-b364-c945f5d9474f","connections":{"Error Trigger":{"main":[[{"node":"Parse Error Details","type":"main","index":0}]]},"Video Ready?1":{"main":[[{"node":"Fetch Sora Video Content1","type":"main","index":0}],[{"node":"Wait 30 Seconds1","type":"main","index":0}]]},"Loop Over Items1":{"main":[[{"node":"Loop Complete1","type":"main","index":0}],[{"node":"AI Prompt Builder1","type":"main","index":0}]]},"Wait 30 Seconds1":{"main":[[{"node":"Poll Sora Status1","type":"main","index":0}]]},"Make File Public1":{"main":[[{"node":"Build Public Drive URL1","type":"main","index":0}]]},"Poll Sora Status1":{"main":[[{"node":"Check Sora Status1","type":"main","index":0}]]},"Row Number Known?":{"main":[[{"node":"Update Sheet — Error","type":"main","index":0}],[{"node":"Log Error (Unknown Row)","type":"main","index":0}]]},"Schedule Trigger1":{"main":[[{"node":"Read Product Sheet1","type":"main","index":0}]]},"AI Prompt Builder1":{"main":[[{"node":"DALL-E 3 Generate Image1","type":"main","index":0}]]},"Check Sora Status1":{"main":[[{"node":"Video Ready?1","type":"main","index":0}]]},"Extract DALL-E URL1":{"main":[[{"node":"GPT-4 Vision Analysis1","type":"main","index":0}]]},"Parse Error Details":{"main":[[{"node":"Row Number Known?","type":"main","index":0}]]},"Read Product Sheet1":{"main":[[{"node":"Filter Pending Rows1","type":"main","index":0}]]},"Extract Sora Job ID1":{"main":[[{"node":"Wait 30 Seconds1","type":"main","index":0}]]},"Filter Pending Rows1":{"main":[[{"node":"Loop Over Items1","type":"main","index":0}]]},"Sora Generate Video1":{"main":[[{"node":"Extract Sora Job ID1","type":"main","index":0}]]},"Video Script Builder1":{"main":[[{"node":"Wait for Sora Rate Limit1","type":"main","index":0}]]},"GPT-4 Vision Analysis1":{"main":[[{"node":"Parse Vision Analysis1","type":"main","index":0}]]},"Parse Vision Analysis1":{"main":[[{"node":"Video Script Builder1","type":"main","index":0}]]},"Update Sheet — Done2":{"main":[[{"node":"Loop Over Items1","type":"main","index":0}]]},"Build Public Drive URL1":{"main":[[{"node":"Update Sheet — Done2","type":"main","index":0}]]},"DALL-E 3 Generate Image1":{"main":[[{"node":"Extract DALL-E URL1","type":"main","index":0}]]},"Fetch Sora Video Content1":{"main":[[{"node":"Upload Video to Google Drive1","type":"main","index":0}]]},"Wait for Sora Rate Limit1":{"main":[[{"node":"Sora Generate Video1","type":"main","index":0}]]},"Upload Video to Google Drive1":{"main":[[{"node":"Make File Public1","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":37,"nodeTypes":{"n8n-nodes-base.if":{"count":2},"n8n-nodes-base.code":{"count":10},"n8n-nodes-base.noOp":{"count":1},"n8n-nodes-base.wait":{"count":2},"n8n-nodes-base.stickyNote":{"count":9},"n8n-nodes-base.googleDrive":{"count":1},"n8n-nodes-base.httpRequest":{"count":6},"n8n-nodes-base.errorTrigger":{"count":1},"n8n-nodes-base.googleSheets":{"count":3},"n8n-nodes-base.splitInBatches":{"count":1},"n8n-nodes-base.scheduleTrigger":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"Vonn","username":"vonnairone","bio":"","verified":false,"links":[],"avatar":"https://gravatar.com/avatar/0dd5e119a04d18d56d480b5a80905a94de4275f2558e384ce3548fac171e515c?r=pg&d=retro&size=200"},"nodes":[{"id":12,"icon":"fa:bug","name":"n8n-nodes-base.errorTrigger","codex":{"data":{"details":"In n8n, when a workflow execution fails, it can start another workflow. This second workflow can be any arbitrary workflow on your n8n instance. Use the Error Trigger node as your Trigger in the Error workflow.","resources":{"generic":[{"url":"https://n8n.io/blog/creating-error-workflows-in-n8n/","icon":"🌪","label":"Creating Error Workflows in n8n"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.errortrigger/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Other Trigger Nodes"]}}},"group":"[\"trigger\"]","defaults":{"name":"Error Trigger","color":"#0000FF"},"iconData":{"icon":"bug","type":"icon"},"displayName":"Error Trigger","typeVersion":1,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core Nodes"}]},{"id":18,"icon":"file:googleSheets.svg","name":"n8n-nodes-base.googleSheets","codex":{"data":{"alias":["CSV","Sheet","Spreadsheet","GS"],"resources":{"generic":[{"url":"https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/","icon":"❤️","label":"Love at first sight: Ricardo’s n8n journey"},{"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/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"},{"url":"https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/","icon":"🎫","label":"Supercharging your conference registration process with n8n"},{"url":"https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/","icon":"⏲","label":"Creating triggers for n8n workflows using polling"},{"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/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"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/your-business-doesnt-need-you-to-operate/","icon":" 🖥️","label":"Hey founders! Your business doesn't need you to operate"},{"url":"https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/","icon":"🍔","label":"How Honest Burgers Use Automation to Save $100k per year"},{"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/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-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"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/app-nodes/n8n-nodes-base.googlesheets/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage","Productivity"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\",\"output\"]","defaults":{"name":"Google Sheets"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="},"displayName":"Google Sheets","typeVersion":5,"nodeCategories":[{"id":3,"name":"Data & Storage"},{"id":4,"name":"Productivity"}]},{"id":19,"icon":"file:httprequest.svg","name":"n8n-nodes-base.httpRequest","codex":{"data":{"alias":["API","Request","URL","Build","cURL"],"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/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/automatically-pulling-and-visualizing-data-with-n8n/","icon":"📈","label":"Automatically pulling and visualizing data with n8n"},{"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/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/","icon":"🧾","label":"Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and 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/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/world-poetry-day-workflow/","icon":"📜","label":"Celebrating World Poetry Day with a daily poem in Telegram"},{"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/automate-designs-with-bannerbear-and-n8n/","icon":"🎨","label":"Automate Designs with Bannerbear and n8n"},{"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/building-an-expense-tracking-app-in-10-minutes/","icon":"📱","label":"Building an expense tracking app in 10 minutes"},{"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/how-to-use-the-http-request-node-the-swiss-army-knife-for-workflow-automation/","icon":"🧰","label":"How to use the HTTP Request Node - The Swiss Army Knife for Workflow Automation"},{"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-a-membership-development-manager-automates-his-work-and-investments/","icon":"📈","label":"How a Membership Development Manager automates his work and investments"},{"url":"https://n8n.io/blog/a-low-code-bitcoin-ticker-built-with-questdb-and-n8n-io/","icon":"📈","label":"A low-code bitcoin ticker built with QuestDB and n8n.io"},{"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/automations-for-activists/","icon":"✨","label":"How Common Knowledge use workflow automation for activism"},{"url":"https://n8n.io/blog/creating-scheduled-text-affirmations-with-n8n/","icon":"🤟","label":"Creating scheduled text affirmations with n8n"},{"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"},{"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.httprequest/"}]},"categories":["Development","Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"output\"]","defaults":{"name":"HTTP Request","color":"#0004F5"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MCAyMEM0MCA4Ljk1MzE0IDMxLjA0NjkgMCAyMCAwQzguOTUzMTQgMCAwIDguOTUzMTQgMCAyMEMwIDMxLjA0NjkgOC45NTMxNCA0MCAyMCA0MEMzMS4wNDY5IDQwIDQwIDMxLjA0NjkgNDAgMjBaTTIwIDM2Ljk0NThDMTguODg1MiAzNi45NDU4IDE3LjEzNzggMzUuOTY3IDE1LjQ5OTggMzIuNjk4NUMxNC43OTY0IDMxLjI5MTggMTQuMTk2MSAyOS41NDMxIDEzLjc1MjYgMjcuNjg0N0gyNi4xODk4QzI1LjgwNDUgMjkuNTQwMyAyNS4yMDQ0IDMxLjI5MDEgMjQuNTAwMiAzMi42OTg1QzIyLjg2MjIgMzUuOTY3IDIxLjExNDggMzYuOTQ1OCAyMCAzNi45NDU4Wk0xMi45MDY0IDIwQzEyLjkwNjQgMjEuNjA5NyAxMy4wMDg3IDIzLjE2NCAxMy4yMDAzIDI0LjYzMDVIMjYuNzk5N0MyNi45OTEzIDIzLjE2NCAyNy4wOTM2IDIxLjYwOTcgMjcuMDkzNiAyMEMyNy4wOTM2IDE4LjM5MDMgMjYuOTkxMyAxNi44MzYgMjYuNzk5NyAxNS4zNjk1SDEzLjIwMDNDMTMuMDA4NyAxNi44MzYgMTIuOTA2NCAxOC4zOTAzIDEyLjkwNjQgMjBaTTIwIDMuMDU0MTlDMjEuMTE0OSAzLjA1NDE5IDIyLjg2MjIgNC4wMzA3OCAyNC41MDAxIDcuMzAwMzlDMjUuMjA2NiA4LjcxNDA4IDI1LjgwNzIgMTAuNDA2NyAyNi4xOTIgMTIuMzE1M0gxMy43NTAxQzE0LjE5MzMgMTAuNDA0NyAxNC43OTQyIDguNzEyNTQgMTUuNDk5OCA3LjMwMDY0QzE3LjEzNzcgNC4wMzA4MyAxOC44ODUxIDMuMDU0MTkgMjAgMy4wNTQxOVpNMzAuMTQ3OCAyMEMzMC4xNDc4IDE4LjQwOTkgMzAuMDU0MyAxNi44NjE3IDI5LjgyMjcgMTUuMzY5NUgzNi4zMDQyQzM2LjcyNTIgMTYuODQyIDM2Ljk0NTggMTguMzk2NCAzNi45NDU4IDIwQzM2Ljk0NTggMjEuNjAzNiAzNi43MjUyIDIzLjE1OCAzNi4zMDQyIDI0LjYzMDVIMjkuODIyN0MzMC4wNTQzIDIzLjEzODMgMzAuMTQ3OCAyMS41OTAxIDMwLjE0NzggMjBaTTI2LjI3NjcgNC4yNTUxMkMyNy42MzY1IDYuMzYwMTkgMjguNzExIDkuMTMyIDI5LjM3NzQgMTIuMzE1M0gzNS4xMDQ2QzMzLjI1MTEgOC42NjggMzAuMTA3IDUuNzgzNDYgMjYuMjc2NyA0LjI1NTEyWk0xMC42MjI2IDEyLjMxNTNINC44OTI5M0M2Ljc1MTQ3IDguNjY3ODQgOS44OTM1MSA1Ljc4MzQxIDEzLjcyMzIgNC4yNTUxM0MxMi4zNjM1IDYuMzYwMjEgMTEuMjg5IDkuMTMyMDEgMTAuNjIyNiAxMi4zMTUzWk0zLjA1NDE5IDIwQzMuMDU0MTkgMjEuNjAzIDMuMjc3NDMgMjMuMTU3NSAzLjY5NDg0IDI0LjYzMDVIMTAuMTIxN0M5Ljk0NjE5IDIzLjE0MiA5Ljg1MjIyIDIxLjU5NDMgOS44NTIyMiAyMEM5Ljg1MjIyIDE4LjQwNTcgOS45NDYxOSAxNi44NTggMTAuMTIxNyAxNS4zNjk1SDMuNjk0ODRDMy4yNzc0MyAxNi44NDI1IDMuMDU0MTkgMTguMzk3IDMuMDU0MTkgMjBaTTI2LjI3NjYgMzUuNzQyN0MyNy42MzY1IDMzLjYzOTMgMjguNzExIDMwLjg2OCAyOS4zNzc0IDI3LjY4NDdIMzUuMTA0NkMzMy4yNTEgMzEuMzMyMiAzMC4xMDY4IDM0LjIxNzkgMjYuMjc2NiAzNS43NDI3Wk0xMy43MjM0IDM1Ljc0MjdDOS44OTM2OSAzNC4yMTc5IDYuNzUxNTUgMzEuMzMyNCA0Ljg5MjkzIDI3LjY4NDdIMTAuNjIyNkMxMS4yODkgMzAuODY4IDEyLjM2MzUgMzMuNjM5MyAxMy43MjM0IDM1Ljc0MjdaIiBmaWxsPSIjM0E0MkU5Ii8+Cjwvc3ZnPgo="},"displayName":"HTTP Request","typeVersion":4,"nodeCategories":[{"id":5,"name":"Development"},{"id":9,"name":"Core 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":26,"icon":"fa:arrow-right","name":"n8n-nodes-base.noOp","codex":{"data":{"alias":["nothing"],"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/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/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/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/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.noop/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers"]}}},"group":"[\"organization\"]","defaults":{"name":"No Operation, do nothing","color":"#b0b0b0"},"iconData":{"icon":"arrow-right","type":"icon"},"displayName":"No Operation, do nothing","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":39,"icon":"fa:sync","name":"n8n-nodes-base.splitInBatches","codex":{"data":{"alias":["Loop","Concatenate","Batch","Split","Split In Batches"],"resources":{"generic":[{"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/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"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.splitinbatches/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow"]}}},"group":"[\"organization\"]","defaults":{"name":"Loop Over Items","color":"#007755"},"iconData":{"icon":"sync","type":"icon"},"displayName":"Loop Over Items (Split in Batches)","typeVersion":3,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":58,"icon":"file:googleDrive.svg","name":"n8n-nodes-base.googleDrive","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"},{"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/aws-workflow-automation/","label":"7 no-code workflow automations for Amazon Web Services"}],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googledrive/"}],"credentialDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"}]},"categories":["Data & Storage"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"input\"]","defaults":{"name":"Google Drive"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBmaWxsPSIjZmZmIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHN0cm9rZT0iIzAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiB2aWV3Qm94PSIwIDAgODEgNzMiPjx1c2UgeGxpbms6aHJlZj0iI2EiIHg9Ii41IiB5PSIuNSIvPjxzeW1ib2wgaWQ9ImEiIG92ZXJmbG93PSJ2aXNpYmxlIj48ZyBmaWxsLXJ1bGU9Im5vbnplcm8iIHN0cm9rZT0ibm9uZSI+PHBhdGggZmlsbD0iIzAwNjZkYSIgZD0ibTYuMDQ4IDYxLjI2IDMuNTI4IDYuMDk0Yy43MzMgMS4yODMgMS43ODcgMi4yOTEgMy4wMjQgMy4wMjRsMTIuNi0yMS44MUgwYTguMyA4LjMgMCAwIDAgMS4xIDQuMTI0eiIvPjxwYXRoIGZpbGw9IiMwMGFjNDciIGQ9Ik00MCAyMi45MSAyNy40IDEuMWMtMS4yMzcuNzMzLTIuMjkxIDEuNzQxLTMuMDI0IDMuMDI0TDEuMSA0NC40NDVBOC4zIDguMyAwIDAgMCAwIDQ4LjU2OGgyNS4yeiIvPjxwYXRoIGZpbGw9IiNlYTQzMzUiIGQ9Ik02Ny40IDcwLjM3OGMxLjIzNy0uNzMzIDIuMjkxLTEuNzQxIDMuMDI0LTMuMDI0bDEuNDY2LTIuNTIgNy4wMS0xMi4xNDJhOC4zIDguMyAwIDAgMCAxLjEtNC4xMjRINTQuNzk4bDUuMzYzIDEwLjUzOHoiLz48cGF0aCBmaWxsPSIjMDA4MzJkIiBkPSJNNDAgMjIuOTEgNTIuNiAxLjFDNTEuMzYzLjM2NyA0OS45NDMgMCA0OC40NzcgMEgzMS41MjRjLTEuNDY2IDAtMi44ODcuNDEyLTQuMTI0IDEuMXoiLz48cGF0aCBmaWxsPSIjMjY4NGZjIiBkPSJNNTQuNzk5IDQ4LjU2OEgyNS4ybC0xMi42IDIxLjgxYzEuMjM3LjczMyAyLjY1NyAxLjEgNC4xMjQgMS4xaDQ2LjU1MmMxLjQ2NiAwIDIuODg3LS40MTIgNC4xMjQtMS4xeiIvPjxwYXRoIGZpbGw9IiNmZmJhMDAiIGQ9Ik02Ny4yNjIgMjQuMjg0IDU1LjYyNCA0LjEyNEM1NC44OTEgMi44NDEgNTMuODM3IDEuODMzIDUyLjYgMS4xTDQwIDIyLjkxbDE0LjggMjUuNjU5aDI1LjE1NWE4LjMgOC4zIDAgMCAwLTEuMS00LjEyNHoiLz48L2c+PC9zeW1ib2w+PC9zdmc+"},"displayName":"Google Drive","typeVersion":3,"nodeCategories":[{"id":3,"name":"Data & Storage"}]},{"id":514,"icon":"fa:pause-circle","name":"n8n-nodes-base.wait","codex":{"data":{"alias":["pause","sleep","delay","timeout"],"resources":{"generic":[{"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/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.wait/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Helpers","Flow"]}}},"group":"[\"organization\"]","defaults":{"name":"Wait","color":"#804050"},"iconData":{"icon":"pause-circle","type":"icon"},"displayName":"Wait","typeVersion":1,"nodeCategories":[{"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":839,"icon":"fa:clock","name":"n8n-nodes-base.scheduleTrigger","codex":{"data":{"alias":["Time","Scheduler","Polling","Cron","Interval"],"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\",\"schedule\"]","defaults":{"name":"Schedule Trigger","color":"#31C49F"},"iconData":{"icon":"clock","type":"icon"},"displayName":"Schedule Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":31,"name":"Content Creation"},{"id":51,"name":"Multimodal AI"}],"image":[]}}