MuninMunin
Sign inStart free
Use case · CRM hygiene

Two records. One customer.

Every CRM fills with the same person twice — a form, an import, a colleague who typed the name differently. Munin files the pair as a proposal with its evidence attached, and waits for somebody to say yes.

  • Filed as a proposal, never applied
  • Evidence on every pair
  • A no is remembered
  • Nothing is deleted
The proposal

The pair it thinks is one person.

One row out of the review queue, with everything the pass matched on and the one field it could not reconcile. Nothing here has been applied. This is an opinion with its working shown, and the button is yours.

01Merge proposal · filed 14 Sep 09:12High confidence
  • 02Matched on
  • Same phone number, digit for digit
  • Name matches once the middle initial is normalised
  • Same company, two spellings
Record · Mar 2024Record · Nov 2025
NameRosalind PettiferRosalind J. Pettifer
Emailrosalind@quillside-property.co.uk03r.pettifer@marchbank-lettings.co.uk
Phone+44 7700 900 612+44 7700 900 612
CompanyQuillside Property LtdQuillside Property
Created12 Mar 20242 Nov 2025
History14 activities · 2 deals3 activities · 0 deals
ConsentLegitimate interest · imported-2024-q1Consent · web-form-trial-signup

Keep the 2024 record

It carries both deals and eleven more activities. The newer row is the one that gets archived.

Copy onto the keeper

  • r.pettifer@marchbank-lettings.co.uk — the address she actually answers from now
  • Consent: explicit, from the form she filled in herself

If you say yes

  1. Activities, deals and relationships move to the keeper.
  2. The duplicate is archived and tagged dedup-archived-2026-09.
  3. mergedInto on the archived row points at the keeper, so the trail survives.
  4. doNotContact is set on the archived row — nothing can reach her twice.
  5. Any other pending proposal naming that row is dismissed along with it.

If either record changes between the proposal and your yes, the apply is refused rather than guessed at. You are approving the pair you read, not the pair it has quietly become.

  1. 01
    It proposes. It does not merge.

    A duplicate is an opinion until a person agrees with it. The queue is where that opinion waits, for as long as it takes.

  2. 02
    The evidence travels with the pair.

    Same phone, normalised name, one company under two spellings. You are reading why it thinks so, not just what it thinks.

  3. 03
    The conflict is the interesting field.

    Two addresses, both real, because she changed employer. The proposal says which to keep and which to carry across, instead of silently dropping one of them.

  4. 04
    A no is remembered.

    Dismiss a pair and the next pass skips it. The queue does not refill every week with an argument you have already settled.

  5. 05
    Nothing is deleted.

    The duplicate is archived and marked, never dropped. If the merge turns out to be wrong, the row is still there and still says where it went.

What it cost you

Nine minutes of judgement.

You spent

9minutes

Eighty-five pairs read. Three refused.
You got

82merges

Nine thousand contacts. One pass.

The ratio is the product. Not fewer people — fewer of the steps that never needed one.

What it found

One pass over nine thousand contacts.

Nobody had ever been given the week it would take to do this by hand, which is exactly why it had never been done. The pass reads the whole table and files only what it can defend.

Eighty-five pairs is an afternoon of reading. The week of detective work in front of it is the part that was done for you.

Proposals filedfirst pass
  • Same phone, different spelling of the name41
  • Same address, different case12
  • Same person, two companies9
  • Similar name only — filed as medium23
85 filed · 0 applied
The honest part

What it won’t do.

  • 01

    Merge on its own. Every pair is a proposal, and there is no setting that turns the queue into an autopilot.

  • 02

    Guess when the evidence is thin. A similar name and nothing else is filed as medium confidence, or not filed at all.

  • 03

    Treat a bounce as an opt-out. An address that stops working is a fact about the address; permission is a separate field, and neither one is inferred from the other.

What it touches

Two modules, one record.

  • 01CRM32 toolscrm_
  • 02Outreach17 toolsoutreach_

The proposal and the merge are CRM calls. Outreach is why it matters: a segment built on a deduplicated table sends once, to the address that still works, under the consent she actually gave.

Open source. Open protocol.
One stack, your terms.