Skip to content
Contactzilla
Back to Blog

How to Deduplicate Contacts Before They Reach Staff Phones (Entra ID, CRM and CSV)

Head shot portrait of Tom Holder, CEO and Founder and Contactzilla

Tom Holder

CEO/Founder @ COntactzilla

Blog header reading 'Stop Contact Duplicates before they reach staff phones' in white on orange, with 'Duplicates' shown in double vision, beside two contact cards for the same man, Daniel Morgan and Dan Morgan, with Dan pointing at his own duplicate
Short answer: Give every contact a permanent ID from the system it comes from, match each import on that ID rather than on names, and let each source delete only the contacts it owns. Then run a duplicate report to catch what IDs can't, like a Dan and a Daniel, before the list syncs to anyone's phone.

When one company contact list feeds every phone in the organisation, a duplicate is no longer a tidy-up job in one database. It's two entries for the same person on every iPhone and Android phone, and staff have no way of knowing which number is right. Phones can't fix it for you: whatever sits in the shared list syncs to every device.

The approach has five parts. We use Contactzilla as the worked example, where all of this happens in the shared address book before contacts reach phones through your MDM, but the same principles apply to any tool that feeds a company contact list to phones:

  1. Give every contact a permanent source ID, such as the Entra object ID or a CRM record ID.
  2. Match directory contacts on that ID, and decide whether name matching helps or hurts.
  3. Choose Skip, Replace or Merge for each recurring import.
  4. Remove leavers from one source without touching contacts that came from anywhere else.
  5. Clean up what's already there with a duplicate report, before it syncs out.
Diagram: contacts from Microsoft Entra ID, a CRM or site spreadsheet and hand-added entries pass Contactzilla's matching rules and duplicate report, so each person appears once on every staff phone, and leavers labelled source:entra are removed while other contacts stay
How contact deduplication works before contacts reach staff phones: Entra ID, CRM and spreadsheet contacts are matched on their own IDs, the duplicate report catches the rest, and a label-scoped delete removes leavers from one source only.

Why duplicate contacts on staff phones cause more trouble than duplicates in a CRM

A duplicate in a CRM is an annoyance for whoever runs the reports. A duplicate in a contact list that syncs to company phones is copied to every device, and it turns up at the moment someone is trying to call a colleague. With two entries for one site manager, each with a different mobile, half the calls go to an old number. A contractor merged into an employee means caller ID shows the wrong name. A leaver who is still in the list keeps ringing through as a colleague long after they've gone.

Staff can't fix this on their own phones. If the company contacts arrive as a read-only account, as they often do on managed phones, edits made on the phone don't stick. Even where staff can merge or link cards, iOS only tidies the view on that one phone; the next person still sees both entries. The fix has to happen in the shared list, before it syncs.

Two screenshots of the Contacts app on an iPhone 15: the Staff Directory list with Dan Morgan and Daniel Morgan of Skyline Development Group boxed side by side, both with the same headshot and a padlock marking them read-only, and a search for Morga returning the same two contacts
Duplicate company contacts on an iPhone 15 running iOS 27: one person entered twice as Dan Morgan and Daniel Morgan shows up side by side in the read-only Staff Directory list and again in search, and every phone the address book syncs to sees the same pair until it's fixed in the shared list.

Where duplicate contacts come from when you combine Entra ID, a CRM and spreadsheets

Most duplicates in a shared company list come from the same handful of causes, and only some of them look like duplicates at first glance:

  • The same person from two sources. An employee arrives from Microsoft Entra ID and again from a project spreadsheet someone imported last year.
  • Name variants. Dan Morgan on a site sign-in sheet, Daniel Morgan in Entra. A married name, or a typo in an email address.
  • Phone numbers written differently. In our tests, 416-555-1113 and +1 416 555 1113 were treated as different numbers: spaces and punctuation are ignored, but a missing country code is not.
  • A rehire on a new account. Someone who leaves and comes back on a brand-new Entra account gets a new object ID, so to anything matching on the ID they are a new person.
  • The same person in two address books. Matching happens inside one address book. If two books both reach a phone and both contain the same person, the phone shows them twice.

The opposite problem matters just as much: two different people treated as one. Name-based matching can merge an IT admin's separate admin account into their everyday account, or two staff with the same name who both list a shared site office number.

Key definitions: contact deduplication, unique IDs and matching rules

Contact deduplication: finding contact records that describe the same person and keeping one, either by stopping the second copy at import or by merging copies that already exist.

Unique identifier (source ID): a value that belongs to one record in the source system and never changes, such as the object ID Microsoft Entra ID gives every user, a Salesforce record ID or a contact ID column in a spreadsheet.

Matching rule: the test an address book uses to decide that an incoming contact is someone it already has. In Contactzilla there are three per address book: custom unique fields, first name + last name + email, and first name + last name + phone.

Import label: a label added to every contact one import brings in (for example source:entra), so you can tell later which contacts that import owns.

Step 1: Give every Entra ID, CRM and CSV contact a permanent source ID

Map each source's own ID to a hidden unique field when you set up the import. Names, emails and job titles change; the ID doesn't. The Microsoft Graph user resource describes a user's id as "the unique identifier for the user" and marks it read-only, which is exactly what you want to match on. In Contactzilla the ID goes into a Hidden Custom Unique field: admins see it in the dashboard, and it never reaches the phone. For a spreadsheet with no ID, add one (a simple Contact ID column is enough) before the first import, not after.

Contactzilla Staff Directory contact Amina Okafor showing her Microsoft Entra ID in a Hidden Custom Unique field, which every Entra import uses to match her
An Entra ID contact in Contactzilla with the Microsoft Entra object ID stored as a hidden unique field: every import matches her on that ID, whatever happens to her name or email.

The payoff shows up the first time someone changes their name. In a re-import test, Priya Nair became Priya Nair-Collins with a new email address. Because the import matched on her contact ID, Contactzilla updated her existing contact instead of adding a second Priya.

Contactzilla contact Priya Nair-Collins after a re-import, showing her new name and email with the same Contact ID SCT-1002, and only one Priya in the Project Cascade Tower contact list
Deduplicating on a contact ID: after a name change, the re-import updated the existing contact (same ID, SCT-1002) rather than creating a duplicate.
Tip 💡 Setting up the Entra side for the first time? Our video Sync Microsoft Global Address List to iPhone & Android walks through the import, including mapping the Entra ID to a hidden unique field.

Step 2: Match Entra ID contacts on the ID, not on names

For an address book fed from Microsoft Entra ID, switch the name-based matching rules off and keep Match using custom unique fields. That's the setting we recommend to Entra customers, and our tests showed why: with the name rules on, a row with a new Entra ID but the same name and mobile as an existing person was skipped, so the second account never got in. Two genuinely different people with the same name and the same site office number fared the same way. And a row whose ID pointed at one contact while its name and phone pointed at another failed outright, because Contactzilla refuses to guess.

Contactzilla Address Book Settings Duplicates tab for the Staff Directory, with Match using custom unique fields on and the name and email and name and phone rules switched off
Duplicate matching for an Entra ID address book: match on custom unique fields only, so every Entra account is exactly one contact.

The rules decide what counts as a duplicate, so Contactzilla won't let you switch one on while two contacts already break it. With two same-name staff sharing a number in the book, turning the name and phone rule back on was refused, with a button to open the duplicate report. That's a useful signal: if real namesakes share a number in your organisation, name and phone matching can't work for that book at all.

Contactzilla Cannot save duplicate matching message after switching on the name and phone rule, with one clashing case and an Open Find duplicates button
Contactzilla blocks a duplicate matching rule that existing contacts would break, and points you to the Find Duplicates report to sort them out first.

Name matching still earns its place where there's no ID to match on, such as a book built only from hand-made spreadsheets. In that case keep the name rules on, and keep phone formats consistent across sources, since a missing +1 is enough to make the same number look different.

Matching ruleCatchesGoes wrong when
Custom unique field (source ID)The same record every time, through name, email and job changesThe source has no ID, or a rehire comes back on a new account
First name + last name + emailThe same person from two sources that share an emailTwo accounts for one person share an email; email isn't filled in
First name + last name + phoneThe same person from two sources that share a mobileNamesakes share a desk or site number; numbers are written differently

The exact switches and the save check are covered in our help article How to Set Duplicate Matching Rules for an Address Book.

Step 3: Choose Skip, Replace or Merge for each recurring import

Matching decides that a contact already exists; the import's duplicate setting decides what happens next. Skip leaves the existing contact's details alone, though it can still add the import's labels. Replace overwrites it with the incoming row, so the source stays in charge, but anything added by hand in Contactzilla is lost: in our tests a photo added to a contact disappeared on the next Entra import with Replace. Merge keeps existing data and adds what's new, which keeps that photo but can stack values, so a changed mobile sits alongside the old one rather than replacing it.

OptionBest forWatch out for
SkipOne-off imports that shouldn't change anyone already in the bookChanges in the source never arrive
ReplaceA directory or CRM that owns the data (Entra ID, Google Workspace, Salesforce)Photos and edits made in Contactzilla are overwritten
MergeTopping up contacts that people also edit by handOld and new numbers both stay, so check changed contacts

Replace is the usual choice for a directory feed, and the import summary tells you what it did. In a weekly site list re-import, three people were updated (a name change, a new mobile and a promotion), two who had left the list were deleted, and the 15 whose rows hadn't changed were ignored.

Contactzilla Import Complete screen after a re-import of the Project Cascade Tower site list, showing 20 records, 3 replaced, 2 deleted and 15 ignored
A CSV re-import without duplicates in Contactzilla: three contacts replaced, two leavers deleted and 15 unchanged rows ignored, with every existing person matched on their contact ID.

Our help article How to Re-import Contacts Without Creating Duplicates walks through each option on the CSV, Entra ID, Google Workspace and Salesforce importers.

Step 4: Remove leavers from Entra ID without deleting contacts from other sources

Replace has a second switch, Delete any contacts not replaced, which removes anyone in the address book who wasn't in the latest import. That's how leavers drop off every phone automatically. In a book that holds only one import, it's exactly right. In a book that mixes sources, it's dangerous: an Entra import would also delete the subcontractors from your site spreadsheet and the gate office number someone added by hand, because none of them are in Entra.

The fix is to label the import. When an import is set up with Label all contacts for this import (for example source:entra), the switch on its duplicates step becomes Delete any contacts with label source:entra that are not replaced. Contactzilla's own explanation on that screen spells out the scope: after the import finishes, contacts with the source:entra label that don't appear in the incoming data are deleted, and everything else is left alone.

Contactzilla Microsoft Entra ID import Duplicates step for the Field Team Phones address book, with Replace duplicates selected and Delete any contacts with label source:entra that are not replaced switched on, and the explanation that only source:entra contacts missing from the import are deleted
Removing Entra ID leavers in a mixed address book: with the import labelled source:entra, only contacts carrying that label are deleted when they disappear from Entra.
Important: the import label is set when the import is created and can't be changed afterwards. If an existing Entra import has no label, create a new import with one rather than switching on the plain delete in a mixed book.

Disabled accounts are a separate case. Entra marks them with accountEnabled set to false, and the importer's deletion handling can use that column to drop them. In our demo tenant, four disabled accounts were left out of the very first import for that reason.

Step 5: Find and merge duplicate contacts already in the address book

Matching rules stop new duplicates; they don't remove the ones you already have, and they can't catch Dan and Daniel. Run a duplicate report on the address book before you deploy it, and again after any big import. Contactzilla's Find Duplicates report runs seven checks in three groups (strict identifiers, names including common short forms, and shared email or phone with a partly matching name), and lists each contact with every potential match it found.

Contactzilla duplicate report for the Staff Directory with Daniel Morgan selected, his potential match Dan Morgan flagged by Similar names (synonyms), and Merge into selected chosen from the match's menu
Finding duplicate contacts that name rules miss: Contactzilla's Find Duplicates report pairs Daniel Morgan from Entra ID with Dan Morgan, added by hand from a site sign-in sheet, ready to merge into one contact before it reaches staff phones.

Merge into selected keeps the contact you selected, with its name, photo, labels and Entra ID, and adds what the duplicate had that it didn't: its phone numbers, email addresses, labels and bio, without doubling a number both already share. Not a duplicate is just as important: Samuel King in facilities and Samuel King from a scaffolding subcontractor are different people, and once marked they aren't suggested again, under any check.

Contactzilla duplicate report for the Staff Directory comparing Samuel King from Entra ID with Samuel King from Northline Scaffolding, flagged by Same first and last name, with Not a duplicate chosen from the menu
Not every match is a duplicate contact: marking the two Samuel Kings as Not a duplicate keeps both on staff phones and stops the pair coming back.

The full review, merge and dismiss steps are in our help article How to Find and Merge Duplicate Contacts in an Address Book.

Tip 💡 Delivering the cleaned-up list as a locked company account? Our guide to making company contacts read-only on iPhone covers what staff can and can't change once it's on their phones.

Once the list is clean, it stays clean the same way it got there: one ID per person, one owner per contact, and a quick report after any big import.

Next steps

Frequently Asked Questions

Can staff merge duplicate company contacts on their own iPhone?

Not in a way that helps anyone else. Apple lets people link contact cards for the same person so they show once in All Contacts, but that only changes one phone. On a read-only company account, edits made on the phone don't stick either, so fix duplicates in the shared address book instead.

Should I match Microsoft Entra ID contacts on email instead of the object ID?

No. Email addresses change when people change names or domains, and some accounts have no email at all; in our demo tenant only a handful did. The Entra object ID is read-only and stays with the account, so a rename, a new email or a new job title still updates the same contact.

What happens to a contact when someone is rehired in Entra ID?

If they come back on a brand-new account, it has a new object ID, so the import adds them as a new contact. Their old contact goes when the old account is deleted or disabled, through the label-scoped delete or deletion handling. Run the duplicate report afterwards to catch any overlap.

Does Not a duplicate stop the same pair being flagged again?

Yes. Once you mark a pair as Not a duplicate, the report stops suggesting it, across every check. It doesn't change the matching rules, though: two namesakes sharing a number still stop the name and phone rule being switched on.

Can the same person appear twice on a phone from two address books?

Yes. Matching rules work inside one address book, so a person in two books that both reach the same phone appears twice. Keep each person in one book, or use labels and selective read-only sync to send different groups different contacts from a single book.

Does Replace or Merge keep a contact's photo?

Merge keeps it. Replace overwrites the contact with the incoming row, so a photo or note added by hand in Contactzilla is lost at the next import. If your source supplies photos, as Microsoft Entra ID can, Replace is fine; if people add them by hand, use Merge.

Ready to supercharge your contact book?

Grow sales and stay organized with better contact management for your team.

No credit card required • 14-day free trial

Contactzilla contact management dashboard on a laptop