Merge duplicate contacts.
Undo any merge.
FluentCRM keeps one contact per email, so the same person still sprawls across gmail aliases, a second address, a shared phone. This finds those duplicates and merges them onto one survivor, with a full snapshot written before anything changes, and one-click restore if you change your mind.
The problem
Cleaning duplicates by hand is a one-way door
Merging duplicates means picking a survivor, moving its tags and lists, then deleting the rest. Do it in the admin or with raw SQL and one slip deletes the record that carried an unsubscribe, or the customer with the order history. There is no undo, and nothing stops you from merging a subscribed contact into someone who opted out.
Safety first
Every merge is reversible, and unsafe ones are refused
The whole plugin is built around not losing data. Four guarantees run on every merge, on the free tier and Pro alike.
A snapshot before anything changes
A full snapshot of every contact in the set is written to an undo journal before the first record is touched. If the snapshot cannot be recorded, the merge is aborted rather than run blind.
Never merges across subscription status
A subscribed contact and an unsubscribed, bounced, or complained alias are never merged automatically. A cleanup cannot quietly resurrect someone who opted out, so you stay on the right side of consent.
Re-read and re-verified at merge time
The moment you confirm, the contacts are read fresh from the database and re-checked. A set that no longer qualifies as a duplicate is refused, not merged on a stale preview.
A history you can walk back
Every merge is listed in a history. On the free tier you verify that its snapshot exists. On Pro you restore it with one click, re-creating the removed contacts and reverting the survivor.
How it finds them
Exact matches, after careful normalization
No fuzzy guessing. Every match is exact once the noise is stripped away, so you are never asked to trust a similarity score with a delete.
gmail dots and plus aliases collapse to one address. john.doe+promo@gmail.com and johndoe@gmail.com are the same inbox. googlemail, casing, and stray whitespace are handled too.
Digits only, with junk rejected. Two contacts that strip to the same number group. Placeholder and repeated-digit noise like 000-000-0000 never matches.
First and last, 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.
Nothing useful is dropped. The survivor keeps the union of every tag and list, and empty custom fields are gap-filled from the records being removed.
Free and Pro
Start free. Upgrade when you want the ripcord.
The free tier merges and records a verifiable snapshot for every merge. Pro adds the thing you reach for when a cleanup goes sideways: one-click restore, plus bulk merge for large lists.
Free
for a careful one-time cleanup
- Scan by email, phone, and name
- Single-set merge with tag, list, and field consolidation
- Snapshot before every merge
- Mixed-status merges refused
- Merge history with snapshot verification
Pro
agency: $129 / year · up to 10 sites
- Everything in Free
- One-click restore of any merge from the history
- Bulk merge many duplicate sets in one action
- Restore re-creates contacts with their original status
- Updates and support
No card for the trial · 14-day money-back guarantee · secure checkout by Freemius
Changelog
What's shipped
Version history for the plugin. Pro customers get every update automatically.
- Merge history panel with per-row undo, so every merge, including each set from a bulk run, is reachable for restore.
- A duplicate set is refused unless all members share one subscription status.
- Restore re-creates a removed contact with its original subscription status.
- Every action's result shows on the card where it happened, on both tiers.
- Pro one-click restore and Pro bulk merge.
- Merges now re-read and re-verify each contact server side at merge time.
- Initial release: detection by normalized email, phone, and name, reversible merge with a pre-merge snapshot, and the free and Pro split.
Questions
Before you merge anything
Does it need FluentCRM Pro?+
No. It works with the free FluentCRM. FluentCRM just needs to be active, or the plugin shows a notice and stays out of the way.
Will merging trigger my automations?+
A merge attaches the removed contacts' tags and lists to the survivor. If you run automations that start when a tag or list is applied, treat a merge as capable of enrolling the survivor, and test on a small set first. Scanning and previewing never change data.
What does restore actually bring back?+
It re-creates the removed contacts with their tags, lists, custom fields, and original subscription status, and reverts the survivor to its pre-merge state. History that was never in the snapshot, like email opens, clicks, and automation position, does not return, and re-created contacts get new contact ids.
How large a list can it handle?+
Single merges are instant. Bulk merge is synchronous and capped per run (50 sets by default, filterable) to stay well inside PHP timeouts. Very large one-shot cleanups are best done in a few bulk passes.
Is it GPL, and can I get a refund?+
Yes, it is licensed GPL-2.0-or-later. Pro is sold through Freemius with a 14-day money-back guarantee, and the trial does not ask for a card.
Merge duplicates. Keep the undo.
Try Pro free for 14 days, no card. If you only need a careful one-time pass, the free version merges with a verifiable snapshot every time.