Salesforce
Sync contacts from Salesforce into your event pipeline, push leads back to Salesforce, and optionally enable live inbound updates.
What you get
- Import Salesforce Contacts as leads on a Pana event.
- Update existing leads matched by email or Salesforce contact ID.
- Push leads from Pana to Salesforce — one at a time or in bulk — with the Pana event fields.
- Enable auto-sync to configure Salesforce outbound messaging for live contact updates.
Salesforce is one connection per workspace. Each workspace uses its own Salesforce Connected App (Consumer Key and Consumer Secret).
Before you start
- A Salesforce org with API access (Production or Sandbox).
- Permission to create an External Client App or Connected App in that org.
- At least one event in Pana to attach synced contacts to.
- Workspace admin access.
Step 1 — Create a Connected App in Salesforce
Create the app in the same Salesforce org you want to connect (your customer’s org or your own).
Open the app manager
- In Salesforce, go to Setup.
- Search for App Manager (or External Client Apps on newer orgs).
- Click New Connected App or New External Client App.
OAuth settings
| Setting | Value |
|---|---|
| Callback URL | Copy from Pana (see below) — must match exactly |
| OAuth scopes | api, id (and refresh_token, offline_access if available) |
| App authorization | All users can self-authorize |
| Distribution / Type | Local is fine — you do not need Package unless listing on AppExchange |
Callback URL format
https://YOUR_APP_DOMAIN/auth/oauth/callback?provider=salesforce
Example (Pana production):
https://events.pana.space/auth/oauth/callback?provider=salesforce
Local development:
http://localhost:3000/auth/oauth/callback?provider=salesforce
:::caution Exact match required
The callback URL in Salesforce must include the query string ?provider=salesforce.
Do not use legacy paths such as /auth/salesforce/callback unless your deployment is configured for them.
:::
Copy credentials
- Save the app and wait a few minutes for Salesforce to activate it.
- Open Consumer Key and Secret (or Settings → OAuth).
- Copy the Consumer Key (Client ID) and Consumer Secret.
Sandbox orgs: use https://test.salesforce.com when signing in during OAuth. Production orgs use https://login.salesforce.com.
Step 2 — Connect in Pana
- Go to Settings → Integrations.
- Find Salesforce under CRM.
- Click Connect.
- In the dialog:
- Confirm the Callback URL shown matches what you registered in Salesforce.
- Paste your Consumer Key and Consumer Secret.
- Click Continue to Salesforce.
- Sign in to the target org and approve access.
- You return to Pana; the card shows as connected with your instance URL (e.g.
yourorg.my.salesforce.com).
Sync contacts manually
- On the Salesforce card, click Sync contacts.
- Select a Pana event.
- Click Sync.
New Salesforce contacts become leads on that event. Existing leads with the same email are updated.
Fields Pana adds to Salesforce
When you connect, Pana sets up these fields on Salesforce Leads and Contacts so you never have to create them by hand. Every push fills them with the lead's current values, alongside first name, last name, email, phone, job title and company.
| Salesforce field | Type | What Pana writes |
|---|---|---|
| Lead Source | Picklist (Salesforce's own) | Always Pana Events, so leads from Pana are easy to identify. Written to Salesforce's built-in Lead Source picklist. |
| Event Name | Text(255) | The event the lead is mapped to. |
| Event Lead Interest Level | Picklist — Cold, Warm, Hot | The lead's interest level from Pana. |
| Event Lead Tags | Picklist (Multi-Select) — Exhibitor, Sponsor, Investor, Partner, High Priority, Decision Maker, Urgent, VIP | The lead's tags. A lead marked as a decision maker always carries Decision Maker. |
| Event Conversation Notes | Long Text Area | The latest note on the lead. Each push replaces it with the newest note. |
| Next Follow-up Date | Date/Time | When the lead is due a follow-up, with the time of day. |
| LinkedIn Profile | URL | The lead's LinkedIn profile URL. |
| Pana Lead URL | URL | A link back to the lead in Pana. |
Each field is created on both Lead and Contact, because a Pana lead can land as either. Salesforce hides a new field from every profile until access is granted, so Pana also creates a Pana Events permission set with read and edit access to these fields and assigns it to the connected user. If a field with one of these names already exists, Pana reuses it instead of creating a duplicate — so reconnecting is always safe. Empty values are never sent, so a push never clears something typed in Salesforce.
Creating fields needs the connected user to have the Customize Application, Manage Profiles and Permission Sets and Assign Permission Sets permissions (System Administrators have them all). Without it, pushes still create and update records with the standard fields. If your org's Lead Source picklist is restricted, add a Pana Events value to it — otherwise Pana leaves Lead Source empty.
Edits made in Salesforce
Event Lead Interest Level, Event Lead Tags, Event Conversation Notes, Next Follow-up Date and LinkedIn Profile come back with the Lead or Contact, so edits made in Salesforce show up on the Pana lead — on every contact sync, and live once auto-sync is enabled (Pana reads them from the record when Salesforce reports a change). This works for leads that came from Salesforce and for leads captured in Pana and pushed to Salesforce.
- A note changed in Salesforce joins the lead's notes thread as the newest note.
- Company comes back on live updates too: a Lead's Company, or a Contact's Account name.
- Tags Pana does not provision are left on the lead untouched; Decision Maker keeps the lead's decision-maker flag in step.
- An empty field in Salesforce never clears the lead.
- Lead Source, Event Name and Pana Lead URL are set by Pana and are not read back.
Re-create the fields
Connecting creates the fields, and a push quietly re-creates a missing one (at most once an hour). To re-run it right away — after someone deleted a field, or after you grant the connected user the permissions above — call:
POST /api/v1/integrations/salesforce/provision-fields/
{ "workspace_id": "<workspace id>" }
The response lists the fields created and reused, and any errors Salesforce returned. Existing fields are reused, never duplicated.
Push leads to Salesforce
Single lead
- Open Leads.
- On a lead row, click the cloud icon and choose Salesforce.
- Pana looks for a Salesforce Contact with the lead's email, then an open Lead, and updates it. If there is none, Pana creates a new Salesforce Lead.
The lead must have an email address. A new Salesforce Lead needs a last name and company; when the Pana lead has none, Pana sends Unknown.
Bulk push
- Select one or more leads in Leads.
- Open the push menu in the toolbar and choose Salesforce.
Leads without an email are skipped and reported in the summary.
Enable auto-sync
- After connecting, click Enable auto-sync on the Salesforce card.
- Pana configures Salesforce outbound messaging for your org.
- When successful, the button shows Auto-sync on (green).
Use this when you want Salesforce contact changes to flow into Pana without manual syncs.
Disconnect
Turn off the toggle on the Salesforce card. Outbound message configuration in Salesforce may need to be removed separately in your org.
Troubleshooting
| Issue | What to try |
|---|---|
redirect_uri_mismatch | Callback URL in Salesforce must match the dialog character-for-character, including ?provider=salesforce. Re-save the app and wait 5–10 minutes. |
| Wrong Consumer Key in OAuth URL | The Consumer Key you paste in Pana must be from the same Connected App where the callback URL is registered. |
| Connected to wrong org | Disconnect and reconnect; sign in to the correct Salesforce org. |
| Sandbox vs production | Sandbox apps must authorize via test.salesforce.com; production via login.salesforce.com. |
| Type: Local | Local distribution is correct for your own integration. Package is only needed for AppExchange. |
| Auto-sync setup errors | Confirm OAuth scopes include api and id; verify your Salesforce user is an admin. |
| Token / scope errors | Ensure refresh_token and offline_access are enabled on the Connected App if refresh fails. |
Callback URL checklist
-
https(nothttp) in production - No trailing slash after
salesforce - Query string is
?provider=salesforce - Same URL in Salesforce and in the Pana connect dialog
Self-hosted deployments (optional)
Platform operators can set default Connected App credentials in the backend environment so workspaces can connect without pasting keys:
SALESFORCE_CLIENT_ID=<Consumer Key>
SALESFORCE_CLIENT_SECRET=<Consumer Secret>
Per-workspace credentials entered in the connect dialog override these defaults when provided.