How do I connect 3CX with HubSpot for call logging?
Here's a verified breakdown of the setup process and key requirements, based on 3CX's own documentation (last updated November 2025).
Setup: How to connect 3CX to HubSpot
The integration is server-side and uses OAuth2. Here are the steps:
-
Create a HubSpot Developer App -- log into your HubSpot Developer Account, create a new app (or a "legacy app" if you're on the new developer platform), and set it to Public.
-
Configure OAuth2 settings -- in the app's Auth tab, set the Redirect URL to your 3CX Admin Console URL with
/api/oauth2crmappended. Add the following scopes:crm.objects.contacts.read,crm.objects.contacts.write,crm.objects.companies.read,crm.objects.owners.read, andtimeline. -
Connect in 3CX Admin Console -- go to Integrations > CRM, select HubSpot, enter the Client ID and Client Secret from your developer app, save, then click Authorise. Select your CRM account (not the developer account) and click "Connect app".
-
Verify the Refresh Token is auto-populated in the 3CX Admin Console.
Critical requirements for call logging to work
These are the most common reasons calls fail to log, based on recent community reports:
-
Phone number format -- numbers must be stored in HubSpot in E164 format, and your SIP trunk must also present the caller's number in E164 format so they match. If they don't align, you can use Caller ID Reformatting in 3CX to adjust before the CRM lookup runs.
-
Matching strategy -- in 3CX, go to System > Phonebook > Options and set matching to "Match exactly".
-
Agent email alignment -- to report calls and chats to HubSpot, the email address on the 3CX extension must match a HubSpot user's email. This is how 3CX maps the agent to the HubSpot user for activity logging.
-
User permissions -- each 3CX user must also be a licensed HubSpot user with the integration permission enabled. HubSpot will only log calls against users that are correctly connected.
How it works once live
When a call starts (inbound or outbound), 3CX searches HubSpot by phone number. If a match is found, the contact name is shown in the 3CX Web Client and the contact URL pops up in the browser when the agent answers. When the call ends, 3CX logs the call as a HubSpot activity against that contact.
If no contact is found, the agent can create one from the 3CX Web Client -- a new contact is then created in HubSpot with the details provided.
Known 'gotchas' to flag
- Calls will only log if the contact lookup succeeds. If the contact exists in HubSpot but not in 3CX's local phonebook, the CRM link won't show in the dialer -- and the call may not log.
- Outbound call logging issues are often caused by the contact not being resolved at dial time -- the contact card icon should appear in the dialer; if it doesn't, the number format is likely the problem.
- Intermittent logging is almost always a number format mismatch or a missing/mismatched agent email.
The official 3CX documentation is at https://www.3cx.com/docs/hubspot-pbx-crm-integration/ if you want the full reference.
For technical guidance on how to test lookups and perform the connection, you can find additional guidance here: https://www.3cx.com/docs/crm-integration/