How to convert email addresses to lowercase in a csv
- Step 1Export your contact list as CSV — Download from your CRM, checkout tool, or form platform.
.csv,.tsv, and.txtare accepted directly;.xlsx/.xls/.odsare read from the first sheet and converted to CSV automatically. - Step 2Drop the file onto the converter — PapaParse reads it in your browser and shows the header row as a list of column checkboxes. Nothing is uploaded.
- Step 3Tick only the email column — Under Apply to columns, check just the box for
Email(or whatever it is named). Leave every other box unchecked — if you tick nothing, the converter would apply to ALL columns, which you do not want here. - Step 4Choose lowercase — Pick the lowercase radio (its preview reads
john smith). The other three modes — UPPERCASE, Title Case, Sentence case — are wrong for email. - Step 5Click Convert case and check the count — The result panel shows Cells converted (how many email values actually changed case) and Data rows. A first-10-rows preview confirms the column looks right.
- Step 6Download and dedup — Download the
.lower-case.csvfile (or.xlsxif you uploaded a spreadsheet), then run it through csv-deduplicator before importing into Mailchimp, Klaviyo, or HubSpot.
What lowercase does to a real email column
Each input value run through the converter's lowercase mode (toLowerCase()). Letter case is the only thing that changes — structure, plus-tags, and domains are preserved verbatim.
| Input cell | Output (lowercase) | Why it matters |
|---|---|---|
John@Example.COM | john@example.com | Local part and TLD both folded — now matches the all-lowercase duplicate |
Sue.Brown+news@Gmail.com | sue.brown+news@gmail.com | Plus-address tag is preserved; only case changes |
INFO@ACME.IO | info@acme.io | All-caps role address normalised for the ESP |
josé@Example.com | josé@example.com | Accented local part is lowercased but kept — some ESPs (e.g. Mailchimp) still reject UTF-8 in the prefix, so review separately |
user@x.com (trailing space) | user@x.com (space kept) | Lowercase does NOT trim — use csv-whitespace-trimmer for the trailing space |
Mode choice for an email list
The converter offers exactly four modes. Only one is correct for an email column.
| Mode | Result on `John@Example.com` | Use for email? |
|---|---|---|
| lowercase | john@example.com | Yes — the standard normalisation |
| UPPERCASE | JOHN@EXAMPLE.COM | No — non-standard, harder to read, no provider expects it |
| Title Case | John@example.com | No — only the very first letter changes; breaks at the @ ambiguously |
| Sentence case | John@example.com | No — identical wrong result to Title here; both lowercase the rest |
Cookbook
Real before/after rows from contact-list exports. Emails anonymised. Each shows the lowercase pass applied to the email column only.
Mixed-case duplicates from desktop + mobile signup
ExampleThe same person signed up twice — once on desktop where Chrome autocapitalised the first letter, once on mobile all-lowercase. The ESP sees two contacts. Lowercasing the email column first makes them identical so the downstream dedup collapses them.
Input: Email,First Name,Source John.Smith@Gmail.com,John,desktop john.smith@gmail.com,John,mobile Convert case → lowercase, column: Email Output (.lower-case.csv): Email,First Name,Source john.smith@gmail.com,John,desktop john.smith@gmail.com,John,mobile Next step: csv-deduplicator (key: Email) → one row remains.
All-caps role addresses from a printed-form import
ExampleA batch keyed in from paper forms was typed in caps lock. The addresses work, but they clash with the lowercase versions already in the list.
Input: Email,Company INFO@ACME.IO,Acme SALES@ACME.IO,Acme Convert case → lowercase, column: Email Output: Email,Company info@acme.io,Acme sales@acme.io,Acme
Header row is preserved — only values change
ExampleA common worry is that lowercasing will also lowercase the column name and break the import field-mapping. It will not — the converter explicitly skips row 0.
Input: EMAIL,FirstName JANE@X.COM,Jane Convert case → lowercase, column: EMAIL Output (header EMAIL untouched, value lowercased): EMAIL,FirstName jane@x.com,Jane
Lowercase only the email, leave the name alone
ExampleYou want the email folded but the display name kept exactly as the subscriber typed it (including their preferred capitalisation). Tick only the email box.
Input: Email,Name Maria@X.com,MaRiA del Carmen Convert case → lowercase, column: Email (Name unticked) Output: Email,Name maria@x.com,MaRiA del Carmen
Trailing space survives lowercase — chain a trim
ExampleLowercase changes case only. A trailing space from mobile autocomplete (which Klaviyo flags as invalid) is left in place, so a second pass is needed.
Input: Email User@X.com Convert case → lowercase: Email user@x.com ← space still there Then csv-whitespace-trimmer: Email user@x.com
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.
No column ticked — every column gets lowercased
By designLeaving all checkboxes unchecked tells the converter to apply to ALL columns, not none. For an email list that would also lowercase names (Jane→jane) and any text fields. If you only want the email folded, tick exactly the email column before running.
Trailing or leading whitespace on the email
PreservedLowercase changes letter case only; it does not trim. User@X.com becomes user@x.com with the trailing space intact. Klaviyo and several ESPs treat whitespace-in-email as invalid format. Run csv-whitespace-trimmer before or after the case pass.
Email wrapped in angle brackets from an Outlook paste
Preserved<John@X.com> becomes <john@x.com> — the case folds but the < > stay. Use csv-find-replace with the pattern [<>] → empty to strip them as a follow-up.
Accented characters in the local part
Preservedjosé@X.com lowercases to josé@x.com — the accent is kept (JavaScript toLowerCase is Unicode-aware). Note that some platforms, notably Mailchimp, document that they cannot process UTF-8 characters in the email prefix, so the address may still be rejected on import even though the case is now correct.
File over 2 MB on the free tier
BlockedFree is capped at 2 MB and 500 data rows. A larger contact export is blocked before processing. Split it with csv-row-limiter, or upgrade to Pro (100 MB / 100,000 rows).
List already fully lowercase
ExpectedIf every email is already lowercase, the pass is a no-op for that column — the Cells converted count reads 0 and the output is byte-identical. Safe to run as a guarantee step in a pipeline.
Two email columns (`Email` and `Email 2`)
SupportedTick both checkboxes and both are lowercased in the same pass. The converter operates per selected column index, so a primary and a secondary contact email are handled together.
Embedded comma or quote in another field shifts columns
PreservedThe converter trusts PapaParse's column parse. If a Notes cell contains an unquoted comma in the source CSV, the email could land in the wrong column index and the wrong field gets lowercased. Clean structural problems first with csv-cleaner.
Frequently asked questions
Does email case actually matter for delivery?
Mail servers fold the address before routing, so delivery itself is unaffected. The problem is downstream: your CRM and ESP often store and match email case-sensitively, so John@x.com and john@x.com become two contacts. That means duplicate sends, inflated list counts, and broken dedup. Lowercasing the column first prevents all of that.
Can I lowercase just the email column without touching names?
Yes — tick only the email checkbox under Apply to columns and leave the rest unchecked. The pass runs per selected column index, so names, dates, and tags are left exactly as they were.
Will this lowercase my column headers too?
No. The converter explicitly skips the first row, so Email / EMAIL / Email Address is preserved exactly. Only the data values below the header change. That keeps your import field-mapping intact.
Does it deduplicate the list as well?
No. This tool only changes letter case. Lowercasing is the step that makes case-insensitive matching possible — run csv-deduplicator on the lowercased file to actually remove duplicate rows.
What about the trailing space on some addresses?
Lowercase does not trim. A trailing space from mobile autocomplete stays in place. Run csv-whitespace-trimmer (or the all-in-one csv-cleaner) to remove it — Klaviyo and others treat whitespace-in-email as invalid.
If I leave all columns unchecked, what happens?
It applies to ALL columns, not none. For an email list that would also lowercase names and free-text fields, which you usually do not want. Always tick the specific column for a targeted email normalisation.
Does lowercasing change the part after the @?
Yes — the whole cell is lowercased, including the domain (Gmail.COM→gmail.com). Domains are case-insensitive by DNS, so this is harmless and consistent. Plus-address tags (user+news@x.com) and dots are preserved character-for-character.
How many rows can I process for free?
The free tier handles files up to 2 MB and 500 data rows — comfortably enough for a small list. Larger exports need Pro (100 MB / 100,000 rows) or you can split first with csv-row-limiter.
Is my subscriber data uploaded anywhere?
No. Parsing and conversion happen entirely in your browser via PapaParse. Email addresses and names never reach a server. Signed-in users get a single anonymous run counter for dashboard stats; no cell content is sent.
Can I upload an Excel file of contacts?
Yes. .xlsx, .xls, and .ods are accepted — the first sheet is read and converted to CSV for processing, and if the input was a spreadsheet the download comes back as .xlsx. Plain .csv, .tsv, and .txt are also accepted.
What does the Cells converted number mean?
It counts the cells whose value actually changed when lowercased — so it excludes addresses that were already lowercase. If you expected, say, 300 mixed-case rows and the count comes back much lower, most of your list was already normalised.
Can I run this in an automated pipeline?
Yes. GET /api/v1/tools/csv-case-converter returns the option schema (caseType, columnIndices); pair the JAD runner once and POST the payload to run the same lowercase pass locally. A common chain is: export → case-converter (lowercase email) → csv-deduplicator → re-import.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.