{"slug": "the-magento-multi-store-bug-every-ai-description-generator-has-and-how-we-fixed", "title": "The Magento multi-store bug every AI description generator has — and how we fixed it", "summary": "Common architectural flaw in Magento 2 AI content modules where product descriptions are saved in the default store scope instead of per store view, causing multilingual catalogs to be overwritten with a single language. The author built an MIT-licensed, open-source solution that iterates through each store view and uses a four-provider AI abstraction (OpenAI, Claude, Gemini, and free Groq) to generate and save descriptions correctly. The framework supports multiple input sources and output destinations, with practical recommendations to validate prompts using Groq's free tier before deploying paid models for production.", "body_md": "A client came to us with 8,000 SKUs across four store views — English, Dutch, German, French. Descriptions were either copied from supplier PDFs or missing entirely. The fix was obviously AI generation. The less obvious problem was that **every existing module we evaluated had the same architectural bug**.\n\nSo we built our own, made it MIT-licensed, and put it on Packagist. This post is about the bug, the fix, and the four-provider abstraction (including a free one) we shipped on top.\n\n🔗 Originally published on\n\n[https://angeo.dev/magento-2-ai-product-description-generator/]\n\n## The bug nobody talks about\n\nMost Magento 2 AI content modules call this:\n\n``` php\n$product = $this->productRepository->get($sku, editMode: true);\n$product->setCustomAttribute('description', $generated);\n$this->productRepository->save($product);\n```\n\nLooks fine. It isn't. Without an explicit `$storeId`\n\n, this loads and saves in the**default scope**— Magento's global, store-view-independent fallback. When you save back, you overwrite** every store view at once**. The Dutch store gets English descriptions. The German store gets English descriptions. The French store gets English descriptions.\n\nThis is not a configuration problem. The multi-store architecture works correctly — the tooling ignores it. Writing to the default scope is simpler to implement than writing per store. Every commercial module we tested took the simpler path.\n\nThe right way:\n\n``` php\n// Load the product in the target store scope\n$product = $this->productRepository->get($sku, false, $storeId);\n$product->setCustomAttribute('description', $generated);\n\n// Save with explicit store scope (Magento_Catalog\\Model\\Product\\Action)\n$this->productService->updateAttributes($sku, $generated, $storeId);\n```\n\nThe difference is one parameter. The architectural cost is iterating stores around your generation loop. The data cost of skipping it is silently corrupting your multi-language catalog.\n\n## The framework around the fix\n\nThe store-scope fix is the boring part. The interesting part is everything you need around it.\n\n```\n┌─────────────────────────────────────────────────────┐\n│       Angeo Multi-Store AI Content Framework        │\n├──────────────┬──────────────────┬───────────────────┤\n│  SKU Source  │ Store Iteration  │   AI Provider     │\n│  ──────────  │  ──────────────  │  ──────────────── │\n│  Catalog     │  Store 1 (EN)    │  OpenAI           │\n│  G.Sheets    │  Store 2 (NL)    │  Claude           │\n│  CLI --sku   │  Store 3 (DE)    │  Gemini           │\n│              │  Store 4 (FR)    │  Groq (free)      │\n├──────────────┴──────────────────┴───────────────────┤\n│               Content Pipeline                      │\n│  load(sku, storeId) → prompt → generate → save      │\n├─────────────────────────────────────────────────────┤\n│                    Output                           │\n│  Magento DB · Local CSV · Google Sheets API v4      │\n└─────────────────────────────────────────────────────┘\n```\n\nFour layers:\n\n-**Provider Layer**— uniform interface across OpenAI, Claude, Gemini, Groq -** Store Iteration Layer**— resolves all active store views before processing any SKUs -** Content Pipeline**— for each store × SKU: load in scope → build prompt → generate → save in scope -** I/O Layer**— reads SKUs from catalog, Google Sheet, or CLI; writes to Magento DB, CSV, and Google Sheets\n\nThe provider abstraction is the part most people will copy. One interface:\n\n```\ninterface AiProviderInterface\n{\n    public function generate(string $system, string $user): string;\n}\n```\n\nWired in `di.xml`\n\n:\n\n```\n<type name=\"Angeo\\AiDescriptionUpdater\\Service\\AiProviderService\">\n  <arguments>\n    <argument name=\"providers\" xsi:type=\"array\">\n      <item name=\"openai\" xsi:type=\"object\">...OpenAiProvider</item>\n      <item name=\"claude\" xsi:type=\"object\">...ClaudeProvider</item>\n      <item name=\"gemini\" xsi:type=\"object\">...GeminiProvider</item>\n      <item name=\"groq\"   xsi:type=\"object\">...GroqProvider</item>\n    </argument>\n  </arguments>\n</type>\n```\n\nAdding a fifth provider is one class + one line. The pipeline, store iteration, and I/O don't change. This is the pattern, not just the code.\n\n## The four-provider benchmark\n\n200 product descriptions from a real Dutch jewellery store, same system prompt, same product names, all four providers.\n\n### Speed (avg per description)\n\n| Provider | Model | Avg. time |\n|---|---|---|\n| Groq | llama-3.3-70b-versatile | 0.8s |\n| Groq | mixtral-8x7b-32768 | 0.6s |\n| gemini-2.0-flash | 1.2s | |\n| Anthropic | claude-haiku-4-5 | 1.1s |\n| OpenAI | gpt-4.1-mini | 1.4s |\n| OpenAI | gpt-4.1 | 2.1s |\n| Anthropic | claude-sonnet-4-6 | 2.8s |\n\nFor 32,000 generations (8,000 SKUs × 4 store views):**Groq ≈ 7 hours, GPT-4.1 ≈ 19 hours**.\n\n### Cost (per 1,000 descriptions, ~200 words each)\n\n| Provider | Model | Cost / 1k |\n|---|---|---|\n| Groq | llama-3.3-70b-versatile | $0.00 (free tier) |\n| gemini-2.0-flash | ~$0.08 | |\n| OpenAI | gpt-4.1-mini | ~$0.24 |\n| Anthropic | claude-haiku-4-5 | ~$0.32 |\n| OpenAI | gpt-4.1 | ~$1.80 |\n| Anthropic | claude-sonnet-4-6 | ~$2.40 |\n\n### Quality (manual review of 200 samples)\n\n| Criteria | Groq Llama 3.3 | GPT-4.1-mini | GPT-4.1 | Claude Sonnet |\n|---|---|---|---|---|\n| Factual accuracy | ★★★★☆ | ★★★★☆ | ★★★★★ | ★★★★★ |\n| Language fluency | ★★★★☆ | ★★★★☆ | ★★★★★ | ★★★★★ |\n| SEO keyword use | ★★★☆☆ | ★★★★☆ | ★★★★☆ | ★★★★☆ |\n| HTML formatting | ★★★★☆ | ★★★★☆ | ★★★★★ | ★★★★★ |**Practical recommendation:** Validate prompts with Groq first — it's free, fast, and good enough to test workflow. Production on GPT-4.1-mini if SEO keyword density matters. Flagship products on GPT-4.1 or Claude Sonnet if copy quality directly affects conversion.\n\n## Why Groq matters\n\nGroq's free tier is 14,400 requests/day. No credit card. Llama 3.3 70B output quality is genuinely good — ~1 star behind GPT-4.1 in our review, mostly on SEO keyword density.\n\nFor 8,000 SKUs × 4 stores = 32,000 calls, you're at ~1.85 days on the free tier. For most stores under 5,000 SKUs, this is**free production-grade AI content generation** if you're patient.\n\nNo other Magento module supports Groq at time of writing. This was the killer feature for our client.\n\n## Installation\n\n```\ncomposer require angeo/module-ai-description-updater\nbin/magento setup:upgrade\nbin/magento setup:di:compile\nbin/magento cache:flush\n```\n\nFirst run (Groq, ~5 minutes from zero):\n\n```\n# 1. Get a free API key at console.groq.com\n# 2. In admin: Stores → Configuration → Angeo → AI Description Updater\n#    AI Provider = Groq (Free), paste key, Dry Run = Yes\n# 3. Test on one SKU\nbin/magento angeo:ai-description:run --sku=MY-SKU-001 --dry-run\n\n# 4. If output looks good, disable dry-run and run the batch\nbin/magento angeo:ai-description:run\n```\n\nOther useful flags:\n\n```\nbin/magento angeo:ai-description:run --sku=ABC-123     # single SKU, all stores\nbin/magento angeo:ai-description:run --store=2         # single store view\nbin/magento angeo:ai-description:run --dry-run         # generate, don't save\n```\n\nCLI-first by design. The 8,000-SKU client doesn't want a UI; they want cron.\n\n## Why it's open source\n\nThe honest answer: distribution. We sell AEO audits and full-stack Magento services. The modules are how stores find us. The code is free; the expertise applied to a specific store is not.\n\nIt's a familiar model — Vercel does it with Next.js, Sentry does it with sentry-php. The artefact is open; the operator is the product.\n\n## Key takeaways for Magento devs\n\n-**Default-scope writes are silent multi-store corruption.** Audit any AI/content module before installing on a multi-store catalog. Look for`$storeId`\n\nparameters in`productRepository->get()`\n\nand save calls. -**Provider abstraction is one interface plus a** Don't hardcode OpenAI. Future you (or future LLM pricing) will thank you.`di.xml`\n\narray. -**Groq is the current sweet spot for free Magento AI generation.** Llama 3.3 70B output is production-acceptable for most stores; the 14,400/day cap is workable for catalogs under ~5,000 SKUs. -**GPT-4.1-mini is the best paid-tier value.** Comparable to GPT-4.1 at ~17% of the cost. -**CLI + cron beats admin UI for catalogs above ~500 SKUs.** Click-by-click generation isn't a workflow.\n\n## Links\n\n-**Module on Packagist:**`angeo/module-ai-description-updater`\n\n-**Full benchmark + FAQ:**[angeo.dev/magento-2-ai-product-description-generator](https://angeo.dev/magento-2-ai-product-description-generator/) -** Why AI search changes Magento descriptions:**[angeo.dev/magento-product-descriptions-in-the-age-of-ai-search](https://angeo.dev/magento-product-descriptions-in-the-age-of-ai-search/) -**The technical why:**[angeo.dev/magento-product-description-invisible-ai-chatgpt](https://angeo.dev/magento-product-description-invisible-ai-chatgpt/)\n\n*Originally published on angeo.dev. Questions or feedback — drop a comment.*", "url": "https://wpnews.pro/news/the-magento-multi-store-bug-every-ai-description-generator-has-and-how-we-fixed", "canonical_source": "https://dev.to/angeo/the-magento-multi-store-bug-every-ai-description-generator-has-and-how-we-fixed-it-59b1", "published_at": "2026-05-22 05:02:09+00:00", "updated_at": "2026-05-22 05:37:38.409729+00:00", "lang": "en", "topics": ["open-source", "developer-tools", "artificial-intelligence", "enterprise-software"], "entities": ["Magento", "Packagist", "MIT", "angeo.dev"], "alternates": {"html": "https://wpnews.pro/news/the-magento-multi-store-bug-every-ai-description-generator-has-and-how-we-fixed", "markdown": "https://wpnews.pro/news/the-magento-multi-store-bug-every-ai-description-generator-has-and-how-we-fixed.md", "text": "https://wpnews.pro/news/the-magento-multi-store-bug-every-ai-description-generator-has-and-how-we-fixed.txt", "jsonld": "https://wpnews.pro/news/the-magento-multi-store-bug-every-ai-description-generator-has-and-how-we-fixed.jsonld"}}