General Purpose
AI receptionist for HubSpot
An AI voice agent that answers every call, qualifies the caller and works your dormant list — connected directly to HubSpot. No Zapier, no Make, no middleware anywhere in the booking path.
What the connection does
- Read leads & contacts
Why HubSpot businesses buy this
HubSpot is where the dormant leads already are, and that is the whole reason this connection exists. A B2B or high-consideration consumer business with a few years of history has thousands of contacts that were worked once and never touched again. They are not bad leads, they are stale ones, and the reason nobody calls them is that a rep will always prioritise the fresh enquiry over a contact from fourteen months ago. An agent that works that list at volume converts a sunk marketing cost into pipeline.
The personalisation is what separates this from a dialler. Because each contact is fetched with its own properties, the call opens with the person's name, references the business they enquired about, and can skip anyone whose lifecycle stage says they already bought. That is the difference between a call that gets thirty seconds and one that gets hung up on in three.
Agencies and consultancies running HubSpot on behalf of clients need per-portal separation rather than one shared connection, and OAuth gives them that natively. Each client portal is authorised on its own, campaigns stay scoped to the portal they were built for, and disconnecting one client does not disturb the others.
Sales teams are protective of their CRM, and rightly so. The reason a read-only connection is a feature rather than a limitation right now is that it is trivially safe to approve: nothing the voice agent does can alter a contact record, so the integration can be piloted without a data governance conversation that takes three weeks.
How you connect it
Authentication: OAuth 2.0 — authorised against your own HubSpot portal
| Credential | Where you find it |
|---|---|
| Access token | Issued automatically by the OAuth flow. You never copy or paste it. |
| Refresh token | Issued alongside the access token and used to keep the connection alive. |
| HubSpot portal | Chosen by you on HubSpot's own consent screen when you approve the connection. |
You click Connect, HubSpot shows you its own consent screen listing the scopes we ask for, and you choose which portal to grant. No API keys change hands and there is nothing to paste. Access tokens are short-lived, so the connection refreshes itself in the background and marks the integration as needing attention rather than failing silently if a refresh is ever rejected. You can revoke us from HubSpot's connected apps screen at any time without contacting support, and because the grant is portal-scoped, an agency managing several client portals connects each one separately instead of sharing a single credential across accounts.
Field mapping
The exact paths this connection reads and writes. Published so you can check them against your own HubSpot data before you commit to anything.
| AutoCallFlow | HubSpot | Notes |
|---|---|---|
| lead.first_name | properties.firstname | Merged into the opening line so the call starts with the contact's name rather than a generic greeting. Contacts with an empty first name fall back to a neutral opener instead of reading a blank. |
| lead.last_name | properties.lastname | Used where the script addresses someone formally, which matters more in insurance and professional services than it does in home services. |
| lead.phone | properties.phone | The primary dial target. Numbers are normalised to E.164 before dialling, since HubSpot stores whatever was typed into the form and free-text entry is rarely consistent. |
| lead.mobile_phone | properties.mobilephone | Used as the fallback when the primary phone property is empty, which is common on contacts created by a mobile-first web form. |
| lead.email | properties.email | Not used for dialling. It is carried through so a follow-up can be matched back to the right contact without a second lookup. |
| lead.company | properties.company | Merged into scripts that reference the business by name. Left out of the spoken line entirely when blank rather than producing an awkward pause. |
| lead.stage | properties.lifecyclestage | Read so a reactivation campaign can exclude contacts who are already customers. This is a read-only use today; we do not advance the stage. |
| lead.external_id | id | The HubSpot record id, stored against the call so every dial is traceable back to a specific contact in your portal. |
Constraints worth knowing up front
- OAuth access tokens are short-lived and must be refreshed against HubSpot's token endpoint. We refresh ahead of expiry rather than waiting for a rejection, and if a refresh is ever declined the integration is marked as needing reconnection in your dashboard instead of quietly dropping calls.
- Contacts are read from the v3 CRM objects API. Properties that are not requested are not returned, so adding a new merge variable to a script means requesting that property explicitly — a custom property will not appear just because it exists on the record.
- HubSpot enforces per-account request limits that are shared across every app connected to your portal, not just ours. Large list pulls are paged and paced deliberately so an outbound campaign cannot exhaust the quota your sales team's own tools depend on.
- Writing back to contact records is not enabled on this connection today. The read scopes we request do not include write permission, which means the integration cannot modify your data even by mistake while that capability is unbuilt.
Questions we actually get asked
Connect HubSpot to your phone line
Build the agent yourself in the dashboard, or tell us what you need it to do and we will set the whole thing up for you.
HubSpot is a trademark of its respective owner. AutoCallFlow is not affiliated with, endorsed by, or sponsored by HubSpot. All product names, logos and brands are the property of their respective owners and are used here only to describe interoperability.