You inherited 200 Shopify product descriptions. Half were written by a freelancer in 2022, a quarter were AI-generated by a previous tool that thought every product was "perfect for any occasion," and the rest were typed in a hurry the night before launch. (Assuming you didn't just take the print-on-demand generics.)
Now you want them to actually work. You want them all rewritten in your brand voice, capped at the length your PDP template actually accommodates, referencing the specs that matter to your customers, with the must-include phrases the legal team gave you (or would have, if you had a legal team).
Your options, as the catalog stands today, are all bad. Copy-pasting 200 times is a week of work. A Shopify CSV import will silently overwrite formatting, drop characters, and ship to the live store before you notice the one row that broke. You could use Shopify AI, but Shopify Magic is the engine that wrote "perfect for any occasion" in the first place. One product at a time, in the admin, no rule layer, no diff.
Scratch, the desktop app, takes a different path. It pulls your products as local files. Your AI rewrites the descriptionHtml field in place against rules you set. You review each rewrite as a diff before anything touches the live store. And if a description goes live and reads wrong an hour later, reject the row and the original goes back.
The prompt
Paste this into Claude, Claude Code, or Cursor at your Scratch project root. The AI will interview you for the rules (brand voice, length cap, must-include phrases, things to avoid), calibrate on one product, and only then work through the rest.
Step 3 is the safety. The AI rewrites one product, you confirm the shape, and only then does it work through the catalog. If the voice or structure is off, you catch it after one rewrite instead of after two hundred.
You are rewriting the descriptionHtml field across a folder of Shopify
product JSON files. Each file is one product in Shopify GraphQL Admin
shape; Scratch pulled them from a live catalog. The rewrites land on
disk; a human reviews each one as a diff in Scratch before anything
ships.
Edit only descriptionHtml. Do not change any other field, and do not
invent a fact that is not in the existing copy, title, productType, or
variants.
Before you start:
1. Read a handful of products to understand the catalog. What kinds of
things, what the existing copy gets right, what it gets wrong, what
facts tend to be missing.
2. Interview me for the rules. Brand voice, a length cap, must-include
phrases, words or claims I do not want to see, anything else that
matters. Push back if my answers are too vague to act on.
3. Rewrite one product. Show me. Only continue once I am happy with
the shape.
If a product is ambiguous (the copy contradicts the title, the
materials are missing, you cannot tell whether a must-include
applies), skip it until the rest are finished, then ask me about all of the issues at the end.
When you finish, print one line: count rewritten, count skipped,
"READY · review diff in Scratch". The edits on disk are the
deliverable. Do not dump rewrites to chat.
What the rewrite actually looks like
This is the loop Scratch runs for every task. Here is what each step looks like for a description rewrite.
1. Pull
Scratch pulls your Shopify catalog into a local folder, one .json per product, in Shopify GraphQL Admin shape. You see something like scratch/shopify/products/0001-linen-drawstring-pants.json, with the editable body in descriptionHtml and the locked fields (variants, inventory, metafields) sitting beside it. Two hundred products land as two hundred files. Nothing on the live store has changed.
2. AI edits
Open Claude Code at your Scratch project root and paste the prompt above. The AI reads a sample of the files, asks you for the rules (voice, length, must-includes, what to avoid), rewrites one product for sign-off, then works through the rest, stopping on anything ambiguous. Scratch keeps the original alongside the rewrite so it can diff them later. You did not give the AI an API token. It cannot touch the live store even if it wanted to.
3. Review
Open the Scratch desktop app. Every product with a changed description shows up as a row in the review table, the old description on the left, the new one on the right, changed fields highlighted. Scan the diff. Rows where the AI obeyed your voice and length rules get a one-click approve. Some rows will have drifted. A "premium" snuck in. The hook reads like an ad. The bullet list lost a real spec. Those get one-click reject, or a quick fix in place.
4. Ship
When you have approved the rows you want live, hit publish right in Scratch. Scratch writes the approved descriptions back through the Shopify Admin API, one product at a time, with a log of which products went out. Rejected and unedited rows stay where they were. And rollback still works after publish: if a description reads wrong on the live store an hour later, reject the row in Scratch and the original descriptionHtml goes back. No CSV. No manual copy-paste. No "publish all and pray."
Why not just import a CSV
Most teams reach for a CSV import. Here is the cost.
The CSV path fails in ways that are hard to spot at scale. A description with a smart-quote or a stray comma can shift columns. A row where someone left descriptionHtml blank in the spreadsheet will blank it out on the live store. There is no per-row approve gate, so 200 rewrites ship together or not at all. And once it is published, the only "rollback" is re-importing yesterday's CSV, assuming you exported one. The Scratch path inverts every one of those properties. Your descriptions exist as 200 small files. Your rules run before you look. You approve per product. You roll back per product.
When not to use this skill
- Your AI can't touch local files. Scratch is a desktop app; it works on a folder of records on your machine. A web-only chat with no file system access can't drive the loop. The /with/ pages cover the AIs that can.
- Your real product prose lives in a custom metafield. This skill rewrites
descriptionHtml. The products connector pulls a fixed field set today (body, SEO, tags, variants) and doesn't pull arbitrary product metafields yet. If your real copy sits in something likemarketing.long_description, tell Curtis which metafield holds it and the connector will be updated to pull it. Connector tweaks are cheap. - You don't have a brand voice to point at yet. The rewrite is only as good as the rules you give it. Spend half an hour writing the voice paragraph and the must-include / must-not-include lists before you run the prompt. The prompt is the cheap part.
- The catalog has factual gaps. If half your products are missing materials or dimensions in the existing copy, the AI will correctly stop on most of them and the list of skipped products will be longer than the rewrites. Fix the source data first.
The shape is simple: the AI does the rewrite, you keep the veto. Two hundred descriptions get the same polish, and not one ships without you reading it.
Related
- Scratch for Shopify covers every other field Scratch can edit on a Shopify catalog.
- Standardize Shopify product tags is the next thing to run once your descriptions are clean.
- Make the agent define done before it starts pairs well with this prompt on long sessions.