MIGRATION · DATA · CONTENT · 6 AUGUST 2026 · 8 MIN READ
Catalogue quality: the audit before the migration
Export the catalogue, count what is broken, and decide what you are not moving. Every hour spent here is an hour you do not spend debugging a cutover.
Export the full catalogue to a spreadsheet before anyone scopes the build, then count five things: products with no description, variants with no barcode or SKU, images below the size the new theme needs, option values that mean the same thing spelled differently, and products nobody has sold in two years. That count is your real migration scope. Fix the data in the old system where you can, decide what you are not moving, and only then start mapping fields.
IN SHORT
- Product data quality decides migration cost more than platform choice does, because every broken record has to be found, judged and fixed by a person.
- The audit is a count, not an impression: export everything and produce a number for each defect class before anyone estimates the work.
- Deciding what not to migrate is the single largest saving available, and the only one that also makes the new store better.
- Option values, vendor names and product types are free-text fields in most systems, so they drift into dozens of spellings that become dozens of broken filters.
- Shopify will import almost anything you give it, which is the problem — a clean import of dirty data is a successful migration of a bad catalogue.
Why this is the work, not the preamble
Migration quotes get written against a product count. Fourteen thousand products, so many weeks. The count is the wrong variable, because the platform does not care how many rows it imports — a bulk import runs the same whether the descriptions are good or empty. What costs money is the subset of rows a machine cannot resolve, and that subset is invisible until somebody counts it.
Here is the shape of it. A product with a missing SKU is not a data problem on the old platform, where nothing enforced SKUs. On the new one it is a stock sync that silently drops a line, a 3PL that cannot receive the order, and an afternoon of someone reconciling by hand. Multiply by however many rows are like it. That number is knowable in a morning and almost nobody produces it before signing.
The audit also changes what you build. A catalogue where 60% of products have one image and no lifestyle shot does not need the theme with the gallery. Knowing that before design starts is worth more than knowing it during UAT.
The export, and the seven counts to take from it
Get a full export out of the current system — every product, every variant, every field, not a sample. If the platform will not export cleanly, pull it through its API. Then produce seven numbers. Each one is a filter or a pivot table, and the whole exercise is a morning for someone who knows spreadsheets.
- Products with no description, or a description under about forty words. These are the ones nobody can write in the sprint before launch, and they are the ones that will not rank.
- Variants missing a SKU or a barcode. Anything that has to match against a warehouse, an ERP or a marketplace needs both. Count them per supplier — the gaps usually cluster.
- Products with fewer than two images, and images below your target render size. Upscaling is not available. A 600px legacy image is a permanent ceiling on that product page.
- Distinct values in each option, vendor and product type field. Sort them alphabetically and read the list. "Navy", "navy", "Navy Blue" and "NVY" are four filter facets and one colour.
- Products with zero sales in 24 months. Not a decision yet, just a number. It is usually larger than anyone in the room expects.
- Products whose URL has inbound links or organic traffic. This is the redirect list, and it comes from Search Console and your backlink tool, not from the catalogue export.
- Fields with no home on the new platform. Anything bespoke in the old system: custom attributes, spec tables, downloadable datasheets, per-product shipping overrides.
The decision that saves the most money
The list of products you are not migrating is the highest-value artefact of the whole project, and the most politically difficult. Every discontinued line, every one-off, every product that exists because someone added it in 2019 and nobody deleted it — each one carries a description to check, images to resize, a category to assign and a redirect to write.
The objection is always the same: someone might search for it. Sometimes true, and the answer is a redirect to the collection or the successor product, not a live page for something you cannot sell. A 404 on a product nobody has bought in two years costs you nothing. A thin, image-less page for it costs you a slot in a crawl and a reason for a shopper to leave.
Run the cut as three buckets rather than a debate. Migrate and improve: the products that earn revenue or traffic. Migrate as-is: everything currently selling that is not worth rewriting. Do not migrate, redirect instead: the rest. Get the merchandising lead to sign the third bucket, because they are the one who will be asked about it later.
The fields that break quietly
Some defects announce themselves at import. The ones worth auditing are the ones that import perfectly and fail later.
Option names and values. Shopify builds variants from options, and the number of options a store may use is set per shop — the API exposes it as Shop.resourceLimits.maxProductOptions rather than hardcoding a figure, so check your own store rather than trusting a blog post. What catches people is not the ceiling but the semantics: a legacy catalogue that used a fourth option for "Pack size" has to express that as a separate product, a metafield, or nothing.
Variant count per product. Shopify's own documentation notes that when you query a single product at the root of a GraphQL query you can fetch up to 2,048 variants, which is a useful signal of the order of magnitude the platform is built around. A configurable product with tens of thousands of theoretical combinations is not a variant problem, it is a configurator problem, and it needs deciding before migration rather than after.
Handles. Shopify generates a handle from the title, lowercased, with whitespace and special characters replaced by a hyphen. If your old URLs were built from a different rule — and they were — then every product URL changes unless you set handles explicitly. Decide early: keep the legacy path as the handle where you can, and redirect the rest with urlRedirectCreate.
Rich text in descriptions. Old descriptions carry tables, inline styles, font tags and absolute image URLs pointing at the platform you are leaving. They will import. Then the images 404 six months later when the old host is switched off, and the inline styles fight your theme on mobile. Strip and re-mark-up as part of the migration, or accept that you are inheriting somebody else's CSS.
Category and taxonomy. Shopify has a standard product taxonomy, and populating it properly feeds search, feeds and market-specific tax treatment. A migration is the one moment when assigning it is cheap, because you are touching every product anyway.
Fix it in the old system where you can
The instinct is to fix data during the migration, in the transform step, because that is where the developers are. Resist it for anything a merchandiser can do.
A transform script that normalises "navy" is a rule that has to be written, tested, reviewed and maintained through three rehearsals, and it only ever runs once. The same fix done in the old admin by the person who owns the catalogue is permanent, visible, and tested by them. It also means the two systems agree during the parallel-running period, which matters more than anyone expects when you are comparing exports at 2am.
The exception is anything mechanical and reversible: casing, trimming whitespace, deriving a missing handle from a title, mapping one closed vocabulary to another. Put those in the transform, keep the mapping in a file somebody can read, and re-run it every rehearsal so the script is exercised as often as the import is.
Load it properly, and read the errors
When you do import, use the bulk path rather than looping the API. Shopify's bulk import flow stages a JSONL file — one set of mutation variables per line — and runs it asynchronously. The documented constraints are worth knowing before you design around them: the JSONL file cannot exceed 100MB, the operation has to complete within 24 hours, and from the 2026-01 API version each app can run up to five bulk mutation operations per shop simultaneously, where earlier versions allowed one of each type at a time.
The part that matters for an audit is the error reporting. Failures come back line by line in the output file, each with the line number from your input, and the operation as a whole only fails on something systemic. That means a dry run gives you a defect list keyed to the source row — which is the same list your spreadsheet audit should have predicted. If the import's error file finds classes of problem your audit did not, the audit was not thorough enough, and that is the signal to go back rather than press on.
Run it against a rehearsal store at least twice before the real cutover, and diff the counts: products in, variants in, images attached, redirects created. A migration is judged on numbers matching, not on a site that looks right.
What we would tell you to skip
Not every data problem is worth solving before launch. Rewriting every description is the classic trap — it is a six-month content project wearing a migration costume, it blocks a cutover that has a commercial deadline, and the descriptions for your long tail will not move a number. Migrate them as they are, fix the top few hundred by revenue, and put the rest on a rolling schedule after launch.
Equally, do not build a PIM because the audit was painful. A PIM is a reasonable answer to a governance problem that recurs, not to a one-off clean-up, and buying one mid-migration means two implementations at once. If the audit showed that four teams edit product data with no agreed ownership, the cheap fix is writing down who owns which field — and Shopify metafield definitions with validation will enforce more of it than people assume.
We would rather spend your budget on the redirect map and the images than on either of those. Those two are the things that are expensive to retrofit and visible to customers on day one.
Questions this raises
How do you audit product data before a migration?
Export every product and variant from the current platform, then count defects by class: missing descriptions, missing SKUs and barcodes, too few or too small images, inconsistent option and vendor values, and products with no sales in two years. Each count is a filter or pivot table. The totals are your migration scope and the basis for deciding what not to move.
Should we clean the data before or during the migration?
Before, in the old system, for anything a merchandiser can judge — normalising colour names, writing missing descriptions, choosing a category. During, in the transform script, only for mechanical and repeatable changes such as casing, trimming and vocabulary mapping. A judgement encoded in a script is a judgement nobody can see or review.
What should we do with products we are not migrating?
Redirect them. Shopify supports URL redirects through the admin and through the `urlRedirectCreate` mutation, so a discontinued product can point at its successor or its collection. Anything with inbound links or organic traffic needs a deliberate target; the rest can go to the nearest collection.
Will Shopify reject our bad data at import?
Mostly no, and that is the risk. A bulk import reports errors line by line for records it cannot process, but a product with an empty description, a missing barcode or four spellings of one colour imports cleanly. The platform validates structure, not quality.
How long should a catalogue audit take?
The counting is a day for someone competent with a spreadsheet and the exports. The decisions that follow — what to cut, what to rewrite, what to redirect — take longer because they need the merchandising owner in the room. Budget a week of elapsed time and treat the output as a signed artefact, not a note.
Does a migration need a PIM?
Usually not. A PIM answers a recurring governance problem — many people editing many fields across many channels — and implementing one during a migration means two projects running at once. Metafield definitions with validation, plus a written record of who owns which field, covers most mid-market cases.
NEXT STEP
Free store audit
A senior Shopify engineer reviews your storefront, theme performance and checkout, then sends a prioritised list of fixes.
