Salesforce Integration with Mobile App
You are developing a mobile app for a sales team that needs to sync leads, contacts, opportunities, and cases with Salesforce. The standard approach via Salesforce Mobile SDK adds 15+ MB to the app size and ties you to the SDK, which is not always convenient. We offer flexible integration: from a lightweight REST client to full synchronization using Platform Events for real-time updates. Our team has 5+ years of experience in mobile development and CRM integration — we have delivered 20+ such turnkey projects.
Salesforce is a mature CRM platform with a well-documented REST API (developer.salesforce.com) and several mobile SDKs. Unlike 1C or Bitrix24, it has fewer unexpected API limitations, but more concepts to learn: Connected App, OAuth 2.0 flows, SOQL, SOSL, Apex REST, and Platform Events. We guarantee that the integration will comply with App Store Connect and Google Play Console guidelines.
How to Set Up Connected App and OAuth 2.0 for a Mobile App?
It all starts with creating a Connected App in Salesforce Setup: App Manager → New Connected App. Specify a Callback URL (the app's deeplink), enable OAuth scopes: api, refresh_token, offline_access.
The mobile app uses OAuth 2.0 Authorization Code Flow or JWT Bearer Flow for server-to-server communication. For user context, we use Authorization Code. We rely on proven libraries: AppAuth for Android and ASWebAuthenticationSession for iOS.
On Android with AppAuth:
val serviceConfig = AuthorizationServiceConfiguration( Uri.parse("https://login.salesforce.com/services/oauth2/authorize"), Uri.parse("https://login.salesforce.com/services/oauth2/token") ) val request = AuthorizationRequest.Builder( serviceConfig, clientId, ResponseTypeValues.CODE, Uri.parse("myapp://oauth/callback") ).setScope("api refresh_token offline_access").build() authService.performAuthorizationRequest(request, pendingIntent) After exchanging the code for a token, we save access_token, refresh_token, and instance_url — the base URL for all API calls (each Salesforce org has its own subdomain).
REST API and SOQL: How to Fetch Data Efficiently?
REST API is the main interface. Base URL: {instance_url}/services/data/v60.0/. Choose the API version based on the minimum Salesforce API version your client supports.
An SOQL (Salesforce Object Query Language) request:
GET /services/data/v60.0/query/? q=SELECT+Id,Name,Amount,StageName,CloseDate,Account.Name +FROM+Opportunity +WHERE+OwnerId='{userId}'+AND+IsClosed=false +ORDER+BY+CloseDate+ASC+LIMIT+50 SOQL is SQL-like but with limitations: no JOIN in the usual sense; related objects via relationship queries (Account.Name). LIMIT max is 2000. For large datasets, use queryMore with the nextRecordsUrl from the response.
Creating a record: POST /services/data/v60.0/sobjects/Opportunity/ with JSON body. Updating: PATCH /services/data/v60.0/sobjects/Opportunity/{id}. Note: Salesforce uses PATCH, not PUT for updates.
Why Use Platform Events for Real-Time Updates?
Salesforce Platform Events is a publish/subscribe mechanism. The server publishes an event (OpportunityUpdated__e), clients receive it via CometD (Bayeux protocol, long polling).
More about CometD and implementation
On mobile — Salesforce Mobile SDK or a custom CometD implementation. The Mobile SDK includes ready SFRestAPI and StreamingAPI client, but the SDK is heavy — 15+ MB, which can be critical for some projects.
A lighter alternative: custom CometD client on OkHttp:
val cometdClient = BayeuxClient( "${instanceUrl}/cometd/60.0", LongPollingTransport.create(null, okHttpClient) ) cometdClient.handshake() cometdClient.getChannel("/event/OpportunityUpdated__e") .subscribe { message -> val payload = message.dataAsMap handleOpportunityUpdate(payload) } When an opportunity is updated in Salesforce → Platform Event → CometD → mobile client updates the screen. Latency: 1-3 seconds.
For one client, we reduced sync latency from 5 seconds to under 1 second using Platform Events and a custom CometD client, while keeping the APK size minimal.
Comparison of Integration Approaches
| Criteria | Salesforce Mobile SDK | Custom Integration |
|---|---|---|
| OAuth | Built-in | AppAuth / custom |
| Offline | SmartStore (SQLCipher) | Room / Core Data |
| Push | Built-in | FCM/APNs directly |
| Size | +15 MB | Minimal |
| Flexibility | Limited by SDK | Full |
| OAuth Flow | Use Case | Supported on Mobile |
|---|---|---|
| Authorization Code | User context, requires browser | Yes (AppAuth, ASWebAuthenticationSession) |
| JWT Bearer | Server-to-server (no user) | No |
| Client Credentials | Background sync | Not recommended |
How to Upload Files to Salesforce from a Mobile App?
Files in Salesforce are ContentDocument and ContentVersion. Uploading a file from a mobile app:
POST /services/data/v60.0/sobjects/ContentVersion/ Content-Type: multipart/form-data { "Title": "Customer photo", "PathOnClient": "photo.jpg", "FirstPublishLocationId": "{opportunityId}" } + binary data FirstPublishLocationId is the object to which the file is attached. Limitation: one file per request. For multiple files, use sequential requests or Salesforce Bulk API.
What Is Included in the Integration Work
- Analysis of current CRM structure and sync requirements.
- Configuration of Connected App and OAuth flows (Authorization Code / JWT Bearer).
- Development of REST client with caching and error handling.
- Integration of Platform Events for real-time notifications.
- Testing on sandbox and production Salesforce orgs.
- Documentation of API and deployment instructions.
- Post-launch support (1 month).
Timelines and Pricing
Basic integration (OAuth, SOQL queries, CRUD for Opportunity/Contact): 1-2 weeks. Platform Events, offline caching, push notifications: additional 1-2 weeks. Full-featured app with Salesforce Mobile SDK, SmartStore, and synchronization: 1.5-2 months. Cost is calculated individually. Send us a request for an estimate.







