How to split an order export into fulfilment chunks
- Step 1Export the day's orders as CSV — Shopify: Orders → Export → CSV (choose the order range and 'Plain CSV file'). WooCommerce: Orders → Export (or your order-export plugin) → CSV. Decide whether you want one row per order or one row per line item — it changes how the split lands (see the cookbook caveat).
- Step 2Sort by pick logic first (optional) — The splitter preserves order but does not sort. To map chunks to pick waves or zones, sort the export by ship-by date, zone, or carrier with the csv-sorter before splitting, so each contiguous chunk is a coherent wave.
- Step 3Drop the order CSV onto the splitter — PapaParse reads it in your browser and auto-detects the delimiter. The first 10 rows preview so you can confirm the header and the per-order vs per-line-item shape before splitting.
- Step 4Set Rows per chunk to your station capacity — Type the per-station row count into the single Rows per chunk field (default 1000, minimum 1). Match it to how many orders (or line items) one packer or 3PL lane can clear in the window.
- Step 5Click Split into chunks — The result panel shows total order rows, number of chunks, and rows per chunk, then one line per chunk with its
rows X–Yrange — assign each range to a station. - Step 6Download and distribute each chunk — Each chunk has its own Download button (no zip). Files are
orders.part-N-of-M.csv, header included. Handpart-1to station 1,part-2to station 2, and so on — ranges never overlap, so no double-picking.
Split behaviour for order exports
One option; the rest is fixed split logic. Confirm it matches your warehouse system before a live pick wave.
| Behaviour | How it works | Why it matters for fulfilment |
|---|---|---|
| Rows per chunk (only option) | Number input, min 1, default 1000; consecutive blocks | Size to a pick station's capacity; chunk count is derived |
| Header in every chunk | Source row 1 copied to each file's top | Every slice opens with the right address/SKU/qty columns |
| Non-overlapping ranges | Chunk N covers a contiguous block of rows | No two stations get the same row — no double-picking |
| Order preserved | Rows keep source order; no re-sort | A zone-sorted export keeps each chunk as a coherent wave |
| Splits by row, not by order | A multi-line-item order can straddle a chunk boundary | Use one-row-per-order exports, or sort so an order's rows stay together |
| Remainder in last file | Final chunk holds leftover rows | 4,000 lines at 1,000/chunk → four even files |
Batch maths for daily order volumes
Worked examples (data rows excluding the header). The row splitter is a Pro tool capped at 100,000 rows / 100 MB per file; Free caps at 500 rows / 2 MB.
| Order rows | Rows per chunk | Chunks | Last chunk | Note |
|---|---|---|---|---|
| 4,000 | 1,000 | 4 | 1,000 | Four pick stations, even |
| 4,000 | 1,500 | 3 | 1,000 | Three stations, remainder in chunk 3 |
| 10,000 | 2,500 | 4 | 2,500 | Peak-day volume, four 3PL lanes |
| 850 | 300 | 3 | 250 | Three small waves |
| 480 | 120 | 4 | 120 | Within Free row cap, but tool is Pro-gated |
Cookbook
Before/after examples from order-fulfilment batching. Addresses illustrative; the splitter never alters cell contents.
4,000-line export into four pick stations
ExampleFour packers work the morning export in parallel. Split into four 1,000-row files, one per station, with no overlap.
Input: orders-2026-06-10.csv (4,000 rows + header) Rows per chunk: 1000 Result panel: Total rows: 4000 Chunks: 4 Rows/chunk: 1000 Part 1 rows 1–1000 → station 1 Part 2 rows 1001–2000 → station 2 Part 3 rows 2001–3000 → station 3 Part 4 rows 3001–4000 → station 4
Header on every chunk so the WMS reads columns
ExampleA warehouse system reads address and SKU columns from the header. A headerless chunk fails to map. The splitter copies the header into each file.
Source: Order,Name,Address,SKU,Qty 1001,Ann,12 Oak St,W-1,2 1002,Bo,5 Elm Rd,G-2,1 1003,Cy,9 Pine Ave,Z-3,4 Rows per chunk: 2 → part-1-of-2.csv part-2-of-2.csv Order,Name,Address,SKU,Qty Order,Name,Address,SKU,Qty 1001,Ann,12 Oak St,W-1,2 1003,Cy,9 Pine Ave,Z-3,4 1002,Bo,5 Elm Rd,G-2,1
Caveat: multi-line-item order straddling a boundary
ExampleIf your export has one row per line item, a single order's rows can be split across two chunks. Use one-row-per-order exports, or sort so an order's lines stay adjacent and choose a chunk size that does not cut mid-order.
One-row-per-line-item export, order 1002 has 2 lines: row5: 1002,...,SKU G-2 row6: 1002,...,SKU G-9 Rows per chunk that puts row5 at the end of a chunk and row6 at the start of the next splits order 1002 across two stations. Fix: export one row per order, or merge line items first, then split.
Sort by zone, then split into waves
ExampleSort the export by delivery zone before splitting so each contiguous chunk is a single-zone pick wave.
Step 1 csv-sorter → sort by zone ascending Step 2 csv-row-splitter, 1000/chunk Part 1 = first 1,000 rows (lowest zones) → wave 1 Part 2 = next 1,000 rows → wave 2 → each wave is geographically coherent.
Uneven split — remainder wave
ExampleWhen orders do not divide evenly, the final chunk holds the leftover rows — a smaller last wave.
Input: orders.csv (4,000 rows) Rows per chunk: 1500 Chunks: 3 Part 1 rows 1–1500 Part 2 rows 1501–3000 Part 3 rows 3001–4000 (1,000 rows + header)
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.
Multi-line-item order split across chunks
Split caveatThe split is by row, not by order. If your export writes one row per line item, a single order's rows can straddle a chunk boundary and end up at two stations. Use a one-row-per-order export, or merge line items into one row with the csv-column-merger before splitting, so each order stays whole.
Chunk ranges never overlap
By designEach chunk covers a contiguous, non-overlapping block of rows (chunk 1 = rows 1–N, chunk 2 = N+1–2N, and so on). No row appears in two chunks, so two stations can never be handed the same order row. This is what prevents double-picking.
Order is not changed
PreservedThe splitter does not sort. Chunk 1 is the first N rows in source order. To make chunks map to zones or ship-by waves, sort the export first with the csv-sorter, then split.
Blank rows between orders
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 a WMS may reject or pick as a phantom order. Strip them with the csv-empty-row-remover first.
Address with a comma stays intact
PreservedShipping addresses with commas are quoted in a well-formed CSV, and the quote-aware parser keeps them inside one row across the split — so "12 Oak St, Apt 4" never spills into the next column in any chunk.
Header-only export
ExpectedA file with the header and no order rows produces zero chunks (total rows 0). If you expected pick lists, confirm the export window actually contained orders.
Peak-day export over the Pro ceiling
Plan limitPro processes up to 100,000 rows / 100 MB per file. A massive peak-season export beyond that should be pre-split at the order-export step (e.g. export by hour or by zone), then chunked per pick station.
Output without BOM
By designChunks are plain UTF-8 with no byte-order mark. Warehouse systems and 3PL portals handle this fine; only a human opening a chunk in Excel-on-Windows might see accented names render oddly — a display quirk, not a data error.
Many waves, individual downloads
ExpectedThere is no 'download all' zip — each chunk downloads on its own button. Splitting into eight waves means eight downloads, which doubles as a station-assignment checklist.
Frequently asked questions
Does each chunk include the header row?
Yes. The source header is copied to the top of every chunk, so each pick list opens with the right address, SKU, and quantity columns in your warehouse system.
Can two stations end up with the same order?
No. Chunks cover contiguous, non-overlapping row ranges — chunk 1 is rows 1–N, chunk 2 is N+1–2N, and so on. No row appears in two chunks, so there is no double-picking.
What if one order has multiple line-item rows?
The split is by row, not by order, so a multi-row order can straddle a chunk boundary. Use a one-row-per-order export, or merge line items with the csv-column-merger before splitting, to keep each order whole.
Can I choose the number of waves instead of rows per chunk?
No. The only option is Rows per chunk. Chunk count is total order rows ÷ chunk size, rounded up. For exactly N waves, set the chunk size to total rows ÷ N.
Does it keep orders grouped by zone or ship-by date?
It preserves source order, so if you sort the export by zone or ship-by date first (via the csv-sorter), each contiguous chunk is a coherent wave.
How are the chunk files named?
Each chunk is the source filename plus a part suffix, like orders-2026-06-10.part-1-of-4.csv, so they sort in wave order.
Can I download all chunks at once?
No. Each chunk has its own Download button and saves individually — there is no zip bundle.
Are shipping addresses with commas handled correctly?
Yes. Quoted address fields are parsed quote-aware, so a comma inside an address never becomes a column break in any chunk.
Is customer address data uploaded anywhere?
No. Parsing and splitting run in your browser; names, addresses, and order values never reach a server.
What happens to the last, uneven chunk?
It holds the remaining rows — a smaller final wave that still carries the header and is picked like any other chunk.
What is the largest export I can split?
The row splitter is a Pro tool: up to 100,000 rows / 100 MB per file. Larger peak-day exports should be pre-split at the order-export step.
What happens to blank rows between orders?
They are kept as rows, not skipped, and count toward the total. Strip them with the csv-empty-row-remover before splitting so a WMS does not pick a phantom order.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.