The change is one sentence long. The shipping promise moved from 2 days to 3, or legal wants the wording your payment processor flagged out of every listing, or an ingredient got discontinued and every description that praises it is now wrong. You know the old phrase and the new one. What you do not know is where it all lives: how many of your 1,200 product descriptions, which blog posts, whether it made it onto the shipping FAQ in your Online Store pages. So you go looking for find and replace in the Shopify admin. The bulk editor does not have it. The rich-text editor does not have it. No screen in the admin has it.
The job looks mechanical, and most of it is. Most hits are clean swaps. The rest are not: the phrase capitalized at the start of a sentence, sitting inside a heading, split across HTML tags, or load-bearing in a sentence that stops being true when you swap it blind. The shape that handles both kinds: pull your products, pages, and posts into local files, find every occurrence with one search, let your AI agent apply the clean swaps and rewrite the messy ones, and review each change as a word-level diff before anything touches the store.
Your options
Admin search and hand edits
Shopify's admin search genuinely covers description text: it matches words in titles, descriptions, and tags, so it can build the list of affected products for free. Three limits decide how far that gets you. It does not match partial words, so "proof" will not surface "waterproof". The result is a list of products, not locations: it does not say where in the description the phrase sits or how many times it appears. And there is no replace step anywhere, so each hit means opening the product and hunting through the editor by hand. Pages and blog posts need their own filtered searches. Fine for 6 hits. At 300, it is a week.
A CSV round trip
Export products, run find and replace down the Body (HTML) column in your spreadsheet, re-import with overwrite. Credit first: the spreadsheet has the find and replace Shopify lacks, it previews matches, and it scales to the whole product catalog. The edges are sharp. A non-required column included but left blank does not mean skip; it means wipe the live value to blank. The import cannot be cancelled once it starts, Shopify keeps no import history, and the official advice is to export a backup first because there is no other undo. And the round trip covers products only: Shopify has no native CSV export for pages or blog posts, so the phrase survives everywhere the spreadsheet cannot reach.
A find-and-replace app
There is a whole app category for exactly this, and the better ones preview matches and advertise an undo with backups, which is more safety than anything native offers. The limits are the category's shape. Most cover products only; pages and blog posts usually need a different tool. Free and cheap tiers usually cap how many products one task can touch, so a catalog-scale pass tends to land on the paid plans. And the engine is a literal string match: it does exactly what you typed, on the casing you typed, with the grammar around each swap left as your problem. You are also handing a third party write access to your live catalog, with undo quality that varies by app.
A script on the Admin API
A developer can do this precisely with GraphQL: fetch descriptionHtml, transform it, write it back with productUpdate. Two mechanics make it slower and blinder than it sounds. The products query has no filter for description text, so finding the phrase means paging through the entire catalog a few hundred products at a time and searching on your side, again for every variant spelling. And rate limits are cost-based, so a catalog-wide pass runs as minutes of throttled mutations, not one call. Writes replace the whole field, and the REST endpoints most older tutorials use were deprecated in 2024. Above all: every mutation lands on the live store the moment it runs, with no diff, no approval, and no version history behind it.
Scratch
Scratch runs the same find and replace on local files instead of the live store. It pulls your products, articles, blogs, and pages into one folder tree, so a single search covers all four surfaces at once. Your own AI agent does the work: grep finds every occurrence, including the casing and spacing variants, a script swaps the clean hits, and the agent reads and rewrites the messy ones. Every changed file comes back as a word-level diff next to the original, prices, variants, inventory, and metafields stay locked, and only what you approve publishes back. The review is real reading: the clean swaps skim in a second each, and the handful of rewritten sentences are the part you actually read.
| Option | Finds every occurrence | Pages and posts | Messy hits | Review before live | Undo after publish |
|---|---|---|---|---|---|
| Admin search, hand edits | Whole words, products listed only | Separate searches | You, by hand | You are the change | No |
| CSV round trip | In the spreadsheet | Not exported | By hand, in cells | Reading a column | Your backup, if you made one |
| Find-and-replace app | Literal matches only | Usually products only | No, rules only | Varies | Varies |
| Admin API script | Full catalog crawl per search | More endpoints, more code | If you code it | Only if you build it | No |
| Scratch | One grep, every folder | Same folder tree | Your agent's judgment | Every change, word-level diff | Per item |
How the loop works on a phrase change
- Scratch pulls your store into files. Every product, article, blog, and page lands as its own file in a folder on your laptop, in Shopify's GraphQL Admin shape. Descriptions, page bodies, and post bodies are all editable text; prices, variants, inventory, and metafields sit beside them, locked. The phrase you are hunting is now plain text, findable in one pass. Nothing live has changed.
- Your AI finds and fixes every occurrence. Point Claude, Codex, Cursor, or Copilot at the folder with the brief. Replace "ships in 2 business days" with "ships in 3 to 5 business days" everywhere it appears. Match casing variants and HTML splits. Where the phrase is part of a bigger claim, rewrite the sentence so it stays true, and list those separately. One grep finds every hit across 1,200 products and every page and post in under a second, a script handles the clean swaps, and the agent reads the rest. That is 99% of the job, done on your laptop, with no store credential anywhere in it.
- You review every diff and publish. Each changed item shows word by word against the original. The clean swaps read in a second; your attention goes to the rewritten sentences. An optional validator can fail any file where the old phrase still appears. Approve, and Scratch writes back through the Admin API at the API's own pace, one approved item at a time. The last 1%, deciding what customers read, stays with you. And a published replacement is not final: reject the item and the old text comes back, row by row.
The hits a blind replace gets wrong
Run the first grep and the occurrence list explains why no literal rule survives a real catalog. Expect some of these:
- The phrase opens a sentence, so it is capitalized, and the lowercase rule walks past it.
- The shipping promise is a heading in title case inside an
<h3>, not a sentence at all. - The HTML splits it:
ships in <strong>2</strong> business daysnever matches the literal string. - The sentence is built around the old fact. "Order by noon and it still arrives in 2 days" needs a rewrite that keeps the claim true, not a swap.
- The discontinued ingredient also lives in the meta description, where the replacement has a character budget to respect.
- The flagged wording survives in a blog post from 3 years ago that no product search would ever surface.
The clean hits take a script. The rest take judgment, which is exactly what putting an agent on the files adds.
Questions people ask
Does Shopify have a find and replace anywhere in the admin?
No. Search exists; replace does not. The bulk editor covers fields like price, SKU, and tags and has no replace step, the rich-text editor has no dependable in-description find, and Shopify's own route for large text changes is the CSV. Everything else is an app or the API.
Can Shopify's admin search find every affected product?
Mostly. It matches words in titles, descriptions, and tags, so it builds a real list. It does not match partial words, it shows which products match but not where or how many times, and pages and blog posts need their own filtered searches. The list is a start; the work is still one product at a time.
Does this cover blog posts and pages, not just products?
Yes. Scratch pulls articles, blogs, and pages into the same folder tree as products, with title, body, handle, tags, and SEO fields editable. One search covers all of it. The full field list is on Scratch for Shopify.
Can it catch the casing and spacing variants of the phrase?
It can. On local files the agent searches by pattern, not just literal text: capitalized at a sentence start, title case in a heading, the phrase split across HTML tags or line breaks. Each variant is one more grep over the folder, not one more crawl of the catalog.
Can I see every replacement before it goes live?
Yes. Every occurrence the grep found comes back as a word-level diff against the original, clean swap or rewrite alike, and nothing publishes until you approve it. If a hit was rewritten rather than swapped, the diff is where you catch it.
Can I undo a replacement after it publishes?
Yes. The original stays next to every published change, item by item, and rejecting it puts the old text back. Shopify itself keeps no version history for descriptions, so outside Scratch the only safety net is a backup you exported before touching anything.
Will this touch prices, variants, or inventory?
Nothing. Prices, variants, and inventory are locked at the connector, so even a replacement pattern that overmatches has no write path to them. The worst a bad grep can do is propose a text diff you reject.
What if the phrase lives in a metafield?
Not supported. Metafields are locked at the connector, along with prices, variants, and inventory, so the agent cannot edit them as files. If metafield text is where your phrase lives, tell Curtis; connector tweaks are cheap when we know what people need.
Do I need to be technical?
No. You describe the phrase change in plain English; the casing variants, the split-across-tags cases, and the regex are the agent's problem. Your part is reading word-level diffs of every occurrence and deciding which ones publish.
See it on your own store
The fastest way to answer "where else does it appear" is to run the search on your real catalog. See it run on your store →, or download Scratch free, connect Shopify, and grep the phrase across your own products, pages, and posts before you change anything.