> ## Documentation Index
> Fetch the complete documentation index at: https://docs.salesfinity.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# How Data Moves Between Platforms

> The path a contact takes into Salesfinity and the path a call takes back out, including sync states, retries, and what else flows between systems.

Salesfinity never becomes a second system of record. Contacts are copied in so they can be dialed
fast, and everything that happens on the call is written back to wherever the contact came from.
This page traces both directions.

```mermaid theme={null}
flowchart TB
  subgraph In["Inbound"]
    direction LR
    CRM[(CRM or sequencer)] -- "list, report, sequence, or due tasks" --> Import[Import]
    Import --> List[Salesfinity contact list with record IDs]
  end
  List --> Dial[Parallel dialer]
  Dial -- "disposition, notes, recording, transcript" --> Log[Call log]
  subgraph Out["Outbound"]
    direction LR
    Log --> Queue[Sync queue]
    Queue -- "recording and transcript" --> Gong[(Gong)]
    Log --> Webhooks[Webhooks, API, MCP]
  end
  Queue -- "activity on the record, task completed" --> CRM
```

## Inbound: from your platform into Salesfinity

An import is a **snapshot**. Salesfinity reads the list, report, sequence, or due-task queue you
chose and copies each person into a Salesfinity contact list. For every contact it stores:

* The mapped fields from your [field mapping](/integrations/overview#how-to-integrate) — name,
  title, company, email, phone numbers, plus any custom fields you configured.
* The **source** (HubSpot, Salesforce, Outreach, and so on) and the **record ID** in that source.
  For task-based imports it also stores the task ID and, where the platform has them, the sequence
  and step.
* The list name, taken from the platform's list, report, or sequence name.

Because it is a snapshot, edits made in the CRM after the import do not appear in Salesfinity
until you re-import. Re-importing the same list refreshes the contacts in place; call history and
dispositions already recorded in Salesfinity are kept.

Contacts uploaded from a **CSV**, created manually, or created from follow-ups have no source
record. They are still linked to your CRM at call time, described below.

## During the call

Everything on the call stays in Salesfinity until you log the outcome: the live transcript,
recording, AI notes, and the disposition you choose. Nothing is written to the CRM mid-call.

## Outbound: from the call log to your platform

When you log a call, Salesfinity saves the call log immediately and marks it **queued** for sync.
A background worker then does the rest, so logging never waits on a CRM.

<Steps>
  <Step title="Wait for the recording and transcript">
    For calls longer than five seconds that were recorded, the worker waits until the recording
    URL and transcript are available before syncing, so the activity written to your CRM carries
    the recording link. It retries a few times; if the recording still has not arrived, the call is
    synced without it rather than being dropped.
  </Step>

  <Step title="Route by source">
    A contact that came from HubSpot, Salesforce, Outreach, or another integration is logged back
    to **that** platform using the stored record ID. See each platform's guide for exactly what is
    written: [HubSpot](/integrations/hubspot#what-salesfinity-writes-back),
    [Salesforce](/integrations/salesforce#what-salesfinity-writes-back),
    [Outreach](/integrations/outreach#what-salesfinity-writes-back).
  </Step>

  <Step title="Fan out contacts with no source">
    A contact from a CSV, a custom list, or a follow-up has nowhere obvious to go, so the call is
    logged to **every CRM the team has connected** among Salesforce, HubSpot, and ActiveCampaign.
    Salesfinity matches the person in each CRM by email, phone, or name, and creates the record
    if nobody matches. A CSV contact that carries a Salesforce or HubSpot ID (for
    example, exported from that CRM) is logged only to that CRM.
  </Step>

  <Step title="Complete the task">
    If the contact was imported from a task, the task is completed in the source platform. In
    Outreach the sequence step advances; in Salesforce an active cadence step is marked complete.
  </Step>

  <Step title="Record the result">
    The call log stores the ID and link of the activity created in each platform, and its sync
    state is updated. Call history shows the state and, on failure, the reason.
  </Step>
</Steps>

### Sync states

| State       | Meaning                                                                                     | What to do                                                                                                      |
| ----------- | ------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| Queued      | Logged, waiting for the worker.                                                             | Nothing. Usually clears within seconds, longer if a recording is still being processed.                         |
| In progress | Being written to the platform now.                                                          | Nothing.                                                                                                        |
| Success     | Written to every target.                                                                    | Nothing. The activity link is on the call log.                                                                  |
| Warning     | The call fanned out to several CRMs and at least one accepted it while another rejected it. | Fix the failing CRM (usually a reconnect) and retry. The CRMs that already have the call are not written again. |
| Error       | No platform accepted the call. The reason is stored on the call log.                        | See [Troubleshooting](/integrations/troubleshooting#a-call-failed-to-sync).                                     |
| Skipped     | The call was intentionally not synced, for example because no integration applied.          | Nothing.                                                                                                        |

Retries are safe. A retry only writes to the platforms that are still missing the call, so a
partial failure never produces duplicate activities.

## Other things that flow between systems

* **Phone numbers.** A number found by [enrichment](/enrichment/contacts) or edited in the dialer
  can be pushed onto the CRM record, so the next import already has it.
* **Sequences.** Adding, moving, or removing a person in a sequence from the dialer writes
  straight to the sequencer. See the sequence section on each platform guide.
* **Gong.** When Gong is connected, recorded calls of at least ten seconds that were not
  voicemails are uploaded to Gong after the CRM sync, under the rep's mapped Gong user. Contacts
  imported from Gong Engage sync to Gong directly and have their task marked done. See
  [Gong](/integrations/gong).
* **Follow-up sync.** Calls made in a connected platform's own dialer can be pulled into
  Salesfinity, transcribed, and turned into follow-up tasks, so a rep's follow-up pipeline covers
  calls made anywhere.
* **Outbound to your own systems.** Every logged call is also available to your systems through
  [webhooks configured in the dashboard](/developers), the [REST API](/api-reference/introduction),
  and the [MCP server](/mcp/overview). Those read from Salesfinity's call log and do not depend on
  the CRM sync.

## Where credentials live

Each integration stores an OAuth session or API key per Salesfinity user and team. Tokens are
refreshed automatically in the background; see the sessions section on each platform guide for
when a reconnect is needed. Disconnecting an integration deletes the stored credentials first and
then the integration configuration, so a failed disconnect can be retried safely.
