How to prepare a csv for mail merge by removing unused columns
- Step 1List the merge fields your template uses — Open your Word document, Google Doc, or email template and note every
«token»it references — typically FirstName, LastName, Email, and a couple of personalisation fields like Company or City. - Step 2Export your contact list as CSV — Download from your CRM, form tool, or spreadsheet. Keep the original; the tool produces a trimmed copy and never edits in place.
- Step 3Drop the file onto the remover above — Every header appears as a checkbox; parsing is local. Free handles up to 2 MB and 500 data rows — comfortable for most mail-merge contact lists.
- Step 4Tick every column not in your template — Select internal IDs, scores, timestamps, tags, and any column your merge doesn't reference. Remember: remove what you tick — to keep 5 fields from 25, tick the other 20. Blank-header columns show as
Col N. - Step 5Run and check the merge fields survived — Click
Remove N columns, confirm 'columns remaining' equals your merge-field count, and scan the preview to be sure FirstName/Email are intact and no internal column slipped through. - Step 6Rename headers if needed, then start the merge — Download
<yourfile>.columns-removed.csv. If your template tokens don't match the header text exactly, run csv-header-rename first, then connect the file in Word, Google Docs, or your email platform.
Mail-merge field checklist: keep vs. remove
A working split for a typical contact export feeding a letter or email merge. Keep what your template references; remove the rest.
| Column (example) | In your template? | Action | Why |
|---|---|---|---|
FirstName, LastName (or FullName) | Almost always | Keep | Greeting personalisation — the core of any merge |
Email | Yes (email merge) | Keep | The send field; required for email merges |
Company, City, JobTitle | If referenced | Keep if used | Personalisation tokens; remove if the template doesn't use them |
CustomerID, LeadID, RecordRef | No | Remove | Internal keys — clutter the field picker |
Notes, LastContacted, LeadScore | No | Remove | Internal — one mis-click from being merged into a letter |
Tags, Segment, Source | Rarely | Remove | Useful for filtering, noise in a merge picker |
Blank-header column (Col N) | No | Remove | Trailing-comma artefact; confuses the importer |
What this tool handles vs. what the merge still needs
Trimming columns is one prep step. Verified against the column-remover client and lib/csv-utils.ts.
| Prep task | This tool? | Where it lives |
|---|---|---|
| Remove unused merge-field columns | Yes | csv-column-remover (this tool) |
Rename headers to match «token» names | No | csv-header-rename |
| Fix Title Case on lowercase names | No | csv-case-converter |
| Trim stray spaces from name/email cells | No | csv-whitespace-trimmer |
| Remove duplicate contacts | No | csv-deduplicator |
| Split FullName into First/Last | No | csv-column-value-splitter |
Cookbook
Trimming real contact lists to merge fields. Contacts fabricated; the focus is which columns reach the merge.
Trim a 25-field CRM export to a 4-field letter merge
ExampleThe letter uses FirstName, LastName, Company, City. Tick everything else so the Word field picker shows only those four.
Template tokens: «FirstName» «LastName» «Company» «City» Input (CRM export): FirstName,LastName,Email,Company,City,LeadScore,LastContacted,Notes Ava,Lee,ava@x.com,Acme,Leeds,82,2026-05-30,"call back" Ticked to remove: Email, LeadScore, LastContacted, Notes Output (<file>.columns-removed.csv): FirstName,LastName,Company,City Ava,Lee,Acme,Leeds
Keep Email for an email merge, drop the internal columns
ExampleAn email merge needs the send field. Keep Email and the personalisation columns; remove the rest.
Input: FirstName,Email,Company,LeadScore,Tags,Source Ava,ava@x.com,Acme,82,"vip,beta",webinar Ticked to remove: LeadScore, Tags, Source Output: FirstName,Email,Company Ava,ava@x.com,Acme
Headers don't match the template tokens — rename after trimming
ExampleThe merge expects First_Name but the column is FirstName. This tool removes columns; it won't rename. Trim first, then rename.
Template token: «First_Name» Column header: FirstName
Step 1 — csv-column-remover: drop everything except FirstName, Email
→ FirstName,Email
Ava,ava@x.com
Step 2 — csv-header-rename: FirstName → First_Name
→ First_Name,Email
Ava,ava@x.com (now «First_Name» resolves)Blank cells stay blank — plan a fallback in the template
ExampleRemoving columns doesn't fill empty cells. A contact with a missing FirstName still merges to a blank greeting. The tool keeps the cell empty; handle the fallback in your merge rule.
Input:
FirstName,Email,Company
Ava,ava@x.com,Acme
,bo@y.com,Beta Ltd <- no first name
Ticked to remove: (nothing extra here)
Output keeps the blank cell:
FirstName,Email,Company
Ava,ava@x.com,Acme
,bo@y.com,Beta Ltd
In Word: use { IF { MERGEFIELD FirstName } = "" "there" ... }
so the empty greeting becomes 'Hi there,'.Large contact list over the free caps
ExampleA 3,000-contact list exceeds the 500-row free limit. Cap or split, or use Pro.
List: 3,000 contacts → over 500-row free limit Free workflow: csv-row-splitter → 6 files of 500 → csv-column-remover on each → merge in batches, OR csv-merger back into one before importing to Mailchimp. Pro: trim the full list in one pass.
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.
You tick columns to remove, not keep
By designThere's no 'keep only merge fields' mode — to keep 5 fields from a 25-column export you tick the other 20. The 'columns remaining' stat confirms you ended with the right merge-field count. When most columns are internal, it's a lot of ticking, but you always see exactly what's being dropped.
Header text doesn't match the template token
Rename afterwardsThe tool removes columns but never renames the survivors. If your template references «First_Name» but the column is FirstName, the token won't resolve. Trim first, then run csv-header-rename to align the header to the token.
Blank cells in a kept column produce blank merges
Plan a fallbackRemoving columns doesn't fill empty cells. A contact missing FirstName still merges to an empty greeting ('Hi ,'). The tool preserves the blank cell as exported — handle the fallback in the merge (Word IF field, or a default value in your email platform).
Names need Title Case or trimming, not column removal
Use a different toolIf names came in as ava lee or with stray spaces, that's a value problem, not a column problem. Trim removes whole columns only. Fix casing with csv-case-converter and spaces with csv-whitespace-trimmer.
FullName needs splitting into First/Last
Use a different toolIf the export has one FullName column but your template uses «FirstName» and «LastName» separately, removing columns won't help. Split it first with csv-column-value-splitter, then trim the rest.
Output is comma-delimited UTF-8 with no BOM
ExpectedInput delimiter is auto-detected; output is always comma-delimited UTF-8 without a BOM. Word, Google Docs, and email platforms read this fine. If accented names garble when opening the file directly in Excel-on-Windows, import via Data → From Text/CSV and pick UTF-8.
Contact list over 2 MB or 500 rows on free
Blocked (free limit)Free caps at 2 MB and 500 data rows. A few thousand contacts exceeds the row cap. Upgrade to Pro, or split with csv-row-splitter / cap with csv-row-limiter and merge in batches.
Duplicate contacts will still merge twice
Use a different toolTrimming columns doesn't deduplicate rows — a contact listed twice still gets two letters/emails. Run csv-deduplicator before the merge if your export has duplicates.
Frequently asked questions
What columns should I keep for a basic email merge?
At minimum Email plus a name field (FirstName or FullName). Add any column your template references as a token — Company, City, JobTitle. Tick everything else to remove it, then confirm 'columns remaining' matches your merge-field count.
Do I select the columns to keep or the ones to remove?
To remove. There's no 'keep only these' mode, so to reduce a 25-column contact export to your 5 merge fields you tick the other 20. The result stats confirm you kept the right number.
Will trimming change my name or email values?
No. Removal is positional and applied to every row uniformly, so the columns you keep retain their exact values — your personalisation tokens resolve correctly. Only the ticked columns are deleted.
My merge token is «First_Name» but my column is FirstName — will it work?
Not until the header matches. This tool removes columns but doesn't rename them. Trim first, then run csv-header-rename to rename FirstName to First_Name so the token resolves.
Can Mailchimp or ActiveCampaign just handle the extra columns?
They can — but each column becomes an audience field, and a cluttered field list makes mapping slower and creates junk fields you later have to clean up. Trimming to the columns you actually use keeps the audience tidy and the import faster.
What happens to a contact with a blank first name?
The blank cell is preserved as exported — removing columns doesn't fill it — so the contact would merge to an empty greeting. Add a fallback in your template (Word IF field or a default value in your email tool) to turn 'Hi ,' into 'Hi there,'.
Can I remove an internal Notes column so it can't leak into a letter?
Yes — that's a core use here. Tick Notes (and any other internal column) to remove it entirely before the merge. With the column gone from the file, it can't appear in the field picker or be merged by accident.
How large a contact list can I prepare for free?
Free handles files up to 2 MB and up to 500 contacts (data rows); either over the cap blocks the run. Larger lists need Pro, or split with csv-row-splitter and merge in batches.
Does it deduplicate contacts or fix name casing while trimming?
No — it only removes columns. Duplicate contacts and lowercase names pass through. Use csv-deduplicator and csv-case-converter as separate steps before the merge.
What does the downloaded file get named?
<your-original-name>.columns-removed.csv. The original contact export is never modified, so you can re-run if you trim the wrong columns.
Is my contact data uploaded anywhere?
No. Parsing and removal run entirely in your browser via PapaParse; contact details never reach a server. When signed in, only a content-free usage counter is recorded for your dashboard.
Can I automate trimming for a recurring merge campaign?
Yes. Pair the @jadapps/runner once and POST the contact CSV to 127.0.0.1:9789/v1/tools/csv-column-remover/run with options.columns listing the internal columns to drop by name (case-insensitive) or index. It returns the trimmed CSV ready for the merge — all on-device.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.