What CRM sync does
Connecting a CRM gives you two directions of data flow:
| Direction | What happens |
|---|---|
| Pull | CRM lists become Finn audiences, so you do not upload CSVs by hand |
| Push | Completed calls are written back as engagement records, and post-call analysis fields become property updates |
Both directions are configured in the dashboard under Settings → Integrations. There is no API endpoint for creating or editing a CRM connection. If you need programmatic outcome delivery, use webhooks instead.
Supported CRMs
| CRM | Auth method | Notes |
|---|---|---|
| HubSpot | OAuth | List selection, sync schedule, field mapping |
| Salesforce | OAuth | Production or Sandbox, custom objects supported |
| Pipedrive | API token | Token generated inside Pipedrive |
HubSpot
- Go to Settings → Integrations → HubSpot → Connect.
- Authorize in HubSpot. You return to Finn with a Connected badge.
- Click Choose Lists and tick the HubSpot lists you want as audiences.
- Set a sync schedule. Every 15 minutes suits active campaigns. Daily suits slower lists.
- Map fields. Tell Finn which HubSpot property holds the name, the phone number, and the country code. Map extra properties to custom fields if the agent needs them mid-call.
- Enable Outcome Sync to write results back. You can turn this on later from the same screen.
With Outcome Sync on, each completed call becomes a HubSpot engagement and each analysis field becomes a property update. Which fields exist depends on what you defined in post-call analysis. If a field is not defined there, nothing is written for it, and the CRM record will look empty even though the call succeeded.
Salesforce
The flow matches HubSpot with three differences.
- The setup flow asks whether to connect Production or Sandbox. Picking the wrong one is the most common cause of "the records are not appearing" reports. Sandbox writes land in Sandbox.
- The connecting user needs API Enabled plus read/write on Leads, Contacts, and any custom objects you intend to map. Without API Enabled, the OAuth handshake completes and every subsequent write fails.
- Custom objects are supported. If your process tracks calls on a custom object rather than Lead or Contact, map to that object during field mapping.
Pipedrive
Pipedrive uses an API token rather than OAuth.
- In Pipedrive, go to Settings → Personal preferences → API → Generate token.
- Paste the token into Settings → Integrations → Pipedrive.
- Complete list selection, sync schedule, and field mapping as with HubSpot.
The token belongs to the Pipedrive user who generated it. If that user is deactivated, the token stops working and the integration tile moves to Needs attention.
Field mapping and what breaks
Mapping is where most CRM setups go wrong. Points to check:
| Problem | Symptom | Cause |
|---|---|---|
| Country code not mapped | Calls fail to dial or dial the wrong country | Finn cannot infer country from a bare local number |
| Phone property holds a formatted string | Numbers rejected | The value needs to be dialable, not decorated |
| Analysis field renamed after mapping | Writes stop for that field | The mapping points at the old name |
| List membership changes between syncs | Contacts appear or vanish from the audience | Audiences follow the CRM list, not a snapshot |
See agent variables for how mapped fields reach the conversation, and audiences for what an audience record looks like once synced.
If your CRM is not listed
Two options.
Use the webhook integration and receive call.analyzed on your own endpoint, then write to your CRM yourself. The payload includes the contact, the transcript, the post-call analysis object, and sentiment. See post-call webhook and webhook events.
Or bridge through Zapier, Make, or n8n using the webhook as the trigger source. This adds a hop, so delivery latency and failure handling become that tool's responsibility rather than Finn's retry behaviour described in webhook retries.
Disconnecting
Every connection is reversible from the same tile you used to connect it. Disconnecting stops future syncs in both directions. It does not remove records already written into your CRM, and it does not delete audiences already imported. Deployments still referencing a disconnected CRM's audience keep the last synced contact set.
Not yet settled
The CRM connection surface is dashboard-only at present. There is no documented endpoint for reading or changing mapping configuration, and no documented per-CRM rate limit or sync-failure retry window. If you need those guarantees, drive outcome delivery through webhooks, where the retry behaviour is documented.