Architecture
Salesfinity is a public HubSpot app installed through OAuth. It uses HubSpot’s CRM and engagements APIs only; nothing is added to your portal beyond the app itself, which appears under Settings → Integrations → Connected Apps once a user has connected.Permissions required to connect
Salesfinity authorizes with HubSpot through OAuth. When you click Connect, HubSpot shows the permissions below. The first group is required: HubSpot will refuse the install if your portal cannot grant one of them. The second group is requested but optional: HubSpot grants each one only if your portal has the feature, and silently drops it otherwise, so a portal without deals or sequences can still connect.Required
Optional
The person connecting needs a HubSpot seat that can grant these permissions. Super admins always
can. A user with a restricted permission set may see the install refused.
For HubSpot admins: setup checklist
1
Decide who connects
Every rep can connect with their own HubSpot user, in which case calls are logged as that
user and tasks are imported from that user’s queue. Or a team admin connects once and turns
on Share with team, and reps who never connect use the admin’s connection while calls
are still attributed to the owner the admin assigns them. Most teams have each rep connect.
2
Check who can install
Installing requires a HubSpot user who can grant every
required permission. A super admin always can. A user with a restricted
permission set may be refused at install time, and a portal whose subscription lacks a
feature will silently drop the matching optional permission.
3
Connect and approve the full permission list
From Settings → Connections & API → HubSpot click Connect, choose the portal, and approve.
Approve everything shown. A permission skipped now can only be added by reconnecting.
4
Set the call task source
In the integration’s configuration, pick the HubSpot user whose tasks “All due tasks” should
import. It defaults to the connecting user. In a shared integration, set it per member under
“Call task source per member”; a member without one cannot import tasks.
5
Map dispositions and fields
Use the automatic suggestion to map every Salesfinity disposition to a HubSpot call outcome,
then map contact properties to Salesfinity fields and pick any custom properties you want
on the contact card.
6
Import and check attribution
Import a small list, dial one contact, and open the call in HubSpot. The engagement should sit
on the contact’s timeline under the rep’s owner, and any open call task on that contact
should now be completed.
Objects and access
The dialer integration never deletes anything in HubSpot and never archives a contact.
How task completion works
When a call is logged on a contact, Salesfinity reads the engagements associated with that contact and finds the tasks that are call type and still not started. Each one is set to completed, keeps its original owner, and gets the body “Call was made.” Tasks of other types (email, to-do) and tasks already in progress are left alone. This is why a task imported through “All due tasks” disappears from the rep’s HubSpot queue after the call without anyone touching HubSpot.Owner attribution
HubSpot separates the user who logs in from the owner record used on CRM objects. When a rep connects, Salesfinity resolves their owner ID from the owner list and stores both. Every engagement is created with that owner, and “All due tasks” filters on it. If a rep’s calls show up unowned in HubSpot, the rep has no owner record in the portal; create one for them in HubSpot and reconnect.What Salesfinity imports
You can import from HubSpot in two ways.- A list. Pick any HubSpot list, active or static. Salesfinity reads its members and their mapped properties into a Salesfinity contact list named after the HubSpot list.
- All due tasks. Import with no list selected and Salesfinity pulls the open tasks assigned to your configured call task source user whose due date has passed or is today, along with the contact each task is associated with. The list is named “All due tasks”. Tasks that are already completed are skipped.
What Salesfinity writes back
When you log a call on a HubSpot-sourced contact, Salesfinity creates a call engagement in HubSpot and associates it with the contact. The engagement carries:
After creating the engagement, Salesfinity marks the contact’s open tasks as completed, so a
task you imported disappears from your HubSpot queue once you have called it.
Two more write paths run outside of call logging:
- Contacts you dial from a CSV or custom list are logged to HubSpot too, if HubSpot is connected. Salesfinity searches HubSpot for the person by email or phone number. If nobody matches, it creates the contact first and then logs the call.
- Phone numbers found by enrichment or edited in the dialer can be pushed back onto the HubSpot contact.
Sequences
From the dialer you can enroll a contact in a HubSpot sequence. Enrollment needs the optional sequence enrollment permission and a sender email, which is the connected HubSpot user’s inbox. HubSpot has no public API to unenroll a contact, so remove and move between sequences are not available for HubSpot. Do those in HubSpot itself.Configuration
Open the integration after connecting to reach these settings.Call task source
Call task source
The HubSpot user whose call tasks are imported by “All due tasks”. Defaults to the user who
connected. Change it if a manager connects on behalf of a rep, or if tasks are assigned to a
shared owner.
Disposition mapping
Disposition mapping
Maps each Salesfinity disposition to a HubSpot call outcome. Salesfinity’s built-in
dispositions fall into answered, no answer, left voicemail, gatekeeper, bad number, and
cancelled. Every one must be mapped; when HubSpot has fewer outcomes than Salesfinity, several
Salesfinity dispositions map to the same outcome. Use the automatic suggestion to fill the
whole table, then adjust.
Contact field mapping
Contact field mapping
Which HubSpot contact property fills each Salesfinity field. A field can pull from more than
one property, which is useful when a phone number may live in either “Phone” or “Mobile”.
Custom fields
Custom fields
Additional contact, company, and deal properties to bring across. Supported property types are
text, textarea, number, select, radio, checkbox, and phone number. These show as custom
fields on the contact in the dialer and can be used in filters.
Rate limits
HubSpot enforces a per-portal limit on search requests that is shared by every user and app in the portal. Salesfinity throttles its own searches to stay under it, and retries automatically when HubSpot asks it to wait. A very large import or a busy portal can therefore take longer than usual without anything being wrong.Questions admins ask
Do we need a Sales Hub seat?
Do we need a Sales Hub seat?
Reps need whatever HubSpot seat lets them create calls and tasks on contacts. Sequences,
deals, and sales email history depend on Sales Hub features; without them the matching
optional permissions are dropped and those features are simply absent in Salesfinity.
Why is the call logged as a call engagement and not a note?
Why is the call logged as a call engagement and not a note?
A call engagement carries duration, outcome, direction, recording URL, and both phone numbers
as structured properties, so HubSpot reports and workflows can use them. A note would lose
all of that.
Can we control which HubSpot lists reps can import?
Can we control which HubSpot lists reps can import?
Reps see every list their HubSpot user can see. Restrict list visibility in HubSpot and the
picker follows.
Does HubSpot's rate limit affect us?
Does HubSpot's rate limit affect us?
HubSpot limits search calls per second per portal, shared by every app and user in the
portal. Salesfinity throttles its own searches and retries when HubSpot asks it to wait, so
large imports can take longer at busy times but do not fail.
Where are our tokens stored?
Where are our tokens stored?
Salesfinity stores the OAuth access and refresh token for each connected user in its
credential store; they are never shown in the UI or returned by the API. Disconnecting
deletes them; uninstalling the app in HubSpot invalidates them.
Related
How data moves
Where a call goes after you log it, and what each sync state means.
Troubleshooting
Missing permissions, empty imports, and failed syncs.