Generate AI Product Descriptions with n8n + Ollama (E-Commerce Automation)
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:
- Reads product data from a spreadsheet, database, or API (Shopify, WooCommerce, etc.)
- Generates unique, SEO-optimized descriptions using local AI
- Produces multiple variants (short, long, bullet points, meta description)
- Applies brand voice and tone guidelines consistently
- Outputs formatted descriptions ready to upload to your store
Why Local AI for Product Descriptions?
| Feature | Cloud 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 privacy | Product data sent externally | Never leaves your server |
| Rate limits | Yes (tokens/min, requests/min) | No limits |
| Quality | Excellent | Very good (7B–14B models) |
| Speed | 2–5s per description | 3–8s per description (CPU), 1–3s (GPU) |
Prerequisites
- n8n — self-hosted instance (Docker or npm)
- Ollama — running locally with
mistral:7b(fast) orqwen2.5:14b(higher quality) - Product data source — Google Sheets, CSV, Shopify API, WooCommerce API, or any database
- ~4GB RAM for 7B model, ~8GB for 14B
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
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)
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(", ")
}
};
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.
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.
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.
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"];
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
| Hardware | Model | Descriptions/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
- Unique descriptions for every product — Duplicate content hurts rankings. Set
temperature: 0.7and include product-specific details in the prompt to ensure uniqueness. - Front-load keywords — Tell the model to include the primary keyword in the first sentence. Google weighs early text more heavily.
- Natural keyword density — Aim for 1–2% keyword density. The quality check node can verify this automatically.
- Structured data — Use the generated descriptions with Schema.org Product markup for rich snippets in search results.
- A/B test descriptions — Generate 2 variants per product, run both for a week, keep the one with higher conversion rate. Automate this with n8n.
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
- Shopify store owners — Bulk-generate descriptions for new product launches
- Dropshipping — Rewrite supplier descriptions to be unique and SEO-friendly
- Amazon/eBay sellers — Create optimized listings for marketplace search
- WooCommerce sites — Refresh stale descriptions to improve organic traffic
- Product data agencies — Generate descriptions at scale for multiple clients
- Seasonal updates — Auto-update descriptions for holiday promotions, sales events
- B2B catalogs — Generate technical product specifications from raw data sheets
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 — $39Summary
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.