Skip to main content
CRM sync (Revenue Autopilot) is a beta feature. A workspace admin must enable Beta features, and the workspace needs the Revenue Autopilot add-on (or Include free on the plan) plus CRM sync capacity limits.
CRM sync imports records from a CRM into Audience on a recurring schedule. Agents, campaigns, segments, and automations can then use the current contact attributes without CSV uploads.

Supported CRMs

  • HubSpot
  • HighLevel
  • Salesforce
  • Pipedrive
  • Close
  • Zoho CRM
  • Attio
  • Keap
  • Twenty Cloud and self-hosted Twenty
Twenty Cloud uses https://api.twenty.com. A self-hosted connection requires the public HTTPS URL of the Twenty server. Private, loopback, link-local, and cloud-metadata destinations are rejected.

HighLevel Marketplace app setup

Use Sub-account as the target user and add this exact redirect URL under Advanced Settings → Auth:
The neutral path is intentional: the Marketplace rejects redirect URLs that contain a HighLevel brand reference. Select only these scopes:
Add HIGHLEVEL_CLIENT_ID and HIGHLEVEL_CLIENT_SECRET to the platform environment, and set HIGHLEVEL_OAUTH_REDIRECT_BASE_URL=https://www.ouraicalling.de. Then use Automations → Connections → HighLevel → Authorize HighLevel. One OAuth grant is reused by CRM sync and all HighLevel automation nodes; rotating access and refresh tokens are updated automatically. The calendar nodes can list calendars and free slots, then create, update, or cancel appointments. calendars.write is intentionally not requested because the integration does not create or modify calendar definitions. Under Advanced Settings → Webhooks, set this exact Default webhook URL:
Leave each event’s Custom webhook URL empty so it inherits the default. Enable these events for CRM and appointment automations:
Do not enable unrelated conversation, invoice, product, payment, Voice AI, or knowledge-base events until a workflow needs them. The endpoint verifies the current X-GHL-Signature Ed25519 signature and supports the legacy signature during HighLevel’s transition period.

Create a sync

  1. Open Automations → Connections and add an API connection for the CRM. Compatible connections carry the CRM Sync tag in Add Connection.
  2. Open Audience → CRM Sync.
  3. Select the connection and CRM object or source.
  4. Map CRM fields to name, phone, email, tags, or a custom Audience attribute such as custom.lifecycle_stage. Assign more than one source field to the same destination to combine the values.
  5. Review up to three read-only CRM samples after the mapping.
  6. Choose the interval and start the sync.
The mapper suggests standard fields and matches existing custom attributes by name. Choose Custom value for a destination to combine CRM-field chips and text in the exact order you need. For example, Salutation + First name + Last name can build name; Calling code + Phone number can build phone. At least phone or email is required so the first CRM record can be matched to an Audience contact safely. For national phone numbers, choose a Default phone country such as Germany. The preview and the real run use the same country-aware parser and store the result in E.164 form (+49152…). International numbers that already start with + or 00 ignore the fallback. If the CRM exposes a separate ISO country (DE) or calling-code (+49) field, map it before the phone-number field in the same phone composition. Invalid phone and email combinations are marked in the read-only preview before anything is saved. The API and MCP keep the simple mapping shape. A single source remains a bare field key. Combined values use safe {{field}} tokens with optional literal text; no code is evaluated:
Map a CRM label or tag field to tags to merge normalized, lowercase tags into the contact. Existing manual tags remain intact, and imported tags immediately appear in the Audience tag filter. The first run imports the selected source. Later runs use the provider cursor when available; providers without an incremental cursor safely scan the source again and skip unchanged records. Runs are durable: pagination, retries, and checkpoints continue after a server restart.

Edit a sync

Use the pencil action on a sync card to update its name, object, source, interval, phone country, or field mapping, then review the same mapped-data preview used when creating a sync. Save only keeps the existing schedule. Save & sync saves the same changes and immediately starts a manual run. Changing the object, source, or mapping resets the provider cursor so the next run reapplies the new mapping to existing CRM records.

Identity and conflict behavior

The stable CRM record ID is the primary identity. The platform stores a workspace-scoped link between that ID and the Audience contact. Email and phone are used only to find a safe initial match. Ambiguous matches are reported as conflicts instead of merging unrelated people. CRM sync never deletes an Audience contact. A full-snapshot run can deactivate the membership of records no longer present in the selected CRM source. Local compliance data, including the block list and consent decisions, is never cleared by CRM data.

Write outcomes back

Use the CRM action nodes in an automation after a call or qualification step. Each supported CRM includes record search/get, create, and update actions where the provider API supports them. Use template values such as {{trigger.call_id}}, {{data.lead.email}}, or output from an earlier node. CRM webhook trigger nodes can start an automation from provider events. HighLevel uses the global Marketplace endpoint above; choose the HighLevel connection and event in the trigger settings. Other CRM providers currently use the automation-specific webhook URL and secret shown in their trigger.

Public API and MCP

The same operations are available through:
  • GET|POST /api/v1/crm-syncs
  • POST /api/v1/crm-syncs/discover
  • GET|PATCH|DELETE /api/v1/crm-syncs/{id}
  • GET|POST /api/v1/crm-syncs/{id}/runs
  • MCP tools for listing, creating, updating, deleting, and running CRM syncs
API keys need the corresponding automations:read or automations:write scope. Secrets and provider tokens are never returned.