Import Products Tool for Shopify
🔧 Quick Info: Update Shopify products and variants by SKU — something Shopify’s own importer can’t do — or create new products and variants, from a spreadsheet.
What it does
Import Products reads a CSV or Excel file with one row per variant. Each row is matched to a variant by its Variant SKU, and that row updates two things:
- the variant — price, compare-at price, cost, barcode, weight, taxable, shipping, inventory;
- the variant’s product — title, description, vendor, type, tags, status, SEO, collections.
Blank cells are never sent, so an import can be as narrow as you like: a file with just Variant SKU and Variant Price only touches prices. Nothing is ever deleted by this tool.
This is the tool’s whole point: Shopify’s built-in product importer matches rows by handle and can’t update by SKU. If your source of truth (ERP, supplier feed, warehouse system) speaks SKU, this tool takes that file directly.
With Create New Products & Variants turned on, rows whose SKU doesn’t exist create something new. When the row’s Handle (or Title, if you don’t use handles) matches an existing product, the row is added to that product as a new variant; otherwise the rows become a new product — complete with options, variants, images, inventory, and collections.
The file format is what Export Products produces, so the easiest workflow is: export, edit the file, re-import. The import runs in the background and, if you turn email delivery on, emails you when it finishes; rows that fail come back in an error file you can fix and re-upload.
When to use it
- Your ERP or supplier feed is SKU-based and you want to sync product data into Shopify without mapping everything to handles first.
- You exported your products, bulk-edited them in a spreadsheet, and want to push the changes back.
- You’re doing a bulk content pass — titles, descriptions, SEO fields, vendors, types, or tags across many products.
- You’re creating many products at once, including multi-variant products with options.
- You’re adding new variants to products you already have — a new size, flavor, or pack count.
- You want to add products to collections in bulk using a Collections column.
- For price-only or stock-only jobs, the dedicated Price Updater and Inventory Updater are simpler.
Before you start
- Your Shopify store must be connected to your account.
- Your file needs a header row. Only the columns you want to import need to be present.
- Updates are matched by Variant SKU. SKUs should be unique in your store — a SKU that exists on more than one variant is reported as an error rather than guessed at. A row with no SKU can still update product fields if its Handle matches an existing product.
- Product columns can repeat on every row. When several rows belong to the same product, the first filled-in value per column is used.
- A non-blank Tags cell replaces all of the product’s tags. Include the full tag list, not just the new ones.
- Image columns add images — they never remove or replace any. Cells containing Shopify CDN links (
cdn.shopify.com— which is what an export contains) are skipped, so re-importing an exported file never duplicates images. Paste an image’s own web address into an image column to add it. For zip-file uploads, the Bulk Image Uploader is the dedicated tool. - If you’re importing an Inventory Qty column, pick the Inventory Location it should apply to (it defaults to your store’s primary location).
Step-by-step
1 Open the Tool
Open the Import Products tool.
2 Upload Products
On the Upload Products step, decide whether to allow Create New Products & Variants (off by default — with it off, unknown SKUs are reported as errors), pick an Inventory Location if you’re importing quantities, then upload your CSV or Excel file (or import from a URL).
3 Match to column
Once the file is read, a Match to column section appears. Columns from an Export Products file are matched automatically; adjust anything that isn’t. Leave anything you don’t want to import unmatched.
4 Email delivery
Continue to the email delivery step and choose whether you’d like an email when the import finishes — your account email is prefilled if you turn it on.
5 Submit
Submit. The import runs in the background as a job, so you can leave the page.
6 Watch for the email
If you turned email delivery on, watch for the email. If any rows failed, it includes an error file listing each failure with the reason — fix those rows and re-upload just that file.
File / field reference
The columns match Export Products. The rules below are specific to importing.
What happens to each row
| Row | What happens |
|---|---|
| SKU exists on one variant | Updates that variant, and its product from the product-level columns. |
| SKU exists on several variants | Error — there’s no safe way to know which one you meant. Make the SKU unique in Shopify first. |
| SKU doesn’t exist | Error — unless Create New Products & Variants is on. Then, if the row’s Handle (or Title, with no handle) matches an existing product, the row becomes a new variant of it; otherwise it becomes part of a new product. |
| No SKU, Handle matches a product | Updates just that product’s product-level fields. |
| No SKU, no Handle, Title matches a product | With Create New Products & Variants on, updates that product’s product-level fields. Otherwise an error. |
Creating new variants on existing products
- A row with a new SKU joins the product its Handle points at — or, with no handle, the product whose Title matches exactly.
- The row’s Option Name / Option Value columns must name an option the product already has (e.g.
Size/XLon a product with a Size option). A new option value is fine; a brand-new option can’t be added by import — add the option in the Shopify admin first. - Variant Inventory Qty is set at creation (at the selected Inventory Location), and a Variant Image web address is added and assigned like on updates.
- Watch your SKUs: with the toggle on, a typo’d SKU on a row whose handle/title matches a product creates an extra variant instead of updating the one you meant.
Creating new products
- Rows that belong to the same new product are grouped by Handle — or by Title if you don’t use a Handle column — and must be next to each other in the file. A new product is only created when that handle/title doesn’t already exist on the store — otherwise the rows become new variants of the existing product (see above).
- Title is required for a new product. A Handle is optional: when it’s blank, Shopify builds one from the title (e.g. “Black Sunglasses” →
black-sunglasses). - Multi-variant products need Option Name / Option Value columns so each row describes a distinct variant (e.g.
Size/Small). Up to 100 variant rows per new product.
Product-level columns
Read from any row of the product — the first filled-in value wins.
| Column | Notes |
|---|---|
| Handle | Optional. Groups rows when creating; also lets a no-SKU row update a product’s fields. |
| Title | The product name. Required when creating. |
| Body (HTML) | The product description (HTML). |
| Vendor / Type | The product’s vendor and product type. |
| Tags | Comma separated. Replaces the product’s full tag list. |
| Status | active, draft, or archived. |
| SEO Title / SEO Description | The search engine listing fields. |
| Collections | Comma separated collection titles. Products are added to these collections — never removed from any. A title that doesn’t exist on the store is reported as an error. |
| Image Src – 1…5 / Image Alt Text – 1…5 | Product images by web address. New addresses are added to the product’s images; Shopify CDN links are skipped and nothing is ever removed. |
Variant columns
| Column | Notes |
|---|---|
| Variant SKU | Matches the variant to update. Also written to the variant on creates. |
| Option1–3 Name / Value | The product’s options. Used when creating products and variants; existing variants aren’t re-optioned. |
| Variant Price / Variant Compare At Price | Prices. |
| Cost per item | The variant’s unit cost. |
| Variant Barcode | The barcode (ISBN, UPC, GTIN). |
| Variant Weight / Variant Weight Unit | Weight with g, kg, lb, or oz (defaults to lb if a weight is given without a unit). |
| Variant Taxable / Variant Requires Shipping | TRUE / FALSE (yes/no also works). |
| Variant Inventory Tracked | TRUE / FALSE — whether Shopify tracks this variant’s stock. |
| Variant Inventory Qty | Sets the quantity at the selected Inventory Location. If the variant isn’t tracked yet, tracking is turned on automatically. |
| Variant Image | The variant’s image by web address. A new address is added and assigned to the variant; Shopify CDN links are skipped. |
Troubleshooting / FAQ
“SKU […] not found.”
No variant with that SKU exists on the store. Turn on Create New Products & Variants if you meant to create it, or fix the SKU if it’s a typo.
“The SKU […] exists on more than one variant in this store.”
Shopify allows duplicate SKUs, but this tool refuses to guess which variant you meant. Make the SKU unique in your Shopify admin, then re-run those rows.
An error mentioning an option that doesn’t exist, or an option value mismatch.
A new-variant row’s Option Name must match an option the product already has (its value can be new). Adding a whole new option to an existing product isn’t possible by import — add the option in the Shopify admin first, then re-run the row.
A new variant appeared instead of an update (or a product got an extra variant).
With Create New Products & Variants on, a row whose SKU doesn’t match anything but whose Handle/Title matches a product creates a new variant on it. If that SKU was a typo, delete the extra variant in the Shopify admin, fix the SKU, and re-import.
“No collection with the title […] exists on this store.”
Collection names must match an existing collection’s title exactly. Create the collection first (or use Import Collections).
My product’s tags changed more than I expected.
A non-blank Tags cell replaces the full tag list. Export first and edit the Tags column so it always contains every tag the product should keep.
Images didn’t change on my existing products.
Image columns skip Shopify CDN links (cdn.shopify.com) — those are the product’s own exported images, and re-adding them would create duplicates. To add an image, put its original web address in an image column. Images are only ever added — this tool never removes or replaces them; remove images in the Shopify admin.
Where do my results go?
The job runs in the background and emails you when done (if email delivery was set to “Yes”). Failed rows are collected into an error file with the reason per row — fix and re-upload just those rows.