How to split a large inventory csv for bulk upload
- Step 1Export the full inventory feed as CSV — Shopify: Products → Export → CSV (plain CSV for Excel/other apps). Amazon: build the flat-file template, save the data tab as CSV / tab-delimited text. ERP / marketplace: export the inventory or listing report as CSV.
- Step 2Validate the feed before splitting (recommended) — The splitter does not check the feed — it copies bad rows into chunks. Run the csv-validator to catch ragged rows, encoding issues, and duplicate SKUs first, then split the clean file so every chunk uploads without row-level rejections.
- Step 3Drop the feed onto the splitter — PapaParse reads it in your browser and auto-detects the delimiter (comma or, for Amazon flat files, tab). The source file's first 10 rows preview so you can confirm the header before splitting.
- Step 4Set Rows per chunk to your platform's safe size — Type the upload-safe row count into the single Rows per chunk field (default 1000, minimum 1). Pick a number comfortably under your platform's documented ceiling — leave headroom for slow processing windows.
- Step 5Click Split into chunks — The result panel shows total data rows, number of chunks, and rows per chunk, then one line per chunk with its
rows X–YSKU range. - Step 6Download and upload each chunk in turn — Each chunk has its own Download button (no zip bundle). Files are
feed.part-N-of-M.csv, header included. Upload one, confirm it processed, then upload the next — so a failure isolates to a single chunk.
Split behaviour for inventory feeds
The tool has one option. The rest is fixed split logic — confirm it matches how your importer expects feeds before a production run.
| Behaviour | How it works | Why it matters for inventory uploads |
|---|---|---|
| Rows per chunk (only option) | Number input, min 1, default 1000; data sliced into consecutive blocks | Set it below your platform's row ceiling; file count is derived, not chosen |
| Header in every chunk | Source row 1 copied to the top of each file | Amazon / Shopify map by column position — a headerless batch corrupts the import |
| Remainder in last file | Final chunk holds leftover SKUs | 60,000 at 9,999/chunk → six files of 9,999 + one of 6 |
| Order preserved | SKUs keep source order; no re-sort | A category-grouped feed stays grouped per batch |
| No edits / no validation | Cells, leading zeros, and duplicates are untouched | Validate and fix UPCs upstream — the splitter only cuts |
| Plain UTF-8 output, no BOM | Chunks written without a byte-order mark | Importers accept this; Excel-on-Windows may show accents oddly on direct open |
Chunk-size maths for common feed sizes
Worked examples (data rows excluding the header). The row splitter is a Pro tool; Free caps at 500 rows / 2 MB.
| SKU rows | Rows per chunk | Files | Last file | Note |
|---|---|---|---|---|
| 60,000 | 9,999 | 7 | 6 rows | Tiny last file is normal — it still has the header |
| 60,000 | 10,000 | 6 | 10,000 rows | Even split, six full files |
| 25,000 | 5,000 | 5 | 5,000 rows | Even |
| 100,000 | 20,000 | 5 | 20,000 rows | At the Pro 100,000-row ceiling |
| 480 | 100 | 5 | 80 rows | Within Free row cap, but tool is Pro-gated |
Cookbook
Before/after examples from product-feed batching. SKUs illustrative; the splitter never changes cell contents.
60k Shopify feed into 10k upload chunks
ExampleShopify's importer is happier with mid-size files than one huge upload. Split the catalogue into 10,000-product files and import them in sequence.
Input: shopify-products.csv (60,000 rows + header) Rows per chunk: 10000 Result panel: Total rows: 60000 Chunks: 6 Rows/chunk: 10000 Part 1 rows 1–10000 … Part 6 rows 50001–60000 Files (header in each): shopify-products.part-1-of-6.csv … part-6-of-6.csv
Header preserved so columns map correctly
ExampleAmazon and Shopify import by column position keyed off the header. A batch without it mis-maps every field. The splitter copies the header into each chunk.
Source: SKU,Title,Price,Qty A-100,Widget,9.99,40 A-101,Gadget,12.50,15 A-102,Gizmo,4.25,200 Rows per chunk: 2 → part-1-of-2.csv part-2-of-2.csv SKU,Title,Price,Qty SKU,Title,Price,Qty A-100,Widget,9.99,40 A-102,Gizmo,4.25,200 A-101,Gadget,12.50,15
Long product descriptions stay intact
ExampleAmazon bullet points and Shopify Body (HTML) fields contain commas and newlines. Because they are quoted, PapaParse keeps them inside one row across the split.
Source row (description quoted): A-200,"Heavy-duty, all-weather cover. Fits most models.",19.99,12 After split (whichever chunk it lands in): A-200,"Heavy-duty, all-weather cover. Fits most models.",19.99,12 → one row, four columns, comma inside the quotes preserved.
Validate-then-split for clean uploads
ExampleThe splitter does not validate. A feed with ragged rows or duplicate SKUs splits those problems into chunks. Validate first so each batch uploads cleanly.
Raw feed: 60,000 rows, 3 ragged + 12 duplicate SKUs Step 1 csv-validator → flags 3 width errors + 12 dup keys Step 2 fix in source, re-export Step 3 csv-row-splitter, 10000/chunk → 6 clean files Skip step 1 and the duplicate SKUs upload across batches, triggering 'product already exists' errors per platform.
Tab-delimited Amazon flat file
ExampleAmazon flat files are usually tab-delimited. PapaParse auto-detects the tab, so the split works the same — each chunk keeps the tab delimiter and header.
Input: amazon_flatfile.txt (tab-delimited, 30,000 rows) Rows per chunk: 10000 Chunks: 3, each tab-delimited with the header row. Upload each via Seller Central's flat-file upload in turn.
Errors and edge cases
Real errors and silent failures sourced from each platform's own documentation. Match the wording to the row, fix what the row says to fix.
Duplicate SKUs split across chunks
By designThe splitter does not dedup. Two rows with the same SKU may land in different chunks and each upload will try to create/update that SKU, producing 'product already exists' or conflicting-update errors. Dedup with the csv-deduplicator or surface them with the csv-duplicate-finder before splitting.
Leading-zero UPC already lost in Excel
Not fixable hereIf Excel stripped the leading zero from a 12-digit UPC (012345678905 → 12345678905) before you exported, the splitter copies the broken value as-is — it does not edit cells. Fix the column as Text in Excel and re-export, or run the csv-validator to catch the type mismatch, then split.
Rows per chunk above the platform ceiling
Upload riskSetting a chunk size larger than your importer can handle defeats the purpose — that chunk will time out or partial-fail on upload exactly as the unsplit feed would. Pick a number comfortably under the documented limit, with headroom for slow processing.
Header-only feed
ExpectedA file with the header and no SKU rows yields zero chunks — there are no data rows to slice (total rows 0). If you expected batches, check the export actually contains products.
Blank rows in the feed
PreservedEmpty lines are kept as rows, not skipped, so a blank separator counts toward the total and lands in a chunk as an empty row — which many importers reject. Strip them with the csv-empty-row-remover before splitting.
Tiny last chunk
ExpectedAn uneven split can leave a final file with just a handful of SKUs (e.g. 6 rows). That is normal and still uploadable — it carries the header like every other chunk.
Feed over the 100,000-row Pro ceiling
Plan limitPro handles up to 100,000 rows / 100 MB per file. A 250,000-SKU master feed exceeds it — split it into sub-100k files at the export step first, then chunk each for upload.
Output without BOM in Excel
By designChunks are plain UTF-8 with no byte-order mark. Importers accept this fine, but Excel-on-Windows may show accented brand names as mojibake on direct open — a display quirk, not corrupted data; the upload is unaffected.
Many chunks, individual downloads
ExpectedThere is no 'download all' zip — each chunk downloads on its own button. A feed split into 12 chunks means 12 downloads, which doubles as a natural upload checklist.
Frequently asked questions
Does each chunk keep the header row?
Yes. The source header is copied to the top of every chunk, which is essential because Amazon and Shopify map fields by column position — a headerless batch would corrupt the import.
Can I set the number of files instead of rows per chunk?
No. The only control is Rows per chunk; the file count is total data rows ÷ chunk size, rounded up. For exactly N files, set the chunk size to total rows ÷ N.
Does the splitter remove duplicate SKUs?
No. It is a pure cut and never dedups. Duplicate SKUs would be split across chunks. Dedup with the csv-deduplicator first, or find them with the csv-duplicate-finder.
Will it fix leading-zero UPC/EAN/GTIN problems?
No. It does not edit cells. If Excel already stripped a leading zero, fix the column as Text and re-export, then split. The csv-validator can flag these before you split.
Does it work with tab-delimited Amazon flat files?
Yes. PapaParse auto-detects the delimiter, so tab-delimited flat files split the same way, each chunk keeping its tabs and header.
What happens to long product descriptions with commas?
They stay intact. Quoted fields are parsed quote-aware, so a comma or newline inside a description never becomes a column break in any chunk.
How are the files named?
Each chunk is the source filename plus a part suffix: feed.part-1-of-7.csv … feed.part-7-of-7.csv, sorting in upload order.
Can I download all chunks at once?
No. Each chunk has its own Download button and saves individually — there is no zip bundle.
Is my SKU and cost data uploaded?
No. Parsing and splitting run in your browser; SKUs, costs, and supplier data never reach a server.
Why does the last file have so few rows?
Because the feed did not divide evenly — the final chunk holds the remainder. It still includes the header and uploads like any other chunk.
What is the maximum feed size?
The row splitter is a Pro tool: up to 100,000 rows / 100 MB per file. Larger master feeds should be pre-split at export.
Do I need to validate the feed first?
It is strongly recommended. The splitter copies ragged rows, encoding issues, and duplicate SKUs into chunks unchanged. Run the csv-validator and fix issues before splitting for clean uploads.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.