How-to

How to Connect an AI Chatbot to HubSpot (Without Zapier)

A direct OAuth connection writes chat leads into HubSpot Contacts, deduplicated by email so repeat visitors update one record instead of creating three. What it writes, what it deliberately does not, and when a Zap is still better.

Key takeaways

  • Chat leads are written to HubSpot Contacts over an OAuth connection, with standard fields mapped and custom properties available for the answers you care about.
  • It looks the contact up by email before writing, so a returning visitor updates one record instead of creating duplicates — the main advantage over a typical Zapier setup.
  • Contacts only. No deals, notes, tasks or timeline events, so if you need a deal created on conversion, use a HubSpot workflow triggered by the new contact.
  • One-way by design: the chatbot cannot read anything back from HubSpot, which keeps the CRM as the system of record and stops a public widget being used to probe it.

The usual way people get chatbot leads into HubSpot is a Zap: chatbot fires a webhook, Zapier catches it, Zapier creates a HubSpot contact. It works, it costs another subscription, and it creates a duplicate contact every time the same person converts twice.

A direct connection removes the middle step. This guide covers what it writes to HubSpot, what it deliberately doesn't, and when a Zap is still the better answer.

What does the HubSpot integration do?

When a visitor completes a lead capture in the chat, the integration writes them to HubSpot Contacts. Specifically:

  1. It looks for an existing contact by email.
  2. If one exists, it updates that record. A returning visitor enriches the contact you already have.
  3. If not, it creates a new contact with the details from the conversation.

Standard fields map straight across, and anything else your chat collects can be written to properties you choose. Connection is by OAuth, so you authorise it inside HubSpot rather than handling API keys.

Will it create duplicate contacts?

No, as long as you collect an email. The email lookup runs before every write, so the same person converting three times updates one record rather than producing three.

This is the main practical reason to prefer the direct connection over a Zap. Most Zapier setups do a plain "create contact" because the find-then-branch version takes more steps and more tasks, and duplicates accumulate quietly until someone runs a cleanup and finds 400 of them.

The corollary: make email a required field in your chat form. Without it there's nothing to match on, and you lose the behaviour entirely.

Does it create deals, notes or timeline events?

No. Contacts only. The integration requests contact read and write permission and nothing else — no deals, no notes, no tasks, no timeline entries, no company records.

That's worth stating plainly because it decides whether this fits your process. If your pipeline works by contacts entering a list and a workflow taking over, this covers you completely. If you need a deal created in a specific stage the moment a lead converts, this doesn't do it, and you have two options: use a HubSpot workflow to create the deal from the new contact, which is the cleaner answer, or run it through Zapier.

If deal-stage creation is central to how you work, it's worth knowing that the GoHighLevel integration does create opportunities in a chosen pipeline stage. Different CRM, deeper write.

Can the chatbot read data back from HubSpot?

No. Data flows one way: conversation into HubSpot. The bot cannot look up a contact, report a deal stage, or personalise itself from your CRM.

Two good reasons that's the right design. Your CRM stays the system of record with no second copy drifting out of sync. And a chat widget on a public page that can query your CRM is an exposure risk — anyone typing into the box could probe for what you know about a person. Customer-specific data belongs behind a login.

Why not use HubSpot's own chatbot?

Reasonable question, and sometimes the answer is that you should. HubSpot's chat is free at entry level, sits natively in the CRM, and writes to the timeline in ways an external tool can't.

Where teams look elsewhere is usually one of these: the AI conversational features are on higher-priced tiers than they want, they need capabilities the CRM's chat doesn't have — like booking into Google Calendar, sending SMS alerts, running a scored assessment, handing off to WhatsApp, or answering from PDFs and a crawled website — or they want the same chatbot on a site that isn't HubSpot-hosted.

The honest framing is that this isn't a HubSpot replacement. It's a front door that fills HubSpot. Keep the CRM doing the CRM's job.


How do I connect it?

  1. Connect HubSpot from the integrations screen and authorise via OAuth. You'll need permission to install integrations in that HubSpot account.
  2. Make email required in your chat's lead form, so dedupe works.
  3. Map your fields. Name, email and phone are straightforward; decide deliberately which extra chat answers deserve a property.
  4. Create any custom properties in HubSpot first if you're mapping to them.
  5. Send a test lead through the chat, find the contact in HubSpot, then send a second with the same email and confirm it updated rather than duplicated.
  6. Set up whatever should happen next in HubSpot — a workflow, a list, an owner assignment, a deal if you need one.

The CRM integration is available on paid plans.

What should I actually map?

Less than the chat collects. A contact record with thirty half-empty properties is harder to work than one with six reliable ones.

  • Name, email, phone. Always.
  • The one answer that decides routing. Service needed, budget band, timeline, or location — whichever your follow-up actually branches on.
  • Where they came from, if you run several bots or sites and need to tell them apart in reporting.

Everything else the visitor said is in the conversation transcript, which is where exploratory detail belongs. Properties are for things you filter, segment or automate on.

Contacts aren't appearing. What do I check?

  1. Is the connection still authorised? OAuth access can be revoked at the HubSpot end, including when the person who connected it loses access.
  2. Did the visitor complete the capture? An abandoned conversation produces no lead. Read the transcript before suspecting the integration.
  3. Is an email being collected? No email means no dedupe, and depending on your form it may mean no usable contact at all.
  4. Do the mapped properties still exist? Renaming or deleting a HubSpot property after mapping it is a common breakage.
  5. Are you looking in the right HubSpot account? Agencies and anyone with a sandbox trip over this regularly.

Frequently asked questions

Can I connect an AI chatbot to HubSpot without Zapier?

Yes. A direct OAuth connection writes captured chat leads into HubSpot Contacts. You authorise it inside HubSpot rather than handling API keys, standard fields map straight across, and anything else the chat collects can be written to properties you choose.

Will chatbot leads create duplicate contacts in HubSpot?

No, as long as you collect an email. The integration searches for an existing contact by email before every write, so the same person converting three times updates one record. Make email a required field in your chat form — without it there is nothing to match on and you lose the behaviour. This is the main reason to prefer a direct connection over a Zap, since most Zapier setups use a plain "create contact" step that duplicates on every repeat conversion.

Does the chatbot create HubSpot deals or timeline events?

No. It requests contact read and write permission and nothing else — no deals, no notes, no tasks, no timeline entries, no company records. If you need a deal created the moment a lead converts, the cleaner approach is a HubSpot workflow triggered by the new contact. If deal-stage creation is central to how you work, note that the GoHighLevel integration does create opportunities in a chosen pipeline stage.

Can the chatbot read data back from HubSpot?

No, the flow is one-way. The bot cannot look up a contact, report a deal stage, or personalise itself from your CRM. That is deliberate: your CRM stays the system of record with no second copy drifting out of sync, and a chat widget on a public page that could query your CRM would let anyone probe for what you know about a person. Customer-specific data belongs behind a login.

Why not just use HubSpot's own chatbot?

Sometimes you should — it is free at entry level, sits natively in the CRM, and writes to the timeline in ways an external tool cannot. Teams look elsewhere when the conversational AI features sit on higher tiers than they want, when they need capabilities the CRM chat lacks (booking into Google Calendar, SMS alerts, scored assessments, WhatsApp handover, answering from PDFs and a crawled website), or when they want the same chatbot on a site HubSpot does not host. The honest framing is that this is a front door that fills HubSpot, not a replacement for it.

Which chat fields should I map to HubSpot properties?

Fewer than the chat collects. Name, email and phone always; the one answer your follow-up actually branches on, such as service needed, budget band or timeline; and a source field if you run several bots or sites. Everything else the visitor said lives in the conversation transcript, which is where exploratory detail belongs. Properties are for what you filter, segment or automate on — a contact with thirty half-empty properties is harder to work than one with six reliable ones.

My chatbot leads are not appearing in HubSpot. What should I check?

Whether the OAuth connection is still authorised, since access can be revoked at the HubSpot end including when the person who connected it loses access. Whether visitors actually completed the capture step — read a transcript before suspecting the integration. Whether an email is being collected. Whether the mapped properties still exist, since renaming or deleting one in HubSpot breaks the mapping. And whether you are looking in the right HubSpot account, which trips up anyone with a sandbox.