If you have products missing after migration, they usually fall into three buckets: some genuinely failed to import, some imported but landed incomplete (missing variants, images or SKUs), and some imported fine but as draft or unpublished so they never reach the storefront. The only reliable way to know which is which is to reconcile counts and records systematically — compare the old catalog to the new one, number by number, then spot-check the details. Guessing wastes days; a clean reconciliation tells you exactly what didn’t come across and why in an afternoon.
Diagnosis: three ways a product can be “missing”
Before you fix anything, sort the problem into one of three categories, because each has a different cause and a different remedy.
- Fully missing — the product does not exist in Shopify admin at all. The import row was dropped, timed out, or filtered.
- Imported but incomplete — the product exists, but a variant, image, price, SKU, metafield or description is absent. It looks fine in a list view and broken on the page.
- Imported but unpublished — the product exists and is complete, but its status is Draft or it isn’t available on the Online Store channel, so it’s invisible to shoppers even though the data made it.
A merchant who only eyeballs the storefront will lump all three together as “missing.” They’re not, and the distinction drives everything below.
Why it matters
Every missing product is a page that used to rank and a SKU that can no longer be bought. That’s lost sales on demand you already have, and lost SEO — the old product URL may still be indexed, but it now 404s or redirects to nothing, bleeding the authority you paid years to build. Incomplete products are worse in one way: they look live, so nobody notices until a customer can’t pick their size or a Google Shopping feed rejects the item for a missing GTIN. Catching this in the first week after cutover is cheap. Catching it from a drop in revenue three months later is not.
How to reconcile: counts first, then records
Reconciliation is two passes. First you prove the totals match; then you prove the contents match.
1. Compare counts
Pull these numbers from the old platform and from Shopify and line them up:
| What to count | Old store | Shopify | Where to check in Shopify |
|---|---|---|---|
| Products | — | — | Admin → Products (total), or a product export |
| Variants | — | — | Product CSV export (one row per variant) |
| Images | — | — | Export image column / count files |
| Collections / categories | — | — | Admin → Products → Collections |
| Published (active) products | — | — | Filter by status = Active + Online Store |
If products match but variants don’t, you have a variant problem, not a product problem. If active count is far below total count, your issue is status, not import. The counts point you straight at the bucket.
2. Export both catalogs and diff them
Counts tell you how many are wrong; a diff tells you which ones. Export the full product list from the old
platform and the full Shopify product CSV, then match them on a stable key — handle/URL slug or SKU — and
list the rows that exist on one side and not the other. This surfaces the fully-missing products by name. A
spreadsheet with VLOOKUP/XLOOKUP or a quick script is enough; you don’t need a tool.
3. Spot-check records
For a sample across each product type (and every best-seller), open the product and confirm the details survived:
- SKUs — present and identical (feeds, 3PL and reporting break silently on changed SKUs).
- Prices & compare-at — correct per variant, no currency rounding drift.
- Inventory — quantities and tracking match; nothing defaulted to 0 or to “continue selling.”
- Metafields — custom fields (specs, ingredients, badges) mapped, not dropped.
- Status & channel — Active and available on Online Store (and any other channel you sell on).
Likely causes — and how to fix each
- Import failures (bad rows / encoding). Special characters, malformed CSV rows or fields over Shopify’s limits get skipped. Fix: find them in the import error log, clean the source rows, re-import just those.
- Products imported as Draft. Many migration tools default status to Draft for safety. Fix: filter by status = Draft, sanity-check, then bulk-set to Active once verified.
- Missing on the Online Store channel. Product is Active but not published to the storefront channel. Fix: bulk-edit → set Online Store availability.
- Missing variants. Option structures don’t map 1:1 (a platform with 4 option types → Shopify’s max of 3), so variants collapse or drop. Fix: remodel options, re-import the affected products’ variant rows.
- Missing images. Images referenced by URL that expired, or files that timed out on upload. Fix: re-host and re-attach from the source export’s image column.
- Filtered rows. The tool excluded products by status, date, or a category filter set during setup. Fix: re-run the export with filters cleared.
- Timeouts on large catalogs. Big imports get cut off partway. Fix: batch the import; reconcile per batch.
The reconciliation checklist
Work top to bottom. Nothing is “done” until every line is checked.
- Product count matches source (or every gap is explained).
- Variant count matches — option models mapped within Shopify’s 3-option / 100-variant limits.
- Image count matches; hero and gallery images present on spot-checked products.
- Collections rebuilt; automated collection rules re-created; product membership correct.
- SKUs present and unchanged across all variants.
- Prices & compare-at correct per variant.
- Inventory quantities and tracking settings match.
- Metafields mapped for every product type that uses them.
- Status = Active for everything that should sell.
- Sales-channel availability set (Online Store + others).
- Handles/URLs captured, with redirects for any that changed.
- Import error log reviewed and every skipped row resolved.
Common mistakes
- Trusting the product count alone. Matching totals hides incomplete and unpublished products. Check variants, images and status too.
- Only looking at the storefront. Draft products won’t show there — you’ll “confirm” they’re missing when they imported fine.
- Skipping SKUs and metafields. They rarely error loudly, so they’re the last thing found and the most expensive downstream (feeds, fulfillment, filters).
- Forgetting redirects. Even a perfect catalog loses SEO if old product URLs don’t 301 to the new ones — which is exactly how a clean migration still causes a traffic drop after migration.
When to get help
If the counts are off by a handful, you can likely resolve it with the checklist above and a re-import of the failed rows. Get help when the catalog is large, the option models don’t map cleanly, or revenue is on the line and you can’t afford to miss anything. A structured reconciliation is exactly what our store migration service does — and it pairs with our broader migrate-to-Shopify solution and the pre-cutover Shopify migration checklist so gaps are caught before they cost you. If you’re coming from WooCommerce specifically, the same reconciliation logic applies with a few extra gotchas — see WooCommerce to Shopify migration problems. Not sure where your losses are? Start with a free profit audit.
Products missing or incomplete after your migration? Send us your store details — we’ll reconcile your catalog, find what didn’t come across, and tell you how to recover it cleanly. See our store migration service or get a free profit audit.