Before debugging, have this ready:Documentation Index
Fetch the complete documentation index at: https://docs.open.cx/llms.txt
Use this file to discover all available pages before exploring further.
- Connection method — is HubSpot connected with OAuth Public App or Private App (legacy) in Settings → Integrations?
- Session ID — find it in the OpenCX inbox for the conversation in question.
- HubSpot conversation or ticket link — open the exact thread your rep is testing.
Common scenarios
OAuth connect or reconnect fails
: wrong HubSpot portal, missing HubSpot admin access, canceled consent, or revoked app install. Fix:- In OpenCX, open Settings → Integrations → HubSpot.
- Choose OAuth Public App and click Connect with HubSpot or Reconnect.
- In HubSpot, confirm you are approving the correct portal.
- If HubSpot blocks the install, ask a HubSpot super admin to approve connected apps for the portal.
- If the redirect lands back on an error toast, retry once and share the error text with OpenCX support.
Private App token save fails
: expired or revoked Private App token, wrong token format, or missing scopes. Fix:- Use OAuth if your workspace allows it; the Private App path is legacy.
- If you must use legacy, confirm the token starts with
pat-. - Confirm the Private App includes the scopes listed in Advanced: Private App (legacy).
- Paste the token into Private App Access Token, enter the numeric Default User ID, and save.
Handoff runs but no ticket appears
: the conversation didn’t originate from a channel HubSpot owns (most common), ticket creation is disabled, or the contact has no email for HubSpot to match. Fix:- Check the channel. Tickets appear automatically only when the conversation starts from a channel HubSpot owns — a HubSpot chat widget, or an email routed through a HubSpot inbox. Messages sent to OpenCX’s
[email protected]address never reach HubSpot, so no ticket is created. - For non-HubSpot channels (OpenCX email, widget, WhatsApp, SMS, phone), use the
create-hubspot-ticket-from-sessionworkflow action on handoff. - Check with your OpenCX admin whether ticket creation is enabled for HubSpot.
- Confirm the contact in the OpenCX session has an email address — HubSpot needs it to associate the ticket with a contact.
- If all of the above are correct, check that the webhook is still registered in HubSpot (see below).
Rep replies don’t reach the customer
: webhook not registered in HubSpot, wrong event subscriptions, uncommitted subscription changes, or stale webhook URL. Fix:- Confirm HubSpot still shows Connected via OAuth in OpenCX. Reconnect if the modal shows Reconnect required.
- Confirm the rep replied publicly, not as an internal note. Internal notes sync to OpenCX as private agent comments and are not delivered to customers.
- If you use the legacy Private App path, confirm the webhook subscriptions are committed in HubSpot and the target URL matches the URL shown in OpenCX.
- Check the customer’s channel is still reachable (email valid, widget session open, phone number active).
AI stopped replying mid-thread
: the conversation owner is not the configured AI user. Fix:- In HubSpot, open the conversation and check the Assigned to field.
- Reassign to the user whose ID you configured as the Default User ID in OpenCX.
- If you want the AI to keep drafting while reps own the conversation, enable Assist Mode instead.
Legacy webhook shows delivered in HubSpot but nothing happens
: the webhook URL in HubSpot is stale or was copied from a different org. Fix:- In OpenCX, choose Private App (legacy) and re-copy the webhook URL.
- In HubSpot, open your Legacy App (Settings → Integrations → Private Apps → Legacy Apps) → Webhooks and replace the target URL.
- Trigger a test conversation to confirm events are now processed.
Email reaches HubSpot, threads appear, but no OpenCX session is created
: the legacy Private App is missing thecrm.objects.owners.read scope.
How to confirm:
- In HubSpot, open your Legacy App → Monitoring → API Calls.
- Look for
GET /crm/owners/v3/A-<number>returning 403 withMISSING_SCOPESin the error body. This is the exact failure.
- Legacy App → Scopes tab → enable
crm.objects.owners.read, or migrate to OAuth. - Click Save / commit scope changes.
- In OpenCX Settings → Integrations → HubSpot, re-save to refresh the cached client.
- Send a fresh test email and confirm the session now appears in the OpenCX inbox.
CRM context panel is empty
: CRM integration not connected, or the contact’s email doesn’t match any HubSpot record. Fix:- The CRM context panel is configured at Settings → CRMs — this is a separate connection from Settings → Integrations.
- Confirm the contact’s email in OpenCX matches a contact in your HubSpot portal.
- Test the CRM connection from Settings → CRMs.
OpenCX returns 200 OK to HubSpot webhooks immediately and processes them in the background. A successful webhook delivery in HubSpot’s logs does not guarantee processing succeeded on the OpenCX side.
Replies not syncing: full checklist
If handoff creates a ticket but replies do nothing:- Confirm the ticket has a handoff comment posted on the associated HubSpot conversation (AI summary, sentiment, language, OpenCX session link).
- Confirm HubSpot is connected via OAuth, or re-check legacy webhook subscriptions if you are still on Private App auth.
- Confirm the reply was sent as a public message, not an internal note.
- Check the customer’s channel is still reachable (email valid, phone active, widget session open).
- Confirm Autopilot or Assist Mode settings match the behavior you expect for that channel.
Limits & timing
| Value | |
|---|---|
| Webhook processing | Returns 200 OK immediately, async processing |
| Event delivery | At-most-once — failures are logged, not retried |
| OAuth tokens | Refreshed automatically; reconnect required if HubSpot revokes the install |
| OAuth webhook setup | Registered automatically during install |
| Ticket close delay | ~15 seconds before closing tickets on resolution |
| Transient failure retry | HubSpot API calls retry up to 3 times on error |
| Contact creation failure | Non-blocking — handoff proceeds even if the HubSpot contact can’t be created |
| Email channel delay | ~5 seconds on email events to let concurrent workflows finish |
OpenCX retries transient HubSpot API failures automatically but does not retry indefinitely past rate limits. If tickets are not appearing during a high-volume period, wait a few minutes and check again.
Related Documentation
Connect HubSpot
Re-check OAuth, AI sender, legacy fallback.
Handoff & Sync
Re-check handoff behavior, ticket creation, and contact sync.
Webhook Reference
Event payloads, skip rules, and outbound HubSpot API calls.
Human Handoff
Global handoff settings and escalation rules.