8
n8n 한국어amn8n.com

批量 SEO 콘텐츠 생성 및 AI 이미지 포함 Webflow 드래그 앤 드롭 생성 (템플릿)

고급

이것은Content Creation, Multimodal AI분야의자동화 워크플로우로, 54개의 노드를 포함합니다.주로 If, Set, Code, Wait, Merge 등의 노드를 사용하며. GPT, Gemini 이미지, Webflow 드라フト를 사용하여 대량 SEO 콘텐츠 생성

사전 요구사항
  • Google Drive API 인증 정보
  • 대상 API의 인증 정보가 필요할 수 있음
  • Google Sheets API 인증 정보
  • OpenAI API Key
워크플로우 미리보기
노드 연결 관계를 시각적으로 표시하며, 확대/축소 및 이동을 지원합니다
워크플로우 내보내기
다음 JSON 구성을 복사하여 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": "AI 에이전트",
      "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": "심플 메모리",
      "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 채팅 모델",
      "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": "스티키 노트",
      "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": "스케줄 트리거",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -6432,
        64
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "months"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "85a2baaf-7fd0-4cb9-b200-7f56d3781275",
      "name": "대기 중인 키워드 로드",
      "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": "항목 루프",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -5984,
        64
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "3403fae8-07ba-4faf-9db5-0ad221b1360e",
      "name": "콘텐츠 품질 검사",
      "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": "에이전트 출력 처리",
      "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": "콘텐츠 확장",
      "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": "에이전트 출력 형식화",
      "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": "콘텐츠 경로 병합",
      "type": "n8n-nodes-base.merge",
      "position": [
        -4272,
        64
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combinationMode": "mergeByPosition"
      },
      "typeVersion": 2.1
    },
    {
      "id": "7554230a-0c6b-4654-ab87-5f527675912f",
      "name": "HTML로 변환",
      "type": "n8n-nodes-base.markdown",
      "position": [
        -4048,
        64
      ],
      "parameters": {
        "mode": "markdownToHtml",
        "options": {},
        "markdown": "={{ $json.content }}"
      },
      "typeVersion": 1
    },
    {
      "id": "0bcdca31-1f50-41fe-b748-91a732a730a2",
      "name": "기존 게시물과 병합",
      "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": "기존 게시물 가져오기",
      "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": "새 게시물 슬러그 가져오기",
      "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": "라우팅: 업데이트 또는 생성",
      "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": "기존 게시물 업데이트",
      "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": "새 게시물 생성",
      "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": "게시물 결과 병합",
      "type": "n8n-nodes-base.merge",
      "position": [
        -2928,
        64
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "4755da23-5ea0-4420-b5a2-7976e41411d1",
      "name": "성공 확인",
      "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": "완료로 표시",
      "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": "오류 기록",
      "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": "성공 결과 저장",
      "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": "오류 저장",
      "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": "몇 초 대기",
      "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": "스티키 노트1",
      "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": "스티키 노트2",
      "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": "스티키 노트3",
      "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": "스티키 노트4",
      "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": "스티키 노트5",
      "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": "스티키 노트6",
      "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": "스티키 노트7",
      "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": "사용 가능한 키워드 없음",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -5760,
        -336
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "bc529bba-49c5-4ba7-95f2-9388f4440ede",
      "name": "스티키 노트8",
      "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": "AI 이미지 생성 도구",
      "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": "다른 워크플로우에 의해 실행 시",
      "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": "이미지 응답 처리",
      "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": "이미지 생성 확인",
      "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": "생성 실패 처리",
      "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": "결과",
      "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를 바이너리로 변환",
      "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": "Google 드라이브에 업로드",
      "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": "다운로드 링크 가져오기",
      "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": "이미지 생성",
      "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": "스티키 노트9",
      "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": "스티키 노트10",
      "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": "스티키 노트11",
      "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": "스티키 노트12",
      "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": "스티키 노트13",
      "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": "스티키 노트14",
      "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": "스티키 노트15",
      "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": "스티키 노트16",
      "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": "스티키 노트18",
      "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
          }
        ]
      ]
    }
  }
}
자주 묻는 질문

이 워크플로우를 어떻게 사용하나요?

위의 JSON 구성 코드를 복사하여 n8n 인스턴스에서 새 워크플로우를 생성하고 "JSON에서 가져오기"를 선택한 후, 구성을 붙여넣고 필요에 따라 인증 설정을 수정하세요.

이 워크플로우는 어떤 시나리오에 적합한가요?

고급 - 콘텐츠 제작, 멀티모달 AI

유료인가요?

이 워크플로우는 완전히 무료이며 직접 가져와 사용할 수 있습니다. 다만, 워크플로우에서 사용하는 타사 서비스(예: OpenAI API)는 사용자 직접 비용을 지불해야 할 수 있습니다.

워크플로우 정보
난이도
고급
노드 수54
카테고리2
노드 유형21
난이도 설명

고급 사용자를 위한 16+개 노드의 복잡한 워크플로우

저자
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.

외부 링크
n8n.io에서 보기

이 워크플로우 공유

카테고리

카테고리: 34