Batch-SEO-Inhalts-Erstellung mit Webflow-Entwürfen und KI-Bildern (Vorlage)

Experte

Dies ist ein Content Creation, Multimodal AI-Bereich Automatisierungsworkflow mit 54 Nodes. Hauptsächlich werden If, Set, Code, Wait, Merge und andere Nodes verwendet. Batch-SEO-Inhalts-Generierung mit GPT, Gemini-Bildern und Webflow-Entwürfen

Voraussetzungen
  • Google Drive API-Anmeldedaten
  • Möglicherweise sind Ziel-API-Anmeldedaten erforderlich
  • Google Sheets API-Anmeldedaten
  • OpenAI API Key
Workflow-Vorschau
Visualisierung der Node-Verbindungen, mit Zoom und Pan
Workflow exportieren
Kopieren Sie die folgende JSON-Konfiguration und importieren Sie sie in n8n
{
  "id": "bCM3L5So04TaTb3I",
  "meta": {
    "instanceId": "506e1eb999b7a8cf86103921b3e1b94e371534d9bae39d44754933678dc6697d",
    "templateCredsSetupCompleted": true
  },
  "name": "Bulk SEO content generation and Webflow draft creation with AI images (template)",
  "tags": [
    {
      "id": "T3xhK1cIuPex0boX",
      "name": "Templates",
      "createdAt": "2025-09-03T11:06:03.839Z",
      "updatedAt": "2025-09-03T11:06:03.839Z"
    }
  ],
  "nodes": [
    {
      "id": "6c19a117-9bac-4598-9618-432ca067a02f",
      "name": "KI-Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -5712,
        64
      ],
      "parameters": {
        "text": "=Current date and time: {{$now}}\n\nTASK: Create high-quality SEO content and generate a relevant featured image for the keyword below.\n\nKeyword: {{ $json['main keyword'] }}\n\nRequirements:\n1. Write 600-800 words of engaging, professional but accessible content.\n2. Include the keyword naturally 2-3 times: once in the introduction, once in a subheading, and once in the conclusion.\n3. Create a compelling title (50-60 characters).\n4. Write a meta description (150-160 characters).\n5. Structure the article with clear sections:\n   - Introduction\n   - Key Benefits\n   - How It Works / Practical Advice\n   - Conclusion / Next Steps\n6. Target audience: general readers searching for this keyword (not academic or overly technical).\n7. Generate ONE relevant professional image. The image should:\n   - Visually represent the keyword topic (not generic SEO/marketing visuals)\n   - Use a clean, modern, professional style\n   - Be suitable as a blog featured image\n   - IMPORTANT: Generate only ONE image per article\n\nCRITICAL: Call the image generation tool exactly ONCE per article. Do not generate multiple images or variations.\n\n8. Provide descriptive **alt text** for the image, optimized for accessibility and SEO.\n\nOutput Format:\nReturn ONLY this valid JSON structure as raw JSON (no markdown code blocks, no json tags, no extra text, notes, or explanations):\n{\n\"title\": \"SEO optimized title here\",\n\"slug\": \"{{ $('Load Pending Keywords').item.json.slug }}\", \n\"metaDescription\": \"Compelling meta description here\",\n\"content\": \"Full article content here (600-800 words). CRITICAL FORMATTING REQUIREMENTS: Start with ### Introduction as the first heading. Use ### for ALL section headings (Key Benefits, How It Works / Practical Advice, Conclusion / Next Steps). Write complete paragraphs separated by blank lines. Never mix plain text with markdown formatting. Each section must have substantial content with specific examples and actionable advice. Include the target keyword naturally 2-3 times throughout the content. Ensure consistent markdown structure from start to finish.\",\n\"main keyword\": \"{{ $json['main keyword'] }}\",\n\"imageUrl\": \"URL from image generation tool\", \n\"altText\": \"Descriptive and SEO-friendly alt text here\"\n}\n\nFORMATTING VALIDATION: Before returning JSON, verify that:\n1. Content starts with ### Introduction \n2. All headings use ### format consistently\n3. Each paragraph is properly separated with blank lines\n4. No mixing of plain text and markdown syntax\n5. Content flows logically between sections\n6. Target keyword appears naturally in introduction and conclusion\n\nCRITICAL: Your response must start with { and end with }. Do not wrap the JSON in markdown formatting or code blocks. Return the raw JSON object only.",
        "options": {
          "systemMessage": "You are an expert SEO content writer and AI coordinator. Your responsibilities: Always follow the Agent Prompt exactly. Always generate both content and a relevant professional image. Always return valid JSON only, with no extra commentary or notes. Never skip image generation. Never output incomplete or invalid JSON. Ensure the content is engaging, structured, and optimized for readers searching for the keyword."
        },
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "9081f1d4-5dac-4350-b910-e17ad918208f",
      "name": "Einfacher Speicher",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -5632,
        288
      ],
      "parameters": {
        "sessionKey": "={{ $('Load Pending Keywords').item.json['main keyword'] }}",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3
    },
    {
      "id": "13743c5a-d649-49a3-8cd6-4c03494d9749",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -5760,
        288
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {
          "temperature": 0.1
        }
      },
      "credentials": {
        "openAiApi": {
          "id": "mvWns3smwtPV0N7O",
          "name": "OpenAI (Dummy Account)"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "97ed3faa-f65c-4b47-a024-9800c24763fd",
      "name": "Haftnotiz",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6480,
        -624
      ],
      "parameters": {
        "width": 576,
        "height": 448,
        "content": "### 📋 Automated SEO Content Generation for Webflow\n\nThis workflow generates SEO-optimized articles at scale and saves them as Webflow drafts.\n\n**What it does:**\n- Reads keywords from Google Sheets (status = \"pending\")\n- AI writes 600+ word articles with proper structure\n- Generates custom featured images via Gemini AI\n- Creates drafts in Webflow (you publish manually after review)\n- Tracks results in Google Sheets\n\n**Best for:** Creating multiple articles targeting long-tail keyword variations (e.g., \"best running shoes for winter\", \"best running shoes for trails\")\n\n**Setup Steps:**\n1. Configure your Google Sheet or [clone this template](https://docs.google.com/spreadsheets/d/1_4wVEuu1fVZBXs0JhImQyzZYv9QC0RLZjxZFwHcJHPw/edit?gid=183091813#gid=183091813)\n2. Add API credentials (OpenAI, OpenRouter, Webflow)\n3. Set Webflow site/collection IDs\n4. Test with 1 keyword before bulk processing"
      },
      "typeVersion": 1
    },
    {
      "id": "d10c11b9-0cbe-4725-ae66-fe4c381666c5",
      "name": "Zeitplan-Auslöser",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -6432,
        64
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "months"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "85a2baaf-7fd0-4cb9-b200-7f56d3781275",
      "name": "Ausstehende Keywords laden",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -6208,
        64
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "pending",
              "lookupColumn": "status"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 183091813,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit#gid=183091813",
          "cachedResultName": "keywords"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit?usp=drivesdk",
          "cachedResultName": "N8N SHEETS TEST"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "zyEOPkCfmHTXNm4V",
          "name": "Google Sheets (Dummy Account)"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "3474f5e5-84e7-44c5-8751-e53ffedffd1e",
      "name": "Über Elemente iterieren",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -5984,
        64
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "3403fae8-07ba-4faf-9db5-0ad221b1360e",
      "name": "Inhaltsqualitätsprüfung",
      "type": "n8n-nodes-base.if",
      "position": [
        -5072,
        64
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "word-count-check",
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ $json.wordCount }}",
              "rightValue": 600
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "ebe7106d-a3bb-4396-989c-5aba594e828d",
      "name": "Agenten-Ausgabe verarbeiten",
      "type": "n8n-nodes-base.code",
      "position": [
        -5296,
        64
      ],
      "parameters": {
        "jsCode": "// Original keyword item from the loop\nconst original = $json;\n\n// Extract and clean the agent output with multiple fallbacks\nlet agentOutput = {};\ntry {\n  let rawOutput = original.output || \"\";\n  \n  // Security: Handle multiple markdown variations\n  let cleanedOutput = rawOutput\n    .replace(/```json\\s*/g, '')    // Remove ```json\n    .replace(/```\\s*$/g, '')       // Remove closing ```\n    .replace(/^```\\s*/g, '')       // Remove opening ``` \n    .replace(/```$/g, '')          // Remove trailing ```\n    .trim();\n  \n  // Try parsing the cleaned output\n  agentOutput = JSON.parse(cleanedOutput);\n  \n} catch (parseError) {\n  // Security fallback: Create safe structure if parsing fails\n  console.log(\"JSON Parse Error:\", parseError.message);\n  \n  agentOutput = { \n    title: `Error: ${original[\"main keyword\"] || \"Unknown keyword\"}`,\n    slug: `error-${Date.now()}`,\n    metaDescription: \"Content generation failed\",\n    content: \"Failed to generate content. Please check agent configuration.\",\n    \"main keyword\": original[\"main keyword\"] || \"unknown\",\n    imageUrl: \"\",\n    altText: \"Error generating content\",\n    parseError: parseError.message,\n    rawAgentOutput: original.output\n  };\n}\n\n// Compute word count from the content\nconst content = agentOutput.content || \"\";\nconst wordCount = content.split(/\\s+/).filter(Boolean).length;\n\n// Return wrapped in json object to avoid n8n reserved key conflicts\nreturn [{\n  json: {\n    ...original,          \n    ...agentOutput,       \n    wordCount,\n    status: wordCount >= 600 ? \"content_ready\" : \"needs_expansion\",\n    generatedAt: new Date().toISOString()\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "457c8c37-c678-4299-8676-4ec41c2ba56d",
      "name": "Inhalt erweitern",
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "position": [
        -4848,
        160
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {
          "maxTokens": 4000,
          "temperature": 0.3
        },
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "You are an expert content expansion specialist. Always return ONLY valid JSON with no extra text, notes, or explanations. Follow the exact format specified in the user prompt."
            },
            {
              "content": "=Expand the following content from {{ $json.wordCount }} words to 600+ words while maintaining the same structure, tone, and keyword optimization.\n\nTARGET KEYWORD: {{ $('Loop Over Items').item.json['main keyword'] }}\n\nORIGINAL CONTENT: {{ $json.content }}\n\nEXPANSION GUIDELINES:\n1. Keep all existing headings and sections intact\n2. Add specific examples, real-world scenarios, and practical tips within each section  \n3. Include 2-3 brand mentions or product examples where relevant\n4. Add actionable advice readers can implement immediately\n5. Maintain the same markdown formatting (###, **, etc.)\n6. Preserve keyword density and natural integration\n7. Keep the original writing style and tone\n\nReturn ONLY this valid JSON structure (no extra text, notes, or explanations):\n\n{\n  \"title\": \"{{ $json.title }}\",\n  \"slug\": \"{{ $json.slug }}\",\n  \"metaDescription\": \"{{ $json.metaDescription }}\",\n  \"content\": \"Expanded article content here (600+ words)\",\n  \"main keyword\": \"{{ $json['main keyword'] }}\",\n  \"imageUrl\": \"{{ $json.imageUrl }}\",\n  \"altText\": \"{{ $json.altText }}\"\n}"
            }
          ]
        }
      },
      "credentials": {
        "openAiApi": {
          "id": "mvWns3smwtPV0N7O",
          "name": "OpenAI (Dummy Account)"
        }
      },
      "retryOnFail": true,
      "typeVersion": 1.8
    },
    {
      "id": "6a7bc453-cf01-4bed-88a9-7b8d478793a2",
      "name": "Agenten-Ausgabe formatieren",
      "type": "n8n-nodes-base.code",
      "position": [
        -4496,
        160
      ],
      "parameters": {
        "jsCode": "const originalData = $json;\nconst expandedResponse = $('Expand Content').first().json.message.content;\n\n// Parse the JSON response from the expanded content\nlet expandedData = {};\ntry {\n  expandedData = JSON.parse(expandedResponse);\n} catch (e) {\n  expandedData = { \n    error: \"Invalid JSON from expansion\", \n    raw: expandedResponse,\n    content: expandedResponse // fallback to raw content\n  };\n}\n\n// Calculate word count from the expanded content\nconst content = expandedData.content || \"\";\nconst wordCount = content.split(/\\s+/).filter(Boolean).length;\n\nreturn [{\n  json: {\n    ...originalData,     // Keep original data (main keyword, etc.)\n    ...expandedData,     // Add all expanded fields\n    wordCount,\n    status: wordCount >= 600 ? \"content_ready\" : \"needs_expansion\",\n    wasExpanded: true,\n    expandedAt: new Date().toISOString()\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "0a272acd-2853-45c9-bdc6-c69d876648f8",
      "name": "Inhaltswege zusammenführen",
      "type": "n8n-nodes-base.merge",
      "position": [
        -4272,
        64
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combinationMode": "mergeByPosition"
      },
      "typeVersion": 2.1
    },
    {
      "id": "7554230a-0c6b-4654-ab87-5f527675912f",
      "name": "In HTML konvertieren",
      "type": "n8n-nodes-base.markdown",
      "position": [
        -4048,
        64
      ],
      "parameters": {
        "mode": "markdownToHtml",
        "options": {},
        "markdown": "={{ $json.content }}"
      },
      "typeVersion": 1
    },
    {
      "id": "0bcdca31-1f50-41fe-b748-91a732a730a2",
      "name": "Mit bestehenden Beiträgen zusammenführen",
      "type": "n8n-nodes-base.merge",
      "position": [
        -3600,
        64
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "advanced": true,
        "joinMode": "keepEverything",
        "mergeByFields": {
          "values": [
            {
              "field1": "fieldData.slug",
              "field2": "slug"
            }
          ]
        }
      },
      "typeVersion": 3.2
    },
    {
      "id": "ad6944f8-67ac-4454-b011-61f833541b97",
      "name": "Bestehende Beiträge abrufen",
      "type": "n8n-nodes-base.webflow",
      "position": [
        -3824,
        -48
      ],
      "parameters": {
        "siteId": "653a17a1b31a397763f3ce40",
        "operation": "getAll",
        "returnAll": true,
        "collectionId": "68c01d34f15ae8b8c30ead31"
      },
      "credentials": {
        "webflowOAuth2Api": {
          "id": "NqkfDWqbJpAotiw2",
          "name": "Webflow (Dummy Account)"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "7f443fca-2d0f-43e2-83be-74f096c0c92b",
      "name": "Neuen Beitrags-Slug abrufen",
      "type": "n8n-nodes-base.set",
      "position": [
        -3824,
        160
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "6f6f5935-eb33-41bd-804c-dc62c085b000",
              "name": "slug",
              "type": "string",
              "value": "={{ $json.slug }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "5c7c7872-e391-479c-b9de-c82c9e1af5f8",
      "name": "Route: Aktualisieren oder Erstellen",
      "type": "n8n-nodes-base.switch",
      "position": [
        -3376,
        64
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "outputKey": "Route 1",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "f22dbd15-9e3d-4dcd-ac02-b6763223b916",
                    "operator": {
                      "type": "string",
                      "operation": "notEmpty",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.id }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            },
            {
              "outputKey": "Route 2",
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "id": "6915f663-8bd2-4e60-ad37-409ea961f89f",
                    "operator": {
                      "type": "string",
                      "operation": "empty",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.id }}",
                    "rightValue": ""
                  }
                ]
              },
              "renameOutput": true
            }
          ]
        },
        "options": {}
      },
      "typeVersion": 3.2
    },
    {
      "id": "ac01b0a4-ecda-4f20-afc8-9aa582fda210",
      "name": "Bestehenden Beitrag aktualisieren",
      "type": "n8n-nodes-base.webflow",
      "maxTries": 3,
      "position": [
        -3152,
        -48
      ],
      "parameters": {
        "itemId": "={{ $json.id }}",
        "siteId": "653a17a1b31a397763f3ce40",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "name",
              "fieldValue": "={{ $('Convert to HTML').item.json.title }}"
            },
            {
              "fieldId": "page-content",
              "fieldValue": "={{ $('Convert to HTML').item.json.data }}"
            },
            {
              "fieldId": "metadescription",
              "fieldValue": "={{ $('Convert to HTML').item.json.metaDescription }}"
            },
            {
              "fieldId": "featured-image",
              "fieldValue": "={{ $('Convert to HTML').item.json.imageUrl }}"
            }
          ]
        },
        "operation": "update",
        "collectionId": "68c01d34f15ae8b8c30ead31"
      },
      "credentials": {
        "webflowOAuth2Api": {
          "id": "NqkfDWqbJpAotiw2",
          "name": "Webflow (Dummy Account)"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2
    },
    {
      "id": "a3f5e05d-a525-4fdd-a214-998806a344b0",
      "name": "Neuen Beitrag erstellen",
      "type": "n8n-nodes-base.webflow",
      "maxTries": 3,
      "position": [
        -3152,
        160
      ],
      "parameters": {
        "siteId": "653a17a1b31a397763f3ce40",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "name",
              "fieldValue": "={{ $('Convert to HTML').item.json.title }}"
            },
            {
              "fieldId": "slug",
              "fieldValue": "={{ $('Convert to HTML').item.json.slug }}"
            },
            {
              "fieldId": "page-content",
              "fieldValue": "={{ $('Convert to HTML').item.json.data }}"
            },
            {
              "fieldId": "metadescription",
              "fieldValue": "={{ $('Convert to HTML').item.json.metaDescription }}"
            },
            {
              "fieldId": "featured-image",
              "fieldValue": "={{ $('Convert to HTML').item.json.imageUrl }}"
            }
          ]
        },
        "operation": "create",
        "collectionId": "68c01d34f15ae8b8c30ead31"
      },
      "credentials": {
        "webflowOAuth2Api": {
          "id": "NqkfDWqbJpAotiw2",
          "name": "Webflow (Dummy Account)"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2
    },
    {
      "id": "42e4fb72-e16f-4dd3-a1ea-9aa94443f5ec",
      "name": "Beitragsergebnis zusammenführen",
      "type": "n8n-nodes-base.merge",
      "position": [
        -2928,
        64
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "4755da23-5ea0-4420-b5a2-7976e41411d1",
      "name": "Erfolg prüfen",
      "type": "n8n-nodes-base.if",
      "position": [
        -2704,
        64
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "success-check",
              "operator": {
                "type": "string",
                "operation": "isNotEmpty"
              },
              "leftValue": "={{ $json.id }}",
              "rightValue": ""
            },
            {
              "id": "4bdc0525-b8fe-4faa-a3a0-d701102ed47a",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.id }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "a013bc1b-70af-4c27-9c88-c5df8a913bd1",
      "name": "Als abgeschlossen markieren",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -2480,
        -48
      ],
      "parameters": {
        "columns": {
          "value": {
            "status": "created",
            "main keyword": "={{ $('Convert to HTML').item.json['main keyword'] }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "main keyword",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "main keyword",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "head terms",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "head terms",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "modifiers",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "modifiers",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "slug",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "slug",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "main keyword"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 183091813,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit#gid=183091813",
          "cachedResultName": "keywords"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit?usp=drivesdk",
          "cachedResultName": "N8N SHEETS TEST"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "zyEOPkCfmHTXNm4V",
          "name": "Google Sheets (Dummy Account)"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "d833be28-654b-41f1-af4d-bcf18e8aa3ec",
      "name": "Fehler protokollieren",
      "type": "n8n-nodes-base.code",
      "position": [
        -2480,
        160
      ],
      "parameters": {
        "jsCode": "const error = $json.error || 'Creation failed';\nconst keyword = $('Convert to HTML').first()?.json?.['main keyword'] || 'Unknown';\n\nreturn {\n  json: {\n    keyword: keyword,\n    error: error,\n    timestamp: new Date().toISOString(),\n    status: 'failed'\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "ab10a761-91e4-4b64-8164-c87134bcbb45",
      "name": "Erfolgsergebnisse speichern",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -2256,
        -48
      ],
      "parameters": {
        "columns": {
          "value": {
            "id": "={{ $('Merge post result').item.json.id }}",
            "slug": "={{ $('Merge post result').item.json.fieldData.slug }}",
            "content": "={{ $('Merge post result').item.json.fieldData['page-content'] }}",
            "updated on": "={{ $('Merge post result').item.json.lastUpdated }}",
            "generatedAt": "={{ $('Merge post result').item.json.createdOn }}",
            "meta description": "={{ $('Merge post result').item.json.fieldData.metadescription }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "slug",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "slug",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "meta description",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "meta description",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "content",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "content",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "generatedAt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "generatedAt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "updated on",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "updated on",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "published on",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "published on",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 977377122,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit#gid=977377122",
          "cachedResultName": "content_created"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit?usp=drivesdk",
          "cachedResultName": "N8N SHEETS TEST"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "zyEOPkCfmHTXNm4V",
          "name": "Google Sheets (Dummy Account)"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "632a7c39-687c-4ea9-95e0-dd57b302c191",
      "name": "Fehler speichern",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -2256,
        160
      ],
      "parameters": {
        "columns": {
          "value": {
            "error": "={{ $json.error }}",
            "status": "={{ $json.status }}",
            "keyword": "={{ $('Convert to HTML').item.json['main keyword'] }}",
            "timestamp": "={{ $json.timestamp }}"
          },
          "schema": [
            {
              "id": "keyword",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "keyword",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "error",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "error",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "timestamp",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "timestamp",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "keyword"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1205462190,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit#gid=1205462190",
          "cachedResultName": "webflow_error_logs"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1qd1H_IY_KEtB1C-ZJzpdmw9_yQEqdpnrf4ZdlV02gW4/edit?usp=drivesdk",
          "cachedResultName": "N8N SHEETS TEST"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "zyEOPkCfmHTXNm4V",
          "name": "Google Sheets (Dummy Account)"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "5f4abc50-4c29-4424-9668-b3eb1494fb66",
      "name": "Einige Sekunden warten",
      "type": "n8n-nodes-base.wait",
      "position": [
        -2032,
        160
      ],
      "webhookId": "6d8fa6b9-a084-4656-a950-cf477ab7329d",
      "parameters": {
        "amount": 3
      },
      "typeVersion": 1.1
    },
    {
      "id": "af480c9a-5086-45af-9d1e-0b403a387463",
      "name": "Haftnotiz1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6464,
        240
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "content": "## STEP 1\n\nLoads all keywords with status='pending' from Google Sheets"
      },
      "typeVersion": 1
    },
    {
      "id": "7747856f-3922-46a8-8f09-ecc007cabeb0",
      "name": "Haftnotiz2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5728,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 144,
        "content": "## STEP 2\n\nAgent creates full article + generates featured image via tool call. Content is checked for 600+ words."
      },
      "typeVersion": 1
    },
    {
      "id": "99d5b7cd-b330-4519-b166-76c3fdd1ac51",
      "name": "Haftnotiz3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4896,
        384
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 144,
        "content": "## STEP 3\n\nQuality Control\nIf under 600 words → expand content\nIf 600+ words → proceed to publishing"
      },
      "typeVersion": 1
    },
    {
      "id": "2100b5a6-2e31-42d5-bbe1-259b81f38933",
      "name": "Haftnotiz4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4096,
        -128
      ],
      "parameters": {
        "color": 7,
        "width": 192,
        "height": 144,
        "content": "## STEP 4\n\n\nConverts markdown to HTML and merges with image data"
      },
      "typeVersion": 1
    },
    {
      "id": "b4478d43-86f7-453b-977d-7bec723d77f8",
      "name": "Haftnotiz5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3824,
        -224
      ],
      "parameters": {
        "color": 7,
        "width": 336,
        "height": 144,
        "content": "## STEP 5\n\n\nMatches slug with Webflow collection to update or create"
      },
      "typeVersion": 1
    },
    {
      "id": "57f327c8-15c0-4d61-a2bc-afe23897add6",
      "name": "Haftnotiz6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3280,
        -208
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 112,
        "content": "## STEP 6\n\nUpdates existing post or creates new one"
      },
      "typeVersion": 1
    },
    {
      "id": "c444b15e-d08f-474d-a10b-30414590af77",
      "name": "Haftnotiz7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2672,
        -224
      ],
      "parameters": {
        "color": 7,
        "width": 528,
        "height": 144,
        "content": "## STEP 7\n\n- saves to content_created sheet\n- Error → logs to webflow_error_logs sheet"
      },
      "typeVersion": 1
    },
    {
      "id": "af2bab6c-5315-4c8a-9ebe-e0d71b2def54",
      "name": "Keine Keywords verfügbar",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -5760,
        -336
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "bc529bba-49c5-4ba7-95f2-9388f4440ede",
      "name": "Haftnotiz8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3920,
        416
      ],
      "parameters": {
        "color": 5,
        "width": 704,
        "height": 400,
        "content": "\n### ⚙️ Webflow OAuth Setup Required\n\n**Before running this workflow, configure Webflow OAuth2 credentials in n8n:**\n\n1. **In n8n:** Credentials → Create new → Webflow OAuth2 API → Copy the OAuth Redirect URL\n\n2. **In Webflow:** Workspace Settings → Apps & Integrations → Develop → Create an app\n\n3. **Configure your app:**\n   - App name & description (required)\n   - App homepage URL: your n8n instance URL\n   - Toggle on \"Data Client REST API\"\n   - Copy Client ID and Client Secret → paste into n8n credentials\n   - Paste the OAuth Redirect URL from n8n\n   - Select permissions (recommend read-write for CMS collections)\n\nFind your Site/Collection IDs in Webflow's Designer or CMS settings."
      },
      "typeVersion": 1
    },
    {
      "id": "c3becf95-359b-4a4a-8dc7-4e9faacf5b81",
      "name": "KI-Bildgenerierungstool",
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "position": [
        -5504,
        288
      ],
      "parameters": {
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "iYw38zcdqp4HuOZR",
          "cachedResultName": "AI image generation for automatic content creation"
        },
        "description": "Generate ONE AI image for content. Pass imagePrompt, imageTitle, and keyword to create a single relevant image. This tool should be called exactly once per article.",
        "workflowInputs": {
          "value": {
            "altText": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('altText', `A clear, descriptive, and SEO-friendly alternative text for the image. Should naturally include the image and remain under 125 characters for accessibility.`, 'string') }}",
            "keyword": "={{ $json['main keyword'] }}",
            "imageTitle": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('imageTitle', `A concise, professional title for the featured image that clearly reflects the main topic of the article`, 'string') }}",
            "imagePrompt": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('imagePrompt', `A concise, professional title for the featured image that clearly reflects the main topic of the article`, 'string') }}"
          },
          "schema": [
            {
              "id": "imageTitle",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "imageTitle",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "imagePrompt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "imagePrompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "keyword",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "keyword",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "altText",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "altText",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "4aa37110-3c5b-4086-bf30-3c3f0c2b47c7",
      "name": "Bei Ausführung durch anderen Workflow",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        -6224,
        2416
      ],
      "parameters": {
        "workflowInputs": {
          "values": [
            {
              "name": "imageTitle"
            },
            {
              "name": "imagePrompt"
            },
            {
              "name": "keyword"
            },
            {
              "name": "altText"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "af3cac37-624f-41f1-b9cf-1136e23d06c1",
      "name": "Bildantwort verarbeiten",
      "type": "n8n-nodes-base.code",
      "position": [
        -5696,
        2416
      ],
      "parameters": {
        "jsCode": "const response = $json;\nlet imageUrl = '';\n\ntry {\n  // OpenRouter returns images in the assistant message\n  if (response.choices && response.choices.length > 0) {\n    const message = response.choices[0].message;\n    \n    // Check for images array in the message\n    if (message.images && message.images.length > 0) {\n      // Extract the base64 data URL from the first image\n      imageUrl = message.images[0].image_url.url;\n    }\n  }\n  \n  // Fallback checks\n  if (!imageUrl && response.data && response.data.length > 0) {\n    imageUrl = response.data[0].url;\n  }\n  \n} catch (error) {\n  console.error('Error processing OpenRouter image response:', error);\n}\n\nconst originalInputs = $('When Executed by Another Workflow').item.json;\n\nreturn {\n  json: {\n    imageUrl: imageUrl,\n    imageTitle: originalInputs.imageTitle,\n    keyword: originalInputs.keyword,\n    imagePrompt: originalInputs.imagePrompt,\n    altText: originalInputs.altText || `${originalInputs.keyword} featured image`,\n    imageGenerated: !!imageUrl,\n    generatedAt: new Date().toISOString(),\n    status: imageUrl ? 'success' : 'failed',\n    rawResponse: response\n  }\n};\n"
      },
      "typeVersion": 2
    },
    {
      "id": "1a9080e8-19e5-4aa1-afee-a938fc89615d",
      "name": "Bildgenerierung prüfen",
      "type": "n8n-nodes-base.if",
      "position": [
        -5408,
        2416
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "image-check",
              "operator": {
                "type": "string",
                "operation": "isNotEmpty"
              },
              "leftValue": "={{ $json.imageUrl }}",
              "rightValue": ""
            },
            {
              "id": "68f8678d-2c93-4335-aa18-bcaa0df7985f",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.imageUrl }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "558fd78f-7410-44ea-8af3-8ab5580989aa",
      "name": "Generierungsfehler behandeln",
      "type": "n8n-nodes-base.code",
      "position": [
        -5056,
        2128
      ],
      "parameters": {
        "jsCode": "const originalData = $('Process Image Response').item.json;\nconst error = $json.error || 'Image generation failed';\n\nconsole.error(`Image generation failed for: ${originalData.keyword}`);\nconsole.error(`Error: ${error}`);\n\nreturn {\n  json: {\n    imageUrl: '',\n    imageTitle: originalData.imageTitle,\n    keyword: originalData.keyword,\n    imagePrompt: originalData.imagePrompt,\n    imageGenerated: false,\n    status: 'failed',\n    error: error,\n    generatedAt: new Date().toISOString(),\n    message: `Failed to generate image for '${originalData.imageTitle}'`\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "4828babb-1f1c-4e19-86a3-effc98f5e4f4",
      "name": "Ergebnis",
      "type": "n8n-nodes-base.set",
      "position": [
        -4320,
        2544
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c66c7c13-57ca-4191-9af3-5ab306dfedfc",
              "name": "Response",
              "type": "string",
              "value": "=The image was created and named \"{{ $json.name }}\" and the following altText \"{{ $('Convert Base64 to Binary').item.json.altText }}\"\n\nHere is the link to the image in Google Drive: {{ $json.webViewLink }}\n\nHere's the download link: {{ $json.webContentLink }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "6756130b-2e51-4457-a28d-f810f9968fac",
      "name": "Base64 in Binär konvertieren",
      "type": "n8n-nodes-base.code",
      "position": [
        -5024,
        2544
      ],
      "parameters": {
        "jsCode": "// Extract base64 from data URL and convert to binary\nconst input = $input.first().json;\nconst base64String = input.imageUrl.replace(/^data:image\\/\\w+;base64,/, '');\nconst buffer = Buffer.from(base64String, 'base64');\n\n// Pass through other data and add binary\nreturn {\n  json: {\n    imageTitle: input.imageTitle,\n    imageUrl: input.imageUrl,\n    altText: input.altText || `${input.keyword} featured image`,  \n    keyword: input.keyword,  \n    imagePrompt: input.imagePrompt  \n  },\n  binary: {\n    data: await this.helpers.prepareBinaryData(\n      buffer,\n      `${input.imageTitle || input.keyword}_raw.png`,\n      'image/png'\n    )\n  }\n};\n"
      },
      "typeVersion": 2
    },
    {
      "id": "9830cce4-9d2f-450f-a61a-2937b3d9831c",
      "name": "In Google Drive hochladen",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -4784,
        2544
      ],
      "parameters": {
        "name": "={{ $json.imageTitle }}.png",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive",
          "cachedResultUrl": "https://drive.google.com/drive/my-drive",
          "cachedResultName": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1CYgRUELLCpM1tHx5cM6hBpf5RdfxItR0",
          "cachedResultUrl": "https://drive.google.com/drive/folders/1CYgRUELLCpM1tHx5cM6hBpf5RdfxItR0",
          "cachedResultName": "AI images"
        }
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "0tTY9psJ9CGds01o",
          "name": "Google Drive Dummy Account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "4c611c1f-8a67-482f-a8c2-3faccc234d84",
      "name": "Download-Links abrufen",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        -4528,
        2544
      ],
      "parameters": {
        "fileId": {
          "__rl": true,
          "mode": "url",
          "value": "={{ $json.webViewLink }}"
        },
        "options": {},
        "operation": "download"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "0tTY9psJ9CGds01o",
          "name": "Google Drive Dummy Account"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "281da2fe-0d6e-47c7-9073-ada1b0f83343",
      "name": "Bild generieren",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -5952,
        2416
      ],
      "parameters": {
        "url": "https://openrouter.ai/api/v1/chat/completions",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"model\": \"google/gemini-2.5-flash-image-preview\",\n  \"messages\": [\n    {\n      \"role\": \"user\", \n      \"content\": \"Generate an image: {{ $json.imagePrompt }}\"\n    }\n  ],\n  \"modalities\": [\"image\", \"text\"],\n  \"max_tokens\": 1000\n}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "typeVersion": 4.2
    },
    {
      "id": "057b7038-0135-486c-9d85-e58c420280a2",
      "name": "Haftnotiz9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4032,
        2224
      ],
      "parameters": {
        "width": 528,
        "height": 496,
        "content": "### 🎨 AI Image Generation Sub-Workflow\n\nGenerates custom AI images for SEO posts.\n\n**How it works:**\n1. Called by parent workflow with image parameters\n2. Gemini 2.5 Flash creates image from prompt\n3. Uploads to Google Drive, returns shareable link\n\n**Inputs Required:**\n- imageTitle: filename/title\n- imagePrompt: AI generation instructions\n- keyword: topic keyword\n- altText: accessibility text\n\n**Output:**\n- Google Drive download link\n- Alt text for SEO\n- Image metadata\n\n**Setup:** Configure OpenRouter API key and Google Drive folder ID before use.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "610f756e-b237-4712-b602-4fae1cf0d842",
      "name": "Haftnotiz10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6016,
        2224
      ],
      "parameters": {
        "color": 7,
        "height": 352,
        "content": "## Step 1\n\nCalls OpenRouter with Gemini 2.5 Flash to create image based on prompt. You can modify based on your own tools and preference."
      },
      "typeVersion": 1
    },
    {
      "id": "6051dd14-fc03-4a39-b781-67c7a8c405e4",
      "name": "Haftnotiz11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5744,
        2224
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 352,
        "content": "## Step 2\n\nParses API response and extracts base64 image URL from response structure"
      },
      "typeVersion": 1
    },
    {
      "id": "f6299361-eb86-4f48-86cf-8d4c661d198d",
      "name": "Haftnotiz12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5456,
        2224
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 352,
        "content": "## Step 3\n\n\nChecks if imageUrl exists and is not empty. Routes to success or error path."
      },
      "typeVersion": 1
    },
    {
      "id": "07b288ff-289c-489a-99d3-0c1f0ad36d61",
      "name": "Haftnotiz13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5088,
        1952
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 352,
        "content": "## Step extra\n\n\nConverts base64 data URL to binary format required for file upload"
      },
      "typeVersion": 1
    },
    {
      "id": "8c05b88e-eb47-4c9d-9d68-ddc3e50115e5",
      "name": "Haftnotiz14",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5072,
        2400
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 352,
        "content": "## Step 4\n\nUploads binary image to Google Drive with descriptive filename"
      },
      "typeVersion": 1
    },
    {
      "id": "b743d732-0624-4572-b286-f30e6839784b",
      "name": "Haftnotiz15",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4816,
        2400
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 352,
        "content": "## Step 5\n\n\nDownloads file to get permanent shareable and download links"
      },
      "typeVersion": 1
    },
    {
      "id": "7cfff106-510f-46d9-aed2-f8d5cde4369b",
      "name": "Haftnotiz16",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4368,
        2400
      ],
      "parameters": {
        "color": 7,
        "width": 208,
        "height": 352,
        "content": "## Step 6\n\nFormats final output with image URL, alt text, and confirmation message"
      },
      "typeVersion": 1
    },
    {
      "id": "8a0e7ba0-5c3d-4c72-a5c6-10318074769c",
      "name": "Haftnotiz18",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6272,
        1680
      ],
      "parameters": {
        "color": 3,
        "width": 2896,
        "height": 144,
        "content": "\n# Important\nThis workflow should be created as an individual one. Then, in the Agent Tool node, you need to select it as the tool. DON'T try to run it inside the same workflow."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "f48990ab-4845-4d5f-9050-6abb325afe3a",
  "connections": {
    "6c19a117-9bac-4598-9618-432ca067a02f": {
      "main": [
        [
          {
            "node": "ebe7106d-a3bb-4396-989c-5aba594e828d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d833be28-654b-41f1-af4d-bcf18e8aa3ec": {
      "main": [
        [
          {
            "node": "632a7c39-687c-4ea9-95e0-dd57b302c191",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "632a7c39-687c-4ea9-95e0-dd57b302c191": {
      "main": [
        [
          {
            "node": "5f4abc50-4c29-4424-9668-b3eb1494fb66",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4755da23-5ea0-4420-b5a2-7976e41411d1": {
      "main": [
        [
          {
            "node": "a013bc1b-70af-4c27-9c88-c5df8a913bd1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "d833be28-654b-41f1-af4d-bcf18e8aa3ec",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9081f1d4-5dac-4350-b910-e17ad918208f": {
      "ai_memory": [
        [
          {
            "node": "6c19a117-9bac-4598-9618-432ca067a02f",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "457c8c37-c678-4299-8676-4ec41c2ba56d": {
      "main": [
        [
          {
            "node": "6a7bc453-cf01-4bed-88a9-7b8d478793a2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "281da2fe-0d6e-47c7-9073-ada1b0f83343": {
      "main": [
        [
          {
            "node": "af3cac37-624f-41f1-b9cf-1136e23d06c1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7554230a-0c6b-4654-ab87-5f527675912f": {
      "main": [
        [
          {
            "node": "7f443fca-2d0f-43e2-83be-74f096c0c92b",
            "type": "main",
            "index": 0
          },
          {
            "node": "ad6944f8-67ac-4454-b011-61f833541b97",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a3f5e05d-a525-4fdd-a214-998806a344b0": {
      "main": [
        [
          {
            "node": "42e4fb72-e16f-4dd3-a1ea-9aa94443f5ec",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "3474f5e5-84e7-44c5-8751-e53ffedffd1e": {
      "main": [
        [
          {
            "node": "af2bab6c-5315-4c8a-9ebe-e0d71b2def54",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "6c19a117-9bac-4598-9618-432ca067a02f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a013bc1b-70af-4c27-9c88-c5df8a913bd1": {
      "main": [
        [
          {
            "node": "ab10a761-91e4-4b64-8164-c87134bcbb45",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d10c11b9-0cbe-4725-ae66-fe4c381666c5": {
      "main": [
        [
          {
            "node": "85a2baaf-7fd0-4cb9-b200-7f56d3781275",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7f443fca-2d0f-43e2-83be-74f096c0c92b": {
      "main": [
        [
          {
            "node": "0bcdca31-1f50-41fe-b748-91a732a730a2",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "42e4fb72-e16f-4dd3-a1ea-9aa94443f5ec": {
      "main": [
        [
          {
            "node": "4755da23-5ea0-4420-b5a2-7976e41411d1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "13743c5a-d649-49a3-8cd6-4c03494d9749": {
      "ai_languageModel": [
        [
          {
            "node": "6c19a117-9bac-4598-9618-432ca067a02f",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "4c611c1f-8a67-482f-a8c2-3faccc234d84": {
      "main": [
        [
          {
            "node": "4828babb-1f1c-4e19-86a3-effc98f5e4f4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ad6944f8-67ac-4454-b011-61f833541b97": {
      "main": [
        [
          {
            "node": "0bcdca31-1f50-41fe-b748-91a732a730a2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5f4abc50-4c29-4424-9668-b3eb1494fb66": {
      "main": [
        [
          {
            "node": "3474f5e5-84e7-44c5-8751-e53ffedffd1e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6a7bc453-cf01-4bed-88a9-7b8d478793a2": {
      "main": [
        [
          {
            "node": "0a272acd-2853-45c9-bdc6-c69d876648f8",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "0a272acd-2853-45c9-bdc6-c69d876648f8": {
      "main": [
        [
          {
            "node": "7554230a-0c6b-4654-ab87-5f527675912f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ebe7106d-a3bb-4396-989c-5aba594e828d": {
      "main": [
        [
          {
            "node": "3403fae8-07ba-4faf-9db5-0ad221b1360e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ab10a761-91e4-4b64-8164-c87134bcbb45": {
      "main": [
        [
          {
            "node": "5f4abc50-4c29-4424-9668-b3eb1494fb66",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ac01b0a4-ecda-4f20-afc8-9aa582fda210": {
      "main": [
        [
          {
            "node": "42e4fb72-e16f-4dd3-a1ea-9aa94443f5ec",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3403fae8-07ba-4faf-9db5-0ad221b1360e": {
      "main": [
        [
          {
            "node": "0a272acd-2853-45c9-bdc6-c69d876648f8",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "457c8c37-c678-4299-8676-4ec41c2ba56d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "85a2baaf-7fd0-4cb9-b200-7f56d3781275": {
      "main": [
        [
          {
            "node": "3474f5e5-84e7-44c5-8751-e53ffedffd1e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1a9080e8-19e5-4aa1-afee-a938fc89615d": {
      "main": [
        [
          {
            "node": "558fd78f-7410-44ea-8af3-8ab5580989aa",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "6756130b-2e51-4457-a28d-f810f9968fac",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "af3cac37-624f-41f1-b9cf-1136e23d06c1": {
      "main": [
        [
          {
            "node": "1a9080e8-19e5-4aa1-afee-a938fc89615d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9830cce4-9d2f-450f-a61a-2937b3d9831c": {
      "main": [
        [
          {
            "node": "4c611c1f-8a67-482f-a8c2-3faccc234d84",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5c7c7872-e391-479c-b9de-c82c9e1af5f8": {
      "main": [
        [
          {
            "node": "ac01b0a4-ecda-4f20-afc8-9aa582fda210",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "a3f5e05d-a525-4fdd-a214-998806a344b0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c3becf95-359b-4a4a-8dc7-4e9faacf5b81": {
      "ai_tool": [
        [
          {
            "node": "6c19a117-9bac-4598-9618-432ca067a02f",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "6756130b-2e51-4457-a28d-f810f9968fac": {
      "main": [
        [
          {
            "node": "9830cce4-9d2f-450f-a61a-2937b3d9831c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0bcdca31-1f50-41fe-b748-91a732a730a2": {
      "main": [
        [
          {
            "node": "5c7c7872-e391-479c-b9de-c82c9e1af5f8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4aa37110-3c5b-4086-bf30-3c3f0c2b47c7": {
      "main": [
        [
          {
            "node": "281da2fe-0d6e-47c7-9073-ada1b0f83343",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Häufig gestellte Fragen

Wie verwende ich diesen Workflow?

Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.

Für welche Szenarien ist dieser Workflow geeignet?

Experte - Content-Erstellung, Multimodales KI

Ist es kostenpflichtig?

Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.

Workflow-Informationen
Schwierigkeitsgrad
Experte
Anzahl der Nodes54
Kategorie2
Node-Typen21
Schwierigkeitsbeschreibung

Für fortgeschrittene Benutzer, komplexe Workflows mit 16+ Nodes

Autor
Dahiana

Dahiana

@mssporto

No-Code Specialist with more than 10 years of experience in Digital Marketing. Currently working with Bubble. Webflow, AI, Agents and N8N.

Externe Links
Auf n8n.io ansehen

Diesen Workflow teilen

Kategorien

Kategorien: 34