How to split a lead csv into one file per sales rep
- Step 1Export the assigned lead list — Pull the leads from your CRM with the Assigned Rep / Owner column populated: Salesforce report export, HubSpot Contacts → Export with the Owner property, Pipedrive export, or a spreadsheet allocation. Keep the header. Free tier: 2 MB / 500 rows; Pro: 100 MB / 100,000 rows.
- Step 2Drop the file onto the splitter above — PapaParse parses it in your browser — contact PII never leaves the tab. The first row becomes the headers and fills the Split by column dropdown.
- Step 3Select the Assigned Rep column — Choose
Assigned Rep,Owner,Lead Owner, or whichever column carries the rep value. The dropdown lists every header by name (blank headers show asCol N). One column per run. - Step 4Decide on case-sensitive grouping — Case-sensitive grouping (default ON) keeps
J. Smithandj. smithapart — handy for spotting a rep split across spellings. Untick to merge case variants into one file named after the first spelling seen. It never trims whitespace, soJ. Smithis still its own group. - Step 5Run the split and review the rep list — Click Split into groups. The result panel shows Total rows and Groups (the distinct rep count), then each rep with their row count. Reconcile that against your roster — an extra group usually means a casing or whitespace variant, or an unassigned bucket.
- Step 6Download each rep's file — Each rep has their own Download button — files save one at a time (no ZIP/bulk download), which suits a small sales team. The filename is
<list-name>.<rep>.csv, with the rep value sanitised to letters/digits/hyphen/underscore (other characters become_) and truncated to 50 characters.
The two controls the splitter exposes
Exactly two inputs — a single-column selector and a case toggle. No round-robin, no re-assignment, no merge, no name normalisation.
| Control | What it does for a lead list | Default |
|---|---|---|
| Split by column (dropdown) | Selects the single rep column — Assigned Rep, Owner, Lead Owner. Lists every header by name; blank headers show Col N | First column (index 0) |
| Case-sensitive grouping (checkbox) | ON: J. Smith and j. smith are separate files. OFF: case variants merge (key lowercased); merged file named after the first-seen spelling. Never trims whitespace | On (ticked) |
How rep values group
The split groups on the raw rep cell. Whitespace and case artefacts from CRM exports create separate groups unless folded.
| Rep cells | Case-sensitive (default) | Case-insensitive (unticked) |
|---|---|---|
Alex, Alex, Bree | 2 files: Alex (2), Bree (1) | Same: 2 files |
Alex, alex | 2 files | 1 file named Alex (first seen) |
Bree, Bree (trailing space) | 2 files — space makes a distinct group | 2 files — still distinct (no trim) |
Alex, `` (unassigned) | 2 files: Alex (1), (empty) (1) | 2 files: Alex (1), (empty) (1) |
Free vs Pro limits for lead splits
Limits apply to the source list before the split. Output file count is uncapped — one per distinct rep.
| Limit | Free | Pro |
|---|---|---|
| Source file size | 2 MB | 100 MB |
| Source row count | 500 rows | 100,000 rows |
| Output rep files | No cap | No cap |
Cookbook
Before/after splits from lead lists. Contact PII anonymised; representative columns shown.
HubSpot lead list split by Owner
ExampleEach rep gets only their contacts. Selecting the Owner column produces one file per rep, header included.
Input (leads.csv): Name,Email,Owner,Stage Acme,a@acme.com,Alex,New Beta,b@beta.com,Bree,New Corp,c@corp.com,Alex,Qualified Split by column: Owner Groups (2): Alex — 2 rows → leads.Alex.csv Bree — 1 row → leads.Bree.csv leads.Alex.csv: Name,Email,Owner,Stage Acme,a@acme.com,Alex,New Corp,c@corp.com,Alex,Qualified
Unassigned leads surface as the (empty) file
ExampleLeads with no rep yet are grouped under (empty) so the manager can allocate them rather than losing them in the master list.
Input (Owner column):
Alex
(blank)
Bree
(blank)
Split by Owner → 3 groups:
Alex — 1 row → leads.Alex.csv
Bree — 1 row → leads.Bree.csv
(empty) — 2 rows → leads._empty_.csv ← unassignedA rep split across two spellings
ExampleA CRM export wrote Alex Smith and alex smith (different casing on two import batches). Default grouping sends them to two files — half of Alex's pipeline in each. Untick case-sensitivity to reunite them.
Owner cells: Alex Smith, alex smith, Bree Lee Default (case-sensitive): 3 groups Alex Smith (1), alex smith (1), Bree Lee (1) Untick 'Case-sensitive grouping': 2 groups Alex Smith (2 rows) — named after first spelling Bree Lee (1 row) → leads.Alex_Smith.csv
Rep names with email-style values sanitise in the filename
ExampleIf the Owner column stores rep emails, the on-screen group keeps the full address but the filename sanitises the @ and ..
Group value on screen: alex.smith@firm.com Download filename: leads.alex_smith_firm_com.csv Rule: [^a-zA-Z0-9-_] → '_'. The CSV cells keep the real email; only the filename is sanitised.
Rep then region: a two-pass split
ExampleThe tool splits by one column per run. For rep-then-region, split by rep first, then re-run on each rep file using the Region column.
Pass 1 — split leads.csv by Owner → leads.Alex.csv, leads.Bree.csv Pass 2 — drop leads.Alex.csv back in, split by Region → leads.Alex.West.csv leads.Alex.East.csv To pull just one rep's leads, the csv-column-filter tool (/tool/csv-column-filter) does it in a single step.
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.
Unassigned leads
PreservedRows with a blank rep cell are grouped into a single file shown as (empty). They are never dropped — treat this file as the allocation backlog. Assign owners and re-run, or distribute the (empty) file to the manager for round-robin.
Same rep under two spellings or casings
By designAlex Smith and alex smith are two groups with the default case-sensitive setting — so a rep can end up split across two files. Untick Case-sensitive grouping to merge case variants (named after the first spelling). Variants that differ by punctuation or middle initial (J. Smith vs John Smith) won't merge — normalise the column first with csv-find-replace.
Trailing spaces on rep names
PreservedThe splitter never trims. Bree and Bree (trailing space, a common CRM-export artefact) are always separate groups, even with case-sensitivity off. Trim the rep column first with the csv-cleaner to avoid a rep being split in two.
Confidentiality between reps
By designEach output file contains only the rows for that rep value — no other rep's leads are present. This is the core use case: a clean per-rep hand-off with no cross-visibility, unlike a shared spreadsheet with hidden rows that a recipient can unhide.
List over the free 2 MB / 500-row limit
Rejected (free tier)A large lead import usually exceeds 500 rows, blocking the run on free with an upgrade overlay. Pro raises the ceiling to 100 MB / 100,000 rows. The check is on the source list, not the per-rep outputs.
Splitting on a near-unique column by mistake
ExpectedChoosing Email or Lead ID instead of the rep column produces one tiny file per lead, each with its own download button. Re-select the Owner / Assigned Rep column and re-run. There is no bulk/ZIP download to mitigate an accidental high-cardinality split.
Quoted commas in company or notes columns
SupportedPapaParse is quote-aware, so a Company value like "Acme, Inc." is one cell and won't shift the rep column. The splitter groups on parsed cells, so embedded commas elsewhere don't affect rep grouping.
Reps whose names share their first 50 characters
Filename collision riskFilenames truncate to 50 sanitised characters. This is rarely an issue for personal names, but if the Owner column holds long team/queue identifiers that share a 50-character prefix, two files get the same name — rename on save. The CSV contents remain correct.
Frequently asked questions
What if some leads are unassigned?
Rows with a blank rep column are grouped into a single file shown as (empty). Nothing is discarded — treat that file as your allocation backlog. Assign owners in the source and re-run, or hand the (empty) file to the manager for round-robin distribution.
Can I hide one rep's leads from another?
Yes — that is the primary use case. Each output file contains only the rows whose rep value matches that file; no other rep's contacts are present. Unlike a shared spreadsheet with hidden rows (which a recipient can unhide), each file is a genuine subset with no cross-visibility.
Is lead contact data uploaded?
No. PapaParse runs entirely in your browser; names, emails, phone numbers, and deal values never reach a server. Only an anonymous run counter is recorded server-side when you are signed in — never the contact content. This matters for a list of real prospects under GDPR/CCPA.
Why is one rep showing up in two files?
Almost always a casing or whitespace variant in the rep column — Alex vs alex, or Alex with a trailing space. Casing merges if you untick Case-sensitive grouping; whitespace and punctuation differences need cleaning first with the csv-cleaner (trim) or csv-find-replace (normalise spellings).
Does each rep's file include the header row?
Yes. Every output begins with the list's original header row, then only that rep's leads. The file imports straight into the rep's CRM view or opens in Excel with full column context.
Can I split by rep and then by region or stage?
Yes, in two passes — the tool splits by one column per run. Split by rep first, then re-run the splitter on each rep file using the Region or Stage column. If you only need one rep's leads, the csv-column-filter tool extracts that single slice in one step.
Does it download all rep files in one ZIP?
No. Each rep has their own Download button and saves a single CSV. There is no bulk or ZIP download — which is fine for a typical sales team but means many clicks for a very large roster.
Does the tool re-assign or re-balance leads?
No. It is a pure split by the existing Assigned Rep value — there is no round-robin allocation, re-assignment, or load-balancing feature. To re-assign before splitting, edit the rep column in your CRM or spreadsheet first (or use csv-find-replace to bulk-reassign values), then split.
Are the rep names changed in any way?
No. The on-screen group name and the cell contents keep the exact rep value. Only the download filename is sanitised (non-alphanumerics become underscores, truncated to 50 characters). The data is never altered.
How large a lead list can it handle?
Free tier: 2 MB / 500 rows. Pro: 100 MB / 100,000 rows. The limit is on the source list. A large import needs Pro, or pre-chunk it with the csv-row-splitter (which splits by row count, not by rep).
What if a rep has only one lead?
They still get their own file with one data row plus the header. Every distinct rep value becomes a group regardless of size. If you would rather not generate single-lead files, filter the list to high-volume reps first with csv-column-filter.
Can I automate the lead split for nightly allocations?
Yes — GET /api/v1/tools/csv-column-value-splitter returns the option schema (columnIndex, caseSensitive). Pair the @jadapps/runner once and POST your list to 127.0.0.1:9789/v1/tools/csv-column-value-splitter/run. A typical pipeline: nightly CRM export → runner-side split by Owner → drop each file to the rep's shared folder. Contact data never reaches JAD's servers — the runner runs locally.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.