Skip to main content
AK Ankush Kaura

Merge or Keep Separate? Duplicate Opportunities in Odoo CRM

How Odoo 19 CRM finds similar opportunities, what a merge keeps and deletes, and how to decide when two records should stay separate.

Published on 13 Nov 2026 · 5 min read

Animated portrait of Ankush Kaura

Short answer: Odoo CRM flags possible duplicates with a Similar Leads smart button, and you merge them from the list view with Actions ‣ Merge. The flag is a prompt, not a verdict: it can match two different people at one company, and the merge cannot be undone. Merge when it is clearly one person with one need. Keep the records separate when the contacts, needs or owners differ, and make sure the same salesperson or team handles both.

Applies to

  • Odoo version: Odoo 19. The merge page reads the same in the 20.0 documentation.
  • Edition: Community and Enterprise. The crm.lead model is in the Community code.
  • Apps: CRM. Leads (if enabled) and opportunities are handled by the same tool.

How does Odoo decide two records look alike?

The documentation describes it simply: the email address and phone number of the contact are compared, and a Similar Leads smart button appears on the record when there is a match.

The 19.0 source is a little broader, and it explains the behaviour you see. It looks at three things. First, a company email domain: for ordinary company addresses it keeps the part after the @, but for well-known free providers it keeps the whole address, so two Gmail users do not match each other. Second, whether the lead is linked to the same commercial customer. Third, an exact match on the sanitised phone number.

There is one more detail worth knowing. For the domain and phone checks, the search is dropped when 21 or more records match. A very common domain therefore stops producing a flag, which is a sensible protection but means the button is not a complete audit.

What exactly does a merge do?

From the list view of the similar records, tick the ones to combine, open Actions, choose Merge, then pick the Salesperson and Sales Team in the pop-up and confirm.

In the 19.0 source, one record survives and the others are removed. Before that happens, messages, attachments and activities move to the survivor, descriptions are joined, tags are combined, the highest priority is kept, the address is taken from the record with the most address fields filled in, and a summary is logged in the chatter. Someone without superuser rights can merge at most five at a time.

Two points to treat carefully. The documentation says the first created record gets priority, while the source ranks by a confidence order first. I would not rely on creation date alone. Also, if a lead and an opportunity are merged, the result is an opportunity.

When should two similar records stay separate?

The documentation lists the cases:

  • Different contacts at one organisation. Same company, different needs. Keep both and assign the same salesperson or team.
  • Similar but not exact email. A near match is not the same person.
  • Several salespeople already working them. Tag everyone in an internal note rather than forcing a merge.
  • A lost record against an active one. Merging brings the lost record back into the pipeline, so do it only if that is what you want.

When it fits and when it doesn’t

Merging fits a clear case: the same person submitted a form twice, or an email arrived while a record already existed. It does not fit when you are tidying a database in bulk by eye. My rule of thumb is that if I cannot say why the two records are the same person in one sentence, I leave them alone and add a note.

A worked example

A supplier of catering equipment gets three records. A web enquiry about ovens and a second submission with the same address and phone, five minutes apart. A third arrives from the same company, from the kitchen manager, asking about refrigeration.

The first two are one person with one need, so they are merged and the surviving record carries both messages. The third has the same domain but another contact and another product. It stays separate, owned by the same salesperson, with an internal note linking the two.

Common mistakes

  • Merging because the button appeared. It is a prompt only.
  • Merging without checking owners. The pop-up asks for a salesperson, and that choice sticks.
  • Merging a lost record by accident. The merged record becomes active again.
  • Creating a new contact for every enquiry. Link the opportunity to an existing customer when you can, because the same-customer check depends on it.

How can I stop the same duplicates returning?

Prevention is mostly habit. Search for the customer before creating an opportunity, link to an existing contact, and make web forms and email aliases create records in a consistent way. If duplicates keep coming from one source, look there first. A forms or integration issue is cheaper to fix than a monthly merge session.

There is a longer screen by screen walkthrough of this on sajjalbajaj.in.

Official references

How this article was checked: I read the Odoo 19 merge and lost-opportunities pages, compared the merge page with 20.0, and read the 19.0 crm.lead source for the duplicate search and the merge steps. Where the documentation and the source differ, I have said so. I did not run a live database.

If you are planning a clean-up or an import that must not create duplicates, the portfolio shows how I approach data work.

Frequently asked questions

How does Odoo CRM detect duplicate opportunities?

The documentation says it compares the contact's email address and phone number and shows a Similar Leads smart button. The 19.0 source also matches on the company email domain and on records linked to the same commercial customer.

Can I undo an Odoo CRM merge?

No. The documentation calls merging irreversible, and the source deletes the secondary records after moving their messages, attachments and activities to the surviving one.

Does the oldest record always survive a merge?

The documentation says the first created record takes priority. The 19.0 source ranks records by a confidence order first (not lost, opportunity before lead, later stage, higher probability) and uses the newer ID only as the last tie-break.