Intempt Docs
GuidesCustomer Data PlatformWebhooks

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.

MechanismWhat it isUsed 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 MessagesSOAP/XML POST fired from a Workflow Rule, Approval Process or Flow. Per-org configuration, not a vendor event catalogueNo
Platform EventsCustom event schemas your org definesNo

Four things follow from CDC that change what you can build:

  • Intempt holds the connection, not Salesforce. The subscriber persists a ReplayId and 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.
  • UPDATE bodies are sparse. Only the fields that changed are populated. changedFields carries 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 objectIntempt eventDelivery
Lead, Contactuser_createdCDC
Lead, Contactuser_updatedCDC
Lead, Contactuser_deletedCDC
Lead, Contactuser_mergedDerived from the paired DELETE and UPDATE
Leadlead_status_changedCDC
Leadlead_stage_changedCDC
Leadlead_convertedDerived from ConvertedContactId being set
Lead, Contact, Accountlifecycle_stage_changedCDC
Accountaccount_createdCDC
Accountaccount_updatedCDC
Accountaccount_deletedCDC
Accountaccount_owner_changedCDC
Contact, AccountContactRelationuser_accountCDC
Opportunitydeal_createdCDC
Opportunitydeal_updatedCDC
Opportunitydeal_stage_changedCDC
Opportunitydeal_amount_updatedCDC
Opportunitydeal_closed_wonDerived from IsWon
Opportunitydeal_closed_lostDerived from IsClosed without IsWon
Opportunitydeal_deletedCDC
Opportunitydeal_owner_changedCDC
OpportunityContactRoledeal_userAPI read
Caseticket_createdCDC
Caseticket_status_changedCDC
Caseticket_closedDerived from IsClosed
Taskcall_loggedCDC
Eventmeeting_loggedAPI read
Tasktask_createdCDC
Tasktask_completedCDC
EmailMessageemail_logged_1_1API read
CampaignMembercampaign_member_addedCDC
CampaignMembercampaign_member_respondedCDC
Product2product_createdCDC
Product2product_updatedCDC
PricebookEntryprice_createdAPI read
Orderorder_createdCDC
Orderorder_cancelledCDC
Lead (Web-to-Lead)form_submittedAPI 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

  1. Create a Salesforce source on the Integrations page and authorize Intempt against your org when prompted. This is a one-time OAuth approval.

  2. In Salesforce Setup, search for Change Data Capture.

  3. Move the objects you want into Selected Entities. Start with Lead, Contact, Account and Opportunity. A standard licence allows five.

  4. Save. Salesforce starts publishing change events for those objects from the next committed change.

  5. Edit a test lead in Salesforce and confirm a user_updated event 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.

On this page