FlowKit

Generating e-commerce product descriptions at scale with AI in n8n

Published 3 August 2026 · 5 min read

An e-commerce catalog with hundreds or thousands of SKUs always runs into the same dilemma: writing every product listing by hand takes time few shops have, but importing the supplier's descriptions as-is means publishing the same text as dozens of other sites — a textbook case of duplicate content, bad for both SEO and conversion. n8n lets you build a pipeline that reads your catalog, generates a unique, substantive listing for each product with an LLM, checks its quality, and pushes it automatically to Shopify, WooCommerce, or PrestaShop.

This isn't just marketing intuition: a study by Reisenbichler, Reutterer, Schweidel, and Dan, published in Marketing Science in 2022 and run under real-world field conditions across two industries, found that SEO content generated by a language model and then revised by a human editor ranked as well as — sometimes better than — text written entirely by human SEO experts, while remaining nearly indistinguishable from human writing to readers (Reisenbichler et al., 2022, Marketing Science — see on Google Scholar). The role of the human editor is still described as essential — which is exactly the setup this workflow implements: automatic generation, but with a quality-control checkpoint before publication rather than a direct write to production.

Pipeline overview

The workflow has five steps: reading the source catalog, preparing per-product attributes, generating the text with an LLM constrained to a structured schema, a quality check (length, duplicates, forbidden wording), then writing back to the e-commerce platform.

Catalog source → Prepare attributes → LLM (title + description + meta) → Quality check → IF (ok / needs review) → Publish via API

The trigger: where the catalog comes from

Three sources come up most often, each with a matching n8n trigger:

  • CSV file or Google Sheets — the most common case for a bulk supplier import. A Google Sheets node (read) or Read Binary File + Spreadsheet File is enough to pull in the catalog rows.
  • An existing Shopify or WooCommerce catalog — for reprocessing listings that are already live but incomplete. The connector's native node (see our Shopify and WooCommerce guides) fetches the product list via the API, filtered for example on empty or too-short descriptions.
  • PrestaShop — the same logic via the Webservice API, see our PrestaShop connection guide.

In all three cases, a Loop Over Items node processes the catalog in batches rather than in one giant pass — essential to avoid saturating both the LLM API and the e-commerce platform's API on a catalog with thousands of rows. The details of this pattern (batch size, Wait between batches, reading the retry-after header) are covered in our guide to n8n loops and our guide to API rate limits.

Preparing product attributes

A Set node (or Code) normalizes each row into a structured object before passing it to the LLM:

return items.map((item) => ({
  json: {
    sku: item.json.sku,
    name: item.json.name,
    category: item.json.category,
    attributes: {
      color: item.json.color,
      material: item.json.material,
      dimensions: item.json.dimensions,
    },
    price: item.json.price,
  },
}));

This step is critical for the quality of the generated text: the more explicit the distinctive attributes (color, material, dimensions, intended use) are on input, the less reason the model has to produce a generic, interchangeable text across SKUs — the number-one risk on a catalog with many close variants (the same shoe in five colorways, for example).

Generating the text: LLM Chain and structured output

A Chain LLM node (or AI Agent for cases where the model also needs to consult an external spec sheet) receives these attributes plus a prompt that sets the frame: brand tone, target length, no inventing an attribute that wasn't provided. A Structured Output Parser node downstream forces the response into a fixed schema:

{
  "seo_title": "string, max 60 characters",
  "short_description": "string, max 160 characters",
  "long_description": "string, 400-600 characters",
  "meta_description": "string, max 155 characters"
}

This structured schema avoids the classic pitfall of free-form text that's awkward to map cleanly back into a product listing's fields — the same principle covered in our Information Extractor guide and our Structured Output Parser guide.

Quality check before publication

This is the step that separates a reliable pipeline from a generic content generator. A Code node runs a series of automated checks before anything is sent to the platform:

const d = $json;
const issues = [];

if (d.long_description.length < 200) issues.push("description too short");
if (/\b(best|number one|amazing)\b/i.test(d.long_description)) {
  issues.push("unverifiable superlative");
}
if (d.seo_title.length > 60) issues.push("seo title too long");

return [{ json: { ...d, ok: issues.length === 0, issues } }];

An IF node then splits compliant listings (direct publication) from listings that need review (routed to a human review queue instead of being blocked outright). For large catalogs, an additional similarity check — comparing each new description's embedding against those already generated in the same category — catches cases where the model still produced a text too close to another listing, and forces a targeted regeneration for those SKUs.

For ambiguous cases that shouldn't ship through automatic publication (regulated categories, health claims, high-margin products), the human approval with Wait and Slack pattern applies directly: a Slack message with the generated listing, two buttons, and the workflow resumes on the reply.

Publishing back to the platform

Once validated, the listing goes back to its source platform via the native node (Shopify, WooCommerce, PrestaShop) or an authenticated HTTP Request for cases not covered by a dedicated node. Map each generated field explicitly to its counterpart on the platform side rather than overwriting the whole product object — that avoids accidentally wiping fields managed elsewhere (stock, variants, images).

Generated field Shopify destination WooCommerce destination
seo_title title name
long_description body_html description
meta_description SEO metafield Yoast/RankMath field

Multilingual catalogs

For a shop selling in several languages, it's more reliable to first generate the listing in the source language with all attributes, then translate it with a second, dedicated LLM call rather than asking for multilingual generation in a single prompt — quality and terminology consistency both improve noticeably. Our guide to automated content translation covers this two-pass pattern in detail.

Summary

An AI product-listing pipeline in n8n rests on four guardrails: explicit input attributes rather than a bare product name, structured output rather than free text, an automated quality check before publication, and a human review step for sensitive cases. That last step — supervision, not full automation — is what separates a catalog that gains visibility from one that accumulates generic filler. If your catalog already draws on a documentation base (supplier spec sheets, usage guides), the ingestion pipeline described in our RAG with Supabase guide can feed the generation prompt directly with richer product data than a plain catalog export.

FAQ

Frequently asked questions

Is AI-generated content penalized by Google?

No, not by principle: Google evaluates the quality and usefulness of content, not the method used to produce it. What gets penalized is duplicate, thin, or unverified content — exactly what this workflow avoids by generating a unique text per SKU and enforcing a quality check before publication.

Do you need to manually review every product listing before publishing?

For a large catalog launch, a human spot-check on 10-20% of listings is usually enough once the prompt is stable. For sensitive categories (health, safety, claims) or on the first runs, a human approval step before publication remains the safest practice.

How much does generation cost for a catalog of several thousand SKUs?

With a low-cost model like gpt-4o-mini and a spec sheet limited to the useful attributes, expect a few cents per 100 listings. For a 5,000-SKU catalog, total cost is typically well under ten euros — far below the cost of manual copywriting.

How do you avoid two similar products getting near-identical descriptions?

By feeding each SKU's distinctive attributes (color, material, dimensions, use case) into the prompt instead of just a product name, and by adding a similarity check (comparing embeddings of already-generated descriptions) before final validation, to catch and regenerate cases that are too close to each other.

Bundle FlowKit Complet

€269