---
title: Integrations
summary: 'A configured connection between your PBX and an external service: Microsoft 365 for user sync, Odoo for ERP-side SIP provisioning, Teams via SBC for Direct Routing, AI voice agents, badge systems.'
section: features
tags:
  - crud
  - telephony
  - integrations
  - external-services
updated: '2026-09-03'
related_forms:
  - microsoft_365_integration
  - odoo_integration
  - microsoft_teams_integration
  - profile_guesser_integration
  - famulor_integration
  - ai_realtime_integration
  - dsk_integration
  - tapi_integration
  - salary_lu_integration
  - google_workspace_calendar_integration
---

> An **integration** is a configured connection between your PBX and an external service. It is mostly infrastructural plumbing and rarely affects inbound callers directly.

## Overview

This page covers **PBX-level** integrations only. Partner organizations have a separate,
unrelated Odoo CRM feature in the partner portal, which is not configured here and does not
appear in the table below.

Each integration has a **type** that sets which fields it needs and what it does. The type is chosen at creation and cannot be changed afterwards, so to switch you delete and recreate. Most types can be added more than once to connect to several instances, but TAPI, Famulor, and AI Realtime are limited to one per tenant. Each type links to its own guide below.

| Type | Connects to | Primary use |
|---|---|---|
| [**Microsoft 365**](microsoft_365_integration.md) | Microsoft Entra ID + Graph | Sync users (via SCIM) and contacts both directions. |
| [**Odoo**](odoo_integration.md) | Odoo ERP instance | Push PBX SIP credentials into Odoo's VoIP module. Not the same as partner-level Odoo CRM. |
| [**Microsoft Teams**](microsoft_teams_integration.md) | Teams via SBC (Direct Routing) | Let Teams users place/receive calls through your PBX. |
| [**Call popup for CRMs**](profile_guesser_integration.md) | External caller-lookup API | Surface incoming-caller name and company on the answering phone. |
| [**Famulor**](famulor_integration.md) | Famulor AI voice agent API | Powers [Famulor agents](famulor_agents.md). |
| [**AI realtime**](ai_realtime_integration.md) | OpenAI realtime voice API | Powers [Smart assistants](smart_assistants.md). |
| [**DSK**](dsk_integration.md) | DSK badge-reader / time-attendance | Sync employee badge events into [Tempus](../tempus/). |
| [**TAPI**](tapi_integration.md) | TAPI desktop CTI bridge | Click-to-dial with Windows TAPI applications. |
| [**Salary.lu**](salary_lu_integration.md) | Salary.lu HR system | Push Tempus time records to Salary.lu for payroll. |
| [**Google Workspace**](google_workspace_calendar_integration.md) | Google Workspace calendars and contacts | Set a [Tempus](../tempus/) meeting status from real meetings, and put approved absences on users' calendars. |

## See also

- [Users](users.md) - the main entity provisioned via M365 integrations.
- [Smart assistants](smart_assistants.md), [Famulor agents](famulor_agents.md) - features that depend on AI integrations.
- [PBX settings](pbxes.md) - the tenant that owns each integration.

```yaml fields
type:
  label: Type
  tab: General
  hint: 'The service to connect. Cannot be changed later.'
is_active:
  label: Active
  tab: General
  hint: 'Turns the integration on or off without deleting it.'
microsoft_push_notifications_to_teams:
  label: 'Microsoft Teams call notifications'
  tab: General
  hint: "Shows incoming and missed calls in each user's Teams activity feed."
  when: 'Type is Microsoft'
microsoft_users_sync:
  label: 'Import users from Microsoft'
  tab: General
  hint: 'Creates and updates users from Microsoft Entra ID.'
  when: 'Type is Microsoft'
microsoft_contacts_sync:
  label: 'Send contacts to Microsoft'
  tab: General
  hint: 'Adds users marked "show in address book" to each user''s Outlook contacts.'
  when: 'Type is Microsoft'
microsoft_user_contact_sync:
  label: 'Import contacts from Microsoft'
  tab: General
  hint: "Brings each user's Outlook contacts into the PBX."
  when: 'Type is Microsoft'
microsoft_calendar_enabled:
  label: 'Outlook calendar'
  tab: General
  hint: 'Puts approved absences on Outlook calendars and sets the meeting status from Outlook meetings. Needs its own authorization.'
  when: 'Type is Microsoft'
serverUrl:
  label: 'Odoo URL'
  tab: Odoo
  hint: 'Your Odoo address, e.g. `https://mycompany.odoo.com`.'
  when: 'Type is Odoo'
dbName:
  label: 'Odoo database'
  tab: Odoo
  hint: 'The Odoo database to connect to.'
  when: 'Type is Odoo'
login:
  label: 'Odoo username'
  tab: Odoo
  hint: 'The Odoo user the API calls run as.'
  when: 'Type is Odoo'
apiKey:
  label: 'Odoo API key'
  tab: Odoo
  hint: 'Generate it in Odoo under your user preferences. Not your password.'
  when: 'Type is Odoo'
sync_sip_configurations_to_odoo_voip:
  label: 'Sync SIP connection configurations to Odoo for active users?'
  tab: Odoo
  hint: 'Installs the Odoo VoIP module and sends SIP settings for the users activated on the Users tab only.'
  when: 'Type is Odoo'
odoo_voip_websocket:
  label: 'Provider WebSocket'
  tab: Odoo
  hint: 'Generated. Odoo VoIP uses it to reach the PBX.'
  when: 'Type is Odoo'
odoo_pbx_dns:
  label: 'Provider PBX server IP'
  tab: Odoo
  hint: 'Generated from the PBX server.'
  when: 'Type is Odoo'
profile_guesser_url:
  label: 'Lookup URL'
  tab: 'Call popup for CRMs'
  hint: 'A POST endpoint that accepts JSON with a `phone_numbers` array.'
  when: 'Type is Call popup for CRMs'
profile_guesser_access_token:
  label: 'API key'
  tab: 'Call popup for CRMs'
  hint: 'Sent with each request to the endpoint above.'
  when: 'Type is Call popup for CRMs'
teams_sbc_host:
  label: 'Teams SBC host'
  tab: 'Microsoft Teams'
  hint: 'Hostname or IP of the Session Border Controller used for Teams Direct Routing.'
  when: 'Type is Microsoft Teams Direct Routing'
teams_sbc_port:
  label: 'Teams SBC port'
  tab: 'Microsoft Teams'
  hint: 'SIP port on the SBC. Usually 5060.'
  when: 'Type is Microsoft Teams Direct Routing'
famulor_strategy:
  label: 'API key strategy'
  tab: Famulor
  hint: 'Mixvoip uses our shared Famulor account. Customer uses your own key.'
  when: 'Type is Famulor (AI Integration)'
famulor_api_key:
  label: 'Famulor API key'
  tab: Famulor
  hint: 'From your Famulor dashboard.'
  when: 'API key strategy is Customer'
dsk_base_url:
  label: 'DSK base URL'
  tab: DSK
  hint: 'Include the versioned API root if your instance has one, e.g. `https://dsk.example.com/API/dsknet/v2`.'
  when: 'Type is DSK (Time & Attendance)'
dsk_api_user:
  label: 'DSK API user'
  tab: DSK
  hint: 'The DSK account used for API access.'
  when: 'Type is DSK (Time & Attendance)'
dsk_api_password:
  label: 'DSK API password'
  tab: DSK
  hint: 'Password of the DSK API user.'
  when: 'Type is DSK (Time & Attendance)'
dsk_bearer_token:
  label: 'DSK bearer token'
  tab: DSK
  hint: 'Issued by DSK on save and refreshed automatically.'
  when: 'Type is DSK (Time & Attendance)'
token:
  label: 'Salary.lu API token'
  tab: Salary.lu
  hint: 'Stored encrypted and never shown again. Leave blank to keep the saved one.'
  when: 'Type is Salary.lu'
enable_custom_rules:
  label: 'Enable custom rules'
  tab: Salary.lu
  hint: 'Adds extra fields to each Salary.lu request.'
  when: 'Type is Salary.lu'
google_calendar_client_id_display:
  tab: General
  label: 'Client ID'
  hint: 'Give this to a Google Workspace super administrator to authorize domain-wide delegation.'
  when: 'Type is Google Workspace'
google_calendar_permissions:
  tab: General
  label: 'Permissions requested'
  hint: 'What is asked of Google for the services that are switched on, one row per permission.'
  when: 'Type is Google Workspace'
google_calendar_scopes_copy:
  tab: General
  label: 'Raw scope string'
  hint: 'The same permissions as one line, to paste into the Google Admin console by hand.'
  when: 'Type is Google Workspace'
google_calendar_allowed_domains:
  tab: General
  label: 'Workspace domains'
  hint: 'Only users with an email in these domains are covered. One domain per row, without "@". Include secondary domains.'
  when: 'Type is Google Workspace'
google_calendar_impersonation_subject:
  tab: General
  label: 'Test user'
  hint: 'Any account in the domains above. Used only to check the authorization; nothing is written to it.'
  when: 'Type is Google Workspace'
google_calendar_target:
  tab: Calendar
  label: 'Create absence events in'
  hint: 'A separate calendar users can hide, or their main calendar for real out-of-office behavior.'
  when: 'Type is Google Workspace'
google_calendar_display_name:
  tab: Calendar
  label: 'Calendar name'
  hint: 'Applies to calendars created from now on. Existing calendars keep their name.'
  when: 'Type is Google Workspace, writing to a separate calendar'
google_calendar_sync_enabled:
  label: 'Enable calendar sync'
  tab: Calendar
  hint: 'Off keeps the connection but stops meeting status and absence events. Contacts are not affected.'
google_contacts_sync_enabled:
  label: 'Enable contact sync'
  tab: Contacts
  hint: 'Adds the contacts permissions, so a super administrator must authorize again before anything syncs.'
google_contacts_push:
  label: 'Send contacts to Google'
  tab: Contacts
  hint: 'Adds the contacts each user can see here to their Google Contacts, under the label below.'
google_contacts_fetch:
  label: 'Import contacts from Google'
  tab: Contacts
  hint: "Imports each user's own Google contacts, which stay private to that user and are edited in Google only."
google_contacts_push_private:
  label: 'Include private contacts'
  tab: Contacts
  hint: "Also sends each user's private contacts."
  when: 'Type is Google Workspace, pushing contacts'
google_contacts_group_name:
  label: 'Google label'
  tab: Contacts
  hint: 'Contacts we add are filed under this label. Renaming it renames the label in every account.'
google_contacts_import_shared:
  label: 'Include Workspace shared contacts'
  tab: Contacts
  hint: 'Reads the Workspace shared directory, which most Workspaces never set up, and needs one more Google permission.'
name:
  label: Name
  hint: 'Identifies the integration in lists and logs.'
api_key:
  hint: 'Send it as the Bearer token. Treat it like a password.'
api_key_scopes:
  label: Scopes
  hint: 'What this key may do. Grant only what is needed.'
api_key_expires_at:
  label: 'Expiration date'
  hint: 'Empty means the key never expires.'
rate_limit:
  hint: 'Requests per minute, set by your plan.'
last_used_at:
  hint: 'Last time this key called the API.'
created_at:
  hint: 'When this key was created.'
```
