Skip to main content

Salesforce — Real-time data

This connector captures data from Salesforce objects into Flow collections in real time via the Salesforce PushTopic API.

A separate connector is available for syncing historical Salesforce data. For help using both connectors in parallel, contact your Estuary account manager.

This connector is available for use in the Flow web application. For local development or open-source workflows, provides the latest version of the connector as a Docker image. You can also follow the link in your browser to see past image versions.

Supported data resources

This connector can capture the following Salesforce standard objects, if present in your account:

  • Account
  • Contact
  • User
  • OpportunityFilledHistory
  • LeadHistory
  • Opportunity
  • Campaign
  • Case
  • ContactLineItem
  • Entitlement
  • Lead
  • LiveChatTranscript
  • MessagingSession
  • Quote
  • QuoteLineItem
  • ServiceAppointment
  • ServiceContract
  • Task
  • UserServicePresence
  • WorkOrder
  • WorkOrderLineItem

Because most Salesforce accounts contain large volumes of data, you may only want to capture a subset of the available objects. There are several ways to control this:


Using OAuth2 to authenticate with Salesforce in the Flow web app

If you're using the Flow web app, you'll be prompted to authenticate with Salesforce using OAuth. You'll need the following:

Configuring the connector specification manually

If you're working with flowctl and writing specifications in a local development environment, you'll need to manually supply OAuth credentials. You'll need:


Create a read-only Salesforce user

Creating a dedicated read-only Salesforce user is a simple way to specify which objects Flow will capture.

  1. While signed in as an administrator, create a new profile by cloning the standard Minimum Access profile.

  2. Edit the new profile's permissions. Grant it read access to all the standard and custom objects you'd like to capture with Flow.

  3. Create a new user, applying the profile you just created. You'll use this user's email address and password to authenticate Salesforce in Flow.

Create a developer application and generate authorization tokens

To manually write a capture specification for Salesforce, you need to create and configure a developer application. Through this process, you'll obtain the client ID, client secret, and refresh token.

  1. Create a new developer application.

    a. When selecting Scopes for your app, select Manage user data via APIs (api), Perform requests at any time (refresh_token, offline_access), and Manage user data via Web browsers (web).

  2. Edit the app to ensure that Permitted users is set to All users may self-authorize.

  3. Locate the Consumer Key and Consumer Secret. These are equivalent to the client id and client secret, respectively.

  4. Follow the Salesforce Web Server Flow. The final POST response will include your refresh token.


You configure connectors either in the Flow web app, or by directly editing the catalog specification file. See connectors to learn more about using connectors. The values and specification sample below provide configuration details specific to the real-time Salesforce source connector.



The properties in the table below reflect the manual authentication method. If you're working in the Flow web app, you'll use OAuth2, so you won't need the /credentials values listed here.

/credentials/client_idClient IDThe Salesforce Client ID, also known as a Consumer Key, for your developer application.stringRequired
/credentials/client_secretClient SecretThe Salesforce Client Secret, also known as a Consumer Secret, for your developer application.stringRequired
/credentials/refresh_tokenRefresh TokenThe refresh token generated by your developer application.stringRequired
/is_sandboxSandboxWhether you're using a Salesforce Sandbox.booleanfalse


/streamStreamSalesforce object from which a collection is captured.stringRequired


client_id: {your_client_id}
client_secret: {secret}
refresh_token: {XXXXXXXX}
is_sandbox: false
- resource:
stream: WorkOrder
target: ${PREFIX}/WorkOrder
- resource:
stream: WorkOrderLineItem
target: ${PREFIX}/WorkOrderLineItem