Bulk Import Products to Shopify: Step-by-Step
Author name: Mark Chickering
Adding products one at a time works for a handful of items and turns into hours of copy-paste for a real catalog. Shopify lets you bulk import or bulk upload products with a CSV file, and for larger or recurring catalogs there are apps, the Admin API and PIM software that connects to your store.
This guide walks through the CSV route step by step, using the current Shopify template, then shows when another method saves more time.
TL;DR
- Fastest route for most stores: download Shopify's sample CSV, fill it in, then go to Products, Import, Add file, Upload and continue, Import products.
- Required data: only Title for a new product; add URL handle when the product has variants.
- Images: upload them to Content, Files, and paste the public HTTPS links into the image columns.
- Limits: 15 MB per file, three options and 2,048 variants per product, 250 images per product.
- Recurring imports or several channels: use a PIM or an import app instead of repeating CSV uploads.
Choose Your Import Method
The right method depends on how many products you have, where the data comes from and how often it changes.
| Method | Best for | Signs it fits | What to watch |
|---|---|---|---|
| Shopify CSV import | One-time loads and occasional updates | Files under 15 MB, one-off or occasional jobs | Column names, handles, 15 MB limit |
| Migration app | Moving from WooCommerce, Wix, Magento or another platform | Products already live in another store | Which data types move and what the app charges |
| Bulk import app such as Matrixify | Excel files, larger jobs, data the native CSV can't handle | Files over 15 MB, Excel files or extra data types | The app's own file format and plan limits |
| PIM with Shopify Sync and Feed | Recurring updates, supplier data, several channels | Data changes every week or goes to several channels | Field mapping and which system owns each field |
| GraphQL Admin API bulk operations | Custom integrations and very large automated jobs | Automated jobs built by developers | Developer time, JSONL files, error handling |
For a first import of a clean file, the CSV route below is enough.
Step 1: Get the Current Shopify Product CSV Template
Start from Shopify's own file. In your Shopify admin, open Products, click Import and download the sample CSV, or export a few existing products to see your store's current format. You can edit it in Google Sheets, Excel or Numbers, as long as you save it back as CSV. In Google Sheets, use File, Download, Comma-separated values (.csv). Excel needs more care: it can drop leading zeros from SKUs and barcodes and turn long GTINs into numbers such as 1.23E+12, so format those columns as text before you paste supplier data.
Shopify renamed several columns in its current template. Older files still import because Shopify keeps backward compatibility, but new exports use the new names, so build your file on the current version. These are the columns most imports need:
| Column | What it holds | Required? |
|---|---|---|
| Title | Product name | Yes, for every new product |
| URL handle (Handle in older templates) | Unique ID that groups a product's rows and forms its URL | Yes, for products with variants and for updates |
| Description | Product description, HTML allowed | No |
| Vendor, Type, Tags, Product category | Classification used for filters and collections | No |
| Status | Active, draft or archived; draft keeps products hidden while you check them | No |
| Option1 name / Option1 value (up to Option3) | Variant options such as Size and Medium | Yes, for variants |
| SKU, Barcodes, Price, Compare-at price | Variant identifiers and pricing | Fill in Price for every variant; a blank price imports as 0.00 |
| Inventory tracker / Inventory quantity | Set the tracker to shopify so Shopify counts stock; quantity works for stores with a single location | When tracking inventory |
| Product image URL / Variant image URL | Public links to product and variant images | No |
| Image alt text | Image description for accessibility and search, up to 512 characters | No |
| SEO title / SEO description | Search snippet text, up to 70 and 320 characters | No |
Don't rename headers or change their spelling, because header names are case-sensitive and must match the template. You can leave cells blank or remove columns you don't need, but keep related columns together, such as Option1 name and Option1 value. Collection is the only column you can add without breaking the format. Shopify's CSV column reference lists every field and its accepted values.
Step 2: Prepare Your Product CSV
Most import errors start in the file, so clean it before you upload. Save a separate working copy, keep the original template untouched and map each column from your supplier or old platform to the matching Shopify column by name.

Products Without Variants
A simple product, such as a tote bag in one size and color, takes one row. Keep the default option from the template: Option1 name is Title and Option1 value is Default Title. Put the price, SKU and barcode on that same row.
Add Variants
Each variant gets its own row. Repeat the same URL handle on every row of the product and fill in the option names and values, such as Color: Blue and Size: Medium. A product can have up to three options and 2,048 variants. Product-level fields such as Title and Description only need to appear on the first row.
When you update variant fields such as SKU or weight, keep the Option1 name and Option1 value columns in the file. Without them, Shopify can create a new default variant and delete the existing ones.
Upload Images and Get HTTPS Links
The CSV holds image links, so upload the image files first. If your images are on your computer, upload them in your Shopify admin under Content, then Files, and copy each file's link. Links must be public, start with https and work without a password.
Add the main image in Product image URL. For more images of the same product, add extra rows with the same URL handle and one image link per row, up to 250 images per product. Use Variant image URL to show the right picture when a shopper picks a color.
Example: What the Rows Look Like
Here is a simple product, a product with two sizes and an extra image row, with the other columns left out for clarity:
| URL handle | Title | Option1 name | Option1 value | Price | SKU | Product image URL |
|---|---|---|---|---|---|---|
| canvas-tote | Canvas Tote Bag | Title | Default Title | 24.00 | TOTE-01 | https://example.com/tote.jpg |
| linen-shirt | Linen Shirt | Size | Small | 48.00 | SHIRT-S | https://example.com/shirt-front.jpg |
| linen-shirt | Size | Medium | 48.00 | SHIRT-M | ||
| linen-shirt | https://example.com/shirt-back.jpg |
The second and third rows share one URL handle, so Shopify creates one shirt with two variants. The last row adds a second image to the same shirt.
Include Metafields
Product metafields can go in the CSV as extra columns with a header in the format Name (product.metafields.namespace.key), for example Material (product.metafields.custom.material). The easiest way to get the exact header is to create the metafield definition first and export one product. Variant metafields can't be imported by CSV, so edit those in the variant bulk editor or use an app or PIM.
Handle Inventory
Set Inventory tracker to shopify on each variant row you want Shopify to count; a blank tracker means stock isn't tracked. The Inventory quantity column works only for stores with a single location. If you stock products in several locations, import products first and update stock with Shopify's separate inventory CSV.
Save as UTF-8
Keep descriptions and other text in UTF-8 encoding. Shopify notes that other encodings can cause odd characters to appear after import. Replace curly quotes with straight quotes, and check commas and quotation marks inside descriptions, because they can break a row.
Before you upload, sort the file by URL handle, scan for blank titles and confirm that prices and SKUs sit on the right variant rows. Then import a test batch of five to ten products with Status set to draft, check them and only then upload the rest.

Step 3: Upload the CSV in Shopify Admin
Shopify's import screen takes a few clicks. Two settings on it decide what happens to existing products and sales channels.
- In your Shopify admin, go to Products.
- Click Import.
- Click Add file and select your CSV.
- Optional: deselect Publish new products to all sales channels if new products should appear only in your online store.
- Optional: select Overwrite products with matching handles if the file updates existing products. Existing values are replaced for every column included in the CSV, and a blank cell in an included column erases the current value.
- Click Upload and continue.
- Review the import details, then click Import products.
Use the review screen as your last checkpoint and confirm that the product count matches your file. An import can't be canceled once it starts, so if anything looks wrong, fix the file and upload it again before you confirm.
When the import finishes, Shopify sends a confirmation email to the account that set up the store. Keep the uploaded file with a short note about what it changed, because Shopify doesn't keep an import history.
Step 4: Check the Results and Fix Import Errors
A completed import means Shopify processed the file. Then check that the products look right: compare the first product, the last product, a product with many variants and any unusual row against your CSV, then open a few product pages on the storefront to check images, variant pictures and descriptions.
If Shopify reports an error, these are the most common messages and fixes from Shopify's import troubleshooting guide:
| Error message | How to fix it |
|---|---|
| Invalid CSV header: missing headers | Restore the first row from the template and remove trailing spaces; if a Choose column headings window appears, match each column to the right field |
| Ignored line because handle already exists | Give each product a unique URL handle |
| Ignored line because it did not contain product data | Add a title to the product |
| Validation failed: options are not unique | Remove duplicate option combinations under the same handle |
| Validation failed: price can't be blank | Add a price to every variant row |
| An error occurred while trying to download the image | Fix the link so it points directly to a public image |
| Illegal quoting or missing or stray quote | Save as UTF-8 and replace curly quotes with straight quotes |
| Inventory quantity is not a number | Enter a numeric quantity in every tracked variant row |
| Not a valid product category | Use the full category breadcrumb or category ID from Shopify's Standard Product Taxonomy |
Fix the source file, test the corrected rows with a small batch and only then import the rest.
Step 5: Update Existing Products Without Breaking Them
Updates are riskier than first imports because every row changes a product customers can already see. Export the products you plan to change and keep an untouched copy as a backup. Work on a duplicate and include only the columns you want to change, plus URL handle and Title, and keep the Option1 columns when you change variant fields. With overwrite turned on, a blank cell erases the current value, so delete columns you don't want to touch instead of leaving them empty.
Keep handles stable. Shopify matches rows to products by URL handle, so a typo turns an update into a new product. Be careful with option values too: changing Option1, Option2 or Option3 values deletes the existing variant IDs and creates new ones, which can affect apps, reports and links that rely on those IDs.
Turn on Overwrite products with matching handles only for this kind of job, and test it on a few products first. For a small change to a handful of products, Shopify's bulk editor is often faster than a file. To see what changed after an import, check your store's activity log.
Shopify Import Limits to Know
These limits decide whether a single CSV will work for your catalog:
- File size: a product CSV can't exceed 15 MB. Shopify's help sets a file size limit, not a product count, so split larger catalogs into several files and keep all rows of a product in the same file.
- Options and variants: up to three options and 2,048 variants per product.
- Images: up to 250 per product.
- Collections: a product can be added to one collection through CSV, and a collection that doesn't exist yet is created.
- Gift cards: new gift cards can't be created through a product CSV.
- Deleting: CSV files can't delete products in bulk; use bulk actions in the Products list.
- Sales channels: CSV can't bulk update product availability on channels other than the online store.
- Large stores: stores with more than 500,000 variants on plans below Shopify Plus can create up to 10,000 new variants per day through CSV or the API.
For very large automated jobs, developers can use bulk operations in the GraphQL Admin API, which upload a JSONL file and process it asynchronously.
Importing From Another Platform
If your products already live in another store, you don't have to rebuild them by hand. Shopify's own Store Migration app moves product and customer data from platforms including WooCommerce, Etsy, Wix, Amazon, eBay and Square, either through a connected account or an uploaded file. Third-party migration apps cover other platforms and extra data such as orders, which a product CSV can't carry.
If you prefer to rebuild the file yourself, the main WooCommerce export columns map to Shopify like this:
- Name becomes Title, and Description stays Description.
- SKU stays SKU on each variant row.
- For products on sale, Sale price becomes Price and Regular price becomes Compare-at price; otherwise Regular price becomes Price.
- Attribute 1 name and its values become Option1 name and Option1 value, one row per variant.
- The comma-separated Images list becomes one Product image URL per row.
Product URLs change when you move platforms, so plan redirects before you switch your domain. In Shopify, go to Content, Menus, URL redirects and import a CSV of old and new addresses, so search traffic and old links land on the right products. Run the migration in a development store first, compare a sample of products with the source and only then import into your live store.
Choosing a PIM for Your Shopify Store
If imports have become a weekly job, these guides help you pick the right system and identifiers.
When CSV Stops Scaling: Recurring Imports With a PIM
CSV works well for a one-time load. It gets harder when supplier files arrive every week, several people edit products, or the same catalog has to reach Shopify, Google Shopping and another store. Each round of exporting, fixing and re-importing adds a chance to overwrite good data.
A PIM keeps one master record for each product and sends the right version to each connected channel. With PIMinto's Shopify PIM integration, the work runs in two directions:
- Sync pulls your existing Shopify products, and later changes made in Shopify, into PIMinto without a CSV.
- Feed sends enriched product data from PIMinto back to Shopify, on demand or on a schedule, and can send only the products that changed since the last run.
Between the two, your team cleans and enriches data in bulk. Supplier files can be imported from CSV or Excel with validation that flags values that don't match your attribute rules, values can be calculated during import, and a recent import can be rolled back in one click, fully or for selected attributes, within a limited window after the import. The same record can also go to BigCommerce, WooCommerce, Wix and Google Merchant Center, and several Shopify stores can be connected.
To make recurring imports reliable with any tool, decide which system owns each field, map fields once, test with a variant-heavy product and log rejected records before the next run.
Conclusion
For a one-time catalog load, Shopify's CSV import is the simplest route: start from the current template, keep headers and handles intact, upload images first, review the preview and check the storefront after the import. When imports turn into a weekly routine or the catalog feeds more than one channel, a PIM saves the repeated cleanup.
PIMinto brings your Shopify catalog in with Sync, lets your team fix and enrich it in one place and sends it back with Feed. Plans start at $300 per month with a 30-day full-featured trial, and migration from any PIM is included.Stop Rebuilding Your Shopify Catalog in Spreadsheets
See how PIMinto pulls your products from Shopify, cleans them up in bulk and keeps the store updated on a schedule.
Shopify Bulk Import FAQ
Download Shopify's sample CSV, fill in one row per variant with a title, URL handle, options, price and image links, and save it as UTF-8. Then go to Products, Import, Add file, Upload and continue, and Import products after checking the preview.
Yes. Edit the template in Excel or Google Sheets, then export or download it as a CSV in UTF-8 before uploading. Shopify's built-in importer accepts CSV only, while some import apps accept Excel files directly.
Give each variant its own row with the same URL handle, and fill in Option1 name and Option1 value, plus Option2 and Option3 if needed. Each variant row needs its own price, and each combination of option values must be unique.
Export the products, edit a copy and keep the same URL handles. During import, select Overwrite products with matching handles. Values are replaced in every column included in the file, and blank cells erase existing values, so remove columns you don't want to change and test on a few products first.
Shopify skips rows it can't use, such as rows with a duplicate handle or a handle without a title. Check the error messages Shopify shows after the upload, fix the affected rows and import them again as a small file.
Product metafields, yes, as columns with headers such as Material (product.metafields.custom.material). Variant metafields aren't supported in CSV import, so use the variant bulk editor, an import app or a PIM for those.
Shopify's help sets a file size limit for CSV imports, 15 MB per file, rather than a product count. Split a large catalog into several files and keep all rows of one product in the same file. Stores with more than 500,000 variants on plans below Shopify Plus can add up to 10,000 new variants per day.
Use Shopify's Store Migration app, or export products from WooCommerce as a CSV and rebuild the columns to match Shopify's template. Test the result in a development store and set up URL redirects before you switch your domain.
Modified on: 2026-10-28