How Shopify's CSV import actually works, where it breaks, and when to move beyond it.
Quick answer — To import a CSV into Shopify, open Shopify Admin → Products → Import, upload a UTF-8 CSV that follows Shopify’s column schema, review the preview, and click Import products. Every row needs a unique Handle; each variant is its own row. Test 5–10 rows first, then import the full catalog.
The Shopify CSV import is the default way most retailers move product data into Shopify — and almost every team hits the same wall within a few months. The format is rigid, the failure modes are silent, and every supplier sends data in a different shape.
This Shopify CSV import guide walks through how Shopify’s CSV import actually works, how to build a product CSV that imports cleanly on the first try, the most common errors and their fixes — and when it is time to leave CSV behind entirely.
CSV is universal, supported by every tool, and Shopify’s built-in importer accepts it natively. For small catalogs or one-off migrations, CSV is the fastest path:
Shopify’s importer matches on exact column names, so the header row is where most imports live or die. These are the columns that actually matter, and the format rules attached to each:
19.99, never 19,99). Inventory only imports if Variant Inventory Tracker is set to shopify.active, draft or archived. Omit it and products may import as draft and never appear in your store.The whole file must be saved as UTF-8, comma-delimited, and stay under Shopify’s 15 MB per-file limit. Everything else in this guide is downstream of getting these columns right.
Once you have more than a few hundred SKUs or more than one supplier, the basic CSV flow hits its limits. Common next steps:
Almost every broken import traces back to one of these issues:
| Problem | Cause | Solution |
|---|---|---|
| Special characters show up as gibberish | File encoded as Windows-1252 instead of UTF-8 | Save explicitly as “CSV UTF-8” from Excel or Numbers |
| Images do not appear after import | Image Src URL is private, behind auth, or 404 | Host on a public CDN; test each URL in an incognito window first |
| Variants collapse into one product | Option1 Name/Value missing, or Handles differ | All variants share the same Handle; each has unique Option values |
| Existing products get duplicated | Handle column missing or altered | Always preserve the original Handle for updates |
| Import aborts silently halfway | Hidden line breaks or malformed commas inside fields | Wrap text fields in double quotes; escape internal quotes by doubling |
| Prices off by factor of 100 | Locale-formatted numbers (e.g. “19,99”) parsed as text | Use dot as decimal separator; no thousand separators |
| “Handle is required” / rows rejected | Blank Handle column, or spaces/uppercase in the handle | Fill every row with a lowercase, hyphenated Handle |
| Inventory imports as 0 or blank | Variant Inventory Tracker not set to shopify | Set the tracker column to shopify and add a quantity |
For a single upload, CSV wins on simplicity. But once the file has to be rebuilt on a schedule, the trade-offs invert. Here is the honest comparison:
| Dimension | Manual CSV import | PIM-driven sync |
|---|---|---|
| Setup effort | Minutes — download template, fill, upload | One-time supplier + Shopify connection |
| Ongoing updates | Rebuild and re-upload the file every time | Automatic — changes sync continuously |
| Multiple suppliers | One hand-mapped file per supplier | Any format ingested and normalized once |
| Data enrichment | Manual, in the spreadsheet | AI-generated descriptions, attributes, translations |
| Error handling | Silent failures, found after import | Validation before publish |
| Multi-channel | Separate file per channel | One source, published to every channel |
| Best for | One-off migrations, small static catalogs | Recurring updates, multi-supplier retailers |
If your catalog lives in the right-hand column, connecting a PIM to Shopify removes the file step entirely. See exactly how to connect a PIM to Shopify, or compare options in our best PIM for Shopify comparison.
The rule of thumb: if you are rebuilding the same CSV every week from the same suppliers, you are doing manual ETL. That is exactly what a PIM is built to eliminate.
The clearest signals it is time to switch:
Productbay is an AI-native PIM built specifically for Shopify retailers. Instead of wrangling CSVs, you connect your suppliers once and the pipeline runs continuously:
For retailers past the “one catalog, one CSV” stage, the payoff is immediate: the weekly file-wrangling disappears, and products go live faster with better data. See how Productbay works for retailers of every size — from a single Shopify store to multi-channel operations.
Shopify’s CSV import is a solid starting point and will always have its place for small catalogs and one-off migrations. But it was designed for a single-channel, single-supplier world. If your reality is messier than that — multiple suppliers, multiple channels, weekly updates — CSV becomes the bottleneck. A PIM like Productbay turns that bottleneck into an automated pipeline.
See how Productbay automates your full Shopify import pipeline — from any supplier file to AI-enriched, channel-ready products.
Get started