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
Prerequisites
Section titled “Prerequisites”You’ll need:
- A Salesforce administrator for the org you want to connect
- My Domain configured in that Salesforce org
- A Salesforce user with read access to the objects and fields you want to sync
- Popups enabled for Resplendent Data during sign-in
- 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.
Setup instructions
Section titled “Setup instructions”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:
- Click the gear icon and open Setup
- In Quick Find, search for External Client App Manager
- Click Create New External Client App
- Enter a name, such as
Resplendent Data - Enter an admin contact email
- Set Distribution State to Local
- In API (Enable OAuth Settings), enable OAuth
- 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-callbackFor 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.
Step 2: Configure OAuth settings
Section titled “Step 2: Configure OAuth settings”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”- Go back to External Client App Manager
- Open the app you created
- Open the Policies tab
- Edit the refresh token policy
- Select Refresh token is valid until revoked
- 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”- Go to Settings -> Integrations
- 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:
- Select Production or Developer for normal Salesforce production orgs and Developer Edition orgs, or Sandbox for Salesforce sandbox orgs
- Paste the Consumer Key from the Salesforce External Client App
- Paste the Consumer Secret from the Salesforce External Client App
Step 7: Sign in to Salesforce
Section titled “Step 7: Sign in to Salesforce”- Click Sign In
- A Salesforce authorization popup opens
- Log in if prompted
- Review the Salesforce authorization screen and approve access
- Return to Resplendent Data after the popup finishes
Step 8: Save and sync
Section titled “Step 8: Save and sync”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.
Available datasets
Section titled “Available datasets”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.
| Area | Datasets |
|---|---|
| CRM core | Account, Contact, Lead, Opportunity |
| CRM history and stages | AccountHistory, ContactHistory, LeadHistory, LeadStatus, OpportunityFieldHistory, OpportunityHistory, OpportunityStage |
| CRM relationships | AccountContactRelation, AccountTeamMember, OpportunityContactRole, OpportunitySplit, OpportunityTeamMember |
| Marketing | Campaign, CampaignMember, CampaignMemberStatus |
| Support cases | Case, CaseContactRole, CaseHistory, CaseMilestone, CaseStatus, CaseTeamMember, CaseTeamRole |
| Activities and messages | Task, TaskRelation, Event, EventRelation, EmailMessage, EmailMessageRelation, Note |
| Products and pricing | Product2, Pricebook2, PricebookEntry |
| Orders, quotes, and contracts | Order, OrderHistory, OrderItem, Quote, QuoteLineItem, Contract, ContractHistory, ContractLineItem, ServiceContract |
| Service work | Asset, Entitlement, EntitlementContact, ServiceAppointment, WorkOrder, WorkOrderLineItem, WorkType |
| Users and permissions | User, UserRole, Profile, PermissionSet, PermissionSetAssignment |
| Groups, queues, and setup helpers | BusinessProcess, Group, GroupMember, QueueSobject, RecordType |
| Territories | Territory2, Territory2Model, Territory2Type, ObjectTerritory2Association, UserTerritory2Association |
| Custom objects | Queryable __c objects |
Sync behavior and refresh rates
Section titled “Sync behavior and refresh rates”Initial sync
Section titled “Initial sync”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.
Incremental sync
Section titled “Incremental sync”Most Salesforce Datasets sync incrementally. Resplendent Data uses Id as the primary key and picks the first available high-watermark field in this order:
SystemModstampLastModifiedDateCreatedDate
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 type | Default interval | Notes |
|---|---|---|
| Incremental Salesforce Datasets | 10 minutes | Uses SystemModstamp, LastModifiedDate, or CreatedDate when available |
| Full-sync-only Salesforce Datasets | 24 hours | Used when no supported high-watermark field is available |
The actual schedule also respects the refresh limits for your Resplendent Data tier.
Deleted records
Section titled “Deleted records”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.
Fields and data types
Section titled “Fields and data types”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, andlocationfields 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.
Joining Salesforce data
Section titled “Joining Salesforce data”Most joins use Salesforce ID fields. Common examples:
Account.Id->Contact.AccountIdAccount.Id->Opportunity.AccountIdOpportunity.Id->OpportunityLineItem.OpportunityIdCase.Id->EmailMessage.ParentIdUser.Id-> owner, creator, and modifier fields such asOwnerId,CreatedById, andLastModifiedByIdRecordType.Id->RecordTypeIdfields 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.
Troubleshooting
Section titled “Troubleshooting”- The sign-in popup does not open: Allow popups for Resplendent Data, then click Sign In again.
invalid_client_idorclient 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 ashttps://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_tokenoroffline_access, andopenidselected. 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
__care shown automatically. - A field is missing: Check the Salesforce user’s object and field permissions. Hidden, deprecated,
base64,address, andlocationfields 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.