AutomationFlowsAI & RAG › Generate Batch Product Descriptions in Google Sheets with Gemini and Slack

Generate Batch Product Descriptions in Google Sheets with Gemini and Slack

ByOka Hironobu @okp29 on n8n.io

This workflow runs daily to find products in Google Sheets that are missing marketing copy, generates a short description and SEO meta title for each item using Google Gemini in rate-limited batches, writes the results back to the sheet, and posts a completion summary to Slack.…

Cron / scheduled trigger★★★★☆ complexityAI-powered11 nodesGoogle SheetsSlackChain LlmGoogle Gemini Chat
AI & RAG Trigger: Cron / scheduled Nodes: 11 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Chainllm → Google Sheets 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": "17MrNWs85wXcDe2d",
  "meta": {
    "builderVariant": "mcp",
    "aiBuilderAssisted": true
  },
  "name": "Bulk-generate product descriptions for a catalog in rate-limited batches with Gemini",
  "tags": [],
  "nodes": [
    {
      "id": "735d562d-6d78-44c2-abc1-a31c6e83017d",
      "name": "Schedule Daily Run",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        48,
        48
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 6
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "9a5f7ede-a3f9-4d01-aec7-bc20cbf7ad91",
      "name": "Get Products Missing Copy",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        272,
        48
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Products"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Select your spreadsheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "c9bf32d7-ce1d-408b-b3d2-16b05cec4d10",
      "name": "Notify Batch Complete",
      "type": "n8n-nodes-base.slack",
      "position": [
        848,
        32
      ],
      "parameters": {
        "text": "=*:white_check_mark: Product copy generated*\n{{ $(\"Get Products Missing Copy\").all().length }} products were processed and written back to the sheet.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "#ecommerce"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.5
    },
    {
      "id": "0ee84324-2124-4102-9316-60975b34c624",
      "name": "Write Product Copy with Gemini",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        832,
        208
      ],
      "parameters": {
        "text": "=You are an e-commerce copywriter. Write a warm, benefit-led product description of about 60 words plus a punchy 55-character SEO meta title for the product below. Return the description first, then a line starting with \"META: \".\n\nProduct: {{ $json['Product Name'] }}\nFeatures: {{ $json.Features }}\nTarget keywords: {{ $json.Keywords }}",
        "batching": {},
        "promptType": "define"
      },
      "typeVersion": 1.9
    },
    {
      "id": "186649d8-80a5-46b8-acbe-8f5c66348672",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        832,
        464
      ],
      "parameters": {
        "options": {
          "temperature": 0.6
        },
        "modelName": "models/gemini-3.1-flash-lite"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "85682140-3ae5-4a3c-9b09-3df2f8bf93e1",
      "name": "Split Description and Meta",
      "type": "n8n-nodes-base.code",
      "position": [
        1104,
        208
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const out = String($json.text || '');\nconst metaMatch = out.match(/META:\\s*(.*)$/im);\nconst meta = metaMatch ? metaMatch[1].trim() : '';\nconst description = out.replace(/META:\\s*.*$/im, '').trim();\nconst row = $('Loop In Batches').item.json;\nreturn { productName: row['Product Name'] || row.productName || '', description: description, metaTitle: meta };"
      },
      "typeVersion": 2
    },
    {
      "id": "c981b274-74ae-4da9-92a6-5a6f8544074d",
      "name": "Save Copy to Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1280,
        208
      ],
      "parameters": {
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Products"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "Select your spreadsheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "0157757b-9bc6-4deb-aad7-4e675eb9e959",
      "name": "Loop In Batches",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        576,
        48
      ],
      "parameters": {
        "options": {},
        "batchSize": 5
      },
      "typeVersion": 3
    },
    {
      "id": "82799637-4e28-47e6-84a1-51eae4056614",
      "name": "Overview Sticky",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -560,
        -256
      ],
      "parameters": {
        "width": 488,
        "height": 760,
        "content": "## Bulk-generate product descriptions for a whole catalog in rate-limited batches\n\n### How it works\nThis template shows the batch-processing pattern: instead of hitting the AI once, it works through an entire product catalog five rows at a time so you never trip the model rate limit. On a schedule it reads only the products that still have no description from Google Sheets, then a Loop Over Items node feeds them to a Basic LLM Chain with Google Gemini in small batches. For each product Gemini writes a benefit-led description and an SEO meta title, a Code node splits the two apart, and the result is written back to the same row - matched by product name so nothing duplicates. When the loop finishes, its done output posts a Slack summary.\n\n### Setup\n1. Connect Google Gemini (PaLM) API, Google Sheets and Slack.\n2. Give your Products sheet columns for Product Name, Features, Keywords and an empty Description.\n3. Adjust the batch size and schedule to fit your rate limits.\n\n### Customization tips\nAdd a Wait node inside the loop for stricter throttling, or push the copy to Shopify."
      },
      "typeVersion": 1
    },
    {
      "id": "16b1f368-a324-4346-a779-dd82c3d414ca",
      "name": "S1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        -256
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 900,
        "content": "## 1. Fetch the backlog\nRun on a schedule and read only products that still have no description."
      },
      "typeVersion": 1
    },
    {
      "id": "6c72c0f5-1879-4204-9b9e-e0a3743c0888",
      "name": "S2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        448,
        -256
      ],
      "parameters": {
        "color": 7,
        "width": 996,
        "height": 896,
        "content": "## 2. Loop in batches (Basic LLM Chain)\nProcess five products at a time so you stay under the rate limit. Gemini writes the copy, a Code node splits description and meta, and each row is upserted back. When done, notify Slack."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": true,
    "executionOrder": "v1"
  },
  "versionId": "69a66e1c-12af-4fa6-84b6-99e91eaef299",
  "nodeGroups": [],
  "connections": {
    "Loop In Batches": {
      "main": [
        [
          {
            "node": "Notify Batch Complete",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Write Product Copy with Gemini",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Copy to Sheet": {
      "main": [
        [
          {
            "node": "Loop In Batches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Daily Run": {
      "main": [
        [
          {
            "node": "Get Products Missing Copy",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Write Product Copy with Gemini",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Get Products Missing Copy": {
      "main": [
        [
          {
            "node": "Loop In Batches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Description and Meta": {
      "main": [
        [
          {
            "node": "Save Copy to Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Write Product Copy with Gemini": {
      "main": [
        [
          {
            "node": "Split Description and Meta",
            "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

This workflow runs daily to find products in Google Sheets that are missing marketing copy, generates a short description and SEO meta title for each item using Google Gemini in rate-limited batches, writes the results back to the sheet, and posts a completion summary to Slack.…

Source: https://n8n.io/workflows/17518/ — 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 is the AI analysis and alerting engine for a complete social media monitoring system. It's designed to work with data scraped from X (formerly Twitter) using a tool like the Apify Tweet

Google Sheets, Google Gemini Chat, Google Sheets Tool +4
AI & RAG

Categories Content Creation AI Automation Publishing Social Media

Google Docs, HTTP Request, Slack +7
AI & RAG

Automatically identifies overdue sales leads and generates personalized follow-up emails using AI. Runs every weekday Reads leads from Google Sheets Filters leads with no contact for 5+ days Downloads

Google Sheets, Chain Llm, Google Gemini Chat +3
AI & RAG

This workflow runs daily to review Japanese ad copy in Google Sheets using Google Gemini, writes compliance risk results back to the sheet, and alerts the right team in Slack (and drafts a Gmail revis

Google Sheets, Chain Llm, Google Gemini Chat +3
AI & RAG

This workflow runs weekly to read attendance overtime from Google Sheets, totals it per employee and month, uses Google Gemini to classify risk against Japanese labour-law limits, writes results back

Google Sheets, Chain Llm, Google Gemini Chat +3