Salesforce API User for SuccessPro Integration ( MODERN JWT )

Salesforce API User for SuccessPro Integration ( MODERN JWT )

Salesforce API User for SuccessPro Integration (Modern ECA / JWT)

SuccessPro Salesforce API Integration

SuccessPro uses the Salesforce API to:
  • Read Contact and Account-level data for user provisioning
  • Write to Tasks, Cases, Opportunities, Events, and Custom Objects
Authentication is JWT Bearer (a certificate-based OAuth flow) - not a stored username/password. Salesforce is retiring the legacy SOAP login() path this setup replaces (mandatory Summer '27).

1. Create a Permission Set

  • Label / API Name: successpro_api_integration
  • Description: "Allows ActiFi's SuccessPro API user to connect and read / write object level data"
  • Session Activation Required: unchecked (no interactive session to gate for a headless integration user)
  • License: Salesforce API Integration - a Permission Set License, found under a separate "Permission Set Licenses" group in the dropdown (not "User Licenses"). Required for Object Settings below to be visible/editable.
Grant within this Permission Set:
  • Object Settings: View All on Contact, View All on Account, plus any other objects this tenant's integration reads/writes (including Custom Objects).
  • System Permissions: Access Activities, Edit Tasks (and Edit Events if writing calendar events)
  • Object Settings, conditional - only if in scope for this tenant's integration: Case, Opportunity, Lead. Not universal requirements; scope to what this tenant's integration actually uses.


2. Create the Integration User

  • Username: dev+{tenant}@{yourdomain}.com - must be globally unique across every Salesforce org that has ever existed (unlike Email).
  • Email: dev@actifi.com, or dev+{tenant}@actifi.com
  • Profile: Salesforce API Only System Integrations (not minimum API License).
  • User License: Salesforce Integration.
  • Uncheck "Generate new password and notify user immediately." JWT Bearer never uses a stored password for this user.
  • Role: leave <None Specified> unless this integration writes activities owned by other users - see Notes below if so.

3. Assign the Permission Set

Assign successpro_api_integration to the integration user.

4. Choose the External Client App

  • (Recommended) Use the existing widget External Client App (SuccessPro_Connected_App), if the Salesforce widget is already configured for this tenant - just add the settings below to that same app.
  • No widget External Connected App configured yet? See the Addendum below for a standalone app.

5. Add the Permission Set to the App's Selected Permission Sets

  • External Client App Manager -> select the app -> row action menu -> Edit Policies (not "Edit Settings".
  • App Policies tab -> Selected Permission Sets -> add successpro_api_integration.

6. Enable JWT Bearer and Upload the Certificate

  • External Client App Manager -> select the app -> Edit Settings -> OAuth -> Flow Enablement -> check "Enable JWT Bearer Flow."
  • Certificate Upload: upload the .crt (public certificate) only - never the .key (private key). The private key goes only to ActiFi's secrets storage, never to Salesforce.
  • Selected OAuth Scopes: confirm both are present:
  • Manage user data via APIs (api)
  • Perform requests at any time (refresh_token, offline_access) - required for the JWT Bearer grant even though no refresh token is actually issued or used. Omitting it fails with invalid_request: refresh_token scope is required and the connected app should be installed and preauthorized.

7. Retrieve the Consumer Key

Send the Consumer Key / Secret (from the app's Edit Settings -> OAuth screen) to ActiFi.

Notes / Troubleshooting

  • Login IP Ranges: optional IP allowlisting for Production/Staging. Not required for the JWT Bearer flow (JWT auth doesn't use a Security Token the way legacy login() did) - relevant mainly if this tenant also keeps a legacy conn.login() fallback configured.
  • "Production"  tenant.actifi.com  IP addresses: 34.207.47.137, 18.215.23.68, 52.7.58.134, 3.84.107.235
  • "Staging"  tenant-dev.actifi.com  IP addresses: 34.238.205.73, 34.236.248.209, 35.153.112.248, 3.84.107.235
  • Role and activity ownership: if activity owners have a Role, ensure the API user's Role outranks the role of any user who will own Salesforce activities written via the API user.
  • Multi-contact Task/Event relations: if this tenant's integration needs to relate multiple contacts to a single Task/Event (TaskRelation), confirm Shared Activities is enabled on the org first (Setup -> Activity Settings -> "Allow Users to Relate Multiple Contacts to Tasks and Events") - a per-org toggle, unrelated to anything above. A plain single-contact Task is unaffected either way.


Addendum: Standalone External Client App (no widget configured)

Use this only if the tenant has no SuccessPro External Client App already set up for the widget.
    Create the ECA the same way as the Widget Installation doc's steps 1-6, with these differences:
  • Oauth Callback URL: use a placeholder value such as " login.salesforce.com "- there's no real widget callback to point it at.
  • Canvas App Settings: leave disabled; Canvas is not needed for API-only access.
    Complete steps 5-7 above (Selected Permission Sets, JWT Bearer + certificate + scopes, Consumer Key) on this standalone app, exactly the same way.