{"workflow":{"id":12728,"name":"Create AI screencast videos with Claude, VEED, OpenAI and automated slides","views":199,"recentViews":0,"totalViews":199,"createdAt":"2026-01-15T14:24:24.281Z","description":"# Create AI screencast videos with VEED and automated slides\n\n## Overview\n\nThis n8n workflow automatically generates **presentation-style \"screen recording\" videos** with AI-generated slides and a talking head avatar overlay. You provide a topic and intention, and the workflow handles everything: scriptwriting, slide generation, avatar creation, voiceover, and video composition.\n\n**Output**: Horizontal (16:9) AI-generated videos with animated slides as the main content and a lip-synced avatar in picture-in-picture, ready for YouTube, LinkedIn, or professional presentations.\n\n---\n\n## What It Does\n\n```\nTopic + Intention → Claude writes script → Parallel processing:\n                                            ├── OpenAI generates avatar → ElevenLabs voiceover → VEED lip-sync\n                                            └── FAL Flux Pro generates slides\n                                          → Creatomate composites everything → Saved to Google Drive + logged to Sheets\n```\n\n### Pipeline Breakdown\n\n| Step | Tool | What Happens |\n|------|------|--------------|\n| 1. Script Generation | Claude Sonnet 4 | Creates hook, script (25-40 sec), slide prompts, caption, and avatar description |\n| 2. Avatar Generation | OpenAI gpt-image-1 | Generates photorealistic portrait image (1024×1536) |\n| 3. Slide Generation | FAL Flux Pro | Creates 5-7 professional slides (1920×1080) with text overlays |\n| 4. Voiceover | ElevenLabs | Converts script to natural speech (multiple voice options) |\n| 5. Talking Head | VEED Fabric 1.0 | Lip-syncs avatar to audio, creates 9:16 talking head video |\n| 6. Video Composition | Creatomate | Combines slides + avatar in 16:9 PiP layout |\n| 7. Storage | Google Drive | Uploads final MP4 |\n| 8. Logging | Google Sheets | Records all metadata (script, caption, URLs, timestamps) |\n\n---\n\n## Required Connections\n\n### API Keys (entered in Configuration node)\n\n| Service | Key Type | Where to Get |\n|---------|----------|--------------|\n| **Anthropic** | API Key | https://console.anthropic.com/settings/keys |\n| **OpenAI** | API Key | https://platform.openai.com/api-keys |\n| **ElevenLabs** | API Key | https://elevenlabs.io/app/settings/api-keys |\n| **FAL.ai** | API Key | https://fal.ai/dashboard/keys |\n| **Creatomate** | API Key | https://creatomate.com/dashboard/settings |\n\n&gt; ⚠️ **OpenAI Note**: `gpt-image-1` requires organization verification. Go to https://platform.openai.com/settings/organization/general to verify.\n\n### n8n Credentials (connect in n8n)\n\n| Node | Credential Type | Purpose |\n|------|-----------------|---------|\n| **🎬 Generate Talking Head (VEED)** | FAL.ai API | VEED video rendering |\n| **📤 Upload to Drive** | Google Drive OAuth2 | Store final videos |\n| **📝 Log to Sheets** | Google Sheets OAuth2 | Track all generated content |\n\n---\n\n## Configuration Options\n\nEdit the **⚙️ Workflow Configuration** node to customize:\n\n```javascript\n{\n  // 📝 CONTENT SETTINGS\n  topic: \"How AI is transforming content creation\",\n  intention: \"informative\",                    // informative, lead_generation, disruption\n  brand_name: \"YOUR_BRAND_NAME\",\n  target_audience: \"sales teams and marketers\",\n  trending_hashtags: \"#AIvideo #ContentCreation #VideoMarketing\",\n  \n  // 🎨 SLIDE STYLE\n  slide_style: \"vibrant_colorful\",            // See slide styles below\n  \n  // 🎥 VIDEO SETTINGS\n  video_resolution: \"720p\",                   // VEED only supports 720p\n  seconds_per_slide: 6,                       // How long each slide shows\n  \n  // 🖼️ BACKGROUND (Optional)\n  background: \"\",                             // URL, gradient array, or empty\n  \n  // 🔑 API KEYS (Required)\n  anthropic_api_key: \"YOUR_ANTHROPIC_API_KEY\",\n  openai_api_key: \"YOUR_OPENAI_API_KEY\",\n  elevenlabs_api_key: \"YOUR_ELEVENLABS_API_KEY\",\n  creatomate_api_key: \"YOUR_CREATOMATE_API_KEY\",\n  fal_api_key: \"YOUR_FAL_API_KEY\",\n  \n  // 🎤 VOICE SELECTION\n  voice_selection: \"susie\",                   // cristina, enrique, susie, jeff, custom\n  \n  // 🎨 AVATAR OPTIONS (Optional)\n  custom_avatar_description: \"\",              // Leave empty for AI-generated\n  custom_avatar_image_url: \"\",                // Direct URL to use existing image\n  \n  // 📝 CUSTOM SCRIPT (Optional)\n  custom_script: \"\"                           // Leave empty for AI-generated\n}\n```\n\n### Slide Style Options\n\n| Style | Description | Best For |\n|-------|-------------|----------|\n| `dark_professional` | Dark gradients, white text, sleek look | Tech, SaaS, premium brands |\n| `light_modern` | Light backgrounds, dark text, clean | Corporate, educational |\n| `vibrant_colorful` | Bold colors, energetic, eye-catching | Social media, startups |\n| `minimalist` | Lots of whitespace, simple, elegant | Luxury, professional services |\n| `tech_corporate` | Blue tones, geometric shapes | Enterprise, B2B |\n\n### Background Options\n\n| Type | Example | Description |\n|------|---------|-------------|\n| **None** | `\"\"` | Full bleed layout, slides take 78% width |\n| **URL** | `\"https://example.com/bg.jpg\"` | Image background with margins |\n| **Gradient** | `[\"#ff6b6b\", \"#feca57\", \"#48dbfb\"]` | Gradient background with margins |\n\n### Voice Options\n\n| Voice | Language | Description |\n|-------|----------|-------------|\n| `cristina` | Spanish | Female voice |\n| `enrique` | Spanish | Male voice |\n| `susie` | English | Female voice (default) |\n| `jeff` | English | Male voice |\n| `custom` | Any | Use your ElevenLabs voice clone ID |\n\n### Intention Types\n\n| Intention | Content Style | Best For |\n|-----------|---------------|----------|\n| `informative` | Educational, value-driven, builds trust | Thought leadership, tutorials |\n| `lead_generation` | Creates curiosity, soft CTA | Product awareness, funnels |\n| `disruption` | Bold, provocative, scroll-stopping | Viral potential, brand awareness |\n\n---\n\n## Custom Avatar & Script Options\n\n### Custom Avatar Description\n\nLeave `custom_avatar_description` empty to let Claude decide, or provide your own:\n\n```javascript\ncustom_avatar_description: \"female marketing influencer, cool, working in tech\"\n```\n\n**Examples:**\n- `\"a woman in her 20s with gym clothes\"`\n- `\"a bearded man in his 30s wearing a hoodie\"`\n- `\"a professional woman with glasses in business casual\"`\n\n### Custom Avatar Image URL\n\nSkip avatar generation entirely by providing a direct URL:\n\n```javascript\ncustom_avatar_image_url: \"https://example.com/my-avatar.png\"\n```\n\n&gt; Image should be portrait orientation, high quality, with the subject looking at camera.\n\n### Custom Script\n\nLeave `custom_script` empty to let Claude write it, or provide your own:\n\n```javascript\ncustom_script: \"This is my custom script. AI is changing how we create content...\"\n```\n\n**Guidelines for custom scripts:**\n- Keep it 25-40 seconds when read aloud (60-100 words)\n- Avoid special characters for TTS compatibility\n- Write naturally, as if speaking\n\n### Behavior Matrix\n\n| custom_avatar_description | custom_avatar_image_url | custom_script | What Claude Generates |\n|---------------------------|-------------------------|---------------|----------------------|\n| Empty | Empty | Empty | Avatar + Script + Slides + Caption |\n| Provided | Empty | Empty | Script + Slides + Caption |\n| Empty | Provided | Empty | Script + Slides + Caption |\n| Empty | Empty | Provided | Avatar + Slides + Caption |\n| Provided | Provided | Provided | Slides + Caption only |\n\n---\n\n## Video Layout\n\nThe final video uses a picture-in-picture (PiP) layout:\n\n### Without Background (Full Bleed)\n```\n┌─────────────────────────────────┬──────┐\n│                                 │      │\n│                                 │      │\n│         SLIDES (78%)            │AVATAR│\n│                                 │(22%) │\n│                                 │      │\n│                                 │      │\n└─────────────────────────────────┴──────┘\n```\n\n### With Background (Margins + Rounded Corners)\n```\n┌─────────────────────────────────────────┐\n│ BG ┌───────────────────────────┐ ┌────┐ │\n│    │                           │ │    │ │\n│    │       SLIDES (74%)        │ │AVA │ │\n│    │                           │ │TAR │ │\n│    │                           │ │20% │ │\n│    └───────────────────────────┘ └────┘ │\n└─────────────────────────────────────────┘\n```\n\n---\n\n## Output\n\n### Per Video Generated\n\n| Asset | Format | Location |\n|-------|--------|----------|\n| Final Video | MP4 (1920×1080, 60fps) | Google Drive folder |\n| Avatar Image | PNG (1024×1536) | tmpfiles.org (temporary) |\n| Slide Images | PNG (1920×1080) | FAL CDN (temporary) |\n| Voiceover | MP3 | tmpfiles.org (temporary) |\n| Metadata | Row entry | Google Sheets |\n\n### Google Sheets Columns\n\n| Column | Description |\n|--------|-------------|\n| topic | Video topic |\n| intention | Content intention used |\n| brand_name | Brand mentioned |\n| slide_style | Visual style used |\n| content_theme | 2-3 word theme summary |\n| script | Full voiceover script |\n| caption | Ready-to-post caption with hashtags |\n| num_slides | Number of slides generated |\n| video_url | Google Drive link to final video |\n| avatar_video_url | VEED talking head video URL |\n| audio_url | Temporary audio URL |\n| status | done/error |\n| created_at | Timestamp |\n\n---\n\n## Estimated Costs Per Video\n\n| Service | Usage | Approximate Cost |\n|---------|-------|------------------|\n| Claude Sonnet 4 | ~2K tokens | ~$0.01 |\n| OpenAI gpt-image-1 | 1 image (1024×1536) | ~$0.04-0.08 |\n| FAL Flux Pro | 5-7 images (1920×1080) | ~$0.10-0.15 |\n| ElevenLabs | ~100 words | ~$0.01-0.02 |\n| VEED/FAL.ai | 1 video render | ~$0.10-0.20 |\n| Creatomate | 1 video composition | ~$0.10-0.20 |\n| **Total** | | **~$0.35-0.65 per video** |\n\n&gt; Costs vary based on script length and current API pricing.\n\n---\n\n## Setup Checklist\n\n### Step 1: Import Workflow\n- [ ] Import `create-ai-screencast-videos-with-veed-and-automated-slides.json` into n8n\n\n### Step 2: Configure API Keys\n- [ ] Open the **⚙️ Workflow Configuration** node\n- [ ] Replace all `YOUR_*_API_KEY` placeholders with your actual API keys\n- [ ] Verify your OpenAI organization at https://platform.openai.com/settings/organization/general\n\n### Step 3: Connect n8n Credentials\n- [ ] Click on **🎬 Generate Talking Head (VEED)** node → Add FAL.ai credential\n- [ ] Click on **📤 Upload to Drive** node → Add Google Drive OAuth2 credential\n- [ ] Click on **📝 Log to Sheets** node → Add Google Sheets OAuth2 credential\n\n### Step 4: Configure Storage\n- [ ] Update the **📤 Upload to Drive** node with your Google Drive folder URL\n- [ ] Update the **📝 Log to Sheets** node with your Google Sheets URL\n- [ ] Create column headers in your Google Sheet (see Output section)\n\n### Step 5: Customize Content\n- [ ] Update `topic`, `brand_name`, `target_audience`, and `trending_hashtags`\n- [ ] Choose your preferred `slide_style` and `voice_selection`\n- [ ] Optionally configure `background`, `custom_avatar_description`, and/or `custom_script`\n\n### Step 6: Test\n- [ ] Execute the workflow\n- [ ] Check Google Drive for the output video\n- [ ] Verify metadata was logged to Google Sheets\n\n---\n\n## MCP Integration (Optional)\n\nThis workflow can be exposed to Claude Desktop via n8n's Model Context Protocol (MCP) integration.\n\n### To enable MCP:\n\n1. Add a **Webhook Trigger** node to the workflow (in addition to the Manual Trigger)\n2. Connect it to the **⚙️ Workflow Configuration** node\n3. Go to **Settings** → **Instance-level MCP** → Enable the workflow\n4. Configure Claude Desktop with your n8n MCP server URL\n\n### Claude Desktop Configuration (Windows):\n\n```json\n{\n  \"mcpServers\": {\n    \"n8n-mcp\": {\n      \"command\": \"supergateway\",\n      \"args\": [\n        \"--streamableHttp\",\n        \"https://YOUR_N8N_INSTANCE.app.n8n.cloud/mcp-server/http\",\n        \"--header\",\n        \"authorization:Bearer YOUR_MCP_ACCESS_TOKEN\"\n      ]\n    }\n  }\n}\n```\n\n&gt; **Note**: Install `supergateway` globally first: `npm install -g supergateway`\n\n---\n\n## Limitations & Notes\n\n### Technical Limitations\n\n- **tmpfiles.org**: Temporary file URLs expire after ~1 hour. Final videos are safe in Google Drive.\n- **VEED processing**: Takes 1-3 minutes for the talking head.\n- **Creatomate processing**: Takes 30-60 seconds for composition.\n- **Total workflow time**: ~3-5 minutes per video.\n\n### Content Considerations\n\n- Scripts are optimized for 25-40 seconds (TTS-friendly)\n- Avatar images are AI-generated (not real people)\n- Slides are dynamically generated based on script length\n- Slide count: 5-7 slides depending on script duration\n\n### Best Practices\n\n1. **Start simple**: Test with default settings before customizing\n2. **Review scripts**: Claude generates good content but review before posting\n3. **Monitor costs**: Check API usage dashboards weekly\n4. **Use backgrounds**: Adding a background image creates a more polished look\n5. **Match voice to content**: Use Spanish voices for Spanish content\n\n---\n\n## Troubleshooting\n\n| Issue | Solution |\n|-------|----------|\n| \"Organization must be verified\" | Verify at platform.openai.com/settings/organization/general |\n| VEED authentication error | Re-add FAL.ai credential to VEED node |\n| Google Drive \"no binary field\" | Ensure Download Video outputs to binary field |\n| JSON parse error from Claude | Workflow has fallback content; check Claude node output |\n| Slides not matching script | Increase `seconds_per_slide` for fewer slides |\n| Avatar cut off in PiP | Avatar is designed for right-side placement |\n| MCP \"Server disconnected\" | Install supergateway globally: `npm install -g supergateway` |\n| Render timeout | Increase wait time in \"⏳ Wait for Render\" node |\n\n---\n\n## Version History\n\n| Version | Date | Changes |\n|---------|------|---------|\n| 2.1 | Jan 2026 | Renamed workflow, improved documentation with section sticky notes, consolidated setup information |\n| 2.0 | Jan 2026 | Added dynamic slide count, background options, FAL Flux Pro for slides, improved PiP layout |\n| 1.0 | Jan 2026 | Initial release with fixed slide count, basic composition |\n\n---\n\n## Credits\n\nBuilt with:\n- **n8n** - Workflow automation\n- **Anthropic Claude** - Script & slide prompt generation\n- **OpenAI** - Avatar image generation\n- **FAL.ai** - Slide image generation (Flux Pro)\n- **ElevenLabs** - Voice synthesis\n- **VEED Fabric** - AI lip-sync video rendering\n- **Creatomate** - Video composition\n- **Google Workspace** - Storage & logging\n","workflow":{"id":"TNf36l4Mq3wVfBMLIVBk-","meta":{"instanceId":"dad5fcc32113ba8bb80eb1361380849427c50ebb586d233d41f3f7c26f32ab71"},"name":"Create AI screencast videos with VEED and automated slides","tags":[],"nodes":[{"id":"13577dc8-b30d-4120-81a4-a8280f3a943d","name":"When clicking 'Execute workflow'","type":"n8n-nodes-base.manualTrigger","position":[-8688,1152],"parameters":{},"typeVersion":1},{"id":"e8d92c4e-cedd-4698-a3fe-5c9606d176d0","name":"⚙️ Workflow Configuration","type":"n8n-nodes-base.code","position":[-8448,1152],"parameters":{"jsCode":"// ══════════════════════════════════════════════════════════════════════════════\n// ⚙️ SCREEN RECORDING VIDEO GENERATOR - CONFIGURATION\n// ══════════════════════════════════════════════════════════════════════════════\n\nreturn [{\n  json: {\n    // ─────────────────────────────────────────────────────────────────────────\n    // 📝 CONTENT SETTINGS\n    // ─────────────────────────────────────────────────────────────────────────\n    topic: \"How AI is transforming content creation, opening up opportunities for personalization and scale\",\n    intention: \"informative\",                            // Options: informative, lead_generation, disruption\n    brand_name: \"YOUR_BRAND_NAME\",\n    target_audience: \"sales teams and marketers\",\n    trending_hashtags: \"#AIvideo #ContentCreation #VideoMarketing #AItools\",\n    \n    // ─────────────────────────────────────────────────────────────────────────\n    // 🎨 SLIDE STYLE\n    // ─────────────────────────────────────────────────────────────────────────\n    // Options:\n    //   - dark_professional: Dark gradients, white text, sleek look\n    //   - light_modern: Light backgrounds, dark text, clean\n    //   - vibrant_colorful: Bold colors, energetic, eye-catching\n    //   - minimalist: Lots of whitespace, simple, elegant\n    //   - tech_corporate: Blue tones, geometric shapes, professional\n    slide_style: \"vibrant_colorful\",\n    \n    // ─────────────────────────────────────────────────────────────────────────\n    // 🎥 VIDEO SETTINGS\n    // ─────────────────────────────────────────────────────────────────────────\n    video_resolution: \"720p\",                           // VEED only supports 720p\n    // num_slides is now calculated automatically based on script length\n    // Target: 1 slide per 5-7 seconds of audio\n    seconds_per_slide: 6,                                // How long each slide shows (affects slide count)\n    \n    // ─────────────────────────────────────────────────────────────────────────\n    // 🖼️ BACKGROUND (Optional)\n    // ─────────────────────────────────────────────────────────────────────────\n    // Option 1: Gradient colors array e.g. [\"#ff6b6b\", \"#feca57\", \"#48dbfb\"]\n    // Option 2: Image URL string e.g. \"https://example.com/background.jpg\"\n    // Option 3: Empty string \"\" for no background (full bleed layout)\n    background: \"\",\n    \n    // ─────────────────────────────────────────────────────────────────────────\n    // 🔑 API KEYS (Required)\n    // ─────────────────────────────────────────────────────────────────────────\n    anthropic_api_key: \"YOUR_ANTHROPIC_API_KEY\",\n    openai_api_key: \"YOUR_OPENAI_API_KEY\",\n    elevenlabs_api_key: \"YOUR_ELEVENLABS_API_KEY\",\n    creatomate_api_key: \"YOUR_CREATOMATE_API_KEY\",\n    fal_api_key: \"YOUR_FAL_API_KEY\",\n    \n    // ─────────────────────────────────────────────────────────────────────────\n    // 🎤 VOICE SELECTION\n    // ─────────────────────────────────────────────────────────────────────────\n    // Options: cristina (Spanish female), enrique (Spanish male),\n    //          susie (English female), jeff (English male),\n    //          custom (set your voice ID in Parse node)\n    voice_selection: \"susie\",\n    \n    // ─────────────────────────────────────────────────────────────────────────\n    // 🎨 AVATAR OPTIONS (Optional)\n    // ─────────────────────────────────────────────────────────────────────────\n    // Leave both empty for AI-generated avatar\n    custom_avatar_description: \"\",                       // e.g., \"a woman in her 30s with casual clothing\"\n    custom_avatar_image_url: \"\",                         // Direct URL to an image (publicly accessible)\n    \n    // ─────────────────────────────────────────────────────────────────────────\n    // 📝 CUSTOM SCRIPT (Optional)\n    // ─────────────────────────────────────────────────────────────────────────\n    custom_script: \"\"                                    // Your own script (leave empty for AI-generated)\n  }\n}];"},"typeVersion":2},{"id":"9fe355e6-8b80-4a17-8d29-b3a32fb34d3e","name":"🧠 Build Claude Prompt","type":"n8n-nodes-base.code","position":[-8208,1152],"parameters":{"jsCode":"const config = $input.first().json;\n\n// Slide style definitions with enhanced professional design guidance\nconst slideStyles = {\n  \"dark_professional\": {\n    background: \"rich dark gradient (deep navy #0a1628 to charcoal #1a1a2e, or midnight purple #16213e to black)\",\n    text_color: \"crisp white (#ffffff) or soft off-white (#f8f9fa) text, bold modern sans-serif (Inter, SF Pro, or Montserrat style)\",\n    accent: \"subtle neon accents (electric blue #00d4ff or soft purple #a855f7), thin glowing lines, minimal geometric shapes\",\n    mood: \"premium, sophisticated, high-end tech keynote aesthetic like Apple or Stripe presentations\",\n    layout: \"generous whitespace, text positioned with intentional asymmetry, clean visual hierarchy\"\n  },\n  \"light_modern\": {\n    background: \"clean white (#ffffff) or warm off-white (#fafafa) with subtle texture or grain\",\n    text_color: \"rich charcoal (#1a1a1a) or dark gray (#374151) text, elegant sans-serif typography\",\n    accent: \"soft pastel accents (blush pink #fecaca, sage green #d1fae5, or sky blue #bae6fd), thin hairlines\",\n    mood: \"airy, minimal, Notion or Linear-style design, sophisticated simplicity\",\n    layout: \"bold use of negative space, text breathing room, modern asymmetric composition\"\n  },\n  \"vibrant_colorful\": {\n    background: \"bold gradient mesh (coral #ff6b6b to magenta #f472b6, or cyan #22d3ee to violet #8b5cf6)\",\n    text_color: \"bold white text with subtle drop shadow for contrast, thick modern typeface\",\n    accent: \"organic blob shapes, floating particles, playful geometric elements\",\n    mood: \"energetic, social-media native, Canva Pro or Instagram aesthetic, eye-catching\",\n    layout: \"dynamic compositions, overlapping elements, bold text placements\"\n  },\n  \"minimalist\": {\n    background: \"pure solid color (warm cream #fef3c7, soft sage #ecfdf5, or clean white #ffffff)\",\n    text_color: \"black (#000000) or near-black (#111827) text, generous letter-spacing, refined serif or clean sans\",\n    accent: \"single thin rule line, small punctuation mark, or subtle brand color dot\",\n    mood: \"ultra-refined, editorial, Pitch.com or premium agency deck style\",\n    layout: \"extreme whitespace, single focal point, typography as art\"\n  },\n  \"tech_corporate\": {\n    background: \"professional blue gradient (#1e3a5f to #0f172a) with subtle grid pattern or data visualization hints\",\n    text_color: \"white or light blue (#e0f2fe) text, clean professional typeface\",\n    accent: \"geometric shapes, circuit-like patterns, subtle glow effects, data viz elements\",\n    mood: \"trustworthy, enterprise-grade, McKinsey or Accenture presentation quality\",\n    layout: \"structured grid-based composition, clear information hierarchy\"\n  }\n};\n\nconst selectedStyle = slideStyles[config.slide_style] || slideStyles.dark_professional;\nconst secondsPerSlide = config.seconds_per_slide || 6;\n\nconst hasCustomAvatar = config.custom_avatar_description && config.custom_avatar_description.trim() !== '';\nconst hasCustomAvatarUrl = config.custom_avatar_image_url && config.custom_avatar_image_url.trim() !== '';\nconst hasCustomScript = config.custom_script && config.custom_script.trim() !== '';\n\n// Calculate number of slides based on custom script length if provided\nlet estimatedSlides = 5; // default\nif (hasCustomScript) {\n  const wordCount = config.custom_script.trim().split(/\\s+/).length;\n  const estimatedDuration = Math.ceil(wordCount / 2.5); // ~2.5 words per second\n  estimatedSlides = Math.max(3, Math.min(8, Math.ceil(estimatedDuration / secondsPerSlide)));\n}\n\nconst intentionGuides = {\n  \"informative\": \"Focus on educating the viewer. Provide genuine value and actionable insights. Build trust through expertise.\",\n  \"lead_generation\": \"Create curiosity and desire. Include a soft call-to-action. Make them want to learn more.\",\n  \"disruption\": \"Challenge conventional thinking. Be bold and provocative. Stand out from the noise.\"\n};\n\n// Build dynamic task instructions\nlet taskInstructions = '';\n\nif (!hasCustomScript) {\n  taskInstructions = `### 1. VOICEOVER SCRIPT\nWrite an engaging, punchy script (25-40 seconds when spoken, approximately 60-100 words) that:\n- Opens with an attention-grabbing hook (problem or bold statement)\n- Delivers 2-3 key value points in conversational tone\n- Is optimized for text-to-speech (natural phrasing, no complex words)\n- Builds momentum toward the end\n- Ends with a memorable closing line or soft CTA\\n\\n`;\n}\n\ntaskInstructions += `### ${hasCustomScript ? '1' : '2'}. SLIDE IMAGE PROMPTS\nCreate ${hasCustomScript ? estimatedSlides : '5-7'} slides that sync perfectly with the script flow. Each slide should:\n- Support exactly one key moment/phrase from the script\n- Display 2-4 words maximum as the headline (think billboard, not paragraph)\n- Be timed so slides transition naturally with the spoken content\\n\\n`;\n\nif (!hasCustomAvatarUrl && !hasCustomAvatar) {\n  taskInstructions += `### ${hasCustomScript ? '2' : '3'}. AVATAR IMAGE PROMPT\nCreate a prompt for a photorealistic presenter:\n- Head and shoulders framing, direct eye contact with camera\n- Professional but approachable, age 25-40\n- Confident, friendly expression\n- Simple/neutral background\\n\\n`;\n}\n\ntaskInstructions += `### ${hasCustomScript && (hasCustomAvatarUrl || hasCustomAvatar) ? '2' : hasCustomScript ? '3' : (hasCustomAvatarUrl || hasCustomAvatar) ? '3' : '4'}. CAPTION\nWrite a social media caption (under 150 chars) + include the hashtags.`;\n\n// Build response format\nlet formatObj = {};\nif (!hasCustomScript) formatObj.audio_script = \"full voiceover script here\";\nformatObj.slides = [\n  { slide_number: 1, image_prompt: \"detailed prompt...\", display_text: \"HEADLINE\" },\n  { slide_number: 2, image_prompt: \"...\", display_text: \"...\" }\n];\nif (!hasCustomAvatarUrl && !hasCustomAvatar) formatObj.avatar_prompt = \"detailed avatar prompt\";\nformatObj.caption = \"caption with hashtags\";\nformatObj.content_theme = \"2-3 word theme\";\nformatObj.language = \"en or es\";\n\nconst responseFormat = JSON.stringify(formatObj, null, 2).replace(/\\n/g, '\\\\n');\n\nconst prompt = `You are a world-class presentation designer who creates slides that rival Pitch.com, Apple Keynotes, and top-tier agency decks.\n\n## CONTENT BRIEF:\n- Topic: ${config.topic}\n- Brand: ${config.brand_name}\n- Target Audience: ${config.target_audience}\n- Content Intention: ${config.intention.toUpperCase()}\n- Hashtags: ${config.trending_hashtags}\n${hasCustomScript ? `- CUSTOM SCRIPT PROVIDED: \"${config.custom_script}\"` : ''}\n${hasCustomAvatar ? `- CUSTOM AVATAR DESCRIPTION: ${config.custom_avatar_description}` : ''}\n${hasCustomAvatarUrl ? `- CUSTOM AVATAR IMAGE PROVIDED (no avatar prompt needed)` : ''}\n\n## INTENTION GUIDE:\n${intentionGuides[config.intention] || intentionGuides.informative}\n\n## SLIDE DESIGN SYSTEM (CRITICAL):\nYou are creating prompts for an AI image generator. Each slide must feel like it belongs in a $50,000 pitch deck.\n\n**Visual Style:**\n- Background: ${selectedStyle.background}\n- Typography: ${selectedStyle.text_color}\n- Accents: ${selectedStyle.accent}\n- Mood: ${selectedStyle.mood}\n- Layout: ${selectedStyle.layout}\n\n**Design Principles:**\n1. LESS IS MORE: Maximum 2-4 words per slide, huge and bold\n2. VISUAL HIERARCHY: One clear focal point per slide\n3. BREATHING ROOM: Generous margins and whitespace\n4. CONSISTENCY: Same visual language across all slides\n5. IMPACT: Each slide should work as a standalone image\n\n## YOUR TASK:\n${taskInstructions}\n\n## CRITICAL REQUIREMENTS FOR IMAGE PROMPTS:\nEvery slide prompt MUST include:\n1. \"16:9 aspect ratio, 1920x1080, landscape orientation\" (exact words)\n2. Specific hex color codes for backgrounds and accents\n3. Exact text to display in quotes (e.g., \"THINK BIGGER\")\n4. Text styling: \"large bold centered sans-serif text\"\n5. Composition details: where elements are positioned\n6. Quality markers: \"high resolution, professional design, premium aesthetic\"\n\nExample prompt format:\n\"16:9 aspect ratio, 1920x1080, landscape orientation. Rich gradient background from deep navy #0a1628 to charcoal #1a1a2e. Large bold white centered sans-serif text reading 'THINK BIGGER' with subtle electric blue #00d4ff glow effect. Generous whitespace, minimal composition, premium tech keynote aesthetic, high resolution.\"\n\n## OUTPUT FORMAT:\nRespond ONLY with valid JSON (no markdown, no code blocks):\n${responseFormat}`;\n\nreturn [{\n  json: {\n    ...config,\n    claude_prompt: prompt,\n    slide_style_config: selectedStyle,\n    seconds_per_slide: secondsPerSlide,\n    estimated_slides: estimatedSlides,\n    has_custom_avatar: hasCustomAvatar,\n    has_custom_avatar_url: hasCustomAvatarUrl,\n    has_custom_script: hasCustomScript\n  }\n}];"},"typeVersion":2},{"id":"fae078a0-d3f9-4325-94f9-fa9483821ddc","name":"🤖 Claude: Generate Content","type":"n8n-nodes-base.httpRequest","position":[-7968,1152],"parameters":{"url":"https://api.anthropic.com/v1/messages","method":"POST","options":{},"jsonBody":"={\n  \"model\": \"claude-sonnet-4-20250514\",\n  \"max_tokens\": 3000,\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": {{ JSON.stringify($json.claude_prompt) }}\n    }\n  ]\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"x-api-key","value":"={{ $json.anthropic_api_key }}"},{"name":"anthropic-version","value":"2023-06-01"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.3},{"id":"cd6f7651-edc4-49d1-9116-6ef00097a95b","name":"📋 Parse Claude Response","type":"n8n-nodes-base.code","position":[-7728,1152],"parameters":{"jsCode":"const item = $input.first();\nconst claudeResponse = item.json;\nconst config = $('🧠 Build Claude Prompt').item.json;\n\nlet responseText = '';\nif (claudeResponse.content && claudeResponse.content[0]) {\n  responseText = claudeResponse.content[0].text;\n}\n\nlet parsed = {};\ntry {\n  let cleanText = responseText.trim();\n  if (cleanText.startsWith('```json')) {\n    cleanText = cleanText.replace(/```json\\n?/, '').replace(/\\n?```$/, '');\n  } else if (cleanText.startsWith('```')) {\n    cleanText = cleanText.replace(/```\\n?/, '').replace(/\\n?```$/, '');\n  }\n  parsed = JSON.parse(cleanText.trim());\n} catch (e) {\n  // Fallback content\n  const defaultSlides = [];\n  const slideTexts = [\"AI REVOLUTION\", \"FASTER RESULTS\", \"SMARTER WORK\", \"YOUR EDGE\", \"START NOW\"];\n  for (let i = 0; i < 5; i++) {\n    defaultSlides.push({\n      slide_number: i + 1,\n      image_prompt: `16:9 aspect ratio, 1920x1080, landscape orientation. Rich gradient background from deep navy #0a1628 to charcoal #1a1a2e. Large bold white centered sans-serif text reading \"${slideTexts[i]}\" with subtle blue glow. Premium tech aesthetic, high resolution.`,\n      display_text: slideTexts[i]\n    });\n  }\n  \n  parsed = {\n    audio_script: \"AI is revolutionizing how we work. What once took hours now takes minutes. From content to analysis, the possibilities are endless. Are you ready to embrace the future?\",\n    slides: defaultSlides,\n    avatar_prompt: \"Photorealistic portrait of a confident tech professional in their early 30s, wearing smart casual clothing, warm friendly smile, direct eye contact, soft neutral background, high quality portrait photography\",\n    caption: \"AI is changing everything. Are you ready? #AIvideo #ContentCreation\",\n    content_theme: \"AI Transformation\",\n    language: \"en\"\n  };\n}\n\n// Voice selection\nconst voiceMap = {\n  \"cristina\": \"CaJslL1xziwefCeTNzHv\",\n  \"enrique\": \"iDEmt5MnqUotdwCIVplo\",\n  \"susie\": \"gPe4h2IS1C7XHbnizzFa\",\n  \"jeff\": \"gs0tAILXbY5DNrJrsM6F\",\n  \"custom\": \"YOUR_VOICE_CLONE_ID\"\n};\n\nconst voiceSelection = (config.voice_selection || 'susie').toLowerCase().trim();\nconst selectedVoiceId = voiceMap[voiceSelection] || voiceMap['susie'];\n\nlet language = (parsed.language || 'en').toLowerCase().substring(0, 2);\nif (voiceSelection === 'cristina' || voiceSelection === 'enrique') {\n  language = 'es';\n}\n\n// Handle avatar prompt\nlet avatarPrompt = '';\nif (config.has_custom_avatar_url) {\n  avatarPrompt = '';\n} else if (config.has_custom_avatar) {\n  avatarPrompt = `Photorealistic portrait photo of ${config.custom_avatar_description}. Head and shoulders framing, looking directly at camera, natural confident expression, high quality, portrait orientation, professional lighting, 4K quality.`;\n} else if (parsed.avatar_prompt) {\n  avatarPrompt = parsed.avatar_prompt;\n} else {\n  avatarPrompt = \"Photorealistic portrait of a confident professional in their early 30s, smart casual attire, warm smile, direct eye contact, soft neutral background, high quality portrait\";\n}\n\n// Handle script\nlet finalScript = '';\nif (config.has_custom_script) {\n  finalScript = config.custom_script.trim();\n} else if (parsed.audio_script) {\n  finalScript = parsed.audio_script;\n} else {\n  finalScript = \"AI is revolutionizing content creation. What once took hours now takes minutes. Are you ready to embrace the future?\";\n}\n\n// Calculate estimated duration from script (approx 2.5 words per second)\nconst wordCount = finalScript.split(/\\s+/).length;\nconst estimatedDuration = Math.ceil(wordCount / 2.5) + 2; // Add 2 seconds buffer\nconst secondsPerSlide = config.seconds_per_slide || 6;\n\n// Get slides from Claude response - use all slides it generated\nlet slides = parsed.slides || [];\n\n// If no slides, create defaults based on estimated duration\nif (slides.length === 0) {\n  const numSlides = Math.max(3, Math.ceil(estimatedDuration / secondsPerSlide));\n  const defaultTexts = [\"TRANSFORM\", \"ACCELERATE\", \"INNOVATE\", \"SCALE\", \"SUCCEED\", \"LEAD\", \"GROW\", \"WIN\"];\n  for (let i = 0; i < numSlides; i++) {\n    slides.push({\n      slide_number: i + 1,\n      image_prompt: `16:9 aspect ratio, 1920x1080, landscape orientation. Rich gradient background from deep navy #0a1628 to charcoal #1a1a2e. Large bold white centered sans-serif text reading \"${defaultTexts[i % defaultTexts.length]}\" with subtle blue glow. Premium aesthetic.`,\n      display_text: defaultTexts[i % defaultTexts.length]\n    });\n  }\n}\n\nconst numSlides = slides.length;\nconst durationPerSlide = estimatedDuration / numSlides;\n\n// Determine background type\nconst bgConfig = config.background;\nlet backgroundType = 'none';\nlet backgroundValue = null;\n\nif (bgConfig) {\n  if (typeof bgConfig === 'string' && bgConfig.trim() !== '') {\n    // It's a URL\n    backgroundType = 'url';\n    backgroundValue = bgConfig.trim();\n  } else if (Array.isArray(bgConfig) && bgConfig.length > 0) {\n    // It's a gradient array\n    backgroundType = 'gradient';\n    backgroundValue = bgConfig;\n  }\n}\n\nreturn [{\n  json: {\n    // Config passthrough\n    topic: config.topic,\n    intention: config.intention,\n    brand_name: config.brand_name,\n    target_audience: config.target_audience,\n    trending_hashtags: config.trending_hashtags,\n    slide_style: config.slide_style,\n    video_resolution: config.video_resolution,\n    \n    // Calculated values\n    num_slides: numSlides,\n    estimated_duration: estimatedDuration,\n    duration_per_slide: durationPerSlide,\n    script_word_count: wordCount,\n    \n    // API keys\n    anthropic_api_key: config.anthropic_api_key,\n    openai_api_key: config.openai_api_key,\n    elevenlabs_api_key: config.elevenlabs_api_key,\n    creatomate_api_key: config.creatomate_api_key,\n    fal_api_key: config.fal_api_key,\n    \n    // Background config\n    background_type: backgroundType,\n    background_value: backgroundValue,\n    \n    // Generated content\n    script_audio: finalScript,\n    avatar_prompt: avatarPrompt,\n    slides: slides,\n    caption: parsed.caption || \"Check out this AI-generated video! #AIvideo #ContentCreation\",\n    content_theme: parsed.content_theme || \"AI Innovation\",\n    language: language,\n    voice_selection: voiceSelection,\n    voice_id: selectedVoiceId,\n    \n    // Avatar handling flags\n    has_custom_avatar_url: config.has_custom_avatar_url,\n    custom_avatar_image_url: config.custom_avatar_image_url || ''\n  }\n}];"},"typeVersion":2},{"id":"f25fcb40-3760-497f-a1eb-b97ce2153c75","name":"🔀 Split into Flows","type":"n8n-nodes-base.code","position":[-7488,1152],"parameters":{"jsCode":"// Split into two parallel flows:\n// Flow A: Avatar (image → audio → VEED)\n// Flow B: Slides (Nanobanana)\n\nconst data = $input.first().json;\n\nreturn [\n  {\n    json: {\n      ...data,\n      flow: 'avatar'\n    }\n  },\n  {\n    json: {\n      ...data,\n      flow: 'slides'\n    }\n  }\n];"},"typeVersion":2},{"id":"b3311e20-c60a-4861-831f-06dabea2e736","name":"🔀 Avatar Flow?","type":"n8n-nodes-base.if","position":[-7248,992],"parameters":{"options":{},"conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"loose"},"combinator":"and","conditions":[{"id":"flow-avatar-check","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.flow }}","rightValue":"avatar"}]}},"typeVersion":2},{"id":"aa0d9826-2a31-4925-96a5-a1d30ad24ffc","name":"🔀 Slides Flow?","type":"n8n-nodes-base.if","position":[-7248,1280],"parameters":{"options":{},"conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"loose"},"combinator":"and","conditions":[{"id":"flow-slides-check","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.flow }}","rightValue":"slides"}]}},"typeVersion":2},{"id":"8a9d78e0-6705-47df-87f7-2411678ad536","name":"🖼️ Has Custom Avatar URL?","type":"n8n-nodes-base.if","position":[-7008,976],"parameters":{"options":{},"conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"loose"},"combinator":"and","conditions":[{"id":"has-avatar-url","operator":{"type":"boolean","operation":"equals"},"leftValue":"={{ $json.has_custom_avatar_url }}","rightValue":true}]}},"typeVersion":2},{"id":"cddbac85-2a6c-4193-bfc0-2f730eeeec81","name":"📸 Use Custom Avatar URL","type":"n8n-nodes-base.code","position":[-6768,880],"parameters":{"jsCode":"const data = $input.first().json;\nreturn [{\n  json: {\n    ...data,\n    avatar_image_url: data.custom_avatar_image_url\n  }\n}];"},"typeVersion":2},{"id":"41801caa-a26a-4947-9e30-5922655eda29","name":"🎨 Generate Avatar (OpenAI)","type":"n8n-nodes-base.httpRequest","position":[-6768,1040],"parameters":{"url":"https://api.openai.com/v1/images/generations","method":"POST","options":{},"jsonBody":"={\n  \"model\": \"gpt-image-1\",\n  \"prompt\": {{ JSON.stringify($json.avatar_prompt) }},\n  \"n\": 1,\n  \"size\": \"1024x1536\",\n  \"quality\": \"high\"\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"=Bearer {{ $json.openai_api_key }}"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.3},{"id":"7d238092-fd81-4a27-95c3-d98546231e5b","name":"📸 Extract Avatar Image","type":"n8n-nodes-base.code","position":[-6528,1040],"parameters":{"jsCode":"const item = $input.first();\nconst imageResponse = item.json;\nconst previousData = $('🖼️ Has Custom Avatar URL?').item.json;\n\nlet imageBase64 = '';\nif (imageResponse.data && imageResponse.data[0] && imageResponse.data[0].b64_json) {\n  imageBase64 = imageResponse.data[0].b64_json;\n}\n\nif (!imageBase64) {\n  throw new Error('No base64 image data received from OpenAI');\n}\n\nreturn [{\n  json: {\n    ...previousData\n  },\n  binary: {\n    avatar_image: {\n      data: imageBase64,\n      mimeType: 'image/png',\n      fileName: 'avatar.png'\n    }\n  }\n}];"},"typeVersion":2},{"id":"295f2711-5cae-43d3-9a08-22b1361d8e69","name":"☁️ Upload Avatar Image","type":"n8n-nodes-base.httpRequest","position":[-6288,1040],"parameters":{"url":"https://tmpfiles.org/api/v1/upload","method":"POST","options":{"response":{"response":{"responseFormat":"json"}}},"sendBody":true,"contentType":"multipart-form-data","bodyParameters":{"parameters":[{"name":"file","parameterType":"formBinaryData","inputDataFieldName":"avatar_image"}]}},"typeVersion":4.3},{"id":"14792c9c-7d3a-4c0c-b625-d02f33b2b042","name":"💾 Store Avatar URL","type":"n8n-nodes-base.code","position":[-6048,1040],"parameters":{"jsCode":"const uploadResponse = $input.first().json;\nconst previousData = $('📸 Extract Avatar Image').item.json;\n\nconst avatarImageUrl = uploadResponse.data.url.replace(\n  /^http:\\/\\/tmpfiles\\.org\\/(\\d+)\\/(.*)$/i,\n  'https://tmpfiles.org/dl/$1/$2'\n);\n\nreturn [{\n  json: {\n    ...previousData,\n    avatar_image_url: avatarImageUrl\n  }\n}];"},"typeVersion":2},{"id":"c4117185-27de-451a-9c95-25b79e10719f","name":"🔊 Generate Audio (ElevenLabs)","type":"n8n-nodes-base.httpRequest","position":[-5808,880],"parameters":{"url":"=https://api.elevenlabs.io/v1/text-to-speech/{{ $json.voice_id }}","method":"POST","options":{"response":{"response":{"responseFormat":"file","outputPropertyName":"audio"}}},"jsonBody":"={\n  \"text\": {{ JSON.stringify($json.script_audio) }},\n  \"model_id\": \"eleven_multilingual_v2\",\n  \"voice_settings\": {\n    \"stability\": 0.5,\n    \"similarity_boost\": 0.75,\n    \"style\": 0.0,\n    \"use_speaker_boost\": true\n  }\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"xi-api-key","value":"={{ $json.elevenlabs_api_key }}"},{"name":"Content-Type","value":"application/json"},{"name":"Accept","value":"audio/mpeg"}]}},"typeVersion":4.3},{"id":"9d065c26-bc23-424e-ae5c-68b57923beeb","name":"🎵 Convert Audio","type":"n8n-nodes-base.code","position":[-5568,880],"parameters":{"jsCode":"// Get previous data from whichever avatar path we came from\nlet previousData;\ntry {\n  previousData = $('💾 Store Avatar URL').item.json;\n} catch (e) {\n  try {\n    previousData = $('📸 Use Custom Avatar URL').item.json;\n  } catch (e2) {\n    previousData = $('🖼️ Has Custom Avatar URL?').item.json;\n  }\n}\n\nreturn items.map(item => {\n  const b = item.binary?.audio;\n  if (!b) return item;\n\n  item.json = { ...previousData };\n  item.binary.audio_mp3 = {\n    ...b,\n    fileName: 'voiceover.mp3',\n    mimeType: 'audio/mpeg'\n  };\n\n  return item;\n});"},"typeVersion":2},{"id":"72856d5c-9ea4-400c-b09b-2cf8b275c868","name":"☁️ Upload Audio","type":"n8n-nodes-base.httpRequest","position":[-5328,880],"parameters":{"url":"https://tmpfiles.org/api/v1/upload","method":"POST","options":{"response":{"response":{"responseFormat":"json"}}},"sendBody":true,"contentType":"multipart-form-data","bodyParameters":{"parameters":[{"name":"file","parameterType":"formBinaryData","inputDataFieldName":"audio_mp3"}]}},"typeVersion":4.3},{"id":"393b9768-cd46-4d09-836b-3a0e560eb1f7","name":"💾 Store Audio URL","type":"n8n-nodes-base.code","position":[-5088,880],"parameters":{"jsCode":"const uploadResponse = $input.first().json;\nconst previousData = $('🎵 Convert Audio').item.json;\n\nconst audioUrl = uploadResponse.data.url.replace(\n  /^http:\\/\\/tmpfiles\\.org\\/(\\d+)\\/(.*)$/i,\n  'https://tmpfiles.org/dl/$1/$2'\n);\n\nreturn [{\n  json: {\n    ...previousData,\n    audio_url: audioUrl\n  }\n}];"},"typeVersion":2},{"id":"be454543-e697-4a13-bfd5-f08973299a79","name":"🎬 Generate Talking Head (VEED)","type":"n8n-nodes-veed.veed","position":[-4848,880],"parameters":{"options":{"timeout":60},"audioUrl":"={{ $json.audio_url }}","imageUrl":"={{ $json.avatar_image_url }}","resolution":"={{ $json.video_resolution }}","aspectRatio":"9:16"},"typeVersion":1},{"id":"9473479f-59dd-47f0-b8c6-69e2954c506b","name":"📹 Extract VEED Video URL","type":"n8n-nodes-base.code","position":[-4608,880],"parameters":{"jsCode":"const veedResult = $input.first().json;\nconst previousData = $('💾 Store Audio URL').item.json;\n\nlet videoUrl = '';\nif (veedResult.video && veedResult.video.url) {\n  videoUrl = veedResult.video.url;\n} else if (veedResult.output && veedResult.output.video_url) {\n  videoUrl = veedResult.output.video_url;\n} else if (veedResult.videoUrl) {\n  videoUrl = veedResult.videoUrl;\n} else if (veedResult.url) {\n  videoUrl = veedResult.url;\n}\n\nreturn [{\n  json: {\n    ...previousData,\n    avatar_video_url: videoUrl,\n    asset_type: 'avatar_video'\n  }\n}];"},"typeVersion":2},{"id":"11339015-c5f7-4ca3-ab9c-2442cb776d2d","name":"📑 Expand Slides","type":"n8n-nodes-base.code","position":[-7008,1264],"parameters":{"jsCode":"// Expand slides into individual items for parallel generation\nconst data = $input.first().json;\nconst slides = data.slides || [];\n\nreturn slides.map((slide, index) => ({\n  json: {\n    ...data,\n    current_slide: slide,\n    slide_index: index\n  }\n}));"},"typeVersion":2},{"id":"17b296a6-06a4-4278-8d2a-7e51041a3c02","name":"🖼️ Generate Slide (FAL)","type":"n8n-nodes-base.httpRequest","position":[-6768,1264],"parameters":{"url":"https://fal.run/fal-ai/flux-pro/v1.1","method":"POST","options":{"batching":{"batch":{"batchSize":1}},"response":{"response":{}}},"jsonBody":"={\n  \"prompt\": {{ JSON.stringify($json.current_slide.image_prompt) }},\n  \"image_size\": {\n    \"width\": 1920,\n    \"height\": 1080\n  },\n  \"num_images\": 1,\n  \"safety_tolerance\": \"5\"\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"},{"name":"Authorization","value":"=Key {{ $json.fal_api_key }}"}]}},"typeVersion":4.3},{"id":"6ae783dd-ec4f-4e56-8df4-23131f91c374","name":"📸 Extract Slide URL","type":"n8n-nodes-base.code","position":[-6528,1264],"parameters":{"jsCode":"// Process ALL FAL responses and extract URLs\nconst items = $input.all();\nconst expandedItems = $('📑 Expand Slides').all();\n\nconst results = [];\n\nfor (let i = 0; i < items.length; i++) {\n  const falResponse = items[i].json;\n  const slideData = expandedItems[i]?.json || {};\n  \n  // FAL returns the image URL in the response\n  let slideImageUrl = '';\n  \n  if (falResponse.images && falResponse.images[0]) {\n    slideImageUrl = falResponse.images[0].url;\n  } else if (falResponse.image && falResponse.image.url) {\n    slideImageUrl = falResponse.image.url;\n  } else if (falResponse.output && falResponse.output[0]) {\n    slideImageUrl = falResponse.output[0];\n  }\n  \n  if (!slideImageUrl) {\n    throw new Error('No image URL received from FAL for slide ' + i + '. Response: ' + JSON.stringify(falResponse).substring(0, 500));\n  }\n  \n  results.push({\n    json: {\n      slide_index: slideData.slide_index,\n      slide_image_url: slideImageUrl,\n      slide_data: slideData.current_slide,\n      duration_seconds: slideData.current_slide?.duration_seconds || slideData.seconds_per_slide || 9,\n      asset_type: 'slide'\n    }\n  });\n}\n\nreturn results;"},"typeVersion":2},{"id":"6dbce0fa-fed1-49ef-b493-5596edcbb66f","name":"📚 Aggregate Slides","type":"n8n-nodes-base.aggregate","position":[-6288,1264],"parameters":{"options":{},"aggregate":"aggregateAllItemData","destinationFieldName":"all_slides_data"},"typeVersion":1},{"id":"077c1515-7115-4b97-8cb8-ae81bda24f49","name":"📊 Format Slides","type":"n8n-nodes-base.code","position":[-6048,1264],"parameters":{"jsCode":"// Process aggregated slides into final format\nconst aggregatedData = $input.first().json;\nconst allSlides = aggregatedData.all_slides_data || [];\n\n// Sort slides by index\nconst sortedSlides = allSlides\n  .sort((a, b) => (a.slide_index || 0) - (b.slide_index || 0))\n  .map(slide => ({\n    slide_index: slide.slide_index,\n    slide_image_url: slide.slide_image_url,\n    slide_data: slide.slide_data,\n    duration_seconds: slide.duration_seconds\n  }));\n\nreturn [{\n  json: {\n    slides_with_urls: sortedSlides,\n    asset_type: 'all_slides'\n  }\n}];"},"typeVersion":2},{"id":"cdf6652a-af63-4b25-8a80-cd3a24abf401","name":"🔗 Merge Avatar + Slides","type":"n8n-nodes-base.merge","position":[-4336,1248],"parameters":{"mode":"combine","options":{},"combineBy":"combineAll"},"typeVersion":3},{"id":"81a456a0-c159-49c4-921d-b0f7f4f56989","name":"📦 Prepare Creatomate Request","type":"n8n-nodes-base.code","position":[-4096,1248],"parameters":{"jsCode":"// Combine avatar video and slides for Creatomate RenderScript\nconst items = $input.all();\n\nlet avatarVideoUrl = '';\nlet slidesWithUrls = [];\nlet baseData = {};\n\nfor (const item of items) {\n  const data = item.json;\n  \n  if (data.avatar_video_url && data.avatar_video_url !== '') {\n    avatarVideoUrl = data.avatar_video_url;\n    baseData = data;\n  }\n  \n  if (data.slides_with_urls && Array.isArray(data.slides_with_urls) && data.slides_with_urls.length > 0) {\n    slidesWithUrls = data.slides_with_urls;\n  }\n}\n\n// Use estimated_duration from script calculation\nconst totalDuration = baseData.estimated_duration || 30;\nconst numSlides = slidesWithUrls.length || 1;\nconst durationPerSlide = totalDuration / numSlides;\n\n// Build slide elements\nconst slideElements = slidesWithUrls.map((slide, index) => {\n  const element = {\n    type: 'image',\n    track: 1,\n    source: slide.slide_image_url,\n    duration: durationPerSlide,\n    fit: 'cover'\n  };\n  \n  if (index > 0) {\n    element.animations = [\n      {\n        time: 0,\n        duration: 0.5,\n        transition: true,\n        type: 'fade'\n      }\n    ];\n  }\n  \n  return element;\n});\n\n// Build the complete Creatomate elements array based on background type\nconst creatomateElements = [];\nconst backgroundType = baseData.background_type || 'none';\nconst backgroundValue = baseData.background_value;\nconst hasBackground = backgroundType !== 'none';\n\nif (backgroundType === 'gradient' && Array.isArray(backgroundValue)) {\n  // Gradient background\n  const colors = backgroundValue;\n  const colorStops = [];\n  for (let i = 0; i < Math.min(colors.length, 5); i++) {\n    colorStops.push({\n      offset: `${Math.round((i / (Math.min(colors.length, 5) - 1)) * 100)}%`,\n      color: colors[i]\n    });\n  }\n  \n  creatomateElements.push({\n    type: 'shape',\n    track: 1,\n    time: 0,\n    duration: totalDuration,\n    width: '100%',\n    height: '100%',\n    fill_color: colorStops,\n    fill_mode: 'linear',\n    fill_x0: '0%',\n    fill_y0: '0%',\n    fill_x1: '100%',\n    fill_y1: '100%'\n  });\n} else if (backgroundType === 'url' && backgroundValue) {\n  // Image URL background\n  creatomateElements.push({\n    type: 'image',\n    track: 1,\n    time: 0,\n    duration: totalDuration,\n    source: backgroundValue,\n    width: '100%',\n    height: '100%',\n    fit: 'cover'\n  });\n}\n\nif (hasBackground) {\n  // With background - add margins and rounded corners\n  creatomateElements.push({\n    type: 'composition',\n    track: 2,\n    time: 0,\n    duration: totalDuration,\n    x: '2%',\n    y: '50%',\n    width: '74%',\n    height: '96%',\n    x_anchor: '0%',\n    y_anchor: '50%',\n    border_radius: '12px',\n    clip: true,\n    elements: slideElements\n  });\n  \n  creatomateElements.push({\n    type: 'video',\n    track: 3,\n    time: 0,\n    source: avatarVideoUrl,\n    x: '98%',\n    y: '50%',\n    width: '20%',\n    height: '96%',\n    x_anchor: '100%',\n    y_anchor: '50%',\n    border_radius: '12px',\n    fit: 'cover'\n  });\n} else {\n  // No background - full bleed layout\n  creatomateElements.push({\n    type: 'composition',\n    track: 1,\n    time: 0,\n    duration: totalDuration,\n    x: '0%',\n    y: '50%',\n    width: '78%',\n    height: '100%',\n    x_anchor: '0%',\n    y_anchor: '50%',\n    clip: true,\n    elements: slideElements\n  });\n  \n  creatomateElements.push({\n    type: 'video',\n    track: 2,\n    time: 0,\n    source: avatarVideoUrl,\n    x: '100%',\n    y: '50%',\n    width: '22%',\n    height: '100%',\n    x_anchor: '100%',\n    y_anchor: '50%',\n    fit: 'cover'\n  });\n}\n\nreturn [{\n  json: {\n    ...baseData,\n    avatar_video_url: avatarVideoUrl,\n    slides_with_urls: slidesWithUrls,\n    slide_elements: slideElements,\n    creatomate_elements: creatomateElements,\n    total_duration: totalDuration,\n    duration_per_slide: durationPerSlide,\n    num_slides: numSlides,\n    has_background: hasBackground,\n    background_type: backgroundType\n  }\n}];"},"typeVersion":2},{"id":"ccad00db-4d1d-41a5-b8cc-97b5f87feba4","name":"🎬 Render Video (Creatomate)","type":"n8n-nodes-base.httpRequest","position":[-3856,1248],"parameters":{"url":"https://api.creatomate.com/v2/renders","method":"POST","options":{},"jsonBody":"={\n  \"output_format\": \"mp4\",\n  \"width\": 1920,\n  \"height\": 1080,\n  \"frame_rate\": 60,\n  \"h264_profile\": \"high\",\n  \"h264_level\": \"5.2\",\n  \"pixel_format\": \"yuv420p\",\n  \"h264_crf\": 18,\n  \"elements\": {{ JSON.stringify($json.creatomate_elements) }}\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"=Bearer {{ $json.creatomate_api_key }}"},{"name":"Content-Type","value":"application/json"}]}},"typeVersion":4.3},{"id":"4191f759-8483-4afc-858c-b90a2708faed","name":"📊 Extract Render Info","type":"n8n-nodes-base.code","position":[-3616,1248],"parameters":{"jsCode":"const renderResponse = $input.first().json;\nconst previousData = $('📦 Prepare Creatomate Request').item.json;\n\nlet renderId = '';\nlet renderUrl = '';\nlet status = 'pending';\n\nif (Array.isArray(renderResponse)) {\n  renderId = renderResponse[0]?.id || '';\n  renderUrl = renderResponse[0]?.url || '';\n  status = renderResponse[0]?.status || 'pending';\n} else {\n  renderId = renderResponse.id || '';\n  renderUrl = renderResponse.url || '';\n  status = renderResponse.status || 'pending';\n}\n\nreturn [{\n  json: {\n    ...previousData,\n    render_id: renderId,\n    render_url: renderUrl,\n    render_status: status\n  }\n}];"},"typeVersion":2},{"id":"63117ee3-6093-476f-bc71-f04f03a5ace6","name":"⏳ Wait for Render","type":"n8n-nodes-base.wait","position":[-3376,1248],"webhookId":"wait-webhook-001","parameters":{"amount":30},"typeVersion":1.1},{"id":"fc9d27bf-161a-4c20-a69e-b57ab2de84a5","name":"🔍 Check Render Status","type":"n8n-nodes-base.httpRequest","position":[-3136,1248],"parameters":{"url":"=https://api.creatomate.com/v2/renders/{{ $json.render_id }}","options":{},"sendHeaders":true,"headerParameters":{"parameters":[{"name":"Authorization","value":"=Bearer {{ $('📦 Prepare Creatomate Request').item.json.creatomate_api_key }}"}]}},"typeVersion":4.3},{"id":"9453860e-bd09-4c49-aadd-3fd0265a322f","name":"📋 Process Status","type":"n8n-nodes-base.code","position":[-2896,1248],"parameters":{"jsCode":"const statusResponse = $input.first().json;\nconst previousData = $('📊 Extract Render Info').item.json;\n\nconst status = statusResponse.status || 'pending';\nconst finalUrl = statusResponse.url || '';\n\nreturn [{\n  json: {\n    ...previousData,\n    render_status: status,\n    final_video_url: finalUrl\n  }\n}];"},"typeVersion":2},{"id":"1a4cd2af-d41d-45e4-8919-f7cc2ebd9dc1","name":"✅ Render Done?","type":"n8n-nodes-base.if","position":[-2656,1248],"parameters":{"options":{},"conditions":{"options":{"leftValue":"","caseSensitive":true,"typeValidation":"loose"},"combinator":"and","conditions":[{"id":"render-done","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.render_status }}","rightValue":"succeeded"}]}},"typeVersion":2},{"id":"f187bbfe-113e-401f-afe8-1b3b3b97c43b","name":"⬇️ Download Final Video","type":"n8n-nodes-base.httpRequest","position":[-2400,1232],"parameters":{"url":"={{ $json.final_video_url }}","options":{"response":{"response":{"responseFormat":"file"}}}},"typeVersion":4.3},{"id":"8ce985b7-d611-432a-aa89-8d1c8dd765e6","name":"📤 Upload to Drive","type":"n8n-nodes-base.googleDrive","position":[-2160,1232],"parameters":{"name":"={{ $('📋 Process Status').item.json.topic.replace(/\\s+/g, '_').substring(0, 30) }}_screen_{{ Date.now() }}.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":"url","value":"YOUR_GOOGLE_DRIVE_FOLDER_URL"}},"typeVersion":3},{"id":"1e069bb5-bff6-466e-a1ff-c78c1dc66733","name":"✅ Prepare Final Data","type":"n8n-nodes-base.code","position":[-1920,1232],"parameters":{"jsCode":"const driveResult = $input.first().json;\nconst prevData = $('📋 Process Status').item.json;\n\nconst driveFileUrl = driveResult.webViewLink || \n  `https://drive.google.com/file/d/${driveResult.id}/view`;\n\nreturn [{\n  json: {\n    success: true,\n    message: \"Screen recording video generated successfully!\",\n    video_url: driveFileUrl,\n    topic: prevData.topic,\n    intention: prevData.intention,\n    brand_name: prevData.brand_name,\n    slide_style: prevData.slide_style,\n    caption: prevData.caption,\n    script: prevData.script_audio,\n    content_theme: prevData.content_theme,\n    language: prevData.language,\n    num_slides: prevData.num_slides,\n    avatar_video_url: prevData.avatar_video_url,\n    audio_url: prevData.audio_url,\n    status: \"done\",\n    created_at: new Date().toISOString()\n  }\n}];"},"typeVersion":2},{"id":"74c77f17-0d7e-4d51-a8ee-d8e5604055c1","name":"📝 Log to Sheets","type":"n8n-nodes-base.googleSheets","position":[-1680,1232],"parameters":{"columns":{"value":{},"schema":[],"mappingMode":"autoMapInputData","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"name","value":"Sheet1"},"documentId":{"__rl":true,"mode":"url","value":"YOUR_GOOGLE_SHEETS_URL"}},"typeVersion":4.7},{"id":"6db7cf56-8872-47a8-858a-4b5a2b176769","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-9184,832],"parameters":{"color":5,"width":420,"height":860,"content":"## How it works\n\nThis workflow generates professional screencast-style videos with a talking head avatar and AI-generated slides.\n\n1. You provide a topic and configure your preferences\n2. Claude writes a script and designs slide content\n3. Two parallel processes run:\n   - **Avatar path**: Generates an avatar image, creates voiceover audio with ElevenLabs, then uses VEED to create a lip-synced talking head video\n   - **Slides path**: Creates 5-7 presentation slides using FAL Flux Pro\n4. Creatomate composites everything: slides as the main background with the avatar in a picture-in-picture overlay\n5. Final video uploads to Google Drive and logs to Sheets\n\n## Setup steps\n\n1. Add your API keys in the Configuration node:\n   - Anthropic (Claude) - for script generation\n   - OpenAI - for avatar image generation\n   - ElevenLabs - for voice synthesis\n   - FAL.ai - for slide image generation\n   - Creatomate - for video composition\n\n2. Set up n8n credentials:\n   - Google Drive (OAuth2) - for video storage\n   - Google Sheets (OAuth2) - for logging results\n\n3. Update the Google Drive folder URL and Google Sheets URL in the output nodes\n\n4. Configure your content: topic, brand name, target audience, and slide style"},"typeVersion":1},{"id":"37b73559-9cc9-49dc-bf8a-3c9dae26eec3","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-5808,608],"parameters":{"color":4,"width":224,"height":256,"content":"### Avatar and audio generation\n\nThis branch creates the talking head presenter.\n\nElevenLabs converts the script to natural speech, then VEED animates the avatar image to lip-sync with the audio. The result is a vertical video of a realistic presenter."},"typeVersion":1},{"id":"fa38ed6f-d9e5-4ffd-a739-f0fdb284b300","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-7248,1424],"parameters":{"color":4,"width":224,"height":256,"content":"### Slide image generation\n\nThis branch creates the presentation slides.\n\nFAL Flux Pro generates 5-7 high-quality images from Claude's prompts. Each slide is 16:9 landscape format with bold headline text and visual styling based on your chosen theme."},"typeVersion":1},{"id":"9ae4e28a-2b7f-4fb9-8cae-28393bd44e7e","name":"Section: Configuration","type":"n8n-nodes-base.stickyNote","position":[-8448,1056],"parameters":{"color":4,"width":236,"height":80,"content":"**1. Configuration** — Set your topic, API keys, voice, and slide style preferences"},"typeVersion":1},{"id":"4b31528d-dcb6-450f-a9fc-9804e53a98c0","name":"Section: AI Script","type":"n8n-nodes-base.stickyNote","position":[-7968,1040],"parameters":{"color":4,"width":236,"height":96,"content":"**2. AI script and slides** — Claude generates voiceover script, slide prompts, avatar description, and social caption"},"typeVersion":1},{"id":"86a87841-6473-4363-9412-28ce4897e212","name":"Section: Avatar Generation","type":"n8n-nodes-base.stickyNote","position":[-7248,880],"parameters":{"color":4,"width":228,"height":96,"content":"**3. Avatar generation** — Creates or uses custom avatar image via OpenAI, uploads to temporary storage"},"typeVersion":1},{"id":"37ba3125-7899-446b-815c-579a0a5d16ab","name":"Section: Talking Head","type":"n8n-nodes-base.stickyNote","position":[-4848,784],"parameters":{"color":4,"width":220,"height":80,"content":"**4. Talking head** — VEED creates lip-synced video from avatar and audio"},"typeVersion":1},{"id":"a9733add-34b7-4574-9bed-643417c1cb37","name":"Section: Video Composition","type":"n8n-nodes-base.stickyNote","position":[-4338,1120],"parameters":{"color":4,"width":230,"height":112,"content":"**5. Video composition** — Creatomate merges slides as background with talking head overlay, then polls until render completes"},"typeVersion":1},{"id":"9e1dd537-f219-411c-a4f5-6990adfb79d8","name":"Section: Output","type":"n8n-nodes-base.stickyNote","position":[-2400,1120],"parameters":{"color":4,"width":220,"height":96,"content":"**6. Output** — Downloads final video, uploads to Google Drive, and logs results to Google Sheets"},"typeVersion":1}],"active":false,"pinData":{},"settings":{"availableInMCP":false,"executionOrder":"v1"},"versionId":"599da7a0-78e2-4192-b44b-0d00ceed7302","connections":{"✅ Render Done?":{"main":[[{"node":"⬇️ Download Final Video","type":"main","index":0}],[{"node":"⏳ Wait for Render","type":"main","index":0}]]},"🔀 Avatar Flow?":{"main":[[{"node":"🖼️ Has Custom Avatar URL?","type":"main","index":0}]]},"🔀 Slides Flow?":{"main":[[{"node":"📑 Expand Slides","type":"main","index":0}]]},"🎵 Convert Audio":{"main":[[{"node":"☁️ Upload Audio","type":"main","index":0}]]},"📊 Format Slides":{"main":[[{"node":"🔗 Merge Avatar + Slides","type":"main","index":1}]]},"📑 Expand Slides":{"main":[[{"node":"🖼️ Generate Slide (FAL)","type":"main","index":0}]]},"⏳ Wait for Render":{"main":[[{"node":"🔍 Check Render Status","type":"main","index":0}]]},"☁️ Upload Audio":{"main":[[{"node":"💾 Store Audio URL","type":"main","index":0}]]},"📋 Process Status":{"main":[[{"node":"✅ Render Done?","type":"main","index":0}]]},"💾 Store Audio URL":{"main":[[{"node":"🎬 Generate Talking Head (VEED)","type":"main","index":0}]]},"📤 Upload to Drive":{"main":[[{"node":"✅ Prepare Final Data","type":"main","index":0}]]},"💾 Store Avatar URL":{"main":[[{"node":"🔊 Generate Audio (ElevenLabs)","type":"main","index":0}]]},"📚 Aggregate Slides":{"main":[[{"node":"📊 Format Slides","type":"main","index":0}]]},"🔀 Split into Flows":{"main":[[{"node":"🔀 Avatar Flow?","type":"main","index":0},{"node":"🔀 Slides Flow?","type":"main","index":0}]]},"✅ Prepare Final Data":{"main":[[{"node":"📝 Log to Sheets","type":"main","index":0}]]},"📸 Extract Slide URL":{"main":[[{"node":"📚 Aggregate Slides","type":"main","index":0}]]},"📊 Extract Render Info":{"main":[[{"node":"⏳ Wait for Render","type":"main","index":0}]]},"🔍 Check Render Status":{"main":[[{"node":"📋 Process Status","type":"main","index":0}]]},"🧠 Build Claude Prompt":{"main":[[{"node":"🤖 Claude: Generate Content","type":"main","index":0}]]},"📸 Extract Avatar Image":{"main":[[{"node":"☁️ Upload Avatar Image","type":"main","index":0}]]},"☁️ Upload Avatar Image":{"main":[[{"node":"💾 Store Avatar URL","type":"main","index":0}]]},"📋 Parse Claude Response":{"main":[[{"node":"🔀 Split into Flows","type":"main","index":0}]]},"📸 Use Custom Avatar URL":{"main":[[{"node":"🔊 Generate Audio (ElevenLabs)","type":"main","index":0}]]},"🔗 Merge Avatar + Slides":{"main":[[{"node":"📦 Prepare Creatomate Request","type":"main","index":0}]]},"⬇️ Download Final Video":{"main":[[{"node":"📤 Upload to Drive","type":"main","index":0}]]},"📹 Extract VEED Video URL":{"main":[[{"node":"🔗 Merge Avatar + Slides","type":"main","index":0}]]},"🖼️ Generate Slide (FAL)":{"main":[[{"node":"📸 Extract Slide URL","type":"main","index":0}]]},"⚙️ Workflow Configuration":{"main":[[{"node":"🧠 Build Claude Prompt","type":"main","index":0}]]},"🎨 Generate Avatar (OpenAI)":{"main":[[{"node":"📸 Extract Avatar Image","type":"main","index":0}]]},"🤖 Claude: Generate Content":{"main":[[{"node":"📋 Parse Claude Response","type":"main","index":0}]]},"🎬 Render Video (Creatomate)":{"main":[[{"node":"📊 Extract Render Info","type":"main","index":0}]]},"🖼️ Has Custom Avatar URL?":{"main":[[{"node":"📸 Use Custom Avatar URL","type":"main","index":0}],[{"node":"🎨 Generate Avatar (OpenAI)","type":"main","index":0}]]},"📦 Prepare Creatomate Request":{"main":[[{"node":"🎬 Render Video (Creatomate)","type":"main","index":0}]]},"When clicking 'Execute workflow'":{"main":[[{"node":"⚙️ Workflow Configuration","type":"main","index":0}]]},"🔊 Generate Audio (ElevenLabs)":{"main":[[{"node":"🎵 Convert Audio","type":"main","index":0}]]},"🎬 Generate Talking Head (VEED)":{"main":[[{"node":"📹 Extract VEED Video URL","type":"main","index":0}]]}}},"lastUpdatedBy":1,"workflowInfo":{"nodeCount":46,"nodeTypes":{"n8n-nodes-base.if":{"count":4},"n8n-nodes-base.code":{"count":17},"n8n-nodes-base.wait":{"count":1},"n8n-nodes-veed.veed":{"count":1},"n8n-nodes-base.merge":{"count":1},"n8n-nodes-base.aggregate":{"count":1},"n8n-nodes-base.stickyNote":{"count":9},"n8n-nodes-base.googleDrive":{"count":1},"n8n-nodes-base.httpRequest":{"count":9},"n8n-nodes-base.googleSheets":{"count":1},"n8n-nodes-base.manualTrigger":{"count":1}}},"status":"published","readyToDemo":null,"user":{"name":"VEED","username":"veed","bio":"VEED is an ai video creation platform used by 75% of Fortune 500 companies. Our N8N templates help marketers and creators to generate talking videos directly within their n8n workflows — unlocking use cases across marketing automation, personalized video generation, and content creation pipelines.","verified":true,"links":["www.veed.io"],"avatar":"https://gravatar.com/avatar/0f7f1db2a9431b2d05ff987882ad3c68629aec97e576012689032baf760700ae?r=pg&d=retro&size=200"},"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":24,"icon":"file:merge.svg","name":"n8n-nodes-base.merge","codex":{"data":{"alias":["Join","Concatenate","Wait"],"resources":{"generic":[{"url":"https://n8n.io/blog/how-to-sync-data-between-two-systems/","icon":"🏬","label":"How to synchronize data between two systems (one-way vs. two-way sync"},{"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/migrating-community-metrics-to-orbit-using-n8n/","icon":"📈","label":"Migrating Community Metrics to Orbit using n8n"},{"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/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/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.merge/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Flow","Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Merge"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="},"displayName":"Merge","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":838,"icon":"fa:mouse-pointer","name":"n8n-nodes-base.manualTrigger","codex":{"data":{"resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.manualworkflowtrigger/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0"}},"group":"[\"trigger\"]","defaults":{"name":"When clicking ‘Execute workflow’","color":"#909298"},"iconData":{"icon":"mouse-pointer","type":"icon"},"displayName":"Manual Trigger","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]},{"id":1236,"icon":"file:aggregate.svg","name":"n8n-nodes-base.aggregate","codex":{"data":{"alias":["Aggregate","Combine","Flatten","Transform","Array","List","Item"],"details":"","resources":{"generic":[],"primaryDocumentation":[{"url":"https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.aggregate/"}]},"categories":["Core Nodes"],"nodeVersion":"1.0","codexVersion":"1.0","subcategories":{"Core Nodes":["Data Transformation"]}}},"group":"[\"transform\"]","defaults":{"name":"Aggregate"},"iconData":{"type":"file","fileBuffer":"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJub25lIj48ZyBmaWxsPSIjRkY2RDVBIiBjbGlwLXBhdGg9InVybCgjYSkiPjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgZD0iTTMyIDE0OGMwLTYuNjI3IDUuMzczLTEyIDEyLTEyaDE0NmM2LjYyNyAwIDEyIDUuMzczIDEyIDEydjI0YzAgNi42MjctNS4zNzMgMTItMTIgMTJINDRjLTYuNjI3IDAtMTItNS4zNzMtMTItMTJ6bTAgOTZjMC02LjYyNyA1LjM3My0xMiAxMi0xMmgxNDZjNi42MjcgMCAxMiA1LjM3MyAxMiAxMnYyNGMwIDYuNjI3LTUuMzczIDEyLTEyIDEySDQ0Yy02LjYyNyAwLTEyLTUuMzczLTEyLTEyem0wIDk2YzAtNi42MjcgNS4zNzMtMTIgMTItMTJoMTQ2YzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MjRjMCA2LjYyNy01LjM3MyAxMi0xMiAxMkg0NGMtNi42MjcgMC0xMi01LjM3My0xMi0xMnoiIGNsaXAtcnVsZT0iZXZlbm9kZCIvPjxwYXRoIGQ9Ik03NCA3NmMwIDYuNjI3IDUuMzczIDEyIDEyIDEyaDExNi4yMTdjMTcuNjczIDAgMzIgMTQuMzI3IDMyIDMydjU2YzAgMjYuOTc4IDEwLjI3MiA1MS41NTcgMjcuMTE5IDcwLjAzOSA1LjA1NSA1LjU0NSA1LjA1NSAxNC4zNzcgMCAxOS45MjItMTYuODQ3IDE4LjQ4Mi0yNy4xMTkgNDMuMDYxLTI3LjExOSA3MC4wMzl2NTZjMCAxNy42NzMtMTQuMzI3IDMyLTMyIDMySDg2Yy02LjYyNyAwLTEyIDUuMzczLTEyIDEydjI0YzAgNi42MjcgNS4zNzMgMTIgMTIgMTJoMTE2LjIxN2M0NC4xODMgMCA4MC0zNS44MTcgODAtODB2LTU2YzAtMzAuOTI4IDI1LjA3Mi01NiA1Ni01NmE1Ljc4MyA1Ljc4MyAwIDAgMCA1Ljc4My01Ljc4M3YtMzYuNDM0YTUuNzgzIDUuNzgzIDAgMCAwLTUuNzgzLTUuNzgzYy0zMC45MjggMC01Ni0yNS4wNzItNTYtNTZ2LTU2YzAtNDQuMTgzLTM1LjgxNy04MC04MC04MEg4NmMtNi42MjcgMC0xMiA1LjM3My0xMiAxMnoiLz48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zNzYgMjQ0YzAtNi42MjcgNS4zNzMtMTIgMTItMTJoMTEyYzYuNjI3IDAgMTIgNS4zNzMgMTIgMTJ2MjRjMCA2LjYyNy01LjM3MyAxMi0xMiAxMkgzODhjLTYuNjI3IDAtMTItNS4zNzMtMTItMTJ6IiBjbGlwLXJ1bGU9ImV2ZW5vZGQiLz48L2c+PGRlZnM+PGNsaXBQYXRoIGlkPSJhIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMCAwaDUxMnY1MTJIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4="},"displayName":"Aggregate","typeVersion":1,"nodeCategories":[{"id":9,"name":"Core Nodes"}]}],"categories":[{"id":31,"name":"Content Creation"},{"id":51,"name":"Multimodal AI"}],"image":[]}}