All case studies

DEV3 Technologies · own product

DEV3 AI Product Description & SEO Optimizer: bulk AI product copy for Shopify with dry-run review and rollback

Our own Shopify app: it audits a whole catalog, writes titles, descriptions, meta tags and vision-based alt text in bulk, and changes nothing until the merchant approves. Every applied change can be rolled back for 30 days.

Industry
E-commerce (Shopify)

Live project preview

Client systems are private — screenshots shown where permitted.

DEV3 Technologies · own product — screenshots
Review screen: original product copy and the AI draft side by side, with removed and added words highlighted and per-field Accept, Reject and Edit controls.

Review screen: original product copy and the AI draft side by side, with removed and added words highlighted and per-field Accept, Reject and Edit controls.

The challenge

Most Shopify catalogs share the same gaps: empty or thin descriptions, missing meta titles and descriptions, and product images without alt text. Fixing them by hand takes weeks, and AI can do it in minutes. But letting a model write directly into hundreds of live product pages is a risk merchants rightly refuse. Generated copy can invent specifications, ignore character limits that search engines enforce, follow instructions hidden in product data, or simply read worse than the original. And once a bulk edit has gone out, Shopify has no undo button. The app needed to make bulk AI edits reviewable before they happen and reversible after.

Our solution

We built the app around one rule: AI output is a draft, and a draft only reaches the store after a merchant accepts it and a snapshot of the original has been saved.

Key design decisions

  • Catalog audit in one pass. A Shopify bulk operation exports the whole catalog; every product gets a 0–100 score and a list of gaps (missing or short description, missing or overlong meta tags, images without alt text, overlong title).
  • Dry run by default. Generation writes Draft rows (one per field, or per image for alt text) with the original and the proposal side by side. Nothing is sent to the Admin API until the merchant accepts, edits or rejects each field.
  • Snapshot before every write. Applying a product first stores its current title, description, SEO fields and alt texts in a Snapshot that expires after 30 days, then calls productUpdate. A retried apply reuses the unrestored snapshot, so originals are never overwritten by AI values.
  • Safe rollback order. Rolling back a job, or one product, restores the snapshot, but only if no newer applied job changed the same fields. Otherwise the app asks the merchant to roll back the newer job first, instead of silently discarding it.
  • Limits enforced twice. The response schema carries maxLength per field (meta title 60, meta description 155 by default), and the output is truncated at a word boundary afterwards. HTML descriptions are sanitized against an allowlist and trimmed by whole blocks.
  • Facts only, data as data. The prompt allows only facts present in the product data, and the product data is wrapped as untrusted input. Banned and required keywords produce warnings on the draft.
  • Alt text through fileUpdate. A vision model (gemini-2.5-pro) looks at each image; alt text is written with fileUpdate on the MediaImage, because productUpdateMedia is deprecated.
  • Resumable background jobs. BullMQ workers process scan, generate and commit queues in batches with per-shop and global AI rate limits in Redis. Items left mid-flight after a crash return to pending, and plan credits are checked inside the worker.

Architecture

An embedded Shopify app on React Router 7 with Polaris web components, Postgres through Prisma (Job → JobItem → Draft, plus Snapshot, ProductAudit, Preset and SyncEvent) and a separate BullMQ worker on Redis. Every Admin GraphQL operation (Admin API 2026-10) lives in one module with throttling retries and userErrors checks. A products/create webhook can queue new products for review or apply them automatically, deduplicated per product and update time. Shared packages used across DEV3's Shopify apps provide the Google Gemini API client, queues, rate limiting, billing and Shopify helpers. GDPR webhooks delete a shop's data on redaction.

Results

The app is in final QA before submission to the Shopify App Store; real-store testing is the next step. What was built and verified so far:

  • 0 TypeScript errors in npm run typecheck.
  • 54 Vitest tests in 7 files, including integration tests on a real Postgres database and a real Redis + BullMQ worker.
  • The full worker flow, scan → generate → review → apply → rollback, runs end to end against a fake Shopify Admin API. The tests cover partial apply, per-product rollback restoring exact originals, blocked out-of-order rollback, userErrors on one product not stopping the rest, the Free-plan limit, 30-day snapshot expiry and shop redaction.
  • Live AI smoke run on 3 sample products: meta titles stayed within 60 characters and meta descriptions within 155, an instruction injected into a product description was ignored, and alt text was generated from the product photo with gemini-2.5-pro.

Related case studies