---
title: "Generate SEO Product Descriptions at Scale with n8n + AI"
description: "Build an n8n workflow that loops your product catalog, generates SEO descriptions with AI, and pushes them back — AI credits included."
canonical: https://agentroost.app/en/blog/bulk-product-descriptions-n8n-ai
date: 2026-06-03T04:00:00Z
---

[Canonical URL](https://agentroost.app/en/blog/bulk-product-descriptions-n8n-ai)

## The Problem with Writing Product Descriptions at Scale

A product catalog with 300 SKUs needs 300 unique, keyword-rich descriptions. Copy-pasting a template and swapping the product name produces thin, duplicate-content spam that Google deprioritizes and shoppers ignore. Outsourcing to a copywriter costs thousands. Paying a per-token AI API bill for that volume adds up fast — and still requires you to wire everything together yourself.

The better path: a scheduled n8n workflow that pulls every product, feeds a structured prompt to an AI node, and writes the result back to Shopify or WooCommerce without you touching a keyboard.

This post walks you through exactly that build, node by node.

---

## What the Workflow Actually Does

At a high level:

1. **Reads your product catalog** from Shopify or WooCommerce via HTTP.
2. **Loops over each product**, extracting the name, category, key attributes, and any existing description stub.
3. **Sends a structured prompt to an AI/LLM node**, which returns a polished, SEO-aware description.
4. **Pushes the result back** using the store's update endpoint.
5. **Optionally logs** every run (product ID, tokens used, new description length) to a Google Sheet or Airtable for QA review.

---

## Building the Workflow — Node by Node

### 1. Schedule Trigger

Start with a **Schedule Trigger** node. For a one-off bulk run, set it to run once at a specific time. For an ongoing "new products get descriptions automatically" setup, a daily interval (e.g., every night at 2 AM) keeps the catalog fresh without hammering your store's API.

```json
{
  "rule": {
    "interval": [{ "field": "cronExpression", "expression": "0 2 * * *" }]
  }
}
```

### 2. HTTP Request — Fetch Product List

Use an **HTTP Request** node to call your store's REST API.

**For WooCommerce:**
```
GET https://your-store.com/wp-json/wc/v3/products
  ?per_page=100
  &status=publish
  &_fields=id,name,categories,attributes,description
```

Add your WooCommerce consumer key and secret under **Authentication → Header Auth** (`Authorization: Basic base64(key:secret)`).

**For Shopify:**
```
GET https://your-store.myshopify.com/admin/api/2024-01/products.json
  ?limit=250
  &fields=id,title,product_type,tags,body_html
```

Use **Header Auth** with `X-Shopify-Access-Token: <your-token>`.

If your catalog is larger than one page, add a **Loop Over Items** node and paginate by incrementing the `page` or `page_info` cursor until the response is empty.

### 3. Loop Over Items

Drop a **Loop Over Items** node (n8n's built-in batching node) after the HTTP Request. Set **Batch Size** to `1` so each iteration processes a single product — this keeps the AI prompt clean and the error handling granular.

Inside the loop, you'll place the Set node, the AI node, and the update HTTP Request.

### 4. Set — Build the Prompt

A **Set** node formats the data before it hits the AI. This is where the prompt engineering lives.

```
productName:     {{ $json.title }}
category:        {{ $json.product_type }}
tags:            {{ $json.tags }}
existingContent: {{ $json.body_html | stripHtml | truncate(200) }}
```

Then build the `prompt` field:

```
Write a product description for an e-commerce listing.

Product: {{ $json.productName }}
Category: {{ $json.category }}
Tags/Attributes: {{ $json.tags }}
Existing content hint: {{ $json.existingContent }}

Requirements:
- 80-120 words
- Start with a customer benefit, not the product name
- Include the main keyword naturally ({{ $json.productName }})
- Avoid superlatives like "best" or "amazing"
- End with a soft call to action ("Perfect for...", "Ideal if...")
- Output plain text only, no markdown
```

The more specific the requirements in this node, the less post-processing you need downstream.

### 5. AI / LLM Node — Generate the Description

Connect the Set node to n8n's **AI / LLM node** (available natively in n8n). Set the model — GPT-4o-mini is fast and cost-efficient for this task; Claude 3 Haiku is another solid choice for bulk description work. Point the prompt field at `{{ $json.prompt }}`.

> **Key setting:** Set `Max Tokens` to around 200. You don't want the model to ramble; descriptions should be tight. Set `Temperature` to `0.6` — enough creativity to vary tone across SKUs without hallucinating specs.

The node returns the generated text in `$json.text` (or `$json.choices[0].message.content` depending on the node version).

### 6. Set — Clean the Output

Run the AI response through another **Set** node to trim whitespace, strip any stray markdown characters the model snuck in, and cap length:

```
cleanDescription: {{ $json.text.trim().replace(/\n{2,}/g, '\n') }}
```

### 7. HTTP Request — Write Back to the Store

**WooCommerce:**
```
PUT https://your-store.com/wp-json/wc/v3/products/{{ $json.id }}
Body (JSON): { "description": "{{ $json.cleanDescription }}" }
```

**Shopify:**
```
PUT https://your-store.myshopify.com/admin/api/2024-01/products/{{ $json.id }}.json
Body (JSON): { "product": { "id": {{ $json.id }}, "body_html": "{{ $json.cleanDescription }}" } }
```

### 8. Optional: Log to Google Sheets

Add a **Google Sheets → Append Row** node after the update call. Log `productId`, `productName`, `timestamp`, and `descriptionLength`. This gives your content team a simple QA sheet to spot-check before descriptions go live — or to flag products the model handled poorly (very short results, question marks in the output, etc.).

---

## Handling Edge Cases

**Products that already have good descriptions:** Add an **IF** node after the HTTP Request. Check `$json.body_html.length > 300` — if true, skip to the next iteration. No point rewriting copy that already works.

**API rate limits:** n8n's **Wait** node with a 500ms pause between iterations is usually enough for both Shopify and WooCommerce's standard rate limits.

**Model hallucinating specs:** If the AI invents dimensions or materials that don't exist, tighten the prompt with a negative constraint: `"Do not invent any product specifications. Only use details present in the product name, tags, and category."`

**Sizing the test run:** Before processing your entire catalog, run the workflow against 10–20 products first. Review the outputs and check your token log. It is much easier to tune the prompt at that scale than to re-process hundreds of SKUs after discovering a systematic issue.

---

## Run It on AgentRoost (No API Keys, No Server Setup)

Here is the friction you avoid when you run this on your own n8n instance on AgentRoost:

- **No API key for the AI node.** The LLM credits are included in your subscription. You pick the model (350+ available, switch anytime), hit save, and the workflow runs. No OpenAI billing account, no separate Anthropic key, no credit card to manage on a third platform.
- **No server to provision.** Your instance is already running at `https://<your-id>.agentroost.app` — public HTTPS URL, webhooks work immediately.
- **No Docker, no nginx, no SSL cert.** It is your own n8n environment; you own the workflows and credentials, but the DevOps layer is already handled.

**How to get started:**

1. Sign up at [agentroost.app/en/pricing](/en/pricing) — from $19.99/mo, 14-day money-back guarantee.
2. Pick the **n8n** framework, name your instance.
3. Your private n8n editor opens. Import or build the workflow above.
4. Add your WooCommerce/Shopify credentials in n8n's Credentials panel.
5. Activate the workflow. The AI nodes draw from your included credits — no extra setup.

[Compare plans →](/en/pricing)

---

## Tips for Better Descriptions

- **Feed more context.** If your product data includes materials, dimensions, or use-case tags, add them to the Set node prompt. The more grounded the input, the more accurate the output.
- **Batch by category.** Run electronics in one batch, apparel in another — adjust the system prompt tone per category (technical vs. lifestyle).
- **A/B test two models.** Run the workflow twice with different models on a small batch and compare the outputs before committing to the full catalog.
- **Store the raw AI output separately.** Keep the original AI response alongside the final description in your log sheet. If you tweak the prompt later, you can re-evaluate old outputs without re-running the workflow.
