Connecting your CRM
Sync accounts, contacts, and deals with Salesforce both ways, pull its tasks, and import read-only from HubSpot and Pipedrive.
Pact syncs with Salesforce both ways, so you do not need to do a one-time CSV migration. Pact pulls from Salesforce on a schedule, and pushes accounts, contacts, and opportunities back for each object an admin switches on: on every sync once the automatic push is on, or one record at a time (see Pushing records back). Deletes are not synced in either direction.
HubSpot and Pipedrive import is read-only: Pact pulls from them and never writes back. Connect them from Data sources (the HubSpot and Pipedrive cards under Settings → Integrations link there).
What syncs (Salesforce)
| Object | Synced |
|---|---|
| Accounts | ✓ |
| Contacts | ✓ |
| Opportunities | ✓ |
| Tasks (last 90 days) | ✓ |
Field mapping uses a built-in default (standard Salesforce fields only). To pull in an extra custom field (e.g. Lead_Source__c), an admin adds a partial override to the integration's mapping config — there is no self-serve field-mapping screen today; ask support if you need a custom field mapped.
Pushing records back to Salesforce
Each object has its own switch under Settings → Integrations → Salesforce. Account push is on by default. Contact and Opportunity push start off, so nothing is written to your org until an admin turns them on.
| Object | Pact record | Default |
|---|---|---|
| Account | Account | On |
| Contact | Contact | Off |
| Opportunity | Deal | Off |
Push Pact edits on every sync is a separate switch, off until an admin turns it on. When it is on, every scheduled sync (every 30 minutes) first sends the fields your team changed in Pact since the two sides last agreed, then pulls from Salesforce:
- Edits to any record already linked to Salesforce are sent, field by field: only what changed in Pact goes over the wire.
- New contacts and deals created in Pact after the switch was turned on are created in Salesforce. If the contact's or deal's account is not in Salesforce yet and Account push is on, the Account is created first so the record is filed under it; with Account push off, the record waits. Records created before the switch was turned on are never created automatically, and sample data is never pushed.
- Limits. One sync writes at most 50 records and does not start when your org's last measured daily API usage is at 90% or more. A record sent costs 3 API calls to update or 2 to create, plus 2 for an Account created first; the card shows the exact count for the last run.
- Failures are shown on the card with Salesforce's own error code (for example a validation rule), counted per object, and retried on the next sync.
To push one record now, the API is POST /v1/integrations/salesforce/push/company/{id}, …/push/contact/{id}, or …/push/deal/{id}.
- Conflicts. Before an update, Pact reads the Salesforce record and compares each field with Pact's value and with what Pact last wrote. If a field changed in Salesforce since Pact last saw it, Salesforce keeps its value by default. An admin can switch the policy to "Pact wins". Either way, the conflict is reported and logged.
- No echo, no ping-pong. A record Pact just pushed is not pulled back as an inbound change, and a change that came from Salesforce is never pushed back to it.
- A field only Salesforce changed is never overwritten, under either policy. And a pull does not erase a Pact edit that has not been sent yet: if a rep changed the phone in Pact and a colleague changed the title in Salesforce, the title comes in and the phone goes out.
- Deletes are not synced. Deleting a record in Pact leaves it in Salesforce, and the other way round.
- Fields Salesforce owns (
OwnerId,ForecastCategoryName) are never pushed. - Every push appears in Recent syncs as "Push to Salesforce".
Connecting Salesforce
Prerequisites
- A Salesforce account with API access enabled (Professional, Enterprise, or Unlimited edition).
- A Salesforce user with System Administrator profile, or a custom profile with API Enabled permission.
Steps
- Go to Settings → Integrations.
- On the Salesforce card, toggle Sandbox if you're connecting a sandbox org (uses
test.salesforce.cominstead oflogin.salesforce.com), then click Connect Salesforce. - You are redirected to Salesforce's OAuth login. Sign in as the integration user and approve the requested
api,refresh_token, andoffline_accessscopes. - On return to Pact, the initial backfill begins. Progress (accounts/contacts/deals/tasks imported) is shown on the card.
Subsequent syncs are incremental and run automatically about every 30 minutes. You can also trigger an immediate sync with the Sync now button.
Stage mapping
Deal StageName values are mapped to Pact's canonical stages using a built-in default table covering Salesforce's standard stage set; an unmapped stage falls back to Pact's Lead stage. An admin can change how any Salesforce stage reads, and add your org's own stages, under Settings → Integrations → Salesforce → Stage mapping. A deal moved in Pact goes back as the first Salesforce stage mapped to its Pact stage, preferring the stages you added. When a deal's stage moves in Salesforce, the deal's stage history records it as a Salesforce change, and the account's lifecycle history says the move was synced from Salesforce.
Disconnecting
Go to Settings → Integrations and click Disconnect on the Salesforce card. Data already synced remains in Pact; no data is deleted. Future changes in Salesforce will no longer sync.
Troubleshooting
Sync shows an error / API cap warning
The card surfaces the raw error text from the last failed run, plus a rate-limit meter when you're approaching Salesforce's daily API cap. New syncs may pause until the cap resets. Expand Recent syncs on the card for a per-run breakdown (imported / updated / error counts).
Records not appearing after initial sync
Check Recent syncs on the Salesforce card — a run with a non-zero error count indicates records that failed to import, most often because a Salesforce record was missing a field Pact's default mapping expects.
OAuth fails or access is denied
Reconnecting requires disconnecting and clicking Connect Salesforce again to restart the OAuth flow. If your org restricts third-party connected apps, your Salesforce admin will need to allow Pact's connected app first.