How to split a large email list into batch csvs
- Step 1Export your full list as CSV — Download from your ESP or CRM. Mailchimp: Audience → Export Audience (arrives as a
.zipof status CSVs — extract thesubscribed_members_export_*.csvfirst). Klaviyo: Lists & Segments → ⋮ → Export List to CSV. Brevo / Kit: Contacts → Export → CSV. - Step 2Clean before you split (optional but recommended) — Splitting copies bad rows into batches verbatim — it does not dedup or trim. If the list has case-different duplicates or trailing-space emails, run the csv-cleaner or the csv-deduplicator first, then split the cleaned output so each batch is import-ready.
- Step 3Drop the CSV onto the splitter — PapaParse reads the file in your browser and auto-detects the delimiter from the data. The source file's first 10 rows show in the preview so you can confirm the header looks right before splitting.
- Step 4Set Rows per chunk — Type the batch size into the single Rows per chunk field (default 1000, minimum 1). For ESP warm-up, match your day-1 tranche; for A/B cohorts, set it to half the list. There is no 'number of files' option — the file count falls out of total rows ÷ chunk size.
- Step 5Click Split into chunks — The result panel shows three counts — total data rows, number of chunks, and rows per chunk — followed by one row per chunk listing its
rows X–Yrange. - Step 6Download each batch — Each chunk has its own Download button (files save individually — there is no single 'download all' zip). Files arrive as
<name>.part-N-of-M.csv, each with the header. Import them into your ESP at the cadence its rate limits allow.
What the splitter does (and does not) do
The tool exposes a single option. Everything else listed here is fixed behaviour baked into the split logic — verify against your workflow before relying on it.
| Behaviour | How it works | Implication for email batching |
|---|---|---|
| Rows per chunk (only option) | Number input, minimum 1, default 1000. Data is sliced into consecutive blocks of this size | You control batch size, not batch count — the file count is total data rows ÷ chunk size, rounded up |
| Header on every chunk | Row 1 of the source is copied to the top of each output file | Each batch imports standalone — no need to re-add column names in Excel |
| Last-chunk remainder | The final file holds the leftover rows when the list does not divide evenly | 12,500 contacts at 5,000/chunk → three files of 5,000, 5,000, 2,500 |
| Order preserved | Rows keep source order; chunk 1 = first N data rows | A list sorted by signup date stays chronological across batches |
| No dedup / no trim / no shuffle | The splitter never alters cells or drops rows | Clean and dedup upstream; the splitter is a pure cut |
| Individual downloads | One Download button per chunk; no zip bundle | For many chunks, download each in turn — the file count tells you how many |
Tier limits and worked batch counts
Free is capped at 2 MB / 500 rows; the row splitter is a Pro tool, so production-size lists need Pro (100 MB / 100,000 rows). Counts below are data rows excluding the header.
| List size (data rows) | Rows per chunk | Files produced | Last file size | Tier needed |
|---|---|---|---|---|
| 480 | 100 | 5 | 80 rows | Fits Free row cap (500) — but tool is Pro-gated |
| 50,000 | 10,000 | 5 | 10,000 rows | Pro (exceeds 500-row Free cap) |
| 50,000 | 5,000 | 10 | 5,000 rows | Pro |
| 12,500 | 5,000 | 3 | 2,500 rows | Pro |
| 100,000 | 25,000 | 4 | 25,000 rows | Pro (at the 100,000-row ceiling) |
Cookbook
Before/after row examples from real email-list batching workflows. Addresses anonymised; the splitter never alters cell contents.
50k list into 10k warm-up tranches
ExampleA new sending domain needs graduated volume. Split the full list into 10,000-row files and send one per day, raising volume as reputation builds.
Input: subscribers.csv (50,000 data rows + header) Rows per chunk: 10000 Result panel: Total rows: 50000 Chunks: 5 Rows/chunk: 10000 Part 1 rows 1–10000 Part 2 rows 10001–20000 Part 3 rows 20001–30000 Part 4 rows 30001–40000 Part 5 rows 40001–50000 Files (each with the header row): subscribers.part-1-of-5.csv subscribers.part-2-of-5.csv … part-5-of-5.csv
Header copied into every batch
ExampleThe single biggest manual-split mistake is a batch with no header. The splitter copies row 1 to the top of each chunk automatically.
Source: Email,First Name,Status a@x.com,Ann,subscribed b@x.com,Bo,subscribed c@x.com,Cy,subscribed Rows per chunk: 2 → part-1-of-2.csv part-2-of-2.csv Email,First Name,Status Email,First Name,Status a@x.com,Ann,subscribed c@x.com,Cy,subscribed b@x.com,Bo,subscribed
Uneven split — the remainder file
ExampleWhen the list does not divide evenly, the last file simply holds the leftover rows.
Input: list.csv (12,500 data rows) Rows per chunk: 5000 Chunks: 3 Part 1 rows 1–5000 (5,000 rows + header) Part 2 rows 5001–10000 (5,000 rows + header) Part 3 rows 10001–12500 (2,500 rows + header)
Quoted commas survive the cut
ExampleDisplay names with commas are quoted in a well-formed CSV. PapaParse keeps the quoting intact, so a comma inside a name never becomes a column break in a batch.
Source row: "o'brien, sean"@x.com,"O'Brien, Sean",subscribed After split (unchanged in whichever chunk it lands): "o'brien, sean"@x.com,"O'Brien, Sean",subscribed → stays one row, three columns, quoting preserved.
Clean first, then split
ExampleThe splitter does not dedup. Running it on a raw list copies duplicates into batches. Dedup upstream so each batch is import-clean.
Raw export: 50,120 rows incl. 120 case-different dupes Step 1 csv-deduplicator (case-insensitive) → 50,000 rows Step 2 csv-row-splitter, 10000/chunk → 5 clean files If you skip step 1, the dupes are simply distributed across the five batches — your ESP still gets all 50,120.
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.
Splitter copies duplicates into every batch
By designThe row splitter never dedups — it is a pure cut. If the source list has case-different (Sue@x.com vs sue@x.com) or trailing-space duplicates, those rows are distributed across the batches verbatim and your ESP still receives all of them. Dedup with the csv-deduplicator or the csv-cleaner before splitting.
Rows per chunk larger than the list
SupportedIf you set a chunk size of 100,000 on a 50,000-row list, you get a single chunk (part-1-of-1) containing the whole file with its header. No error — the tool just produces one file.
Header-only file (no data rows)
ExpectedA CSV with just the header and no data rows produces zero chunks — there are no data rows to slice. Total rows shows 0. If you expected batches, check the export actually contains contacts.
Blank lines inside the export
PreservedParsing keeps empty lines as rows rather than dropping them, so a blank separator line in the source counts toward the row total and lands inside a chunk as an empty row. Strip them first with the csv-empty-row-remover if your ESP rejects blank rows.
Output has no UTF-8 BOM
By designChunks are written as plain UTF-8 without a byte-order mark. Most ESP importers handle this fine, but Excel-on-Windows can show accented names as mojibake when opening the file directly. If a human needs to eyeball a batch in Excel, that is a display quirk of Excel, not corrupted data — the import into your ESP is unaffected.
Free row cap reached
Plan limitFree is capped at 500 rows / 2 MB and the row splitter is a Pro tool. Any realistic email list will exceed the Free cap, so production batching needs Pro (100 MB / 100,000 rows).
List exceeds the 100,000-row Pro ceiling
Plan limitPro processes up to 100,000 rows per file. A 300,000-contact list is over the ceiling — split the source into sub-100k files at the export step (or via two passes) before batching for sends.
Many chunks, downloaded one by one
ExpectedThere is no 'download all as zip' button — each chunk has its own Download. Splitting a list into 20 batches means 20 downloads. Pick a chunk size that produces a manageable number of files for your send schedule.
Mailchimp four-file export ZIP
Pre-step neededMailchimp exports a .zip of status CSVs, not one file. Extract the file you want to send (usually subscribed_members_export_*.csv), or combine the status files with the csv-merger first, then split the single combined CSV.
Frequently asked questions
Does each batch file include the header row?
Yes. The splitter copies the source file's first row to the top of every chunk, so each batch imports into your ESP standalone without re-adding column names.
What happens if the list does not divide evenly?
The last batch holds the remaining rows. A 12,500-row list at 5,000 per chunk produces files of 5,000, 5,000, and 2,500 data rows (plus the header in each).
Can I choose the number of files instead of rows per chunk?
No. The only option is Rows per chunk. The file count is derived: total data rows divided by chunk size, rounded up. To get exactly N files, set the chunk size to total rows ÷ N.
Does the tool deduplicate or clean emails while splitting?
No. It is a pure cut — no dedup, trim, or column edits. Clean and dedup upstream with the csv-cleaner or csv-deduplicator, then split the result.
Does it shuffle rows for random A/B cohorts?
No. Order is preserved — chunk 1 is the first N rows. For a random split, shuffle the list before splitting (e.g. sort by a random key column), since the splitter always cuts in source order.
How are the output files named?
Each chunk is named after the source file with a part suffix, like contacts.part-1-of-5.csv through contacts.part-5-of-5.csv, so they sort in send order.
Can I download all batches at once?
No — each chunk has its own Download button and saves individually. There is no zip bundle, so pick a chunk size that yields a manageable file count.
Will commas or line breaks inside a cell break the split?
No. PapaParse is quote-aware, so a comma inside a quoted display name or a newline inside a quoted notes cell stays within its row and column across the split.
Is my subscriber data uploaded anywhere?
No. Parsing and splitting run in your browser via JavaScript. Emails and names never reach a server, which matters for GDPR-scoped contact lists.
Why is the tool Pro-only?
The row splitter is gated to Pro. Free across CSV tools caps at 500 rows / 2 MB; real email lists exceed that, so batching needs Pro (100 MB / 100,000 rows per file).
What is the largest list I can split?
Pro processes up to 100,000 rows / 100 MB per file. For larger migrations, split the source at export time into sub-100k files first.
Do output files open cleanly in Excel?
They are valid UTF-8 CSVs, but without a BOM, so Excel-on-Windows may render accented names oddly on direct open. This is an Excel display quirk; the data and any ESP import are unaffected.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.