Generate AI Product Descriptions with n8n + Ollama (E-Commerce Automation)

Published March 24, 2026 · 14 min read · By Workflow Forge

Writing unique product descriptions is one of the biggest bottlenecks in e-commerce. Whether you manage 50 SKUs or 50,000, every listing needs a compelling, SEO-optimized description that converts browsers into buyers. Hiring copywriters costs $5–25 per description. Cloud AI APIs charge $0.01–0.05 each and send your product data to third parties. With n8n and Ollama, you can generate thousands of unique, keyword-rich descriptions on your own hardware — completely free after setup.

In this tutorial you'll build a workflow that:

  1. Reads product data from a spreadsheet, database, or API (Shopify, WooCommerce, etc.)
  2. Generates unique, SEO-optimized descriptions using local AI
  3. Produces multiple variants (short, long, bullet points, meta description)
  4. Applies brand voice and tone guidelines consistently
  5. Outputs formatted descriptions ready to upload to your store

Why Local AI for Product Descriptions?

FeatureCloud AI (GPT-4, Claude)Self-Hosted (n8n + Ollama)
Cost per description$0.01–0.05$0 (your hardware)
1,000 descriptions$10–50$0
50,000 descriptions$500–2,500$0
Data privacyProduct data sent externallyNever leaves your server
Rate limitsYes (tokens/min, requests/min)No limits
QualityExcellentVery good (7B–14B models)
Speed2–5s per description3–8s per description (CPU), 1–3s (GPU)
The math is simple: If you have 5,000 products and refresh descriptions quarterly, that's 20,000 descriptions per year. At $0.03 each with cloud AI, that's $600/year. With Ollama, it's $0 — forever. For large catalogs, the savings compound fast.

Prerequisites

Architecture Overview

Product Data Source (Sheets / Shopify / DB)
    ↓
[Read Products] — Fetch product name, category, features, specs
    ↓
[Enrich Data] — Add category-specific keywords, competitor context
    ↓
[Generate Description] — Ollama generates SEO-optimized copy
    ↓
[Generate Variants] — Short desc, bullet points, meta description
    ↓
[Quality Check] — Verify length, keywords, formatting
    ↓
[Output] — Write to spreadsheet, update store via API, or export CSV

Step-by-Step Build

STEP 1 — Product Data Input

Read products from your data source

Use a Google Sheets, Spreadsheet File, or HTTP Request node to read your product catalog. Each row should have:

{
  "sku": "WH-BLENDER-PRO",
  "name": "ProBlend 5000 Countertop Blender",
  "category": "Kitchen Appliances",
  "features": ["1500W motor", "64oz BPA-free pitcher", "10 speed settings", "pulse function", "self-cleaning mode"],
  "price": 89.99,
  "target_audience": "home cooks, smoothie enthusiasts",
  "brand": "KitchenElite",
  "existing_description": ""
}

For Shopify, use the HTTP Request node with:

GET https://your-store.myshopify.com/admin/api/2024-01/products.json
Headers: X-Shopify-Access-Token: {{your_token}}

For WooCommerce:

GET https://your-store.com/wp-json/wc/v3/products
Auth: Basic (consumer_key:consumer_secret)
STEP 2 — Keyword Enrichment

Add SEO context for each product

Add a Code node that maps product categories to target keywords. This ensures every description naturally includes search terms buyers actually use:

const categoryKeywords = {
  "Kitchen Appliances": ["best blender", "countertop blender", "smoothie maker", "kitchen gadget"],
  "Electronics": ["wireless", "bluetooth", "rechargeable", "portable"],
  "Clothing": ["comfortable", "breathable", "machine washable", "true to size"],
  "Home & Garden": ["durable", "easy to assemble", "weather resistant", "space saving"],
  "Beauty": ["natural ingredients", "dermatologist tested", "cruelty-free", "long lasting"]
};

const product = $input.item.json;
const keywords = categoryKeywords[product.category] || [];

return {
  json: {
    ...product,
    seo_keywords: keywords,
    feature_list: product.features.join(", ")
  }
};
STEP 3 — Generate Main Description

Create SEO-optimized product copy with Ollama

Add an HTTP Request node to call Ollama. The prompt engineering is critical here — it determines the quality and consistency of every description:

POST http://localhost:11434/api/generate

{
  "model": "qwen2.5:14b",
  "prompt": "You are an expert e-commerce copywriter. Write a compelling product description that sells.\n\nProduct: {{name}}\nCategory: {{category}}\nKey Features: {{feature_list}}\nPrice: ${{price}}\nTarget Audience: {{target_audience}}\nBrand: {{brand}}\n\nSEO Keywords to naturally include: {{seo_keywords}}\n\nRequirements:\n1. Write 150-200 words\n2. Start with a benefit-driven hook (not the product name)\n3. Highlight the top 3 features with concrete benefits\n4. Include at least 2 SEO keywords naturally\n5. End with a subtle call-to-action\n6. Use active voice and sensory language\n7. Do NOT use cliches like 'game-changer', 'revolutionary', or 'take X to the next level'\n8. Write in a warm, confident tone\n\nWrite ONLY the description, no headers or labels.",
  "stream": false,
  "options": {
    "temperature": 0.7,
    "num_predict": 400
  }
}

temperature: 0.7 gives creative variety while keeping output coherent. Higher values (0.9+) risk rambling; lower values (0.3) make descriptions sound robotic and repetitive across products.

STEP 4 — Generate Variants

Create multiple description formats

Most e-commerce platforms need descriptions in multiple formats. Add a second Ollama call to generate variants from the main description:

{
  "model": "mistral:7b",
  "prompt": "Based on this product description, create 3 variants:\n\nOriginal:\n{{main_description}}\n\nProduct: {{name}}\nFeatures: {{feature_list}}\n\nGenerate:\n1. SHORT (50 words max) - punchy summary for product cards/listings\n2. BULLETS (5 bullet points) - key selling points, each starting with a benefit\n3. META (155 characters max) - SEO meta description for search results\n\nFormat your response as JSON:\n{\"short\": \"...\", \"bullets\": [\"...\", \"...\"], \"meta\": \"...\"}",
  "stream": false,
  "options": {
    "temperature": 0.5,
    "num_predict": 500
  }
}

Using the faster mistral:7b for variants is a good tradeoff — the main description already sets the quality bar, and the variants just need to be accurate reformattings.

STEP 5 — Quality Validation

Automated quality checks

Add a Code node that validates every description before it reaches your store:

const desc = $input.item.json;
const main = desc.main_description;
const issues = [];

// Length check
const wordCount = main.split(/\s+/).length;
if (wordCount < 100) issues.push("Too short: " + wordCount + " words");
if (wordCount > 300) issues.push("Too long: " + wordCount + " words");

// Keyword check
const keywordsFound = desc.seo_keywords.filter(kw =>
  main.toLowerCase().includes(kw.toLowerCase())
);
if (keywordsFound.length === 0) issues.push("No SEO keywords found");

// Duplicate check (basic)
const sentences = main.split(/[.!?]+/).filter(s => s.trim().length > 20);
const uniqueSentences = new Set(sentences.map(s => s.trim().toLowerCase()));
if (uniqueSentences.size < sentences.length * 0.8) {
  issues.push("Contains repetitive sentences");
}

// Cliche check
const cliches = ["game-changer", "revolutionary", "next level", "cutting-edge", "state-of-the-art"];
const foundCliches = cliches.filter(c => main.toLowerCase().includes(c));
if (foundCliches.length > 0) issues.push("Cliches found: " + foundCliches.join(", "));

// Meta description length
if (desc.meta && desc.meta.length > 160) {
  issues.push("Meta description too long: " + desc.meta.length + " chars");
}

return {
  json: {
    ...desc,
    quality: {
      passed: issues.length === 0,
      issues: issues,
      word_count: wordCount,
      keywords_found: keywordsFound.length
    }
  }
};

Products that fail quality checks get flagged for regeneration or manual review.

STEP 6 — Output to Store

Update your product listings

For Shopify, update the product via API:

PUT https://your-store.myshopify.com/admin/api/2024-01/products/{{product_id}}.json

{
  "product": {
    "body_html": "{{main_description}}",
    "metafields_global_description_tag": "{{meta}}"
  }
}

For Google Sheets output (review before publishing), write all variants to a new sheet:

| SKU | Name | Main Description | Short | Bullets | Meta | Quality |
|-----|------|-----------------|-------|---------|------|---------|

For CSV export, use n8n's Spreadsheet File node to generate a CSV ready for bulk import into any platform.

Brand Voice Configuration

Consistency is what separates professional product copy from AI slop. Create a brand voice prompt prefix that's prepended to every generation:

// Store in a Code node or n8n credentials
const brandVoice = {
  "luxury": "Write in a sophisticated, aspirational tone. Use sensory language. Emphasize craftsmanship, materials, and exclusivity. Avoid discount language.",
  "casual": "Write in a friendly, conversational tone. Use contractions. Be relatable and enthusiastic without being pushy. Include light humor where appropriate.",
  "technical": "Write in a precise, specification-focused tone. Lead with performance data. Include measurements, ratings, and comparisons. Audience is knowledgeable.",
  "eco": "Emphasize sustainability, materials sourcing, and environmental impact. Mention certifications. Tone is earnest and transparent, not preachy."
};

const voice = brandVoice[$input.item.json.brand_voice || "casual"];
Pro tip: Include 2–3 example descriptions in your prompt as few-shot examples. This dramatically improves consistency. Copy your best-performing existing descriptions (those with highest conversion rates) and use them as the template for AI to follow.

Handling Large Catalogs

Batch processing

For catalogs with thousands of products, use n8n's Split In Batches node to process 10–50 products at a time. Add a Wait node between batches if running on CPU to prevent memory pressure:

Split In Batches (size: 20)
    ↓
[Generate Description] — Ollama call
    ↓
[Wait 2s] — Let GPU/CPU cool down (optional, for large batches)
    ↓
Loop back to next batch

Incremental updates

Don't regenerate every description on every run. Add a check for products that already have descriptions:

// Only process products without descriptions or flagged for refresh
const needsDescription = $input.item.json.existing_description === ""
  || $input.item.json.refresh_flag === true;

if (!needsDescription) {
  return []; // Skip this product
}
return [$input.item];

Performance benchmarks

HardwareModelDescriptions/hour
CPU only (8-core)mistral:7b~200–400
CPU only (8-core)qwen2.5:14b~80–150
RTX 3060 (12GB)mistral:7b~800–1,200
RTX 3060 (12GB)qwen2.5:14b~400–600
RTX 4090 (24GB)qwen2.5:14b~1,000–1,500

Even on CPU, you can regenerate a 5,000-product catalog overnight with mistral:7b.

SEO Optimization Tips

Multilingual Descriptions

Selling internationally? Add a translation step after generating the English description:

{
  "model": "qwen2.5:14b",
  "prompt": "Translate this product description to {{target_language}}. Maintain the marketing tone, adapt idioms naturally, and keep SEO keywords in the target language. Do NOT translate brand names or model numbers.\n\nOriginal:\n{{main_description}}\n\nTranslated:",
  "stream": false,
  "options": { "temperature": 0.3 }
}

qwen2.5 models are particularly strong at multilingual tasks, supporting 20+ languages with good quality. For European e-commerce, this single workflow can generate descriptions in English, German, French, Spanish, and Italian simultaneously.

Common Use Cases

Want the complete workflow + 10 more AI templates?

Get the full Self-Hosted AI Workflow Pack for n8n + Ollama. 11 production-ready templates including product descriptions, email automation, lead scoring, and more.

Get the Pack — $39

Summary

Product description generation is one of the highest-ROI applications of local AI for e-commerce. The cost savings are immediate and scale linearly: whether you have 100 products or 100,000, the per-description cost with Ollama is zero. The workflow handles the complete pipeline from raw product data to store-ready copy with quality validation built in.

Start with your worst-performing product listings — the ones with thin or duplicate descriptions that aren't ranking in search. Generate new descriptions, monitor the impact on organic traffic and conversion rates, then roll out to your full catalog. The brand voice configuration ensures consistency, and the quality checks catch issues before anything goes live.

For stores refreshing descriptions quarterly, this workflow saves dozens of hours of copywriting work every cycle — and the descriptions are available in minutes, not days.