How to bulk edit product descriptions in Shopify
Key takeaways
- Shopify's built-in bulk editor can edit descriptions. The column is just switched off by default, which is why most people conclude it can't.
- Typing — not writing, just typing — one 147-character description took 19.6 seconds in our test, and that was at a machine-steady pace faster than most people type. Fifty products is about 16 minutes of pure typing. Five hundred is nearly three hours.
- A description-only CSV will not import. You need five columns, and one row per variant. The two error messages you'll hit are quoted in full below.
- Shopify's current CSV template calls the columns
URL handleandDescription. The older names,HandleandBody (HTML), still import correctly — we imported 50 products with them on 19 August 2026. - The setting that silently loses your work is Overwrite products with matching handles. Leave it unticked and Shopify skips every product you were trying to change.
Published 21 August 2026 by Adot Technologies Inc, the team behind Arvio. Every step below was run in a live Shopify admin in August 2026; the timings are stopwatched, not estimated. Method in full at the end.
The part of this that is not a Shopify problem
Two of the three methods below work fine. What they cannot do is write the words. Arvio drafts descriptions against your own catalogue — your vendors, your variants, your product types — and shows you each one before it goes live.
The quick version
- Under ~50 products: Products → select → Bulk edit → Columns → tick Description. Edit them in a grid. Costs nothing, built in, and genuinely the fastest way to touch a lot of products by hand.
- Working in a spreadsheet, or handing the copy to someone else: export a product CSV, keep five columns, tick Overwrite products with matching handles, re-import.
- Past the point where writing them all by hand is realistic: generate drafts, review them, then publish the ones you approve.
Neither of the first two writes a single word for you. That is the honest limit of both, and it's the reason the third section exists.
Why bulk product descriptions are harder than they should be
Shopify's product admin is built around editing one product at a time. The bulk editor exists, but it opens with a default column set — title, price, inventory, status — and Description is not in it. There is no message telling you the column exists; you have to know to go looking in the Columns picker.
That single default is why the top results for this question are full of people saying the built-in editor can't do descriptions, and why so many merchants jump straight to a paid app for something their admin already does.
Method 1 — the built-in bulk editor
Products → tick the products you want → Bulk edit.
The checkbox in the header row selects everything on the page. Once the grid opens:
Click Columns (top right) and tick Description. That's the whole trick. The column exists; it's off by default.
While you're in that picker, the same applies to media, tags, product type, vendor, template and your sales channels — all editable in the same grid, all one tick away.
Now you have every description in one grid. Click a cell, type, move on. No loading a product page, no going back, no losing your place. Save when you're done.
The "Editing 15 products" thing is not a limit
Select fifty products and the grid header will tell you it's editing far fewer than fifty — 15, in our run. This looks like a cap and gets reported as one. It isn't. It's lazy loading: scroll down and the header climbs to 35, then 50. The full list of fifty is in the URL's ids= parameter the entire time.
What it actually saves you
We stopwatched it. Typing one real 147-character description — not composing it, just typing it — took 19.6 seconds.
| Products | Pure typing time |
|---|---|
| 50 | ~16 minutes |
| 200 | ~1 hour 5 minutes |
| 500 | ~2 hours 43 minutes |
That's typing only. It excludes deciding what to say, which is the part that actually takes the time.
Method 2 — export, edit and re-import a CSV
First, the thing nobody warns you about. The description column is called Body (HTML) for a reason: it holds markup, not plain text. If your descriptions have headings, bullets or bold, what lands in the spreadsheet cell is <p>, <ul>, <strong> and the rest, on one line. Two consequences worth knowing before you export:
- Whatever you type into that cell is what ships. Type plain sentences and you get plain sentences — the formatting you had is gone, because you replaced the markup that produced it.
- If you are handing the file to someone else to write in, tell them that. A writer who tidies up the tags is rewriting your page layout without knowing it.
If your descriptions are plain prose to begin with, none of this matters and you can treat the column as text.
Better when you want to work in a spreadsheet, or when someone else is writing the copy.
Products → Export → Plain CSV file. Then edit, then Products → Import.
The five columns that work
A description-only file does not import. We tried, twice, and both failures produce error messages that are worth quoting because nothing seems to document them:
A product title column is required.
That's what you get with just the handle and the description. So you add the title — and if any product has variants, you then get:
Product options input is required when updating variants.
The export is around fifty columns wide. Delete every column except these five, and keep one row per variant:
| Column | Why it's there |
|---|---|
URL handle (older name: Handle) |
Matches the existing product |
Title |
Required even when you're not changing it |
Option1 name |
Required if the product has variants |
Option1 value |
One row per variant |
Description (older name: Body (HTML)) |
This is the description field |
On the column names: Shopify's current template — product_template.csv, checked verbatim in August 2026 — uses URL handle and Description. Most guides still teach Handle and Body (HTML), and we can confirm those legacy names still import: the 50-product catalogue we used for this article was itself imported with a Handle / Body (HTML) file on 19 August 2026, and all 26 descriptions in it landed. Either set works today. The current names are the safer bet for the future.
The setting that decides whether any of it lands
Overwrite products with matching handles. Leave it off and Shopify will not touch your existing products at all — your edits quietly don't land and nothing tells you why. Tick it and the preview says it in plain words: existing products will be overwritten.
It matches on the handle, not the title, so renaming a product doesn't break the match.
What a CSV import leaves alone, and what it destroys
This is the part that costs people data, and all three rules are in Shopify's own documentation:
"If a non-required column isn't included in the import CSV file … then the value in the product list remains the same."
A column you leave out entirely is safe. Your images, prices and inventory are untouched by a five-column file.
"If a non-required column in the import CSV file is blank, then the matching value in the product list is overwritten as blank."
A column you include but leave empty erases the existing value. Most people expect the opposite of one of these two, and it's usually this one.
"Changing data in the Option1 value, Option2 value, or Option3 value columns … deletes existing variant IDs, and creates new variant IDs."
This one matters because Method 2 requires you to include the option columns for variant products. Export them and re-import them unchanged and you're fine. Retype them, tidy the capitalisation, or let a spreadsheet "helpfully" reformat them, and you have replaced every variant ID on those products — which breaks anything keyed to variant IDs downstream.
Three more from the same documentation, all worth knowing before you start: the file can't exceed 15 MB, it must be UTF-8 with LF linefeeds, and opening it in Excel can corrupt image links. Back up before importing — Products → Export → All products, and keep that file untouched. It is the only way back if an import writes something you did not intend.
You have now seen both manual routes
One is a spreadsheet in the admin, the other is a CSV round trip. Arvio is the third shape: say what you want changed, read what it drafted, approve or reject it product by product.
Method 3 — generating the drafts
Cost and limits, since this is the one method you pay for. Arvio's plans start at $9.90 per 30 days with a 5-day trial, and work is metered in credits — a completed run costs 10 credits, and the entry plan carries 1,000. There is no product-count ceiling on a run; the ceiling is credits. Failed or incomplete runs are not charged. If Methods 1 and 2 cover your case, they are built into Shopify at no cost and you should use them.
Disclosure: Arvio is our own product. It's third here on purpose — the two methods above need nothing from us, and if you only came for those, you already have what you came for.
Everything above saves you clicks. Neither method writes a word. Once you're past a few hundred products, "the grid is fast" stops being the binding constraint and "somebody has to write 500 descriptions" starts being it.
So here's what that looks like, on the same 69-product demo store used throughout this article. When we ran it, on 2026-08-30, 23 of those 69 had nothing in the description field at all.
Asked in plain English to improve my product copy, deliberately without being told which products:
It looked for the best sellers first — and said so when it couldn't find any. The store has no order history. Rather than pick something and proceed, it reported the gap, pulled the whole catalogue instead, and counted what was actually missing: 23 empty descriptions, 23 missing SEO titles, 60 products with no image alt text. Then it stopped and asked what "top products" should mean, given there were no orders to rank by.
It drafted, and it did not publish. Told to write one for each of the 23, and to show the drafts rather than apply them, it returned 23 drafts on screen. We have not published those drafts, and we should say why rather than let it look like a choice: they were written for a real store's products and we did not clear the copy for republication. So this run tells you the approval gate held; it does not tell you whether the writing was any good, and you should not take our word for that either — that is what a trial is for. We checked the store afterwards, independently of the tool's own report: all 23 descriptions were still empty. Nothing had been written.
Here is what a draft queue looks like on screen. This is a separate, smaller run on the same store — three Storage products, asked for in the same way (the screenshot catches two of the three cards in full, plus the tail of the first):
The three Storage products with no description: draft one description for each, using only their own titles, product types, tags and variants. Show me the drafts before changing anything.

One card per product, each showing the fields behind that draft (Type: Storage · Tags: solid-wood, gift · Variants: Small $52.80, Xtra Large $59.40, Large $70.95), the draft in an editable box, and its own Apply this description button, none of which we pressed.
Two things that row of prices tells you, and neither is about the copy. The variants are Small $52.80 · Xtra Large $59.40 · Large $70.95 — the extra-large costs less than the large, which is the kind of thing an import does to a price list and nobody notices until a customer does. And the panel lists the fields that draft leaned on, not the product's full record: this product also carries a catalog-2026 tag that doesn't appear here. Read it as "what this sentence came from," not as an inventory of the product.
That distinction — a draft queue rather than an autopilot — is the whole reason we built it that way. Bulk generation that writes directly to a live catalogue is a fast way to need a bulk undo.
The two runs took 127 seconds to plan and 323 seconds to draft 23 descriptions.
When you should not bother with any tool
If you have fewer than about fifty products, or descriptions are the only thing you're changing and you already have the copy written, the built-in bulk editor is the right answer and everything else is overhead. Use Method 1 and skip the rest of this section — it costs you nothing, it's already open in your browser, and it will take you twenty minutes.
The video version
The same three methods on screen, in 6 minutes 57 seconds — including both CSV import failures exactly as the admin reports them, and the stopwatch running while one description is typed. Watch on YouTube.
Five things that go wrong
- Ticking nothing and importing anyway. Without Overwrite products with matching handles, the import "succeeds" and changes nothing.
- Including a column you meant to leave alone. A blank cell in an included column erases the live value. Delete the whole column instead.
- Retyping the option columns. New variant IDs, silently.
- One row per product instead of one per variant. Produces the "Product options input is required" error, or drops variants.
- Editing the CSV in Excel. Image links can be mangled on save. Use a plain-text-safe editor or Google Sheets, and export as UTF-8.
Which method for which catalogue
| Situation | Use |
|---|---|
| Under ~50 products, copy already written | Built-in bulk editor |
| Copy written by someone outside your admin | CSV export → edit → re-import |
| Hundreds of products, copy not written yet | Generate drafts, review, then publish |
| One product, one field | Just open the product |
FAQ
Can you bulk edit product descriptions in Shopify without an app?
Yes, two ways, both built in. The bulk editor handles it once you enable the Description column in the Columns picker, and the CSV export/import route handles any number of products. Neither costs anything.
Why is there no Description column in the Shopify bulk editor?
There is — it's just off in the default column set. Click Columns at the top right of the bulk edit grid and tick Description. This is the single most common reason people conclude the built-in editor can't do descriptions.
What is the Body (HTML) column in a Shopify CSV?
It's the product description. Shopify's current export template calls it Description; Body (HTML) is the older name for the same field and still imports correctly as of August 2026.
Why does my Shopify CSV import say "A product title column is required"?
Because your file has no Title column. Shopify requires it on import even when you're not changing the title. Add it and re-export the existing titles rather than retyping them.
Why does my import say "Product options input is required when updating variants"?
Because at least one product in the file has variants and your file has no option columns. Include Option1 name and Option1 value, with one row per variant.
Does importing a CSV overwrite my product images and prices?
Not if those columns aren't in your file — Shopify leaves out-of-file columns untouched. But a column that is in the file and left blank will be overwritten as blank. That asymmetry is where most accidental data loss comes from.
How many products can the Shopify bulk editor handle at once?
More than the header implies. Selecting 50 showed "Editing 15 products" until we scrolled, at which point it filled in to 50. The real constraint on the CSV route is the documented 15 MB file limit, not a product count.
How long does it take to write 500 product descriptions?
Typing alone, on our measurement, about 2 hours 43 minutes — and that excludes composing them, which is the larger half. That's the number worth having before you decide whether to do it by hand.
Method
One Shopify store, 69 products, 50 of them a synthetic catalogue we built for this purpose and 19 pre-existing. All steps run in a live admin between 19 and 21 August 2026, in English, on desktop Chrome.
The 19.6-second figure is a single measured run of typing one 147-character description into the bulk edit grid, timed with a stopwatch visible inside the recording — that is 19.6 seconds end to end for 147 characters, about 133 ms per character, entered at a machine-steady pace with no pauses, no typos and no backspaces. That is faster than most people type, so treat the per-product timings as a floor rather than an estimate of your afternoon. The recording is public: https://www.youtube.com/watch?v=ZMqlmA96aDs. It measures keystrokes only — composing the text is excluded, and on real copy that is the larger cost.
Exclusion: the two CSV failures we quote were reproduced on this store's own export; we did not test a store with 3+ option dimensions, custom metafield columns, or a catalogue near the 15 MB limit, and we would not assume the same error messages there.
Quotations from Shopify's documentation are copied verbatim from the CSV import guide and the column names from the official template, both checked in August 2026.
Related: Your SEO app found 400 missing meta descriptions. Now what? — the same CSV route applied to SEO fields, including the current column names and which flagged items are actually worth fixing.
Related: Shopify App Store Ads: what 310,000 impressions say about Relevance, bids and dead keywords — keyword-level data from our own ad account.
Related: What a Shopify virtual assistant does — the same catalogue jobs, priced as a hire instead of a bulk edit.
Written by Adot Technologies Inc, the team behind Arvio: AI Store Operator — ask for a bulk change in plain language, review every edit before it goes live, and undo anything.
Arvio: AI Store Operator — install it on the Shopify App Store. Descriptions drafted against your real catalogue, each one held for your approval.
