Open the consent URL
Use the link below to start the Microsoft admin consent flow in your tenant.
Grant iOS app consentFor IT Techs
Everything you need to deploy Enterprise Contacts, from tenant consent to live caller ID.
Step 1 of 2
A Global Administrator grants consent for the iOS app. This approves delegated, read-only access to Microsoft Graph for all users in the tenant.
Use the link below to start the Microsoft admin consent flow in your tenant.
Grant iOS app consentSign in with a Microsoft 365 account that holds the Global Administrator role. A standard Microsoft permissions dialog lists the six delegated Graph permissions.
Click Accept. Microsoft redirects back to enterprisecontacts.eu confirming tenant consent is registered. Users in the tenant can now sign into the app.
Requirements
Group.Read.All, GroupMember.Read.All, and User.Read.AllPermissions reference
Enterprise Contacts requests six delegated, read-only Microsoft Graph permissions. No write permissions are requested. The app acts on behalf of the signed-in user.
| API / permission name | Type | Description | Admin consent required |
|---|---|---|---|
Contacts.Read | Delegated | Read user contacts | No |
Contacts.Read.Shared | Delegated | Read user and shared contacts | No |
Group.Read.All | Delegated | Read all groups — needed to find source groups | Yes |
GroupMember.Read.All | Delegated | Read group memberships — needed to fetch contacts | Yes |
User.Read | Delegated | Sign in and read user profile | No |
User.Read.All | Delegated | Read all users' full profiles — needed to resolve contact details for group members | Yes |
Delegated permissions only. All six permissions are delegated — the app acts on behalf of the signed-in user and is bounded by that user's own access rights. No application-level permissions are requested.
Step 2 of 2
The web admin at admin.enterprisecontacts.eu lets you create and manage Entra ID source groups without writing JSON by hand.
Open Web AdminRequirements
Web Admin — First use
The web admin is a multitenant enterprise application. A Global Administrator must grant consent once before the tool can be used in your tenant.
Go to admin.enterprisecontacts.eu. You will be redirected to a Microsoft sign-in page.
Sign in with your Microsoft 365 Global Administrator account. On first use, Microsoft presents a permissions dialog for the web admin enterprise application. Click Accept to grant consent for your tenant.
Once signed in, use the web admin to create and manage Entra ID source groups. The web admin handles all JSON formatting, group naming, and ID resolution.
Enter a source name that users will see in the app, and an optional description.
Choose from: Entra ID security group (syncs profile contacts for group members), Shared Exchange mailbox (syncs contacts from a shared mailbox folder), or Personal Exchange contacts (the signed-in user's own contacts folder).
Search Entra groups and Exchange mailboxes by name. The web admin validates the selection — no manual ID lookup required.
The web admin creates an Entra ID security group and writes the source configuration into the group description. Configuration lives entirely in Entra ID — no external database.
Web Admin
Create and manage your Entra ID source groups in the web admin. Handles all JSON formatting, group naming, and ID resolution.
iOS app for users
Users install the app, sign in with their work account, and the right sources appear automatically.
Daily use — Step 3
Membership of each source group controls who sees that contact source in the app. Add individual accounts, security groups, or Microsoft 365 groups.
Go to Entra ID → Groups. Search for the group the web admin created — named with your chosen prefix and the source name you set.
Go to Members → Add members. Add individual accounts, security groups, or Microsoft 365 groups. Nested groups are supported — members of nested groups inherit source access.
Once added, users receive the source automatically the next time they open the app. No per-device profile or MDM policy to deploy.
Remove the user from the source group in Entra ID. Access is revoked and contacts are removed from the device at the next sync cycle.
Tip
Assign a broad existing group — such as an All Employees group — to grant access to most of your organisation at once, without adding individuals one by one.
Daily use — Step 4
No MDM deployment required. Send the App Store link and users sign in with their work account. Configuration applies automatically from group membership.
App Store linkSend the link via email, Teams, or your intranet. No MDM profile, no configuration file, no device enrolment required.
The app is free on the App Store. Users install it and sign in with their Microsoft 365 work account using the standard Microsoft sign-in screen.
The app reads the user's group memberships in Entra ID and discovers the source groups they belong to. Group membership is the configuration — no codes or extra steps for the user.
After the first sync, contacts appear in the native iPhone Contacts app, caller ID, Mail, Messages, and every app that uses the system address book.
First sync timing
The initial sync may take a few minutes depending on contact count. After that, each source has a configurable notification schedule. When it's time to sync, the app notifies the user. The user can also trigger a manual sync at any time from within the app.
Optional
Enterprise Contacts requires no MDM — but if you manage devices with Intune or another MDM, you can distribute and update it silently like any App Store app via Apple Volume Purchasing or the Intune app catalog.
How it works
Users receive the app automatically and only sign in once. MDM changes nothing about how the app works — Entra ID group membership still controls which contact sources appear, and the app functions identically whether deployed via MDM or installed directly from the App Store. Both paths are fully supported.
Pattern
Keeping a rotating on-call number current in every employee's contacts is not something sync timing on iOS can do reliably. Use the PBX instead.
Recommended pattern: Create a Teams Phone call queue or hunt group with a fixed number that routes to whoever is on duty. Put that fixed number in a contact inside a shared Exchange mailbox — for example, "IT On-Call" — and sync that mailbox via Enterprise Contacts. The contact never goes stale because the rotation is managed PBX-side; employees always call the same number while the routing changes behind it.
Troubleshooting
The app has a one-tap diagnostics export on the Settings tab, visible to all users. It answers most "why isn't it syncing" questions without a screen-share.
Have the user open Enterprise Contacts → Settings → Export diagnostics and share the file with you — one tap, then the standard iOS share sheet.
The export is plain text: app, device, and configuration state, per-source sync status, and logs. It contains no contact content and no tokens — the file's own header says so — so it is safe to forward inside your organisation.
If the export does not explain the problem, send it to support@enterprisecontacts.eu. The installId in the file is an anonymous identifier that is only useful when escalating to Enterprise Contacts support — it lets us correlate the report with our telemetry.
How contact sources are defined
Enterprise Contacts uses Entra ID security groups as its configuration layer. Two group types are involved: one config group that names your prefix, and one source group per contact source.
Create a single security group named exactly App_EnterpriseContacts_Config in your Entra ID tenant. The app looks for this group to read your chosen group prefix.
Group name must match exactly: use App_EnterpriseContacts_Config. The lookup is not case-sensitive, but the expected group name is exactly this. The config group does not need any members — its description is all that matters.
Set the group Description to this JSON, replacing Your_Prefix_Here_ with your chosen prefix:
{"groupPrefix":"Your_Prefix_Here_"}Example — if your organisation is Contoso and you want prefix EC_Contoso_:
{"groupPrefix":"EC_Contoso_"}Each contact source visible in the app is backed by one Entra ID security group. The group name must start with your chosen prefix:
Name: {YourPrefix}{SourceLabel}
Example: EC_Contoso_CompanyContactsThe group description must be a valid JSON object. The web admin writes this for you — only hand-edit if creating groups manually in the Azure portal.
| Field | Type | Values | Description |
|---|---|---|---|
name | string | Any | Display name shown in the app. Required. |
description | string | Any | Short subtitle shown when adding the source manually. |
autoLoad | boolean | true / false | true = added automatically on first launch. false = only via the + button. |
deleteable | boolean | true / false | true = user can remove the source from the app. |
type | integer | 0, 1, 2 | 0 = Exchange mailbox, 1 = Entra ID group, 2 = My Contacts. Required. |
primaryId | string | See reference | Mailbox UPN for type 0, Object ID (GUID) for type 1, and me for type 2. Required. |
secondaryId | string | Folder ID | Type 0 only. Exchange contact folder ID. |
Syncs contacts from a shared Exchange mailbox contact folder. Good for curated company address books.
Name: EC_Contoso_SharedMailbox
Description:
{
"name": "Shared Mailbox",
"description": "Reception desk contacts",
"autoLoad": false,
"deleteable": true,
"type": 0,
"primaryId": "reception@contoso.com",
"secondaryId": "<exchange-folder-id>"
}Mailbox read access required. Enterprise Contacts uses delegated permissions — it can only read what the signed-in user is already allowed to access. For type 0, each user must have at least Reviewer permission on the relevant contact folder in Exchange. Grant access via Exchange Admin Center or PowerShell: Add-MailboxFolderPermission.
Syncs the profile contact card for each group member. Good for department or team directories.
Type 1 uses two separate Entra ID groups:
EC_Contoso_CompanyContacts). Members control who can see this source. This group carries the config JSON in its description.primaryId.These are two different groups. A user in the access group sees the source. The contacts they see are the members of the contact group.
── Group 1 — Access group (you create this) ──
Name: EC_Contoso_CompanyContacts
Members: Sales Team, HR Team, ...
Description:
{
"name": "Company Contacts",
"description": "All company contacts",
"autoLoad": true,
"deleteable": false,
"type": 1,
"primaryId": "7e2d4f1a-9b3c-5e6d-7f8a-1b2c3d4e5f6a"
}
── Group 2 — Contact group (existing or new) ──
Name: All-Employees
Object ID: 7e2d4f1a-9b3c-5e6d-7f8a-1b2c3d4e5f6a ← goes in primaryIdSyncs the signed-in user's own personal Exchange contacts folder.
Name: EC_Contoso_MyContacts
Description:
{
"name": "My Contacts",
"description": "Personal Exchange contacts",
"autoLoad": true,
"deleteable": true,
"type": 2,
"primaryId": "me"
}| Type | primaryId value | secondaryId |
|---|---|---|
| 0 — Mailbox | User UPN, e.g. john@contoso.com | Exchange folder ID (required) |
| 1 — Entra ID group | Object ID (GUID) of the contact source group — the group whose members become contacts. Not the access group itself. | Not used — omit |
| 2 — My Contacts | Always me. This tells the app to use the signed-in user's own contacts folder. | Not used — omit |
Hybrid Exchange is not supported. On-premises (hybrid) Exchange mailboxes are not reachable through Microsoft Graph and cannot be used as contact sources. Entra ID group sources (type 1) work regardless of your Exchange configuration.