Dial your Salesforce reports and open call tasks, and log every call back as a completed Task on the Contact or Lead.
Connect Salesforce and you can dial any contact or lead report, or all your open call tasks,
straight from the dialer. Every call you log becomes a completed Task on the record, and an
active cadence step moves forward.Nothing is installed in your org. Each rep signs in as themselves, so your sharing rules and field
security apply to Salesfinity exactly as they apply to the rep.
If your org limits which apps users may authorize (Setup › Connected Apps OAuth Usage, or
“Admin approved users are pre-authorized”), approve Salesfinity. Then assign it to the
profiles or permission sets your reps use. Reps who are not assigned are refused at sign-in.
2
Give reps API access
The rep’s profile or a permission set needs API Enabled. Salesfinity does everything
through the API, so a user without it cannot connect.
3
Check object permissions
Salesfinity acts as the rep, so the rep needs the access in
objects and access. A standard sales profile usually has it. The one
most often missing is Run Reports, with access to the report folders reps import from.
4
Prepare the reports reps will import
Use a contact report or a lead report, and include the Contact ID or Lead ID
column. That is how Salesfinity finds the records. An import reads the first 2,000 records of
a report, so split bigger territories into several reports.
5
Map a custom task process, if you have one
If your org uses custom Task statuses, a custom call type value or a custom due date field,
set them under Task import in the integration’s settings. Orgs on the standard Task
process can keep the defaults.
6
Decide on Sales Engagement
With Sales Engagement turned on, a logged call completes the current cadence step. Reps can
also add, move and remove people in cadences from the dialer. Without it, everything else
still works.
Go to Settings › Connections › Integrations and find the Salesforce card.
2
Sign in and allow access
Click Connect, sign in with your own Salesforce login and click Allow.
3
Test with one call
Import a small report, dial one record and log the call. In Salesforce, the record should now
have a completed call Task under your name.
Each rep must connect with their own login. If an admin connects once for everyone, every call is
logged under the admin’s name. Salesforce cannot be shared with the team yet.
You are done when a test call shows as a completed Task on the Contact or Lead, under the rep who
made it.
Salesfinity is a Salesforce connected app. When you connect, Salesforce asks you to allow these
scopes.
Scope
Why Salesfinity needs it
api
Read and write records through the REST, SOQL and Analytics APIs.
full
Reach the data your user can already see, so imports and call logging follow your sharing rules.
web
Open records in Salesforce from links in Salesfinity.
id, email, profile
Identify the connected user, so calls are attributed correctly and “my tasks” means you.
content
Read report content when importing from a report.
Salesfinity only ever acts as the connected user. It cannot read a record or run a report that the
rep’s Salesforce user cannot. There is no managed package, Apex, trigger, custom object or custom
field.
The Salesforce card connects to production through login.salesforce.com. The Salesforce
Sandbox card connects through test.salesforce.com. They are separate integrations with their
own mappings, so you can test in a sandbox while dialing against production.
Pick a contact report or a lead report. Salesfinity runs it and imports the Contacts or Leads
it returns, up to 2,000. The list is named after the report.
Import with no report selected. Salesfinity pulls your open Tasks that are calls and are due
today or earlier, with the Contact or Lead each task is on. If a record has several open
tasks, the earliest is used. The list is named “All call tasks”. What counts as open and as a
call comes from your Task import settings.
Contacts use the contact field mapping and Leads use the lead field mapping. Every record keeps its
Salesforce ID and object type, so the call goes back to the right object. A field the rep cannot
see is left out of the import rather than causing an error.
How an import runs, step by step
Collect record IDs. For a report, Salesfinity runs it and reads the Contact or Lead ID
from each row. For “All call tasks”, it queries your open call Tasks by due date and takes
the record each one is related to.
Load the records. It queries Contacts and Leads 100 IDs at a time. It selects only the
fields in your mappings and custom fields, including relationship fields such as the
account name.
Build the list. Each record becomes a contact with its Salesforce ID, object type and a
link back to the record. Task imports also keep the task ID and due date.
When you log a call on a Salesforce Contact or Lead, Salesfinity creates a Task.
Task field
Value
Related to
The Contact or Lead you dialed
Status
Completed
Subject
”Call made to: (number), from: (number)”, plus the cadence name when the record came from one
Task subtype
Call
Call type
Outbound
Call disposition
The Salesforce value mapped from your Salesfinity disposition
Call duration
Talk time in seconds
Description
Your call notes
Activity date
The day of the call
If the record is in a Sales Engagement cadence and its current step is active, Salesfinity
marks that step complete so the cadence moves on. Without Sales Engagement, the call is still
logged and nothing else changes.
Calls on records that did not come from Salesforce
If you dial someone from a CSV or a custom list, the call still reaches Salesforce when it is
connected. Salesfinity looks for the person among Contacts and Leads by LinkedIn URL, email or
phone number. If nobody matches, it creates a Contact from your field mapping, skipping any mapped
field the Contact object does not have, and then logs the call.Phone numbers found by enrichment or edited in the dialer can also be
written to the Contact or Lead.
Sales Engagement cadences show in the dialer’s sequence controls. You can add a Contact or
Lead to a cadence, remove it, and move it to another cadence. All three need Sales
Engagement in your org.
Two separate maps, one for Contacts and one for Leads, from Salesforce fields to Salesfinity
fields. Relationship fields such as the account name are available for Contacts.
Custom fields
Extra Contact, Lead, Account and Opportunity fields to bring across. Contact and Lead fields
land on the contact in the dialer. Account and Opportunity fields feed the account view and
Ari.
Disposition mapping
Maps each Salesfinity disposition to a Salesforce call disposition value. The automatic
suggestion fills the table from your org’s picklist values.
Task import
Controls what “All call tasks” pulls and how tasks are closed. Map three Task fields:
Status: the field that says a task is open, and the values that count as open.
Defaults to Status and “not Completed”.
Task type / call type: the field and values that mark a task as a call. Defaults to
Task Subtype equal to Call.
Due date: the field used to find tasks due today or earlier. Defaults to Activity
Date.
Orgs with a custom task process should map these to their own fields, so the import matches
what reps see in Salesforce.
Salesfinity refreshes the Salesforce session on every request with your refresh token, so reps
are not asked to sign in again. They only need to reconnect if the refresh token is revoked. That
happens when an admin revokes the connected app, when a password change also revokes sessions, or
when the org’s refresh token policy expires it. The card then reads as disconnected, and the rep
reconnects from the same card.
No. Each rep connects with their own Salesforce login and every action runs as that user. A
shared integration user would log every call under one name and skip your sharing rules, so
Salesfinity does not support it.
Where are our credentials stored?
Salesfinity stores each connected user’s access token, refresh token and instance URL in its
credential store. It never stores passwords. Tokens are never shown in the app or returned by
the API. Disconnecting deletes them, and revoking the connected app in Salesforce makes them
useless right away.
How much API usage should we expect?
An import costs one report run plus one SOQL query per 100 records. A logged call costs a
short identity check and one Task insert. With Sales Engagement, add one cadence query and one
action call.
Can we limit Salesfinity to certain records?
Yes, in Salesforce. Salesfinity only sees what the connected user sees, so profiles,
permission sets, sharing rules and field level security all apply.
Does it work with custom objects or a custom lead process?
Contacts and Leads are supported. Custom fields on either work through the custom field
pickers, and a custom Task process works through Task import. Custom objects are not
imported.
Can we test before rolling out?
Yes. Connect the Salesforce Sandbox card to a sandbox org. It has its own mappings, so
nothing from testing touches production.
Can Ari change our Salesforce data?
Ari can look up Salesforce records for you. When it wants to create or update a record, it
shows you the change and waits for your approval. Ari is available on Enterprise and
Enterprise+ plans. See Ari.
What happens after you log a call, and what each sync status means.
Fix integration problems
Reconnect prompts, empty imports and failed syncs.
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Salesfinity Docs","description":"Learn Salesfinity, the agentic sales platform: build lists with Ari, run parallel dialing sessions, run sequences, connect your CRM, and use the REST API and MCP server. Build pipeline at superhuman speed.","colors":{"primary":"#5429D8","light":"#8B6CF0","dark":"#5429D8"},"logo":{"light":"https://mintcdn.com/salesfinity/YBsYR5N3Fg_u90-H/logo/light.svg?fit=max\u0026auto=format\u0026n=YBsYR5N3Fg_u90-H\u0026q=85\u0026s=e21e087ae3d1330def1fbf87274af05b","dark":"https://mintcdn.com/salesfinity/YBsYR5N3Fg_u90-H/logo/dark.svg?fit=max\u0026auto=format\u0026n=YBsYR5N3Fg_u90-H\u0026q=85\u0026s=3c5233eb319342816ee870dca049dbce"},"favicon":"https://mintcdn.com/salesfinity/YBsYR5N3Fg_u90-H/favicon.png?fit=max\u0026auto=format\u0026n=YBsYR5N3Fg_u90-H\u0026q=85\u0026s=6beb35ff3cf64db277c41d8e84730ceb","appearance":{"default":"light"},"background":{"color":{"light":"#F7F6FA","dark":"#0E0B18"}},"navbar":{"links":[{"href":"https://support.salesfinity.ai","label":"Help Center"},{"href":"https://web.salesfinity.co/dashboard/dialer","label":"Open Salesfinity"}],"primary":{"type":"button","label":"Book a demo","href":"https://salesfinity.ai/demo"}},"footer":{"socials":{"linkedin":"https://www.linkedin.com/company/salesfinity-co","facebook":"https://www.facebook.com/people/Salesfinity/61556891038304","website":"https://salesfinity.ai"},"links":[{"header":"Product","items":[{"label":"Salesfinity","href":"https://salesfinity.ai"},{"label":"Pricing","href":"https://salesfinity.ai/pricing"},{"label":"Integrations","href":"https://salesfinity.ai/integrations"},{"label":"Book a demo","href":"https://salesfinity.ai/demo"}]},{"header":"Resources","items":[{"label":"Help Center","href":"https://support.salesfinity.ai"},{"label":"Blog","href":"https://salesfinity.ai/blog"},{"label":"System status","href":"https://salesfinity.statuspage.io"}]},{"header":"Company","items":[{"label":"About","href":"https://salesfinity.ai/about"},{"label":"Customers","href":"https://salesfinity.ai/customers"},{"label":"Legal","href":"https://salesfinity.ai/legal"}]}]},"search":{"prompt":"Search the docs or ask a question"},"seo":{"metatags":{"og:site_name":"Salesfinity Docs","og:image":"https://docs.salesfinity.ai/images/og.jpg","og:image:width":"1200","og:image:height":"630","twitter:card":"summary_large_image","twitter:image":"https://docs.salesfinity.ai/images/og.jpg"}},"fonts":{"heading":{"family":"Onest","weight":600},"body":{"family":"Onest","weight":400}},"styling":{"eyebrows":"section","codeblocks":"system","latex":false},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"navigation":{"global":{"anchors":[{"anchor":"Help Center","icon":"circle-question","href":"https://support.salesfinity.ai"},{"anchor":"Blog","icon":"newspaper","href":"https://salesfinity.ai/blog"},{"anchor":"Status page","icon":"signal","href":"https://salesfinity.statuspage.io"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"salesfinity","hasAudioNarration":false,"actualSubdomain":"salesfinity","customDomains":["docs.salesfinity.ai"],"gitSource":{"type":"github","owner":"salesfinity-web","repo":"api-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad17f94e88740c316d6280b","collectionId":"68ad612b-f99a-4daf-b9c5-a935080be466","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad17f94e88740c316d6280b"},"entitlements":{},"buildId":"6ad17f94e88740c316d6280b","clientVersion":"0.0.3908","searchFilterCounts":[{"language":"default","tag":"Developers","count":130},{"language":"default","tag":"Sequencer API","count":77},{"language":"default","tag":"Dialer API","count":24},{"language":"default","tag":"Get started","count":22},{"language":"default","tag":"Dialer","count":20},{"language":"default","tag":"Tasks","count":17},{"language":"default","tag":"Enrollments","count":16},{"language":"default","tag":"Sequencer","count":13},{"language":"default","tag":"Use cases","count":13},{"language":"default","tag":"Help","count":12}]},"assistantConfig":{},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-branches-v2-autocommit","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-branches-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"teamspace","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"client-snapshot-docs-config","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":true},"customCss":[{"filePath":"components.css","content":":root{--sf-accent:#5429d8;--sf-ember-deep:#0e0328;--sf-ember-violet:#5429d8;--sf-ember-magenta:#c02a8a;--sf-ember-coral:#ff5a3c;--sf-ember-head:#f5f0ff;--sf-ember-body:#d6ccf7;--sf-ember-accent:#c5b0ff;--sf-ember-shade:linear-gradient(90deg, rgba(12, 2, 44, 0.78) 0%, rgba(12, 2, 44, 0.5) 45%, rgba(12, 2, 44, 0) 75%);--sf-prompt-bg:#faf8ff;--sf-prompt-border:rgba(84, 41, 216, 0.14);--sf-prompt-text:#1d1730;--sf-prompt-muted:#6b6485;--sf-frame-bg:rgba(249, 250, 251, 0.6);--sf-frame-border:rgba(17, 12, 34, 0.08)}html.dark{--sf-prompt-bg:rgba(84, 41, 216, 0.08);--sf-prompt-border:rgba(197, 176, 255, 0.16);--sf-prompt-text:#ece7fb;--sf-prompt-muted:#a59cc4;--sf-frame-bg:rgba(31, 41, 55, 0.25);--sf-frame-border:rgba(255, 255, 255, 0.08)}.sf-prompt{position:relative;margin:1.25rem 0;border:1px solid var(--sf-prompt-border);border-left:3px solid var(--sf-accent);border-radius:12px;background:var(--sf-prompt-bg);overflow:hidden}html.dark .sf-prompt{border-left-color:var(--sf-ember-accent)}.sf-prompt-head{display:flex;align-items:center;justify-content:space-between;gap:.75rem;padding:.5rem .625rem 0 1rem}.sf-prompt-copy,.sf-prompt-label{display:inline-flex;align-items:center;gap:.375rem;font-size:.75rem}.sf-prompt-label{font-weight:600;letter-spacing:.02em;text-transform:uppercase;color:var(--sf-accent)}html.dark .sf-prompt-label{color:var(--sf-ember-accent)}.sf-prompt-copy{padding:.3rem .55rem;border:1px solid transparent;border-radius:8px;background:0 0;font:inherit;font-weight:500;color:var(--sf-prompt-muted);cursor:pointer;transition:background-color 150ms ease,color 150ms ease,border-color 150ms ease}.sf-prompt-copy:hover{color:var(--sf-accent);background:rgba(84,41,216,.08);border-color:rgba(84,41,216,.14)}html.dark .sf-prompt-copy:hover{color:var(--sf-ember-head);background:rgba(197,176,255,.1);border-color:rgba(197,176,255,.18)}.sf-prompt-copy:focus-visible{outline:2px solid var(--sf-accent);outline-offset:1px}.sf-prompt-body{padding:.375rem 1rem .875rem;font-family:inherit;font-size:.9375rem;line-height:1.6;color:var(--sf-prompt-text);white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word}.sf-prompt-body p{margin:0 0 .6em}.sf-prompt-body p:last-child{margin-bottom:0}.sf-prompt-body ol,.sf-prompt-body ul{margin:.25em 0 .6em;padding-left:1.25em;white-space:normal}.sf-prompt-body ul{list-style:disc}.sf-prompt-body ol{list-style:decimal}.sf-prompt-body code{font-size:.875em;padding:.1em .3em;border-radius:4px;background:rgba(84,41,216,.08)}.sf-cover{position:relative;display:flex;align-items:flex-end;min-height:220px;margin:.5rem 0 2rem;border-radius:16px;overflow:hidden;isolation:isolate;background:radial-gradient(120% 140% at 85% 110%,var(--sf-ember-coral) 0%,rgba(255,90,60,0) 45%),radial-gradient(90% 120% at 70% 40%,var(--sf-ember-magenta) 0%,rgba(192,42,138,0) 60%),linear-gradient(120deg,var(--sf-ember-deep) 0%,var(--sf-ember-violet) 60%,var(--sf-ember-magenta) 100%);box-shadow:0 1px 2px rgba(14,3,40,.06),0 12px 32px -12px rgba(84,41,216,.35)}.sf-cover-img{position:absolute;inset:0;z-index:-2;width:100%;height:100%;margin:0;object-fit:cover;object-position:center;border-radius:0}.sf-cover-shade{position:absolute;inset:0;z-index:-1;background:var(--sf-ember-shade)}.sf-cover-text{max-width:34rem;padding:1.75rem 2rem}.sf-cover-eyebrow{margin-bottom:.5rem;font-size:.75rem;font-weight:600;letter-spacing:.12em;text-transform:uppercase;color:var(--sf-ember-accent)}.sf-cover-title{font-size:1.875rem;font-weight:650;line-height:1.15;letter-spacing:-.02em;color:var(--sf-ember-head);text-wrap:balance}.sf-cover-desc{margin-top:.625rem;font-size:1rem;line-height:1.5;color:var(--sf-ember-body);text-wrap:pretty}@media (max-width:640px){.sf-cover{min-height:168px;border-radius:12px}.sf-cover-text{padding:1.25rem}.sf-cover-title{font-size:1.5rem}.sf-cover-desc{font-size:.9375rem}.sf-cover-shade{background:linear-gradient(90deg,rgba(12,2,44,.78) 0,rgba(12,2,44,.6) 70%,rgba(12,2,44,.35) 100%)}}.sf-video{margin:1.5rem 0}.sf-video-frame{padding:.5rem;border:1px solid var(--sf-frame-border);border-radius:16px;background:var(--sf-frame-bg);overflow:hidden}.sf-video-el{display:block;width:100%;height:auto;margin:0;border-radius:10px;background:var(--sf-ember-deep);object-fit:cover}.sf-video-caption{margin-top:.625rem;padding:0 .5rem;font-size:.875rem;line-height:1.5;text-align:center;color:var(--sf-prompt-muted)}.sf-status{display:inline-flex;align-items:center;gap:.35em;padding:.15em .6em;border:1px solid transparent;border-radius:999px;font-size:.75rem;font-weight:600;line-height:1.4;letter-spacing:.01em;white-space:nowrap;vertical-align:middle}.sf-status::before{content:\"\";width:.45em;height:.45em;border-radius:999px;background:currentColor}h1 .sf-status,h2 .sf-status,h3 .sf-status,h4 .sf-status{margin-left:.5rem;font-size:.75rem;position:relative;top:-.1em}.sf-status-early-access{color:#4320b4;background:#efeaff;border-color:rgba(84,41,216,.2)}.sf-status-coming-soon{color:#8a4b05;background:#fff4dc;border-color:rgba(217,140,20,.28)}.sf-status-beta{color:#1849a9;background:#e6efff;border-color:rgba(41,112,255,.22)}html.dark .sf-status-early-access{color:#c5b0ff;background:rgba(84,41,216,.22);border-color:rgba(197,176,255,.28)}html.dark .sf-status-coming-soon{color:#fcd38d;background:rgba(217,140,20,.16);border-color:rgba(252,211,141,.26)}html.dark .sf-status-beta{color:#a4c4ff;background:rgba(41,112,255,.18);border-color:rgba(164,196,255,.26)}@media (prefers-reduced-motion:reduce){.sf-prompt-copy{transition:none}}"},{"filePath":"home.css","content":"#content-area:has(.sf-home-hero) header#header,#content-area:has(.sf-home-hero)>#header,#content-container:has(.sf-home-hero) #header{display:none}.sf-home-hero{position:relative;overflow:hidden;isolation:isolate;margin:.25rem 0 2.5rem;padding:clamp(28px,5vw,56px);min-height:320px;border-radius:20px;background:#0e0328 linear-gradient(120deg,#0e0328 0,#5429d8 45%,#c02a8a 75%,#ff5a3c 100%);box-shadow:0 18px 40px rgba(42,10,126,.16);display:flex;flex-direction:column;justify-content:center}.sf-home-hero-img{position:absolute;inset:0;z-index:-2;width:100%;height:100%;object-fit:cover;object-position:center right;margin:0!important;border-radius:0!important;max-height:none!important}.sf-home-hero-shade{position:absolute;inset:0;z-index:-1;background:linear-gradient(90deg,rgba(12,2,44,.78) 0,rgba(12,2,44,.5) 45%,rgba(12,2,44,0) 75%)}.sf-home-eyebrow{margin:0 0 14px;font-size:13px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:#c5b0ff}.sf-home-hero h1.sf-home-title{margin:0;max-width:640px;font-size:clamp(38px,5.4vw,60px);font-weight:700;line-height:1;letter-spacing:-.045em;color:#f5f0ff}.sf-home-lede{max-width:560px;margin:18px 0 0;font-size:17px;line-height:1.55;color:#d6ccf7}.sf-home-actions{display:flex;flex-wrap:wrap;gap:12px;margin-top:28px}.sf-home-btn{display:inline-flex;align-items:center;gap:8px;min-height:44px;padding:10px 18px;border-radius:10px;font-size:15px;font-weight:600;text-decoration:none!important;border:1px solid rgba(245,240,255,.28)!important;color:#f5f0ff!important;background:rgba(245,240,255,.08);backdrop-filter:blur(8px);transition:transform .18s ease,background-color .18s ease,box-shadow .18s ease}.sf-home-btn:hover{transform:translateY(-1px);background:rgba(245,240,255,.16)}.sf-home-btn-primary{border-color:#f5f0ff!important;background:#f5f0ff;color:#2a0a7e!important}.sf-home-btn-primary:hover{background:#fff;box-shadow:0 8px 22px rgba(12,2,44,.35)}.sf-home-btn:focus-visible{outline:2px solid #c5b0ff;outline-offset:2px}.sf-home-meta{margin-top:18px;font-size:13px;color:#c5b0ff}@media (max-width:640px){.sf-home-hero{min-height:0;padding:28px 20px;border-radius:16px}.sf-home-hero-shade{background:linear-gradient(90deg,rgba(12,2,44,.8) 0,rgba(12,2,44,.62) 100%)}.sf-home-lede{font-size:16px}}@media (prefers-reduced-motion:reduce){.sf-home-btn{transition:none}.sf-home-btn:hover{transform:none}}"},{"filePath":"style.css","content":":root{--sfb-accent:#5429d8;--sfb-accent-soft:#8b6cf0;--sfb-bg:#f7f6fa;--sfb-surface:#ffffff;--sfb-muted:#f1eff6;--sfb-border:#e3dfec;--sfb-border-strong:#cdc6dc;--sfb-text:#16141c;--sfb-text-muted:#5d5a66;--sfb-accent-hover:rgba(84, 41, 216, 0.05);--sfb-accent-open:rgba(84, 41, 216, 0.03);--sfb-accent-border:rgba(84, 41, 216, 0.28);--sfb-shadow-sm:0 1px 2px rgba(42, 10, 126, 0.05);--sfb-shadow-lift:0 12px 26px -6px rgba(84, 41, 216, 0.16), 0 4px 10px -4px rgba(42, 10, 126, 0.08);--sfb-selection:rgba(84, 41, 216, 0.16)}html.dark{--sfb-accent:#8b6cf0;--sfb-accent-soft:#c5b0ff;--sfb-bg:#0e0b18;--sfb-surface:#15121f;--sfb-muted:#181524;--sfb-border:#2a2638;--sfb-border-strong:#3a3550;--sfb-text:#f5f0ff;--sfb-text-muted:#b5aed0;--sfb-accent-hover:rgba(139, 108, 240, 0.1);--sfb-accent-open:rgba(139, 108, 240, 0.07);--sfb-accent-border:rgba(139, 108, 240, 0.36);--sfb-shadow-sm:0 1px 2px rgba(0, 0, 0, 0.3);--sfb-shadow-lift:0 14px 30px -8px rgba(84, 41, 216, 0.38), 0 4px 12px -4px rgba(0, 0, 0, 0.4);--sfb-selection:rgba(139, 108, 240, 0.32)}::selection{background:var(--sfb-selection)}#content-area h1,#page-title{letter-spacing:-.03em;line-height:1.1}#content-area h2{letter-spacing:-.02em;line-height:1.2}#content-area h3,#content-area h4{letter-spacing:-.015em;line-height:1.25}.eyebrow{letter-spacing:.01em}#content-area strong{font-weight:600}#content-area img:not(.no-style):not(.sf-cover-img):not([data-component-part=card-image]){border-radius:8px}#content-area iframe{width:100%;border:0;border-radius:8px}#content-area iframe[src*=\"loom.com\"],#content-area iframe[src*=\"youtube-nocookie.com\"],#content-area iframe[src*=\"youtube.com\"]{aspect-ratio:16/9;height:auto}#content-area table,.frame{border:1px solid var(--sfb-border)}.frame{border-radius:16px!important;background:var(--sfb-muted)!important}.frame img{border-radius:10px!important}.card{border-radius:14px!important;border-color:var(--sfb-border)!important;background:var(--sfb-surface)!important;box-shadow:var(--sfb-shadow-sm);transition:transform 200ms ease,box-shadow 200ms ease,border-color 200ms ease}.card[href]:hover,a.card:hover{transform:translateY(-2px);border-color:var(--sfb-accent-border)!important;box-shadow:var(--sfb-shadow-lift)}.card img[data-component-part=card-image]{transition:transform 300ms ease}a.card:hover img[data-component-part=card-image]{transform:scale(1.03)}@media (prefers-reduced-motion:reduce){.card,.card img[data-component-part=card-image]{transition:none}.card[href]:hover,a.card:hover,a.card:hover img[data-component-part=card-image]{transform:none}}.accordion,.accordion-group{border-color:var(--sfb-border)!important}.accordion-group{background:0 0!important}.accordion{background-color:var(--sfb-muted)!important;transition:border-color 150ms ease,background-color 150ms ease}.accordion:hover{border-color:var(--sfb-accent-border)!important}.accordion[aria-expanded=true],.accordion[open]{border-color:var(--sfb-accent-border)!important;background-color:var(--sfb-accent-open)!important}details.accordion>summary{background-color:transparent!important}details.accordion>summary:hover{background-color:var(--sfb-accent-hover)!important}.accordion,.callout{border-radius:14px!important}.code-block,.code-group{border-radius:12px!important}#content-area table{border-collapse:separate;border-spacing:0;border-radius:12px;overflow:hidden;font-size:.9375rem}#content-area tbody td,#content-area thead th{border-bottom:1px solid var(--sfb-border)!important}#content-area thead th{background:var(--sfb-muted);color:var(--sfb-text);font-weight:600;font-size:.8125rem;letter-spacing:.01em}#content-area td,#content-area th{padding:.65rem .9rem!important;vertical-align:top}#content-area tbody td{border-top:0!important}#content-area tbody tr:last-child td{border-bottom:0!important}#content-area tbody tr:hover td{background:var(--sfb-accent-hover)}#topbar-cta-button a>span:first-child{border-radius:9999px;transition:box-shadow 150ms ease}#topbar-cta-button a{padding-left:.9rem;padding-right:.7rem;transition:transform 150ms ease}#topbar-cta-button a:hover{transform:translateY(-1px)}#topbar-cta-button a:hover>span:first-child{box-shadow:0 6px 16px rgba(84,41,216,.32)}a[href*=\"utm_campaign=poweredBy\"]{display:none!important}*{scrollbar-width:thin;scrollbar-color:var(--sfb-border-strong) transparent}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-thumb{background:var(--sfb-border-strong);border-radius:9999px}::-webkit-scrollbar-track{background:0 0}"}],"page":{"pagePath":"integrations/salesforce","slug":"/integrations/salesforce","pageMetadata":{"title":"Connect Salesforce","sidebarTitle":"Salesforce","description":"Dial your Salesforce reports and open call tasks, and log every call back as a completed Task on the Contact or Lead.","href":"/integrations/salesforce"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Dial your Salesforce reports and open call tasks, and log every call back as a completed Task on the Contact or Lead.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CardGroup,Check,Heading,Mermaid,Step,Steps,Tab,Table,Tabs,Warning}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!Check)_missingMdxReference(`Check`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Mermaid)_missingMdxReference(`Mermaid`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Connect Salesforce and you can dial any contact or lead report, or all your open call tasks,\nstraight from the dialer. Every call you log becomes a completed Task on the record, and an\nactive cadence step moves forward.`}),`\n`,_jsx(_components.p,{children:`Nothing is installed in your org. Each rep signs in as themselves, so your sharing rules and field\nsecurity apply to Salesfinity exactly as they apply to the rep.`}),`\n`,_jsx(Heading,{level:`2`,id:`before-you-start`,children:`Before you start`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`The Salesfinity connected app is allowed in your org`}),`, if your org limits which apps users\nmay sign in to.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Reps have API Enabled`}),` on their profile or a permission set.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Reports to import from`}),`, with the Contact ID or Lead ID column included.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`set-up-your-org-admins-once`,children:`Set up your org (admins, once)`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Allow the Salesfinity connected app`,children:_jsxs(_components.p,{children:[`If your org limits which apps users may authorize (`,_jsx(_components.strong,{children:`Setup › Connected Apps OAuth Usage`}),`, or\n“Admin approved users are pre-authorized”), approve Salesfinity. Then assign it to the\nprofiles or permission sets your reps use. Reps who are not assigned are refused at sign-in.`]})}),_jsx(Step,{title:`Give reps API access`,children:_jsxs(_components.p,{children:[`The rep’s profile or a permission set needs `,_jsx(_components.strong,{children:`API Enabled`}),`. Salesfinity does everything\nthrough the API, so a user without it cannot connect.`]})}),_jsx(Step,{title:`Check object permissions`,children:_jsxs(_components.p,{children:[`Salesfinity acts as the rep, so the rep needs the access in\n`,_jsx(_components.a,{href:`#objects-and-access`,children:`objects and access`}),`. A standard sales profile usually has it. The one\nmost often missing is `,_jsx(_components.strong,{children:`Run Reports`}),`, with access to the report folders reps import from.`]})}),_jsx(Step,{title:`Prepare the reports reps will import`,children:_jsxs(_components.p,{children:[`Use a `,_jsx(_components.strong,{children:`contact report`}),` or a `,_jsx(_components.strong,{children:`lead report`}),`, and include the `,_jsx(_components.strong,{children:`Contact ID`}),` or `,_jsx(_components.strong,{children:`Lead ID`}),`\ncolumn. That is how Salesfinity finds the records. An import reads the first 2,000 records of\na report, so split bigger territories into several reports.`]})}),_jsx(Step,{title:`Map a custom task process, if you have one`,children:_jsxs(_components.p,{children:[`If your org uses custom Task statuses, a custom call type value or a custom due date field,\nset them under `,_jsx(_components.strong,{children:`Task import`}),` in the integration’s settings. Orgs on the standard Task\nprocess can keep the defaults.`]})}),_jsx(Step,{title:`Decide on Sales Engagement`,children:_jsx(_components.p,{children:`With Sales Engagement turned on, a logged call completes the current cadence step. Reps can\nalso add, move and remove people in cadences from the dialer. Without it, everything else\nstill works.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`connect-your-account-every-rep`,children:`Connect your account (every rep)`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Open the Salesforce card`,children:_jsxs(_components.p,{children:[`Go to `,_jsx(_components.strong,{children:`Settings › Connections › Integrations`}),` and find the `,_jsx(_components.strong,{children:`Salesforce`}),` card.`]})}),_jsx(Step,{title:`Sign in and allow access`,children:_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Connect`}),`, sign in with your own Salesforce login and click `,_jsx(_components.strong,{children:`Allow`}),`.`]})}),_jsx(Step,{title:`Test with one call`,children:_jsx(_components.p,{children:`Import a small report, dial one record and log the call. In Salesforce, the record should now\nhave a completed call Task under your name.`})})]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Each rep must connect with their own login. If an admin connects once for everyone, every call is\nlogged under the admin’s name. Salesforce cannot be shared with the team yet.`})}),`\n`,_jsx(Check,{children:_jsx(_components.p,{children:`You are done when a test call shows as a completed Task on the Contact or Lead, under the rep who\nmade it.`})}),`\n`,_jsx(Heading,{level:`2`,id:`permissions-salesforce-asks-for`,children:`Permissions Salesforce asks for`}),`\n`,_jsx(_components.p,{children:`Salesfinity is a Salesforce connected app. When you connect, Salesforce asks you to allow these\nscopes.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Scope`}),_jsx(_components.th,{children:`Why Salesfinity needs it`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`api`})}),_jsx(_components.td,{children:`Read and write records through the REST, SOQL and Analytics APIs.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`full`})}),_jsx(_components.td,{children:`Reach the data your user can already see, so imports and call logging follow your sharing rules.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`web`})}),_jsx(_components.td,{children:`Open records in Salesforce from links in Salesfinity.`})]}),_jsxs(_components.tr,{children:[_jsxs(_components.td,{children:[_jsx(_components.code,{children:`id`}),`, `,_jsx(_components.code,{children:`email`}),`, `,_jsx(_components.code,{children:`profile`})]}),_jsx(_components.td,{children:`Identify the connected user, so calls are attributed correctly and “my tasks” means you.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`content`})}),_jsx(_components.td,{children:`Read report content when importing from a report.`})]})]})]}),`\n`,_jsx(_components.p,{children:`Salesfinity only ever acts as the connected user. It cannot read a record or run a report that the\nrep’s Salesforce user cannot. There is no managed package, Apex, trigger, custom object or custom\nfield.`}),`\n`,_jsx(Heading,{level:`3`,id:`production-and-sandbox`,children:`Production and sandbox`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.strong,{children:`Salesforce`}),` card connects to production through `,_jsx(_components.code,{children:`login.salesforce.com`}),`. The `,_jsx(_components.strong,{children:`Salesforce\nSandbox`}),` card connects through `,_jsx(_components.code,{children:`test.salesforce.com`}),`. They are separate integrations with their\nown mappings, so you can test in a sandbox while dialing against production.`]}),`\n`,_jsx(Heading,{level:`2`,id:`what-salesfinity-imports`,children:`What Salesfinity imports`}),`\n`,_jsxs(Tabs,{children:[_jsx(Tab,{title:`A report`,id:`a-report`,children:_jsx(_components.p,{children:`Pick a contact report or a lead report. Salesfinity runs it and imports the Contacts or Leads\nit returns, up to 2,000. The list is named after the report.`})}),_jsx(Tab,{title:`All call tasks`,id:`all-call-tasks`,children:_jsxs(_components.p,{children:[`Import with no report selected. Salesfinity pulls your open Tasks that are calls and are due\ntoday or earlier, with the Contact or Lead each task is on. If a record has several open\ntasks, the earliest is used. The list is named “All call tasks”. What counts as open and as a\ncall comes from your `,_jsx(_components.strong,{children:`Task import`}),` settings.`]})})]}),`\n`,_jsx(_components.p,{children:`Contacts use the contact field mapping and Leads use the lead field mapping. Every record keeps its\nSalesforce ID and object type, so the call goes back to the right object. A field the rep cannot\nsee is left out of the import rather than causing an error.`}),`\n`,_jsx(AccordionGroup,{children:_jsx(Accordion,{title:`How an import runs, step by step`,id:`how-an-import-runs-step-by-step`,children:_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Collect record IDs.`}),` For a report, Salesfinity runs it and reads the Contact or Lead ID\nfrom each row. For “All call tasks”, it queries your open call Tasks by due date and takes\nthe record each one is related to.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Load the records.`}),` It queries Contacts and Leads 100 IDs at a time. It selects only the\nfields in your mappings and custom fields, including relationship fields such as the\naccount name.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Build the list.`}),` Each record becomes a contact with its Salesforce ID, object type and a\nlink back to the record. Task imports also keep the task ID and due date.`]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`what-salesfinity-writes-back`,children:`What Salesfinity writes back`}),`\n`,_jsxs(_components.p,{children:[`When you log a call on a Salesforce Contact or Lead, Salesfinity creates a `,_jsx(_components.strong,{children:`Task`}),`.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Task field`}),_jsx(_components.th,{children:`Value`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Related to`}),_jsx(_components.td,{children:`The Contact or Lead you dialed`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Status`}),_jsx(_components.td,{children:`Completed`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Subject`}),_jsx(_components.td,{children:`”Call made to: (number), from: (number)”, plus the cadence name when the record came from one`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Task subtype`}),_jsx(_components.td,{children:`Call`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Call type`}),_jsx(_components.td,{children:`Outbound`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Call disposition`}),_jsx(_components.td,{children:`The Salesforce value mapped from your Salesfinity disposition`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Call duration`}),_jsx(_components.td,{children:`Talk time in seconds`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Description`}),_jsx(_components.td,{children:`Your call notes`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Activity date`}),_jsx(_components.td,{children:`The day of the call`})]})]})]}),`\n`,_jsxs(_components.p,{children:[`If the record is in a `,_jsx(_components.strong,{children:`Sales Engagement cadence`}),` and its current step is active, Salesfinity\nmarks that step complete so the cadence moves on. Without Sales Engagement, the call is still\nlogged and nothing else changes.`]}),`\n`,_jsx(Heading,{level:`3`,id:`calls-on-records-that-did-not-come-from-salesforce`,children:`Calls on records that did not come from Salesforce`}),`\n`,_jsx(_components.p,{children:`If you dial someone from a CSV or a custom list, the call still reaches Salesforce when it is\nconnected. Salesfinity looks for the person among Contacts and Leads by LinkedIn URL, email or\nphone number. If nobody matches, it creates a Contact from your field mapping, skipping any mapped\nfield the Contact object does not have, and then logs the call.`}),`\n`,_jsxs(_components.p,{children:[`Phone numbers found by `,_jsx(_components.a,{href:`/enrichment/contacts`,children:`enrichment`}),` or edited in the dialer can also be\nwritten to the Contact or Lead.`]}),`\n`,_jsx(Heading,{level:`2`,id:`the-full-round-trip`,children:`The full round trip`}),`\n`,_jsx(Mermaid,{chart:`sequenceDiagram\n autonumber\n actor Rep\n participant SF as Salesfinity\n participant Org as Salesforce org\n Rep->>SF: Connect Salesforce\n SF->>Org: Sign-in (connected app, acts as the rep)\n Org-->>SF: Connection approved\n Rep->>SF: Import a report or \"All call tasks\"\n SF->>Org: Run the report, or find your open call tasks\n Org-->>SF: Contact and Lead IDs\n SF->>Org: Read the fields you mapped\n Org-->>SF: Records\n SF-->>Rep: Contact list with Salesforce IDs\n Rep->>SF: Dial, then log the call\n SF->>Org: Create completed Task on the Contact or Lead\n SF->>Org: Mark active cadence step complete (Sales Engagement)\n SF-->>Rep: Call history shows sync status and link`}),`\n`,_jsx(Heading,{level:`2`,id:`objects-and-access`,children:`Objects and access`}),`\n`,_jsx(_components.p,{children:`What Salesfinity reads and writes, and the access the rep needs for each. Field level security\napplies.`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Object`}),_jsx(_components.th,{children:`Access`}),_jsx(_components.th,{children:`What Salesfinity does with it`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Contact`}),_jsx(_components.td,{children:`Read, create, edit`}),_jsx(_components.td,{children:`Import mapped fields; create a Contact for a CSV contact who is not in Salesforce; write phone numbers back`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Lead`}),_jsx(_components.td,{children:`Read, edit`}),_jsx(_components.td,{children:`Import mapped fields from lead reports and tasks; write phone numbers back`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Task`}),_jsx(_components.td,{children:`Read, create, edit`}),_jsx(_components.td,{children:`Read open call tasks for “All call tasks”; create a completed Task for every logged call`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Account`}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:`Account fields on the contact card, account custom fields, account lists`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Opportunity`}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:`Deal fields on the contact card and opportunity-based lists`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Report`}),_jsx(_components.td,{children:`Run Reports`}),_jsx(_components.td,{children:`Run the chosen report to collect record IDs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`User`}),_jsx(_components.td,{children:`Read`}),_jsx(_components.td,{children:`Resolve the connected user for “my tasks”`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`ActionCadence, ActionCadenceStepTracker`}),_jsx(_components.td,{children:`Read, plus Sales Engagement`}),_jsx(_components.td,{children:`Find the active cadence step and complete it; add, move and remove people`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Object describe`}),_jsx(_components.td,{children:`Standard`}),_jsx(_components.td,{children:`Find fields for the field mapping and custom field pickers`})]})]})]}),`\n`,_jsx(_components.p,{children:`The dialer never deletes a Salesforce record. It creates one only in the case above: a CSV contact\nwith no match.`}),`\n`,_jsx(Heading,{level:`2`,id:`cadences-from-the-dialer`,children:`Cadences from the dialer`}),`\n`,_jsxs(_components.p,{children:[`Sales Engagement cadences show in the dialer’s sequence controls. You can `,_jsx(_components.strong,{children:`add`}),` a Contact or\nLead to a cadence, `,_jsx(_components.strong,{children:`remove`}),` it, and `,_jsx(_components.strong,{children:`move`}),` it to another cadence. All three need Sales\nEngagement in your org.`]}),`\n`,_jsx(Heading,{level:`2`,id:`settings-reference`,children:`Settings reference`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Contact field mapping and lead field mapping`,id:`contact-field-mapping-and-lead-field-mapping`,children:_jsx(_components.p,{children:`Two separate maps, one for Contacts and one for Leads, from Salesforce fields to Salesfinity\nfields. Relationship fields such as the account name are available for Contacts.`})}),_jsx(Accordion,{title:`Custom fields`,id:`custom-fields`,children:_jsx(_components.p,{children:`Extra Contact, Lead, Account and Opportunity fields to bring across. Contact and Lead fields\nland on the contact in the dialer. Account and Opportunity fields feed the account view and\nAri.`})}),_jsx(Accordion,{title:`Disposition mapping`,id:`disposition-mapping`,children:_jsx(_components.p,{children:`Maps each Salesfinity disposition to a Salesforce call disposition value. The automatic\nsuggestion fills the table from your org’s picklist values.`})}),_jsxs(Accordion,{title:`Task import`,id:`task-import`,children:[_jsx(_components.p,{children:`Controls what “All call tasks” pulls and how tasks are closed. Map three Task fields:`}),_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Status`}),`: the field that says a task is open, and the values that count as open.\nDefaults to Status and “not Completed”.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Task type / call type`}),`: the field and values that mark a task as a call. Defaults to\nTask Subtype equal to Call.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Due date`}),`: the field used to find tasks due today or earlier. Defaults to Activity\nDate.`]}),`\n`]}),_jsx(_components.p,{children:`Orgs with a custom task process should map these to their own fields, so the import matches\nwhat reps see in Salesforce.`})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`staying-connected`,children:`Staying connected`}),`\n`,_jsx(_components.p,{children:`Salesfinity refreshes the Salesforce session on every request with your refresh token, so reps\nare not asked to sign in again. They only need to reconnect if the refresh token is revoked. That\nhappens when an admin revokes the connected app, when a password change also revokes sessions, or\nwhen the org’s refresh token policy expires it. The card then reads as disconnected, and the rep\nreconnects from the same card.`}),`\n`,_jsx(Heading,{level:`2`,id:`questions-admins-ask`,children:`Questions admins ask`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Do we need a dedicated integration user?`,id:`do-we-need-a-dedicated-integration-user`,children:_jsx(_components.p,{children:`No. Each rep connects with their own Salesforce login and every action runs as that user. A\nshared integration user would log every call under one name and skip your sharing rules, so\nSalesfinity does not support it.`})}),_jsx(Accordion,{title:`Where are our credentials stored?`,id:`where-are-our-credentials-stored`,children:_jsx(_components.p,{children:`Salesfinity stores each connected user’s access token, refresh token and instance URL in its\ncredential store. It never stores passwords. Tokens are never shown in the app or returned by\nthe API. Disconnecting deletes them, and revoking the connected app in Salesforce makes them\nuseless right away.`})}),_jsx(Accordion,{title:`How much API usage should we expect?`,id:`how-much-api-usage-should-we-expect`,children:_jsx(_components.p,{children:`An import costs one report run plus one SOQL query per 100 records. A logged call costs a\nshort identity check and one Task insert. With Sales Engagement, add one cadence query and one\naction call.`})}),_jsx(Accordion,{title:`Can we limit Salesfinity to certain records?`,id:`can-we-limit-salesfinity-to-certain-records`,children:_jsx(_components.p,{children:`Yes, in Salesforce. Salesfinity only sees what the connected user sees, so profiles,\npermission sets, sharing rules and field level security all apply.`})}),_jsx(Accordion,{title:`Does it work with custom objects or a custom lead process?`,id:`does-it-work-with-custom-objects-or-a-custom-lead-process`,children:_jsxs(_components.p,{children:[`Contacts and Leads are supported. Custom fields on either work through the custom field\npickers, and a custom Task process works through `,_jsx(_components.strong,{children:`Task import`}),`. Custom objects are not\nimported.`]})}),_jsx(Accordion,{title:`Can we test before rolling out?`,id:`can-we-test-before-rolling-out`,children:_jsxs(_components.p,{children:[`Yes. Connect the `,_jsx(_components.strong,{children:`Salesforce Sandbox`}),` card to a sandbox org. It has its own mappings, so\nnothing from testing touches production.`]})}),_jsx(Accordion,{title:`Can Ari change our Salesforce data?`,id:`can-ari-change-our-salesforce-data`,children:_jsxs(_components.p,{children:[`Ari can look up Salesforce records for you. When it wants to create or update a record, it\nshows you the change and waits for your approval. Ari is available on Enterprise and\nEnterprise+ plans. See `,_jsx(_components.a,{href:`/ari/overview`,children:`Ari`}),`.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`How a call gets back to your CRM`,icon:`arrows-rotate`,href:`/integrations/data-flow`,children:_jsx(_components.p,{children:`What happens after you log a call, and what each sync status means.`})}),_jsx(Card,{title:`Fix integration problems`,icon:`wrench`,href:`/integrations/troubleshooting`,children:_jsx(_components.p,{children:`Reconnect prompts, empty imports and failed syncs.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Connect Salesforce","sidebarTitle":"Salesforce","description":"Dial your Salesforce reports and open call tasks, and log every call back as a completed Task on the Contact or Lead.","href":"/integrations/salesforce"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Before you start","slug":"before-you-start","depth":2,"children":[]},{"title":"Set up your org (admins, once)","slug":"set-up-your-org-admins-once","depth":2,"children":[]},{"title":"Connect your account (every rep)","slug":"connect-your-account-every-rep","depth":2,"children":[]},{"title":"Permissions Salesforce asks for","slug":"permissions-salesforce-asks-for","depth":2,"children":[{"title":"Production and sandbox","slug":"production-and-sandbox","depth":3,"children":[]}]},{"title":"What Salesfinity imports","slug":"what-salesfinity-imports","depth":2,"children":[]},{"title":"What Salesfinity writes back","slug":"what-salesfinity-writes-back","depth":2,"children":[{"title":"Calls on records that did not come from Salesforce","slug":"calls-on-records-that-did-not-come-from-salesforce","depth":3,"children":[]}]},{"title":"The full round trip","slug":"the-full-round-trip","depth":2,"children":[]},{"title":"Objects and access","slug":"objects-and-access","depth":2,"children":[]},{"title":"Cadences from the dialer","slug":"cadences-from-the-dialer","depth":2,"children":[]},{"title":"Settings reference","slug":"settings-reference","depth":2,"children":[]},{"title":"Staying connected","slug":"staying-connected","depth":2,"children":[]},{"title":"Questions admins ask","slug":"questions-admins-ask","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"salesfinity","siteName":"Salesfinity Docs","title":"Connect Salesforce - Salesfinity Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-06T19:02:31.182Z","originalFileLocation":"integrations/salesforce.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"light\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Dial your Salesforce reports and open call tasks, and log every call back as a completed Task on the Contact or Lead.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Salesfinity Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/salesfinity/-QoBSwygykESAJIM/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/salesfinity/-QoBSwygykESAJIM/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/salesfinity/-QoBSwygykESAJIM/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/salesfinity/-QoBSwygykESAJIM/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/salesfinity/-QoBSwygykESAJIM/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/salesfinity/-QoBSwygykESAJIM/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/salesfinity/-QoBSwygykESAJIM/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/salesfinity/-QoBSwygykESAJIM/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/salesfinity/-QoBSwygykESAJIM/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Connect Salesforce - Salesfinity Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"Dial your Salesforce reports and open call tasks, and log every call back as a completed Task on the Contact or Lead.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Salesfinity Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.salesfinity.ai/integrations/salesforce\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://docs.salesfinity.ai/images/og.jpg\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Connect Salesforce - Salesfinity Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Dial your Salesforce reports and open call tasks, and log every call back as a completed Task on the Contact or Lead.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://docs.salesfinity.ai/images/og.jpg\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/salesfinity/-QoBSwygykESAJIM/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Salesfinity Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#5429D8\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.salesfinity.ai/integrations/salesforce\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/integrations/salesforce.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.salesfinity.ai/#organization\",\"name\":\"Salesfinity Docs\",\"url\":\"https://docs.salesfinity.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/salesfinity/YBsYR5N3Fg_u90-H/logo/light.svg?fit=max\u0026auto=format\u0026n=YBsYR5N3Fg_u90-H\u0026q=85\u0026s=e21e087ae3d1330def1fbf87274af05b\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.salesfinity.ai#website\",\"name\":\"Salesfinity Docs\",\"url\":\"https://docs.salesfinity.ai\",\"publisher\":{\"@id\":\"https://docs.salesfinity.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.salesfinity.ai/integrations/salesforce#webpage\",\"url\":\"https://docs.salesfinity.ai/integrations/salesforce\",\"name\":\"Connect Salesforce\",\"description\":\"Dial your Salesforce reports and open call tasks, and log every call back as a completed Task on the Contact or Lead.\",\"dateModified\":\"2026-10-06T19:02:31.182Z\",\"isPartOf\":{\"@id\":\"https://docs.salesfinity.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.salesfinity.ai/integrations/salesforce#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.salesfinity.ai/integrations/salesforce#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Connect your tools\",\"item\":\"https://docs.salesfinity.ai/integrations/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Connect Salesforce\",\"item\":\"https://docs.salesfinity.ai/integrations/salesforce\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.salesfinity.ai/integrations/salesforce#article\",\"headline\":\"Connect Salesforce\",\"name\":\"Connect Salesforce\",\"description\":\"Dial your Salesforce reports and open call tasks, and log every call back as a completed Task on the Contact or Lead.\",\"url\":\"https://docs.salesfinity.ai/integrations/salesforce\",\"mainEntityOfPage\":{\"@id\":\"https://docs.salesfinity.ai/integrations/salesforce#webpage\"},\"image\":\"https://docs.salesfinity.ai/images/og.jpg\",\"dateModified\":\"2026-10-06T19:02:31.182Z\",\"publisher\":{\"@id\":\"https://docs.salesfinity.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.salesfinity.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Salesfinity Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Salesfinity Docs","nav":{"global":{"anchors":[{"anchor":"Help Center","icon":"circle-question","href":"https://support.salesfinity.ai"},{"anchor":"Blog","icon":"newspaper","href":"https://salesfinity.ai/blog"},{"anchor":"Status page","icon":"signal","href":"https://salesfinity.statuspage.io"}]},"tabs":[{"tab":"Home","icon":"house","pages":[{"title":"Home","href":""}]},{"tab":"Dialer","icon":"phone","pages":[{"title":"Dialer","href":"/dialer/overview"}]},{"tab":"Coaching","icon":"graduation-cap","pages":[{"title":"Coaching","href":"/coaching/overview"}]},{"tab":"Ari","icon":"sparkles","pages":[{"title":"Ari","href":"/ari/overview"}]},{"tab":"Sequencer","icon":"paper-plane","pages":[{"title":"Sequencer","href":"/sequencer/overview"}]},{"tab":"Use cases","icon":"lightbulb","pages":[{"title":"Use cases","href":"/tutorials/overview"}]},{"tab":"Integrations","icon":"plug","groups":[{"group":"Connect your tools","pages":[{"title":"Connect your CRM and sales tools","sidebarTitle":"Overview","href":"/integrations/overview"},{"title":"Connect HubSpot","sidebarTitle":"HubSpot","description":"Dial your HubSpot lists and due tasks, and log every call back to the contact as a call engagement.","href":"/integrations/hubspot"},{"title":"Connect Salesforce","sidebarTitle":"Salesforce","href":"/integrations/salesforce"},{"title":"Connect Outreach","sidebarTitle":"Outreach","description":"Dial your due Outreach call tasks and log every call back to the prospect, so the task closes and the sequence moves on.","href":"/integrations/outreach"},{"title":"Send your calls to Gong","sidebarTitle":"Gong","href":"/integrations/gong"}]},{"group":"Keep data in sync","pages":[{"title":"How a call gets back to your CRM","sidebarTitle":"How data flows","href":"/integrations/data-flow"},{"title":"Fix integration problems","sidebarTitle":"Troubleshooting","href":"/integrations/troubleshooting"}]}]},{"tab":"Developers","icon":"code","pages":[{"title":"Developers","href":"/developers"}]},{"tab":"Help","icon":"life-ring","pages":[{"title":"Help","href":"/help/overview"}]}]},"title":"Connect Salesforce - Salesfinity Docs","buildId":"dpl_CUnGQP1HgFUzoxatVC37y4zP83Vx","deploymentId":"dpl_CUnGQP1HgFUzoxatVC37y4zP83Vx","dynamics":[],"chunks":[]}