$ dedup scan --by email,phone,name

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.

  Works with free FluentCRM   WP 6.4+ · PHP 8.2+   GPL-2.0
Merge preview · reason: email
#4471
John Doejohndoe+promo@gmail.com
subscribed
#4472
Johnny Doejohn.doe@gmail.com
subscribed
merge onto survivor
#4471
John Doetags & lists consolidated · city gap-filled
survivor
Snapshot #4813 recorded Undo merge

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.

delete the wrong record once, and it does not come back

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.

by email

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.

by phone

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.

by name

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.

consolidate

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

$0forever

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
Download free
14-day free trial

Pro

$49/ year · 1 site

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
Start 14-day trial

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.

1.2.02026-07-21latest
  • 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.
1.1.02026-07-06
  • Pro one-click restore and Pro bulk merge.
  • Merges now re-read and re-verify each contact server side at merge time.
1.0.02026-07-05
  • 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.