AutomationFlowsAI & RAG › Generate Multilingual Shopify Product Descriptions with Gemini 2.5 Vision AI

Generate Multilingual Shopify Product Descriptions with Gemini 2.5 Vision AI

ByWeiser22 @weiser22 on n8n.io

Use for free

Event trigger★★★★☆ complexityAI-powered8 nodesShopifyGoogle SheetsGoogle GeminiAgentGoogle Gemini ChatOutput Parser Structured
AI & RAG Trigger: Event Nodes: 8 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #8179 — we link there as the canonical source.

This workflow follows the Agent → Googlegemini recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "id": "txsxi3EjP4dwobow",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Shopify AI Product Description Generation & Translation",
  "tags": [],
  "nodes": [
    {
      "id": "f1434b43-9e37-4d44-8a46-9b532bc0d0cf",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1104,
        32
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "c47ad83d-995d-4b15-bad2-f2e5dabcdd4b",
      "name": "Get many products",
      "type": "n8n-nodes-base.shopify",
      "position": [
        -896,
        32
      ],
      "parameters": {
        "limit": 2,
        "resource": "product",
        "operation": "getAll",
        "authentication": "accessToken",
        "additionalFields": {}
      },
      "credentials": {
        "shopifyAccessTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "4fc52ebc-edf9-4fec-b4fc-212670823194",
      "name": "Append row in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        240,
        -64
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "body_html",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "body_html",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "vendor",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "vendor",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "product_type",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "product_type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "created_at",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "created_at",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "handle",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "handle",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "updated_at",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "updated_at",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "published_at",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "published_at",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "template_suffix",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "template_suffix",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "published_scope",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "published_scope",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "tags",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "tags",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "admin_graphql_api_id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "admin_graphql_api_id",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "variants",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "variants",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "options",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "options",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "images",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "images",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "image",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "image",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [
            "id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1IFS_wfLKgEtjA5ltPhLApGDltKH6d2nHdri6NONkiZE/edit#gid=0",
          "cachedResultName": "Hoja 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1IFS_wfLKgEtjA5ltPhLApGDltKH6d2nHdri6NONkiZE",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1IFS_wfLKgEtjA5ltPhLApGDltKH6d2nHdri6NONkiZE/edit?usp=drivesdk",
          "cachedResultName": "ia products details output"
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "9eeaafab-0d88-4f1d-90f7-fa8136c8397a",
      "name": "Analyze image",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        -688,
        32
      ],
      "parameters": {
        "text": "=Analyze the provided image and return an objective, clear, and detailed description of the product shown.\n\nRequirements:\n\nFocus only on the main product (ignore background or decorations).\n\nDescribe only what is visible and verifiable in the image.\n\nInclude details about:\n\nProduct type (shoe, bag, cap, t-shirt).\n\nApparent materials (leather, fabric, canvas, knit, etc.).\n\nMain and secondary colors.\n\nVisible patterns or prints (plain, stripes, logos, embroidery).\n\nDistinctive elements (closure, laces, buckles, pockets, stitching, sole).\n\nUse a descriptive and neutral tone:\n\nExamples: \u201csmooth finish\u201d, \u201cwith top closure\u201d, \u201cwith visible stitching\u201d.\n\nDo not invent information that is not visible in the image (do not assume size, brand, comfort, or usage).\n\nWrite the answer in a short and concise paragraph (3\u20135 sentences).",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-2.5-flash-lite",
          "cachedResultName": "models/gemini-2.5-flash-lite"
        },
        "options": {},
        "resource": "image",
        "imageUrls": "={{ $json.images[0].src }}",
        "operation": "analyze"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "640eda46-69f2-4482-bbe4-8c99f5348e4a",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -416,
        -64
      ],
      "parameters": {
        "text": "=AI Generated Vision Description of Product: Analyze the image at the URL: {{ $('Get many products').item.json.images[0].src }}\n\nBrand: {{ $('Get many products').item.json.vendor }}\nProduct Name: {{ $('Get many products').item.json.title }}\nUser Provided Description: {{ $('Get many products').item.json.body_html }}\nProduct Type: {{ $('Get many products').item.json.product_type }}\n\nVision Description: {{ $json.content.parts[0].text }}",
        "options": {
          "systemMessage": "=<system_prompt>\nYOU ARE A PROFESSIONAL MULTILINGUAL E-COMMERCE COPYWRITING AI FOR FOOTWEAR. GENERATE PRODUCT COPY FOR **ES, DE, EN, FR, IT, PT**.\n\nSOURCES (priority):\n1) Product name \u2192 category/keywords/core attributes.  \n2) User draft \u2192 tone and context.  \n3) Vision description (analyzed) \u2192 visible traits (apparent materials, colors, finishes, sole, closure).  \n\nGENERAL RULES & ANTI-HALLUCINATION:  \n- Do not invent technologies, materials, sizes, or brand if not provided in the sources.  \n- Professional online shoe store tone; conversion-oriented, without exaggerations.  \n- HTML allowed ONLY in `shopify_description`: <div>, <h2>, <h3>, <p>, <ul>, <ol>, <li>, <strong>, <em>, <br>. No <script>, no inline styles, no tables.  \n- Intro paragraph + 3\u20136 bullets max; titles \u2264 80 characters.  \n- Do not include SKU, locator, or other internal metadata.  \n\nFOOTWEAR TERMINOLOGY (apply per language):  \n- **DE**: Sneaker / Turnschuh, Obermaterial (tige / upper), Sohle / Au\u00dfensohle, Schn\u00fcrung / Klettverschluss, Stiefel (boots), Sandalen, Slipper.  \n- **EN**: sneaker / shoe, upper, outsole, lace-up / closure, boots, sandals, espadrilles, dress shoes, casual shoes, slip-ons.  \n- **FR**: basket / chaussure, tige, semelle ext\u00e9rieure, lacets / fermeture, bottes, sandales, espadrilles, chaussures habill\u00e9es, souliers, mules.  \n- **IT**: sneaker / scarpa, tomaia, suola / suola esterna, chiusura / lacci, stivali, sandali, espadrillas, scarpe eleganti, ballerine, sabot.  \n- **PT**: t\u00e9nis / sapato, cabedal, sola / sola exterior, fecho / atacadores, botas, sand\u00e1lias, alpargatas, sapatos de vestir, mocassins, chinelos.  \n\nHANDLES/SLUGS PER LANGUAGE:  \n- Lowercase; words separated with `-`; no symbols; normalize accents.  \n- DE: \u00e4\u2192ae, \u00f6\u2192oe, \u00fc\u2192ue, \u00df\u2192ss; FR/IT/PT: remove diacritics; ES: \u00e1\u2192a, \u00e9\u2192e, \u00ed\u2192i, \u00f3\u2192o, \u00fa\u2192u, \u00f1\u2192n.  \n- Max. 80 characters. Avoid repeating the brand in the handle unless it is part of the product name.  \n\nSTRICT OUTPUT FORMAT (mandatory):  \n\nReturn **exclusively** a JSON object with no text before or after.  \nDo not wrap the response inside any other key (e.g. do not use \"output\" or similar).  \nThe root object must contain exactly 6 keys: es, de, en, fr, it, pt.  \nEach language must include exactly 3 keys: shopify_product_name, shopify_description, handle.  \nUse double quotes for JSON. Inside HTML strings, use single quotes for attributes.  \nReturn the JSON minified on a single line (no line breaks, no Markdown).  \nIt is forbidden to use different keys (e.g. not \"shop_description\").  \nIf some data is missing, return an empty string, but always keep the key.  \n\nGOAL: RETURN **EXCLUSIVELY** THIS MULTILINGUAL JSON:\n{\n  \"es\": {\"shopify_product_name\": \"...\", \"shopify_description\": \"...\", \"handle\": \"...\"},\n  \"de\": {\"shopify_product_name\": \"...\", \"shopify_description\": \"...\", \"handle\": \"...\"},\n  \"en\": {\"shopify_product_name\": \"...\", \"shopify_description\": \"...\", \"handle\": \"...\"},\n  \"fr\": {\"shopify_product_name\": \"...\", \"shopify_description\": \"...\", \"handle\": \"...\"},\n  \"it\": {\"shopify_product_name\": \"...\", \"shopify_description\": \"...\", \"handle\": \"...\"},\n  \"pt\": {\"shopify_product_name\": \"...\", \"shopify_description\": \"...\", \"handle\": \"...\"}\n}\n</system_prompt>\n"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "97c2a425-b417-437f-a2a4-667d0381637c",
      "name": "Google Gemini Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -432,
        240
      ],
      "parameters": {
        "options": {
          "temperature": 0.4,
          "maxOutputTokens": 4048
        }
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "cbfc55dc-3109-4c8d-9387-8819f30239f2",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        -256,
        240
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"es\": {\"shopify_product_name\": \"\", \"shopify_description\": \"\", \"handle\": \"\"},\n  \"de\": {\"shopify_product_name\": \"\", \"shopify_description\": \"\", \"handle\": \"\"},\n  \"en\": {\"shopify_product_name\": \"\", \"shopify_description\": \"\", \"handle\": \"\"},\n  \"fr\": {\"shopify_product_name\": \"\", \"shopify_description\": \"\", \"handle\": \"\"},\n  \"it\": {\"shopify_product_name\": \"\", \"shopify_description\": \"\", \"handle\": \"\"},\n  \"pt\": {\"shopify_product_name\": \"\", \"shopify_description\": \"\", \"handle\": \"\"}\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "d6e790a0-c1fa-4623-be86-3cd382c00e2a",
      "name": "Expand Languages & Sanitize",
      "type": "n8n-nodes-base.code",
      "position": [
        -32,
        -64
      ],
      "parameters": {
        "jsCode": "// Entrada: $json.output con claves es,de,en,fr,it,pt\nconst langs = ['es','de','en','fr','it','pt'];\n\nconst productId = $('Get many products').first().json.id;\nconst handleES = $('Get many products').first().json.handle\nconst items = [];\n$input.first().json.output.es\n\nfor (const lang of langs) {\nconst node = $input.first().json.output[lang];\nif (!node) continue;\nitems.push({\njson: {\nproduct_id: Number(productId),\nlang,\nhandle: node.handle,\nshopify_product_name: node.shopify_product_name,\nshopify_description: node.shopify_description,\n// Para comodidad, tambi\u00e9n retornamos los campos ES por si quieres compararlos\nbase_handle_es: handleES\n}\n});\n}\n\n\nreturn items;"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "db699da8-51d3-4a4e-b9bf-be4b2e4f2147",
  "connections": {
    "AI Agent": {
      "main": [
        [
          {
            "node": "Expand Languages & Sanitize",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyze image": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get many products": {
      "main": [
        [
          {
            "node": "Analyze image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Expand Languages & Sanitize": {
      "main": [
        [
          {
            "node": "Append row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Get many products",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Use for free

Source: https://n8n.io/workflows/8179/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This workflow transforms your Telegram bot into an intelligent creative assistant. It can chat conversationally, fetch trending image prompts from PromptHero for inspiration, or perform a deep "remix"

Telegram Trigger, Output Parser Structured, Telegram +6
AI & RAG

This Shopify AI automation is an advanced n8n-powered workflow that transforms Shopify product collections into SEO-optimized blog articles with images, while maintaining full visibility and control t

Shopify Trigger, HTTP Request, Google Sheets +7
AI & RAG

This workflow acts as an AI-powered "Viral Architect" for YouTube creators. Simply send a video topic (e.g., "Kling 2.6") to your Telegram bot, and it will scrape top-performing competitor thumbnails,

Output Parser Structured, N8N Nodes Browseract, OpenRouter Chat +6
AI & RAG

This workflow automates Facebook posting and appointment booking directly from a Telegram bot, making it especially useful for pet grooming businesses that want to keep their social media active while

Google Sheets, OpenAI Chat, Output Parser Structured +12
AI & RAG

This workflow automates batch video publishing prep from a Google Drive folder with AI-generated, platform-specific copy and a simple approval queue in Google Sheets. Perfect for Agencies, content cre

Form Trigger, Google Drive, Google Gemini +5