All integrations
VoiceDock

HubSpot

Recognise the caller before they say their name

The useful half of a HubSpot connection is not logging the call afterwards. It is the lookup in the first second, so the agent opens with the right context instead of asking who is calling and why.

Lookup cost

1 search call

Search ceiling

5 / second, per account

Write path

After the call

What gets asked for

Four jobs, in the order people want them

01

Recognise the caller from the number

One search on the incoming number, before the agent speaks. Everything else on this page exists to make that single call reliable.

02

Read the open deal or ticket

So the opening line can refer to the reason they are probably calling, instead of asking them to explain it.

03

Log the outcome on the timeline

Written after the caller has hung up. Nobody has ever stayed on the line to hear a CRM confirm a write.

04

Create or update a deal

Only when the conversation actually produced one, and only with fields the agent could not have invented.

The constraint that bites

Search is the ceiling, not your call volume

A HubSpot private app on Professional or Enterprise gets 190 requests per ten seconds, which sounds like more than any phone line could use. Caller lookup does not spend that budget. Finding a contact by phone number is a search call, and search endpoints are limited to five requests per second per account, separately and far more strictly. That cap is shared across every integration on the account, so the number to plan against is not your call volume. It is your call volume plus whatever else already searches HubSpot.

So the lookup is cached, and the cache is keyed on the number rather than on the contact.

Numbers

Burst limit
190 requests / 10s per private app
Search endpoints
5 requests / second per account
Daily limit
625,000 (Pro) or 1,000,000 (Enterprise), shared across apps
Our tool call
30s, attempted once

In practice

A recognised call, end to end

caller-lookup.log
inbound  +31612345678                       t+0.00s
  [norm]   normalised → 612345678             t+0.00s
  [cache]  miss                               t+0.01s
  [hs]     POST /crm/v3/objects/contacts/search
           filter: phone CONTAINS 612345678
  [hs]     200 · 1 result · 340ms             t+0.35s
  [cache]  stored · ttl 4h                    t+0.35s
  [agent]  "Good afternoon, Mr de Vries."     t+0.41s

  search budget used   1 of 5 per second
  the caller heard     nothing before the greeting

What gets built

One endpoint, two paths

The read path answers the tool call: it normalises the number, checks the cache, searches HubSpot only on a miss, and returns a short answer the model can speak. The write path never blocks the conversation. Call outcomes are queued and pushed after the caller has hung up, because nobody has ever hung on to hear a CRM confirm a write.

What the endpoint hands back
{
  "found": true,
  "say": "Mr de Vries, from De Vries Installatie",
  "open_deal": "heat pump quote, sent 6 August",
  "last_contact": "eight days ago"
}

// Four fields, all of them speakable. Not the contact object:
// a model handed forty fields will read one of them out loud.

What we need from you

Four things, and the first call is easier with all four

  • A private app token

    With read on contacts and deals, and write on engagements if we log the call. A private app, not somebody's personal key, so it survives that person leaving.

  • Which property holds the phone number

    Most portals have several, and the one people actually fill in is rarely the one called phone. We check this before writing any code.

  • Who else searches this portal

    The five per second is shared across the account. If a warehouse sync already uses four of it, we design around one.

  • Where the call should land

    On the contact, on the deal, or on both. It sounds like a detail and it decides what your sales team sees on Monday.

Questions we get first

Is there a native HubSpot integration?

No. There is a tool contract. Your agent calls a tool, we post to an endpoint you own, and that endpoint talks to HubSpot with your private-app token. We will build that endpoint with you, or you build it against our API.

Where does my HubSpot token live?

In your environment. VoiceDock posts to a URL you own and never stores a HubSpot credential.

What happens when the caller is not in HubSpot?

The agent is told the lookup returned nothing and greets them as a new caller. It does not guess, and it does not read out a near match, because a wrong name in the first sentence costs more than no name at all.

Can the agent write a deal during the call?

It can, and usually it should not. Writes during the call add latency the caller hears for a result they cannot see. The exception is a write the caller needs confirmed out loud, such as a booked appointment.

Going deeper

The two articles underneath this page

Bring us the awkward one

Send the system, its API documentation and one call you want to automate. On the intake call we will tell you whether the hard part is the code or the configuration, and which of the two sets the date.

Voice agents and HubSpot: caller lookup, rate limits and the write path | VoiceDock