Merge duplicate FluentCRM contacts without the one-way delete.
FluentCRM has no merge feature, so the usual fix is a bulk delete you cannot take back. This finds duplicates by normalized email, phone, and name and merges them onto one survivor, writing a full snapshot before anything changes. Mixed-status merges are refused, and on Pro one click restores a merge.
Works with free FluentCRM · WP 6.4+ · PHP 8.2+ · GPL-2.0
- subscribed
John Doe
- subscribed
Johnny Doe
John Doe
tags & lists consolidated · city gap-filled
The problem
Cleaning up duplicate FluentCRM contacts by hand is a one-way door
Delete the wrong record once, and it does not come back.
- FluentCRM has no built-in way to merge duplicate contacts.
- You can prevent some on import and bulk-delete filtered contacts, but merging two records into one is left to you.
- Do it in the admin or with raw SQL and one slip deletes the record that carried an unsubscribe, with no undo.
- Nothing stops you from merging a subscribed contact into someone who opted out.
Safety first
Every merge is snapshotted first, and unsafe ones are refused
This plugin is built around one rule: you should never lose a contact you did not mean to. Four checks run on every merge, on the free tier and Pro alike. One-click restore of a merge is the Pro upgrade.
Nothing changes until a snapshot is saved
Before the first record is touched, a full snapshot of every contact in the set is written to an undo journal. If that snapshot cannot be recorded, the merge aborts instead of running blind. Nothing changes until there is a recorded snapshot to restore from.
A cleanup can never re-subscribe someone who opted out
The plugin refuses to merge a subscribed contact with an unsubscribed, bounced, or complained alias. Consent stays intact, so tidying your list can never quietly resurrect a contact who asked to leave.
You never merge on a stale preview
The moment you confirm, every contact is re-read from the database and re-checked on the server. If the set no longer qualifies as a duplicate, the merge is refused rather than run on numbers that changed since you looked.
Every merge stays reachable, and reversible on Pro
Each merge is listed in a history panel. On the free tier you can confirm its snapshot exists. On Pro, one click restores it, re-creating the removed contacts and reverting the survivor. Restore brings back contact data and consent, not per-message engagement history.
How it finds them
Find duplicate contacts by email, phone, and name
No fuzzy similarity score decides what to delete. Each contact is matched exactly, after the noise is normalized away, so the sets you review are matches, not guesses. You still review every set before merging.
by email
The same inbox is caught even when the address looks different.
Gmail dots and plus aliases collapse to one address, so
[email protected]and[email protected]read as the same person. Googlemail, casing, and stray whitespace are normalized too.by phone
One number, however it was typed.
Numbers are compared on their digits, so different punctuation or spacing does not hide a match. Placeholder and repeated-digit junk like
000-000-0000is rejected and never groups unrelated people.by name
First and last name, both required.
Case-insensitive, and a single shared field is too weak to group, so two people who only share a surname are left alone. Two contacts with the same full name are grouped, so review a name-only match before you merge it.
consolidate
The survivor keeps everything worth keeping.
It inherits the union of every tag and list in the set, and any custom field left empty is filled from the records being removed. Nothing useful is dropped on the way to one clean record.
Free and Pro
Start free. Add control and an undo button when the list is bigger.
The free tier does the real work: it finds duplicates, merges them with full tag, list, and field consolidation, and records a verifiable snapshot every time. Pro is what you reach for at scale, when you need to decide which contact wins and which value survives, filter a long list down to the sets you care about, merge many at once, and put any of it back with one click.
| Feature | Free | Pro |
|---|---|---|
| Find duplicates by email, phone, and name | Included | Included |
| Merge one set, with tags, lists, and empty fields consolidated onto the survivor | Included | Included |
| Full snapshot written before every merge | Included | Included |
| Mixed-status merges refused, so consent is never broken | Included | Included |
| Merge history with snapshot verification | Included | Included |
| Per-field merge: decide which value survives wherever the contacts disagree | Not included | Included |
| Choose which contacts to merge, and which one to keep | Not included | Included |
| Scan filters by status, name, email, phone, date, tags, lists, and custom fields | Not included | Included |
| One-click restore of any merge from the history | Not included | Included |
| Bulk merge many duplicate sets in one action, up to 50 per run | Not included | Included |
| Move a removed contact's guest WooCommerce orders to the survivor | Not included | Included |
| Updates and support | Not included | Included |
| Download free | Start 14-day trial |
No card for the trial. 14-day money-back guarantee. Pricing and secure checkout by Freemius.
Changelog
What's shipped
1.3.0
- ProPer-field merge. Every standard and custom field is resolved across the set, and you are asked only where the contacts genuinely disagree.
- ProChoose which contacts in a set to merge, and which one to keep.
- ProScan filters by status, name, email, phone, created date, tags, lists, and custom fields, applied before grouping.
- ProOptionally move a removed contact's guest WooCommerce orders onto the surviving contact's account.
- NewDuplicate sets now collapse into an accordion, so a long scan stays readable. This is the one change on the free plan.
- FixedReverting a merge could not clear a custom field it had filled in, and reported success anyway.
- FixedA per-field choice was ignored for custom fields whose name is not plain ASCII.
1.2.0
- NewMerge history panel with per-row undo, so every merge, including each set from a bulk run, is reachable for restore.
- NewA duplicate set is refused unless all members share one subscription status.
- NewRestore re-creates a removed contact with its original subscription status.
- NewEvery action's result shows on the card where it happened, on both tiers.
1.1.0
- ProOne-click restore and bulk merge.
- NewMerges now re-read and re-verify each contact server side at merge time.
1.0.0
- NewInitial release: detection by normalized email, phone, and name, reversible merge with a pre-merge snapshot, and the free and Pro split.
Can I undo a merge if something goes wrong?
Will merging trigger my automations?
What does restore bring back, and what does it not?
Can a merge re-subscribe someone who opted out?
How large a list can it handle?
What goes into the snapshot journal, and is that GDPR-safe?
Does it need FluentCRM Pro?
Is it GPL, and how do the trial and refund work?
Merge your duplicates without the one-way delete.
Start Pro free for 14 days, no card required, and run a real cleanup with one-click restore if anything goes wrong. Prefer to keep it simple? The free version records a verifiable snapshot on every merge, so a careful, reviewed pass is well covered.