See it in action
Scan, review the duplicate groups, pick the contact to keep and merge — safely, end to end.
The Community answer to duplicate contacts
Duplicate contacts come from imports, web leads and typos. This app finds them with smart, normalized matching, lets you review them in groups, and merges safely — reusing Odoo's own merge engine so nothing is lost.
Detection that actually finds them
Email & phone matching
Normalized comparison — case and formatting are ignored, so "+1 (415) 555-0100" and "415.555.0100" are recognised as the same number.
Fuzzy name matching
Legal suffixes dropped, words sorted, similarity scored — "Acme Corp", "ACME Corporation Ltd" and "John Smith" vs "Smith, John" all match.
Tax ID matching
Match on VAT / tax ID with punctuation and case stripped, catching the same registration entered differently.
Smart false-positive guard
A company and its own contacts share details but aren't duplicates — they're never grouped, so your review list stays clean.
Suggested master
The most complete contact is suggested to keep automatically; override it per group with one click before merging.
Safe merge engine
Merging reuses Odoo's built-in engine: every order, invoice, message and link is re-pointed to the survivor before the duplicates go.
Review workflow
Pending, Merged, Ignored and Error states, per-group confidence, Merge All, and Reset to retry — a real workflow, not a blind batch.
Scheduled scans
An optional weekly scan surfaces duplicates as they appear. Detection is automatic; merging always stays your call.
Multi-company
Runs and groups are company-scoped via record rules, keeping each company's cleanup separate.
Up and running in four steps
New scan
Choose what to match on and the scope.
Scan
Duplicates are grouped with a suggested master.
Review
Merge the real ones, ignore the rest.
Stay clean
Schedule scans to catch new duplicates.
Real screens, real data
Every screenshot below is the actual app running on Odoo 19 — no mockups.
Configure & scan
Tick the criteria to match on, set the name similarity and scope, then Scan. The counts of groups and removable duplicates fill in instantly.
Review every group
Each row shows what matched, the contacts involved, the suggested master and a confidence score — Merge or Ignore right from the list.
Pick the master, merge safely
Open a group to compare the contacts side by side, choose which one survives, and merge with Odoo's own engine.
Keep a history of scans
Every run is saved with its group and duplicate counts, so you can track how clean your database stays over time.
Clean up your contacts — without the risk
Install in seconds. No Enterprise, no external libraries, no lock-in. Works on Odoo 19 Community and Enterprise.
Full manual included. The app ships with a complete in-app documentation page (Apps > this module > Documentation) covering setup, matching, reviewing, safe merging and FAQs. Questions? bambooforge.labs@gmail.com
BambooForge Partner Dedupe
Keep your contact database clean. This app scans your contacts for duplicates by email, phone, tax ID and fuzzy name matching, groups the matches for review, suggests which record to keep, and merges them safely using Odoo's own merge engine — so every link, document and transaction is preserved. No Enterprise needed.
This page is the complete manual. Follow it top to bottom and you can install, run your first scan, review and merge duplicates, schedule scans and fix the common issues without contacting support.
Overview
Duplicate contacts creep into every database: imports, web leads, typos, the same company entered twice. This app finds them and helps you clean up:
- Scan your contacts on any combination of email, phone/mobile, tax ID and name, with configurable fuzzy name matching.
- Review the results as duplicate groups, each with a suggested master, a confidence score and the matched value.
- Merge safely — the actual merge is performed by Odoo's built-in merge engine, which re-points every related record (orders, invoices, messages…) to the surviving contact before deleting the duplicates.
- Ignore false positives, re-scan any time, and keep a history of runs.
- Schedule scans to catch duplicates as they appear.
It deliberately reuses the platform's merge logic, so merging is exactly as safe as Odoo's own "Merge Contacts" tool — with far better detection and a review workflow on top.
Requirements
- Odoo 17.0.
- The Contacts app (contacts). Installing this app pulls it in automatically.
No Enterprise modules and no external Python libraries are required.
Installation
- Copy bambooforge_partner_dedupe into your addons path.
- Update the apps list (Apps > Update Apps List).
- Search for Dedupe and click Install.
A new top-level Dedupe app appears, and a Find Duplicates entry is added under the Contacts app.
Quick start
- Open Dedupe > Scans and click New.
- Choose what to Match On — any combination of Email, Phone/Mobile, Tax ID and Name. For names, set the Name Similarity (0–1): 1.0 means identical after normalization, lower values catch typos and word-order differences.
- Pick a Scope (all contacts, companies only, or individuals) and whether to include archived contacts.
- Click Scan.
The run switches to Scanned and the Groups and Duplicates stat buttons fill in. Open the Duplicate Groups tab to review.
How matching works
Each criterion normalizes the value before comparing, so cosmetic differences do not hide a duplicate:
- Email — trimmed and lower-cased.
- Phone/Mobile — reduced to digits and compared on the last nine, so +1 (415) 555-0100 and 415.555.0100 match.
- Tax ID — stripped of punctuation and upper-cased.
- Name — lower-cased, punctuation removed, legal-form suffixes (Ltd, Inc, GmbH, Corp…) dropped, words sorted — then compared with a similarity ratio against the Name Similarity threshold, so Acme Corp and ACME Corporation Ltd match, as do John Smith and Smith, John.
Contacts that belong to the same commercial entity (a company and its own child contacts) are never grouped as duplicates, avoiding the most common false positive.
Reviewing and merging
In the Duplicate Groups list each row shows what was matched, the matched value, the contacts involved, the suggested master to keep, a confidence score and a status. From there you can:
- Merge a group — the master is kept and the other contacts are merged into it. Open a group first if you want to change which contact is the master.
- Ignore a group you have judged to be distinct.
- Reset an ignored or errored group back to pending.
- Merge All Pending from the run to process every group at once (with a confirmation).
Merging uses Odoo's engine, which re-points foreign keys and reference fields, merges values into the master, logs the operation and deletes the source contacts. For safety the engine merges up to three contacts at a time; larger groups are merged in several automatic passes.
The suggested master
For each group the app suggests keeping the most complete contact — the one with the most filled-in fields (email, phone, address, tax ID…), breaking ties in favour of the oldest record. You can override this on the group before merging.
Scheduling scans
A scheduled action Dedupe: Scheduled Duplicate Scan ships disabled. Enable it under Settings > Technical > Scheduled Actions to create a fresh scan on a schedule (weekly by default) so duplicates are surfaced as they appear. The scan only detects; merging always stays a manual, reviewed action.
Frequently asked questions
- Will merging lose any data?
- No. The merge re-points every related record (orders, invoices, activities, messages, etc.) to the surviving contact before the duplicates are removed — this is Odoo's own merge behaviour.
- A merge shows an Error status.
- The engine refuses some merges for safety — for example contacts in a parent/child relationship, or contacts linked to more than one user. The reason is stored on the group; fix the underlying issue and Reset to retry.
- Two different companies share a tax ID and were grouped — is that wrong?
- That is a genuine match worth reviewing. If they are truly distinct, Ignore the group. Only contacts of the same company are auto-excluded.
- Can I tune how aggressive name matching is?
- Yes. Lower the Name Similarity to catch more typos (at the risk of more false positives), or raise it toward 1.0 to require near-identical names.
- Does it work with multiple companies?
- Yes. Runs and groups are company-scoped via record rules.
Support
Questions or ideas: bambooforge.labs@gmail.com.
Upgrading & version compatibility
This build targets Odoo 19.0. Each Odoo major series (17.0, 18.0, 19.0) has its own dedicated build of this module — always install the build that matches your Odoo version. Mixing a build with a different Odoo series is not supported.
Patch upgrades (same series, e.g. 19.0.1.0.0 → later)
Back up your database and filestore first.
Replace the module folder with the newer build.
Restart Odoo with the module updated:
./odoo-bin -c your.conf -u bambooforge_partner_dedupe -d your_db
Odoo applies any schema/data changes automatically. Your existing records and configuration are preserved.
Cross-version migration (e.g. Odoo 17 → 18)
Upgrading Odoo itself is a database migration handled by Odoo's standard upgrade tooling. When you migrate the database to the next Odoo series, install the matching build of this module for that series. Data created by this module carries over with the database migration.
After any upgrade the module's scheduled actions resume on their normal cadence — no manual re-activation is required.
Uninstallation
You can remove this module at any time from Apps → (this module) → Uninstall, or from the command line. Uninstalling is clean and reversible by reinstalling — but note what is and is not deleted.
What is removed
- The module's own tables and every record in them (2 models, prefixed partner.*) — this is the data this module created.
- The menus, actions, views and reports this module installed.
- Its scheduled actions (cron jobs) — they stop immediately on uninstall.
- The security groups this module defined (user assignments to them are dropped).
What is preserved
- Your standard Odoo data (partners, products, sales, invoices, inventory moves) is not deleted — this module only reads and annotates it; the underlying records stay.
- Attachments and chatter messages on standard records are kept.
As always, take a database backup before uninstalling in production.
Changelog
19.0.1.0.0
Current release for Odoo 19.0. This build includes:
- Find duplicate contacts with fuzzy matching on email, phone, VAT and name, review them in groups, and merge safely using Odoo's own merge engine.
- The Community answer to data cleaning.
Feature additions and fixes ship as new builds on the Odoo Apps store; this page and the module's version reflect the current published release. Always keep the build matched to your Odoo series (see Upgrading & version compatibility).
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module