How to Build a Shopify AI SEO Description Automation Workflow
Automating Shopify AI SEO product descriptions is no longer optional for stores with 500+ products. Without an efficient solution, managing SEO-optimized content becomes a full-time job or a missed opportunity. Most store owners often neglect this, leaving their products with generic manufacturer descriptions, duplicate content, and zero keyword optimization – significantly impacting organic traffic.
We built an N8N automation that generates, reviews, and publishes SEO-optimized product descriptions for Shopify stores automatically. Here's the full build.
What the Workflow Does
- Reads all products from Shopify with missing or short descriptions
- For each product, extracts: product title, category, tags, variants, and existing description
- Sends to OpenAI with an SEO-focused prompt
- Generates a keyword-rich, conversion-optimized description
- Reviews the output for quality (another AI call — optional but recommended)
- Updates the Shopify product via API
- Logs every update to Google Sheets with the before/after
Shopify API Setup
First, create a private app in your Shopify admin:
- Go to Settings → Apps and sales channels → Develop apps
- Create a new app
- Configure Admin API scopes:
read_products,write_products - Get your API key and Admin API access token
Store in N8N credentials as shopify_token.
Step 1 — Fetch Products Needing Descriptions
// N8N HTTP Request — Shopify API
URL: https://YOUR-STORE.myshopify.com/admin/api/2024-01/products.json?limit=250
Headers: { "X-Shopify-Access-Token": "{{ $credentials.shopify_token }}" }Filter products that need new descriptions:
// N8N Code node
const products = $input.first().json.products;
const needsDescription = products.filter(p =>
!p.body_html ||
p.body_html.replace(/<[^>]*>/g, '').trim().length < 150
);
return needsDescription.map(p => ({
json: {
id: p.id,
title: p.title,
product_type: p.product_type,
tags: p.tags,
vendor: p.vendor,
variants: p.variants.map(v => `${v.title}: ₹${v.price}`).join(', '),
existing_desc: p.body_html?.replace(/<[^>]*>/g, '').slice(0, 200) || 'None'
}
}));Step 2 — Generate SEO Description with OpenAI
System prompt:
You are an expert Shopify SEO copywriter specializing in Indian e-commerce.
Generate a product description that:
1. Opens with the primary keyword naturally in the first sentence
2. Is 150-200 words (ideal for SEO + mobile reading)
3. Highlights 3-4 key features/benefits
4. Uses active voice and customer-focused language ("you'll love", "perfect for")
5. Includes a natural call-to-action in the last sentence
6. Avoids superlatives like "best" or "most amazing"
7. Uses plain text only — no markdown, no HTML tags
Return ONLY the description text. No preamble.
Product Details:
Title: {{ $json.title }}
Category: {{ $json.product_type }}
Tags: {{ $json.tags }}
Variants/Pricing: {{ $json.variants }}
Current description: {{ $json.existing_desc }}Step 3 — Quality Review (Optional but Recommended)
Before publishing, run a second AI call to check quality:
System prompt:
You are a Shopify SEO content reviewer.
Review this product description and return JSON:
{
"approved": true/false,
"seo_score": 1-10,
"issues": ["list of issues if any"],
"suggested_fix": "only if approved is false"
}
Approve if:
- Starts with a keyword
- 150-200 words
- No keyword stuffing
- Customer-focused language
- Has a call to action
Description to review:
{{ $json.generated_description }}Only publish descriptions that receive "approved": true and seo_score >= 7.
Step 4 — Update Shopify Product
// N8N HTTP Request — Update product
URL: https://YOUR-STORE.myshopify.com/admin/api/2024-01/products/{{ $json.product_id }}.json
Method: PUT
Headers: { "X-Shopify-Access-Token": "{{ $credentials.shopify_token }}" }
Body: {
"product": {
"id": "{{ $json.product_id }}",
"body_html": "<p>{{ $json.final_description }}</p>"
}
}Add a 2-second delay between updates to respect Shopify's rate limits (2 calls/second on the standard plan).
Step 5 — Bulk Mode with Rate Limiting
For stores with 1,000+ products, run in batches:
// N8N Code node — batch processing with rate limiting
const products = $input.all();
const BATCH_SIZE = 50;
const DELAY_MS = 500; // 500ms between each product update
const batches = [];
for (let i = 0; i < products.length; i += BATCH_SIZE) {
batches.push(products.slice(i, i + BATCH_SIZE));
}
// Process first batch, schedule rest for later runs
const currentBatch = batches[0];
return currentBatch;Run the workflow on a daily schedule — it processes 50 products per run, completing a 1,000-product store in 20 days.
SEO Prompt Engineering for Indian E-commerce
For Indian Shopify stores, the prompt needs adjustments:
Additional prompt instructions for Indian stores:
- Include INR pricing context naturally where relevant
- Use Indian measurement standards where applicable (kg, cm, litre)
- Consider common Indian search patterns (e.g., "buy [product] online India")
- For fashion: mention size guides, fabric quality, occasion suitability
- For electronics: mention warranty, compatibility with Indian voltage
- For food: highlight ingredients, allergens, shelf lifeResults from Client Stores
After running this on a D2C skincare brand with 340 products:
| Metric | Before | 60 days after |
|---|---|---|
| Products with <150 word descriptions | 280 (82%) | 12 (4%) |
| Average organic sessions/month | 4,200 | 7,800 |
| Organic-attributed revenue | ₹1,80,000 | ₹3,40,000 |
| Time spent on product copy | 20 hours/week | 2 hours/week (review only) |
The 86% increase in organic sessions came primarily from long-tail product searches that the new descriptions now ranked for.
Cost to Run This System
- N8N (self-hosted): ₹800/month
- OpenAI API (GPT-4o-mini): ~₹0.50 per product (generation + review) = ₹500 for 1,000 products one-time, then only for new products
- Total for 1,000-product store: ~₹1,300 setup, ₹100–200/month ongoing
We're Monk Media One Tech — AI automation agency, Ahmedabad. We build Shopify AI automation, N8N workflows, and e-commerce AI systems.
Book a free discovery call: monkmediaone.tech/contact
📞 +91 88668 19349 | hello@monkmediaone.tech
