How to dedupe an event registration csv
- Step 1Decide the right key for your ticket model — One ticket per person (most conferences, webinars): dedupe on
Email. One buyer purchasing several tickets for a group: each ticket is a separate attendee — dedupe onTicket ID/Order ID, or skip deduping if every row is a distinct attendee. - Step 2Combine your registration exports — If your platform exported in batches or you pulled multiple times, concatenate them with csv-merger, oldest export first so the earliest registration is the one kept.
- Step 3Drop the registration CSV onto the deduplicator — Accepts
.csvand Excel/ODS (.xlsx/.xls/.ods, first sheet). Eventbrite, Luma, and Hopin export comma-delimited UTF-8; the delimiter is auto-detected regardless. - Step 4Pick the key column — From the Unique key column dropdown choose
Email(one-per-person) orTicket ID/Order ID(multi-ticket). This is the single field that identifies a unique attendee or ticket. - Step 5Run and read the stats — Leave Case-sensitive keys off and click Remove duplicates. The tiles show Rows in, Rows out, Duplicates (removed), Unique keys (= unique registrants), Empty keys. Check Empty keys for registrations missing the identifier (e.g. comp entries).
- Step 6Verify head count and download — Cross-check Unique keys against your expected attendee count for badges and catering. Then Download CSV (or
.xlsx) — one row per registrant in original order, ready for check-in or badge printing.
The deduplicator's two controls
Exactly two options. No multi-column key, no merge-on-collision. The right key depends entirely on your ticket model.
| Control / behaviour | Effect | Default | Event guidance |
|---|---|---|---|
| Unique key column | Rows sharing this value (trimmed, optionally lowercased) collapse to the first | First column | Email for one-per-person; Ticket ID/Order ID for multi-ticket |
| Case-sensitive keys | Off matches Sam@x.com to sam@x.com; on requires exact case | Off | Keep off for emails and most ticket codes |
| Whitespace in key | Trimmed before comparison; the cell value is unchanged | Always trimmed | Padded emails from form autofill still match |
| Blank-key rows | Never deduped; kept and counted as Empty keys | Always preserved | Comp/on-the-door entries with no email survive review |
Key choice by event/ticket model
Pick the key that matches how attendees map to rows on your platform.
| Event model | Rows per attendee | Best key | Caveat |
|---|---|---|---|
| Conference, 1 ticket/person | One row per registrant | Email | Payment retries and re-submits create email duplicates to remove |
| Group purchase (buyer + guests) | One row per ticket; buyer's email repeats | Ticket ID / Attendee ID | Email-keying would wrongly collapse the buyer's group to one |
| Eventbrite export | One row per ticket order | Order # or Email | Multi-ticket orders share an Order # — dedupe on Ticket ID for per-attendee |
| Webinar (Zoom/GoTo) | Registered + attended exported separately | Email | Concatenate the two, dedupe on email to merge |
| Free RSVP (Luma, Meetup) | One row per RSVP; +1s may share email | Email | If +1s lack their own email, dedupe collapses them — verify head count |
Cookbook
Real before/after rows from registration exports. Attendee PII anonymised. The tool keeps the first row per key — choose the key carefully for multi-ticket events.
Payment retry created a duplicate registration
ExampleA registrant's card failed, then succeeded — the platform wrote two attendee rows with the same email. Deduping on Email keeps the first and removes the retry.
Input: email,name,status sam@x.com,Sam,paid lee@y.com,Lee,paid sam@x.com,Sam,paid Key column: email · Case-sensitive keys: OFF Output: email,name,status sam@x.com,Sam,paid lee@y.com,Lee,paid Stats: Rows in 3 · Rows out 2 · Duplicates 1 · Unique keys 2
Group purchase — DO NOT dedupe on email
ExampleOne buyer purchased three tickets for colleagues; the buyer's email is on all three rows. Deduping on email would wrongly drop two real attendees. Dedupe on ticket_id instead.
Input (one buyer, three attendees): email,ticket_id,attendee boss@co.com,TK-1,Boss boss@co.com,TK-2,Aide boss@co.com,TK-3,Intern Wrong: key column = email → collapses to 1 row (2 attendees lost!) Right: key column = ticket_id → all three kept: email,ticket_id,attendee boss@co.com,TK-1,Boss boss@co.com,TK-2,Aide boss@co.com,TK-3,Intern
Case-different email from a re-submitted form
ExampleA registrant submitted once on mobile (lowercase) and again on desktop (autocapitalised). Default case-insensitive matching collapses them.
Input: email,registered Pat@Org.com,2026-03-01 pat@org.com,2026-03-02 Key column: email · Case-sensitive keys: OFF Output (first registration kept): email,registered Pat@Org.com,2026-03-01 To keep the LATEST registration, sort by 'registered' desc with csv-sorter first, then dedupe.
Merge Zoom 'registered' and 'attended' exports
ExampleZoom exports registrants and attendees as two files. Concatenate them and dedupe on email to get one row per person across both lists.
Step 1 — csv-merger (registered file first, attended below): email,list a@x.com,Registered b@x.com,Registered a@x.com,Attended Step 2 — deduplicator, key column = email: email,list a@x.com,Registered b@x.com,Registered One row per person; first (Registered) row kept.
On-the-door comp entries with no email preserved
ExampleWalk-in/comp attendees were logged without an email. Blank-key rows are never deduped — each is kept and counted as an Empty key.
Input: email,name,type ,Walk-in 1,comp ,Walk-in 2,comp zoe@x.com,Zoe,paid Key column: email Output (both comp rows kept): email,name,type ,Walk-in 1,comp ,Walk-in 2,comp zoe@x.com,Zoe,paid Stats: Rows in 3 · Rows out 3 · Duplicates 0 · Empty keys 2
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.
Group buyer's tickets collapsed when keyed on email
Over-collapse riskIf one person buys several tickets, their email repeats across rows that are genuinely different attendees. Deduping on Email would drop the real guests. Dedupe on Ticket ID/Attendee ID for multi-ticket events, or don't dedupe if every row is a distinct attendee.
Registration list over the free 500-row limit
Pro requiredThis is a Pro tool; free is capped at 500 rows / 2 MB. Large events exceed that. Pro raises it to 100,000 rows / 100 MB. For bigger lists, split with csv-row-splitter, dedupe each part, concatenate, then dedupe once more.
Want to keep the LATEST registration, not the first
First-row onlyOnly the first occurrence is kept. To keep the most recent (e.g. updated dietary info), sort by the registration timestamp descending with csv-sorter first so the newest row is first, then dedupe.
+1 guests share the registrant's email
Verify head countWhen +1s are logged under the main registrant's email with no email of their own, deduping on email collapses them and undercounts catering. If +1s have a distinct ticket/attendee field, key on that; otherwise leave the list un-deduped and count rows.
Need to merge fields from duplicate registrations
Not supportedWhen two rows for one registrant each hold partial data (one has the dietary note, the other the t-shirt size), the deduplicator keeps the first whole row and drops the second — it does not field-merge. Reconcile partial rows first, or place the more complete one on top.
Comp / on-the-door entries with no email kept
PreservedBlank-key rows pass through untouched as Empty keys, so walk-in and comp attendees aren't lost. If you only want emailed registrants for a mailing, pre-filter with csv-column-filter (email is_not_empty).
Composite key (email + session) needed for multi-session events
Single key onlyA person can register for multiple sessions; you want one row per (person, session). The key is one column, so merge email and session into a combined key with csv-column-merger, dedupe on it, then split back with csv-column-value-splitter.
Ticket codes that differ only by case
Toggle case-sensitiveBy default ticket codes are matched case-insensitively. If your platform issues case-distinct codes (TK-ab vs TK-AB as different tickets), enable Case-sensitive keys so they aren't wrongly merged.
Semicolon delimiter or BOM in an EU export
SupportedDelimiter auto-detection handles ;-separated exports, and a leading UTF-8 BOM doesn't corrupt the header. Output is comma-delimited. Upload/download as .xlsx for a guaranteed Excel-clean round-trip.
You only want to find duplicate registrants first
Use the finderTo review which registrants are duplicated before removing anyone, use csv-duplicate-finder — it flags rows YES/NO and groups matches. Use this deduplicator once you've confirmed which to drop.
Frequently asked questions
Should I dedupe registrations on email or ticket ID?
Email for one-ticket-per-person events (conferences, webinars), where payment retries and re-submits create same-email duplicates. Ticket ID / Order ID for events where one buyer purchases multiple tickets — each ticket is a distinct attendee and email-keying would wrongly collapse the group.
Does it match emails case-insensitively?
Yes by default. With Case-sensitive keys off, Sam@x.com, sam@x.com, and sam@x.com all collapse to one registrant. Whitespace is trimmed for the comparison too. Enable case-sensitivity only for case-distinct ticket codes.
Why would deduping on email lose attendees?
Because one buyer purchasing several tickets puts their email on every row. Those rows are different real attendees, so email-keying drops the guests. For group/multi-ticket events, dedupe on Ticket ID/Attendee ID instead — see the second cookbook example.
Which duplicate registration is kept?
The first in file order. Concatenate batch exports oldest-first to keep the earliest registration, or sort by timestamp descending with csv-sorter to keep the most recent.
What happens to comp / walk-in entries with no email?
They're kept. Blank-key rows are never deduped and are counted as Empty keys, so on-the-door and comp attendees survive. Pre-filter with csv-column-filter if you want only emailed registrants for a mailing.
Can I merge Zoom's registered and attended lists?
Yes — concatenate the two files with csv-merger, then dedupe on email. You get one row per person across both lists, with the first (registered) row kept.
Will it combine partial data from duplicate rows?
No. It keeps the first complete row and drops the rest — no field-level merge. If your duplicates hold complementary info (dietary note on one, t-shirt size on another), reconcile them first or place the more complete row on top before deduping.
Is attendee data uploaded anywhere?
No. Parsing and deduplication run entirely in your browser. Attendee names, emails, and dietary/accessibility notes stay on your device — only an anonymous run counter is recorded for signed-in dashboards. This keeps attendee PII out of any server.
Can I dedupe per attendee per session for a multi-session event?
Not in one pass — the key is one column. Merge email and session into a combined key with csv-column-merger, dedupe on that, then split it back with csv-column-value-splitter if you need the columns separated.
How large a registration list can it handle?
Free tier: 500 rows / 2 MB (this is a Pro tool). Pro: 100,000 rows / 100 MB. For larger events, split with csv-row-splitter, dedupe each part, concatenate, and run a final pass.
Can I upload an Eventbrite Excel export?
Yes — .xlsx, .xls, and .ods are accepted (first sheet is read), and you can download the result back as .xlsx. Plain .csv works directly, with the delimiter auto-detected.
How do I just see who's duplicated before removing?
Use csv-duplicate-finder — it adds an _is_duplicate YES/NO column and groups duplicate registrants so you can review. Then use this deduplicator to collapse the confirmed duplicates.
Privacy first
Processing runs locally in your browser with PapaParse. No file is uploaded — only metadata counters are saved for signed-in dashboard stats.