Quick Answer
Shopify limits product CSV imports to 15MB per file and 1,000 new variant creations per 24-hour period. Both limits require splitting large catalogs into batch files. The non-obvious constraint: all variant rows for a product must be in the same file as their parent Handle row — a split that cuts mid-product orphans the variant rows and produces products with no purchasable options on import. Calculate a safe row threshold before splitting, then use CSV Splitter's SPLIT_BY_ROWS or SPLIT_BY_PARTS mode for the mechanical split.
Fast Fix
- Find the maximum variant count per product in your catalog (the product with the most variants).
- Calculate safe rows per file:
(max variants + 1 parent row + image rows) × target products per batch. - Open CSV Splitter. Select Split by rows and enter your safe threshold.
- Open the last 5 rows of each output file in a plain-text editor. Confirm no Handle straddles the split boundary.
- Import files sequentially into Shopify. If importing more than 1,000 new variants total, wait 24+ hours between batches.
TL;DR: A merchant with a 3,000-product catalog split their file at row 5,000 — a round number — and imported the first file two days before a Black Friday launch. Shopify showed "2,241 products imported" with no errors. What the success banner didn't show: 340 products had no variants available, because the split had landed mid-Handle. The variant rows for those products were in the second file, which had not yet imported. When the second file finally ran, those rows arrived with no parent product to attach to — they were rejected silently.
Splitting a Shopify product CSV is the documented solution to the 15MB and 1,000-variant limits. The step Shopify's documentation omits is the Handle-aware threshold calculation.
Recognizing the Limits and the Bad-Split Symptoms
Errors from the 15MB limit appear at upload time. Errors from the variant limit and from bad splits appear later — after a seemingly successful import.
From the 15MB file size ceiling:
- Upload fails immediately or times out — the import screen shows an error before any rows are processed.
- "Your file is too large" or similar (representative — exact wording may vary by plan and browser).
- Slow connections may produce a timeout on files approaching but not exceeding 15MB.
From the 1,000-new-variant-per-24-hour limit:
- "Daily variant creation limit reached" — appears in Shopify's admin error feed (representative — exact wording may vary by plan version).
- The import appears to complete normally: the success banner fires, the product count is correct. What it does not show is that the last N products imported with no variants — they were created as bare product stubs with no options because the variant-creation counter hit its ceiling mid-file.
- A customer sees the product listed in the store but cannot add it to cart.
From a naive split (orphaned variants):
- Products appear with no variants. The product title exists in the store but has nothing purchasable.
- A second file import may produce "Variant SKU already exists" if the orphaned rows attempt to attach to a product that was partially committed on the first import.
- "Handle already exists" errors on the second file if orphaned variant rows are misread as new product rows.
What Causes the Orphaning Problem
| Symptom | Root Cause | Fix |
|---|---|---|
| Upload fails or times out | File exceeds Shopify's 15MB import ceiling | Split by size to under 15MB per file |
| Products imported with no variants; "daily variant creation limit reached" | More than 1,000 new variant creations submitted in 24 hours | Batch into groups of ≤1,000 new variants; import on separate calendar days |
| Products have no variants after split-and-import; no error on import | Split boundary cut mid-Handle — variant rows landed in a different file from their parent row | Recalculate safe row threshold; verify boundary rows; resplit |
Table of Contents
- Why Shopify Limits Product CSV Imports
- The Safe-Split Method: Avoid Orphaning Variant Rows
- Re-Importing Split Files Into Shopify
- FAQ
Why Shopify Limits Product CSV Imports
Shopify's 15MB file size limit and 1,000-new-variant-per-24-hour cap are separate constraints with different origins. Neither is waivable on standard plans.
The 15MB limit applies at file upload. Shopify's importer processes files synchronously on their servers — larger files increase the risk of server-side timeouts before all rows are committed. At 15MB, a product CSV represents roughly 30,000–50,000 rows depending on field density. A catalog of 5,000 products with 6 variants each (30,000+ variant rows, plus image URL rows) commonly reaches 20–40MB. The fix is file splitting; there is no workaround on standard plans.
The 1,000-variant-per-24-hour limit throttles new variant object creations — not row count. Updating existing variants does not count against this limit; only creating new ones does. The counter resets at midnight Pacific time. A 3,000-product catalog where every product is new and has 5 variants requires 15,000 new variant creations — spread across 15 separate daily import batches (≤1,000 variants each) to import cleanly.
The interaction between the two limits matters for planning: a file split that keeps each file under 15MB may still exceed 1,000 new variants per file, requiring further subdivision for batching purposes.
For context on what your catalog file size means in practice: at 500 bytes per row (a realistic average for a product with title, description excerpt, image URL, and a few tags), 30,000 rows ≈ 15MB. Add image URL rows (one row per image, per product) and description HTML and your row count can triple without your product count changing.
The Safe-Split Method: Avoid Orphaning Variant Rows
Shopify's product CSV uses a parent-row / variant-row structure. Every product's parent row carries the Handle, Title, and all product-level fields. Each variant row for that product carries the same Handle and only variant-level fields — Variant SKU, Variant Price, Option1 Value. Image URL rows use the same Handle and carry only image fields.
All rows for one product — parent row, all variant rows, all image rows — must be in the same import file. If the split boundary lands mid-product, the result is:
- File 1 creates the product with only the variants present before the boundary. The product is committed to the store at this point.
- File 2's orphaned variant rows arrive with a Handle that now exists in the store. Shopify's import-update logic may attach them, reject them, or produce duplicate-option errors — behavior varies. What reliably does not happen is the catalog appearing correct without manual verification.
Step 1 — Determine your catalog's row footprint
Before splitting, find the product with the most rows in your file. Open the CSV in a plain-text editor (not Excel — Excel may reformat the data on open) and search for the Handle that repeats the most times. Count: 1 parent row + N variant rows + M image rows = total row footprint for that product.
Step 2 — Calculate your safe split threshold
Use this table as a starting point, then adjust for your catalog's actual image-row density:
| Max variants per product | Safe products per batch (≤1,000 new variants) | Safe rows/file (no images) | Safe rows/file (~1 image row per product) |
|---|---|---|---|
| 2 | 333 | 999 | ~1,330 |
| 3 | 333 | 1,332 | ~1,665 |
| 5 | 200 | 1,200 | ~1,400 |
| 8 | 125 | 1,125 | ~1,250 |
| 10 | 100 | 1,100 | ~1,200 |
| 15 | 66 | 1,056 | ~1,122 |
Image row estimates assume one image per product. Catalogs with multiple images per product should add actual image-row count to the row footprint calculation.
If your goal is only to stay under 15MB (not the variant limit), calculate rows per MB for your specific file: total rows ÷ file size in MB. Then set your split threshold at 14MB × rows-per-MB to stay safely under the ceiling.
Step 3 — Run the split
Open CSV Splitter and load your product CSV:
- Use Split by rows with your calculated safe threshold. This gives you the most control over boundary placement.
- Use Split by parts if you want a fixed number of equal-size output files — divide your target part count into total rows to verify the per-file row count stays within your threshold.
- Use Split by size if your primary constraint is the 15MB ceiling and variant count is not a concern. Target 13–14MB per file to stay safely under the limit.
All processing runs in your browser — your product catalog is not uploaded to any server.
Step 4 — Verify the boundary rows
After splitting, open the last 5 rows of each output file and the first 5 rows of the next file in a plain-text editor. Confirm:
- The last
Handlein File N appears with all its variant rows complete — no variant rows for that Handle appear at the start of File N+1. - File N+1 begins with a new Handle on a parent row (a row containing
Title), not a variant row (a row withHandleandVariant SKUbut noTitle).
If a Handle straddles the boundary (some rows in File N, some in File N+1):
- Move the straddling product's rows from the end of File N to the beginning of File N+1 in a plain-text editor.
- Or reduce your split threshold by 10–20 rows and re-split, then re-verify.
For the general large-file splitting workflow without Shopify-specific constraints, see How to Split Large CSV Files Without Excel and Split 1GB CSV Into 1,000 Files in 30 Seconds.
Re-Importing Split Files Into Shopify
Import order and pacing determine whether a split-and-reimport succeeds cleanly.
If all products are new (no existing Handles in the store):
Import files in sequence — File 1 first, then File 2, and so on. Wait for each import to reach "complete" status in Shopify's Products → Import history before starting the next file. If you hit the variant limit mid-import (the import stops creating variants partway through), stop. Wait until midnight Pacific for the counter to reset, then resume from the file or product where the limit was reached.
If you are updating existing products (Handles already exist in the store):
The 1,000-variant limit applies only to new variant creations. Updates to existing variants are not throttled. Import in sequence for easier error tracking, but pacing between files is not required. Shopify's importer matches existing Handles and updates only the fields present in the import file — fields absent from the file are not cleared.
If a file fails mid-import:
Check the error log in Shopify's Products → Import history. Correct only the rows that failed. Re-import only the corrected rows as a new file — do not re-import the full batch file, as that will produce "Handle already exists" errors for the rows that succeeded on the first pass.
Validating after import:
After all files import, spot-check the catalog. For each batch:
- Verify that the last product in the batch has its correct variant count.
- Verify that the first product in the next batch also shows correctly.
- Check that no products have zero variants if they should have options.
For the full pre-import validation workflow before splitting, see Product CSV Pre-Import Validation Checklist. For the broader e-commerce CSV guide covering all five failure categories, see Shopify & WooCommerce Product CSV: Fixes, Imports & Migrations.
Additional Resources
Methodology: Shopify product CSV limits verified against Shopify's import documentation, May 2026. The variant rate limit, file size ceiling, and Handle/variant-row structure reflect Shopify's standard plan behavior — Shopify Plus merchants may have access to higher-throughput import tooling not covered here.
Shopify documentation:
- Shopify: Import a CSV file — Official product CSV import guide; includes the 15MB limit and template download
- Shopify: Open and edit a CSV file — Covers the Handle structure, column names, and image row positioning
Standards:
- RFC 4180: Common Format and MIME Type for CSV Files — The CSV format standard; relevant to quoting rules and column-count consistency
- MDN Web Docs: File API — How browsers handle local file processing without upload
- Unicode FAQ: UTF-8, UTF-16, UTF-32 & BOM — Encoding reference; relevant to file encoding before splitting