Skip to content

Salesforce Integration

This integration syncs Salesforce CRM data into Resplendent Data for dashboards, reports, and analysis. It uses Salesforce OAuth through a customer-owned Local External Client App, then reads data through Salesforce REST and SOQL.

What you can sync:

  • CRM records: Accounts, Contacts, Leads, Opportunities, Campaigns, Cases, and related history tables
  • Activities and messages: Tasks, Events, Email Messages, and Notes
  • Revenue objects: Products, Pricebooks, Orders, Quotes, Contracts, Line Items, and Assets
  • Service objects: Entitlements, Service Appointments, Work Orders, Work Order Line Items, and Work Types
  • Relationship helpers: Team members, contact roles, task/event relations, groups, queues, territories, and permissions
  • Custom objects: Queryable custom objects whose Salesforce API name ends in __c

You’ll need:

  1. A Salesforce administrator for the org you want to connect
  2. My Domain configured in that Salesforce org
  3. A Salesforce user with read access to the objects and fields you want to sync
  4. Popups enabled for Resplendent Data during sign-in
  5. The right org type selected in Resplendent Data: Production or Developer or Sandbox

Each Salesforce org must have its own Local External Client App. Resplendent Data does not use a shared Salesforce app or shared environment credentials for new Salesforce connections.

Resplendent Data requests Salesforce OAuth access for API reads, refresh tokens, and the signed-in user’s identity. The integration only issues read/query requests. The Salesforce user’s profile and permission sets control which objects and fields are visible.


Step 1: Create the External Client App in Salesforce

Section titled “Step 1: Create the External Client App in Salesforce”

In the Salesforce org you want to connect:

  1. Click the gear icon and open Setup
  2. In Quick Find, search for External Client App Manager
  3. Click Create New External Client App
  4. Enter a name, such as Resplendent Data
  5. Enter an admin contact email
  6. Set Distribution State to Local
  7. In API (Enable OAuth Settings), enable OAuth
  8. Add the callback URL shown in the Resplendent Salesforce setup form

For production Resplendent Data, the callback URL is:

https://app.resplendentdata.com/integrations/oauth/salesforce-oauth-callback

For a staging or local environment, use the callback URL shown in that environment’s Salesforce setup form. The Salesforce callback URL must match exactly.

My Domain must be configured in the Salesforce org, but users do not normally need to paste the My Domain URL into Resplendent Data.

Add these OAuth scopes:

  • Manage user data via APIs (api)
  • Perform requests at any time (refresh_token, offline_access)
  • Access unique user identifiers (openid)

Leave Require Proof Key for Code Exchange (PKCE) Extension for Supported Authorization Flows enabled. Resplendent Data uses PKCE during Salesforce OAuth.

Save the External Client App.

Step 3: Configure the refresh token policy

Section titled “Step 3: Configure the refresh token policy”
  1. Go back to External Client App Manager
  2. Open the app you created
  3. Open the Policies tab
  4. Edit the refresh token policy
  5. Select Refresh token is valid until revoked
  6. Save the policy

Step 4: Copy the Consumer Key and Consumer Secret

Section titled “Step 4: Copy the Consumer Key and Consumer Secret”

On the External Client App’s settings page, open the OAuth settings and copy:

  • Consumer Key
  • Consumer Secret

Keep the Consumer Secret private. Resplendent Data sends it to the backend for OAuth and stores it only in encrypted source storage after the Salesforce source is saved. It is not stored in browser storage or visible source configuration.

Step 5: Open the integration form in Resplendent

Section titled “Step 5: Open the integration form in Resplendent”
  1. Go to Settings -> Integrations
  2. Find Salesforce and click Connect

Step 6: Enter the app credentials and choose the org type

Section titled “Step 6: Enter the app credentials and choose the org type”

In Resplendent Data:

  1. Select Production or Developer for normal Salesforce production orgs and Developer Edition orgs, or Sandbox for Salesforce sandbox orgs
  2. Paste the Consumer Key from the Salesforce External Client App
  3. Paste the Consumer Secret from the Salesforce External Client App
  1. Click Sign In
  2. A Salesforce authorization popup opens
  3. Log in if prompted
  4. Review the Salesforce authorization screen and approve access
  5. Return to Resplendent Data after the popup finishes

After Salesforce shows as authorized, click Save and Test. Once the connection is saved, click Sync Datasets and choose the Salesforce Datasets you want to pull.


Salesforce Dataset names use Salesforce API names. Standard Salesforce objects are shown when they are queryable in your org. Custom objects are shown when they are queryable, not hidden or deprecated, and their API name ends with __c.

AreaDatasets
CRM coreAccount, Contact, Lead, Opportunity
CRM history and stagesAccountHistory, ContactHistory, LeadHistory, LeadStatus, OpportunityFieldHistory, OpportunityHistory, OpportunityStage
CRM relationshipsAccountContactRelation, AccountTeamMember, OpportunityContactRole, OpportunitySplit, OpportunityTeamMember
MarketingCampaign, CampaignMember, CampaignMemberStatus
Support casesCase, CaseContactRole, CaseHistory, CaseMilestone, CaseStatus, CaseTeamMember, CaseTeamRole
Activities and messagesTask, TaskRelation, Event, EventRelation, EmailMessage, EmailMessageRelation, Note
Products and pricingProduct2, Pricebook2, PricebookEntry
Orders, quotes, and contractsOrder, OrderHistory, OrderItem, Quote, QuoteLineItem, Contract, ContractHistory, ContractLineItem, ServiceContract
Service workAsset, Entitlement, EntitlementContact, ServiceAppointment, WorkOrder, WorkOrderLineItem, WorkType
Users and permissionsUser, UserRole, Profile, PermissionSet, PermissionSetAssignment
Groups, queues, and setup helpersBusinessProcess, Group, GroupMember, QueueSobject, RecordType
TerritoriesTerritory2, Territory2Model, Territory2Type, ObjectTerritory2Association, UserTerritory2Association
Custom objectsQueryable __c objects

The first sync pulls Salesforce records through SOQL in pages. Large objects can take several sync cycles to finish the first backfill. Salesforce returns up to 2,000 records per page for this integration.

Most Salesforce Datasets sync incrementally. Resplendent Data uses Id as the primary key and picks the first available high-watermark field in this order:

  1. SystemModstamp
  2. LastModifiedDate
  3. CreatedDate

When a Dataset has one of these fields and it can be filtered in Salesforce, Resplendent Data syncs rows changed since the last local high watermark. Each incremental sync uses a 120-second overlap window so late-arriving updates are picked up. Duplicate overlap rows are safe because rows update by primary key.

Datasets without a usable high-watermark field are treated as full-sync Datasets.

Dataset typeDefault intervalNotes
Incremental Salesforce Datasets10 minutesUses SystemModstamp, LastModifiedDate, or CreatedDate when available
Full-sync-only Salesforce Datasets24 hoursUsed when no supported high-watermark field is available

The actual schedule also respects the refresh limits for your Resplendent Data tier.

For Salesforce objects that support replication metadata, Resplendent Data checks Salesforce’s deleted-record endpoint during incremental sync. Objects that do not support that metadata do not report deleted rows through this integration.


Resplendent Data reads field metadata from Salesforce before syncing each Dataset.

  • Salesforce field API names are preserved as column names
  • Salesforce field labels are used as column aliases where available
  • Hidden and deprecated fields are skipped
  • base64, address, and location fields are skipped
  • Boolean, integer, currency, double, percent, date, and datetime fields are typed from Salesforce metadata
  • Other supported Salesforce field types are stored as text

This means empty date and datetime columns still keep their date-aware types when Salesforce exposes the field type through object metadata.


Most joins use Salesforce ID fields. Common examples:

  • Account.Id -> Contact.AccountId
  • Account.Id -> Opportunity.AccountId
  • Opportunity.Id -> OpportunityLineItem.OpportunityId
  • Case.Id -> EmailMessage.ParentId
  • User.Id -> owner, creator, and modifier fields such as OwnerId, CreatedById, and LastModifiedById
  • RecordType.Id -> RecordTypeId fields on business objects

Some Salesforce fields are polymorphic. For example, Note.ParentId points to the parent record for a classic Salesforce note. The parent can be an Account, Contact, Opportunity, Case, Lead, or another note-enabled object, so join it to the object that matches the records you are analyzing.

Use helper Datasets when a relationship is many-to-many or Salesforce stores it outside the main object, such as AccountContactRelation, OpportunityContactRole, TaskRelation, EventRelation, CampaignMember, GroupMember, and territory assignment Datasets.


  • The sign-in popup does not open: Allow popups for Resplendent Data, then click Sign In again.
  • invalid_client_id or client identifier invalid: Confirm the Consumer Key was copied from the exact Local External Client App in the Salesforce org you are connecting, the correct org type is selected, and Salesforce has had a few minutes to make the app available. If the org still rejects the Consumer Key before the Salesforce login screen opens, use Advanced options in the Resplendent setup form and enter that Salesforce org’s My Domain login URL, such as https://your-domain.my.salesforce.com.
  • Cross-org OAuth flows are not supported: The Consumer Key belongs to an External Client App in a different Salesforce org. Create a Local External Client App in the exact Salesforce org you are connecting, then reconnect with that org’s Consumer Key and Consumer Secret.
  • External client app is not installed in this org: The authorization request is using an app from another org, or the user logged into the wrong Salesforce org. Confirm the org type in Resplendent, then use a Local External Client App created in the target org.
  • Redirect URI mismatch or bad callback URL: Copy the callback URL from the Resplendent Salesforce setup form and paste it into the Salesforce External Client App. The protocol, host, path, and trailing slash behavior must match exactly.
  • Missing or incorrect scopes: Confirm the app has api, refresh_token or offline_access, and openid selected. Reconnect Salesforce after changing scopes.
  • Authorization fails after login: Confirm you selected the correct org type. Sandbox logins must use Sandbox.
  • Refresh fails after the source was working: The Salesforce user may have revoked access, the refresh token policy may not allow long-lived refresh tokens, or the External Client App credentials may have been deleted or rotated. Update the Consumer Secret if needed, then reconnect Salesforce.
  • A Dataset is missing: The object may not be queryable in your org, may be hidden or deprecated, or may not be included in the standard Salesforce catalog. Queryable custom objects ending in __c are shown automatically.
  • A field is missing: Check the Salesforce user’s object and field permissions. Hidden, deprecated, base64, address, and location fields are not synced.
  • Data is incomplete after the first sync: Large Salesforce objects may still be backfilling. Let the sync continue until the Dataset finishes its initial pull.
  • Deleted rows are not reflected for an object: The object may not support Salesforce replication metadata for deleted records.