Salesforce Change Data Capture
Collect lead, contact, account, opportunity and case changes from Salesforce. Salesforce publishes no webhook, so this source subscribes to Change Data Capture over the Pub/Sub API.
Research Preview. This connector is rolling out account by account. Ask your Intempt contact to enable it for your workspace.
This is not a webhook. Salesforce doesn't POST to a URL. Intempt subscribes to your org's Change Data Capture stream over the Pub/Sub API instead. There's no endpoint to paste and no token header to add. The setup steps below are different from every other page in this section.
The Salesforce source collects CRM activity: leads and contacts created or changed, accounts updated, opportunities moving stage and closing, cases opened and resolved.
It's the same customer record your sales team works in, landing on the same Intempt profile as your web, email and payment events.
How delivery works
Salesforce has three push mechanisms and none of them is a webhook in the sense the rest of this section uses.
| Mechanism | What it is | Used here? |
|---|---|---|
| Change Data Capture (CDC) | CREATE, UPDATE, DELETE and UNDELETE change events on /data/ChangeEvents, consumed over the Pub/Sub API (gRPC over HTTP/2, Avro-encoded) | Yes |
| Outbound Messages | SOAP/XML POST fired from a Workflow Rule, Approval Process or Flow. Per-org configuration, not a vendor event catalogue | No |
| Platform Events | Custom event schemas your org defines | No |
Four things follow from CDC that change what you can build:
- Intempt holds the connection, not Salesforce. The subscriber persists a
ReplayIdand resumes from it after a disconnect. The event bus keeps 3 days of events, so an outage under 72 hours loses nothing. - A standard licence covers 5 CDC-enabled objects. More needs a Salesforce add-on. The P0 events on this page come from Lead, Contact, Account and Opportunity, which fit inside the five with one slot left, usually Case.
UPDATEbodies are sparse. Only the fields that changed are populated.changedFieldscarries field names, not prior values. Salesforce cannot tell Intempt what a stage or owner was, only what it is now. A "changed from X to Y" segment needs a diff against the last state Intempt holds, and that isn't part of this connector today.- Nothing is real-time only. Every record CDC pushes is also readable through REST and SOQL, which is what the historical load uses.
Available events
Events are grouped by the Salesforce object that produces them. CDC means the change is pushed live once that object is CDC-enabled. API read means Intempt fills it from the historical load and scheduled reads, because CDC support for that object couldn't be verified from Salesforce's own docs. Derived means Intempt computes it from another change.
| Salesforce object | Intempt event | Delivery |
|---|---|---|
| Lead, Contact | user_created | CDC |
| Lead, Contact | user_updated | CDC |
| Lead, Contact | user_deleted | CDC |
| Lead, Contact | user_merged | Derived from the paired DELETE and UPDATE |
| Lead | lead_status_changed | CDC |
| Lead | lead_stage_changed | CDC |
| Lead | lead_converted | Derived from ConvertedContactId being set |
| Lead, Contact, Account | lifecycle_stage_changed | CDC |
| Account | account_created | CDC |
| Account | account_updated | CDC |
| Account | account_deleted | CDC |
| Account | account_owner_changed | CDC |
| Contact, AccountContactRelation | user_account | CDC |
| Opportunity | deal_created | CDC |
| Opportunity | deal_updated | CDC |
| Opportunity | deal_stage_changed | CDC |
| Opportunity | deal_amount_updated | CDC |
| Opportunity | deal_closed_won | Derived from IsWon |
| Opportunity | deal_closed_lost | Derived from IsClosed without IsWon |
| Opportunity | deal_deleted | CDC |
| Opportunity | deal_owner_changed | CDC |
| OpportunityContactRole | deal_user | API read |
| Case | ticket_created | CDC |
| Case | ticket_status_changed | CDC |
| Case | ticket_closed | Derived from IsClosed |
| Task | call_logged | CDC |
| Event | meeting_logged | API read |
| Task | task_created | CDC |
| Task | task_completed | CDC |
| EmailMessage | email_logged_1_1 | API read |
| CampaignMember | campaign_member_added | CDC |
| CampaignMember | campaign_member_responded | CDC |
| Product2 | product_created | CDC |
| Product2 | product_updated | CDC |
| PricebookEntry | price_created | API read |
| Order | order_created | CDC |
| Order | order_cancelled | CDC |
| Lead (Web-to-Lead) | form_submitted | API read |
Each event is normalised onto a named stream, so you build segments and journey triggers on the event name rather than on the Avro shape.
Identity
The person on a change event is the Lead or Contact Email. On a sparse UPDATE that field is only present when it changed, so Intempt resolves the record by its Salesforce Id against the profile it already holds, and reads the Contact when a change arrives on an object that carries no email of its own (Opportunity, Case, Task, Order).
Accounts map to Intempt accounts. Person Accounts resolve through PersonContactId; business accounts link each Contact under the account.
Order fields such as BillingEmailAddress need an Order Management, Revenue Cloud or B2B Commerce licence to be populated. Without one they're null and Intempt falls back to the bill-to Contact.
Historical load
Connecting Salesforce runs a one-time historical load before the CDC subscription takes over. It reads, over REST and SOQL, the objects you enable for CDC plus the API-read objects listed above.
The connector reports connected only once that load finishes, so a complete profile is never mistaken for a partial one. Records that arrive in the overlap between the load and the first change event are de-duplicated on the change event's ReplayId.
Backfilled records do not trigger journeys, workflows or experiments.
Setup
Change Data Capture is enabled per object inside Salesforce Setup. Create the source in Intempt first so the connection is ready to subscribe as soon as the objects are enabled.
Configure Salesforce
-
Create a Salesforce source on the Integrations page and authorize Intempt against your org when prompted. This is a one-time OAuth approval.
-
In Salesforce Setup, search for Change Data Capture.
-
Move the objects you want into Selected Entities. Start with Lead, Contact, Account and Opportunity. A standard licence allows five.
-
Save. Salesforce starts publishing change events for those objects from the next committed change.
-
Edit a test lead in Salesforce and confirm a
user_updatedevent appears in the Intempt event stream.
If you later add an object to CDC, Intempt picks it up from the next change. Records on that object that predate the change are not loaded automatically.
