Integrations
Integrations let your agent's outputs flow into the systems where your team already works. Today the platform ships with two CRM integration providers — HubSpot and Zoho CRM — and a scheduling integration, Cal, that lets visitors book meetings straight from the chat. More are on the roadmap. The framework underneath is generic OAuth 2.0; adding new providers is a matter of database seed plus credential configuration, not application code.
In this chapter you'll:
- Tour the Integrations screen
- Walk through the HubSpot and Zoho CRM connect flows
- Understand what each sync does once it's wired up — including how Zoho handles the Lead → Contact lifecycle
- Connect Cal and let visitors book meetings from the chat through an in-widget calendar
The Integrations screen
Open Integrations from the team's left-hand rail.

A list of every integration provider available to your tenant. Each card has a Connect button to start the flow:
- HubSpot — Sends new leads and their Breezee score to your HubSpot contacts.
- Zoho — Sends new leads and their Breezee score to Zoho as leads and contacts.
- Cal.com — Lets visitors book a meeting on your calendar from inside the chat.
A connected integration shows a Connected badge and a Disconnect action, which asks you to confirm before disconnecting.
Reading an integration's status
Each tile says what state its connection is in:
| Badge | What it means | What to do |
|---|---|---|
| Connected | Working normally. | Nothing. |
| Refresh failing (since a date) | Breezee is having trouble renewing its access, but the provider hasn't said the connection is gone. It keeps retrying on its own — a brief outage at the provider usually clears without you. | Nothing at first. If it's still showing a day or two later, reconnect. |
| Reconnect required | The provider has told us the access you granted is no longer valid — revoked, expired, or the connecting user was removed. | Click Reconnect and approve on the provider's screen again. |
| Paused | The connection is switched off. | Click Reconnect to switch it back on. |
| Paused by plan | Your plan no longer covers this connection — either the plan doesn't include this provider, or the organisation has more connections than the plan allows. The connection is kept and nothing is deleted; the tile says which of the two applies. | Upgrade, or — if you're over the connection limit — disconnect another integration to bring this one back within it. |
How many connections your plan allows counts across the whole organisation, not per team. See the plan table in Billing & usage. When you're at the limit, a tile you haven't connected shows Connection limit reached in place of its Connect button.
There's no on/off switch for syncing. Earlier versions had a Syncing on / Syncing off switch on each tile. It's gone: a connection is either connected or disconnected. If you used that switch to pause an integration, the tile now reads Paused, and Reconnect is how you switch it back on — it takes you through the provider's approval screen again.
Connecting HubSpot
Click Connect on the HubSpot card. The dashboard redirects you to HubSpot's OAuth bridge.

This is HubSpot's screen, not the Breezee dashboard. The text confirms what's being connected:
Connecting your Breezee Dev account to HubSpot.
Two paths:
- Create a new HubSpot account — for tenants who don't have HubSpot yet.
- Sign in to your HubSpot account — for tenants who do, this is the path that completes the grant.
This manual stops at the OAuth handoff. Completing the grant requires real HubSpot credentials and creates a live integration that immediately starts syncing prospect data. For the manual we screenshot the handoff and stop there. The remaining steps in production are:
- Sign in to HubSpot (or create an account)
- Pick the HubSpot portal to connect to
- Review the requested scopes (contacts read/write, companies read/write, schemas read/write)
- Click Allow
- HubSpot redirects you back to the dashboard with an authorisation code, the platform exchanges it for an access token and a refresh token, and the integration is live.
After completion the Integrations screen shows the HubSpot card with a Connected status and a Disconnect action.
What HubSpot sync does
Once the integration is connected, the pipeline starts syncing data from new and updated prospects into your HubSpot account. The sync runs as a background pipeline component called HubSpotContactSync and triggers on:
- A visitor shares their contact details — by submitting a contact form or booking a meeting. The contact is sent whichever way they answered the remember-me prompt, because they gave you those details on purpose.
- Existing prospect updated — when subsequent activity adds property values, changes segment matches, or modifies the lead score.
Manage data governs the visitor's browser, not your CRM. Stop remembering me clears the marker in their browser so they arrive as someone new next time; the details they already sent you, and anything they send later, still reach your CRM. They chose to contact you, and turning off a browser marker is not a request to be forgotten by your business.
What gets synced:
- Contact fields — first name, last name, phone, mobile phone, and job title from the prospect record.
- Breezee custom properties — two custom properties that Breezee creates automatically on first sync if they don't already exist:
BREEZEE SCORE(the numeric lead score) andBREEZEE SOURCE(the channel that brought the prospect in). These are Breezee-namespaced and do not touch any of HubSpot's built-in fields. - Activity log — prospect activities (meetings booked, contact-form submissions) appear as notes on the contact's HubSpot timeline, and so do chat session summaries. Both are sent for every visitor, whichever way they answered the remember-me prompt — that prompt governs the marker in their browser, not what reaches you.
- Company association — if the agent captured a company name, Breezee searches for a matching HubSpot company record and associates the contact with it.
What is not synced: Individual property values captured during the chat (industry, company size, budget, pain points, buying timeframe, etc.) are not sent to HubSpot. They remain inside Breezee and drive lead scoring and segment matching there.
The sync is one-way today (Breezee → HubSpot). Updates made in HubSpot don't flow back to the Breezee prospect record.
Which HubSpot fields Breezee will never overwrite
Breezee follows a strict "fill in the blank, never overwrite" policy for all standard contact fields. If a field already has a value in HubSpot, Breezee leaves it untouched — even if Breezee has a different value for that prospect.
| HubSpot field | Breezee behaviour |
|---|---|
| First name | Only written if the field is blank in HubSpot |
| Last name | Only written if the field is blank in HubSpot |
| Phone | Only written if the field is blank in HubSpot |
| Mobile phone | Only written if the field is blank in HubSpot |
| Job title | Only written if the field is blank in HubSpot |
| Lead Status | Never written — remains entirely under your control |
| Any other native HubSpot field | Never written |
The only fields Breezee always updates are its own namespaced custom properties:
| Custom property | Why it always updates |
|---|---|
BREEZEE SCORE | The score changes as the prospect engages — it must stay current |
BREEZEE SOURCE | Reflects the latest source attribution |
Last activity date | Reflects the prospect's most recent interaction |
This means your sales team's manual edits to names, phone numbers, and job titles in HubSpot are always preserved.
Required HubSpot scopes
When you complete the OAuth grant, HubSpot asks for these scopes:
| Scope | Why we need it |
|---|---|
crm.objects.contacts.read | To check whether a prospect already exists as a HubSpot contact before creating a duplicate. |
crm.objects.contacts.write | To create new contacts and update existing ones with captured values. |
crm.objects.companies.read | To look up companies by name when the prospect provides a company name. |
crm.objects.companies.write | To create company records when the prospect's company doesn't already exist in HubSpot. |
crm.schemas.contacts.read | To inspect the contact schema before deciding which custom properties to create. |
crm.schemas.contacts.write | To create custom HubSpot contact properties for Breezee properties HubSpot doesn't already have. |
The platform requests only the scopes it actually uses — there's no access to deals, tickets, or marketing tools, and read access is scoped to the objects we touch.
Viewing synced data in HubSpot
Once the integration is live, every prospect that comes through Breezee appears as a contact in your HubSpot account. You can view and filter on Breezee-specific fields directly from the HubSpot Contacts view.
Breezee fields in the contacts list
By default the HubSpot contacts table shows standard columns. To add Breezee's fields:
- Open Contacts in HubSpot.
- Click the three-dot menu on any column header, then choose Add column.

- In the property search panel that opens, you will see Breezee's custom properties listed alongside HubSpot's built-in ones:

| Property | What it contains |
|---|---|
| BREEZEE SCORE | The numeric lead score calculated by Breezee based on engagement, property, and activity signals. |
| BREEZEE SOURCE | The source channel captured by the Breezee agent (e.g. sAllsbot). |
- Select the properties you want and they appear as columns in the contacts table.
Note: Breezee does not write to HubSpot's native Lead Status or Lead Score fields. Both remain entirely under your control. Breezee only populates its own namespaced custom properties (
BREEZEE SCORE,BREEZEE SOURCE).
Contact activity timeline
Click any contact to open their record. Switch to the Activities tab to see everything Breezee has logged for that prospect.

Two activity types appear for Breezee-synced contacts:
- Created — logged when Breezee first synced the prospect to HubSpot (shows the source channel and timestamp).
- Contact Activity — logged when Breezee updates the contact's lifecycle stage or lead score based on new engagement signals (e.g. "User Starc moved to Lead").
All activity entries are attributed to the connected Breezee application so your team can distinguish them from manually logged activities.
Disconnecting
To disconnect the integration, return to the Integrations screen and click Disconnect on the HubSpot card (visible once connected). The platform revokes its access token, stops the sync, and removes its stored OAuth credentials. Data already synced to HubSpot stays there — disconnecting doesn't delete anything in HubSpot.
To delete the synced contacts after disconnecting, you'd do that in HubSpot directly.
Connecting Zoho CRM
Click Connect on the Zoho card. The dashboard redirects you to Zoho's consent screen.

This is Zoho's screen, not the Breezee dashboard. It lists exactly what Breezee is asking for:
- Accounts — read your basic profile information (to identify the connecting account).
- CRM — manage leads data, manage contacts data, manage notes data, and a group scope to perform CRUD operations on metadata (so Breezee can create its own custom fields).
Tick I allow … to access the above data from my Zoho account and click Accept. Zoho redirects you back to the dashboard with an authorisation code, the platform exchanges it for an access token and a refresh token, and the integration is live.
Tip — connect with a dedicated "Breezee AI" user. Zoho attributes everything the integration writes — every Lead, Contact, and Note — to the Zoho user who authorises the connection (its Created By stamp). If you connect with a personal account, your CRM will show those automated notes and records as "by <that person>", which inflates one teammate's activity and breaks the sync if that user is later deactivated.
For a clean setup, create a dedicated Zoho CRM user named Breezee AI (or "Breezee Integration") and authorise the connection while signed in as that user. Every synced note and record will then read "by Breezee AI", clearly separating automation from your team's manual work. This is optional — without it the integration still works, and synced notes are always titled "Note created via Breezee AI" — but it's the recommended approach for production. (It uses one Zoho user licence.)
Zoho is multi–data-centre. Zoho hosts accounts across several regions (EU, US, India, Australia, Japan, China, Canada, Saudi Arabia). Breezee automatically detects which data centre your account belongs to from the OAuth response and routes all API calls — and token refreshes — to the correct region. The same Connect button works regardless of where your Zoho org lives.
After completion the Integrations screen shows the Zoho card with a Connected badge and a Disconnect action.

What Zoho sync does
Once connected, the same batched background pipeline that powers HubSpot syncs new and updated prospects into your Zoho CRM. It triggers on:
- A visitor shares their contact details — by submitting a contact form or booking a meeting, whichever way they answered the remember-me prompt.
- Existing prospect updated — when later activity adds property values, changes segment matches, or moves the lead score.
As with HubSpot, Manage data governs only the visitor's browser — contact details and chat session summaries both keep syncing either way.
What gets synced:
- Standard fields — first name, last name, phone, mobile, job title, and company (account) name.
- Breezee custom fields —
Breezee Score(the numeric lead score) andBreezee Source(the channel that brought the prospect in). Breezee creates these automatically on first sync, on both the Leads and Contacts modules, if they don't already exist. They are Breezee-namespaced and never touch Zoho's built-in fields. Breezee also sets the native Lead Source field toBreezee AIso you can filter on origin. - Notes — chat session summaries, meeting bookings, and contact-form submissions are written as Notes on the Lead or Contact, not as separate records.
What is not synced: Individual property values captured during the chat (industry, company size, budget, pain points, buying timeframe, etc.) stay inside Breezee and drive lead scoring and segment matching there.
The sync is one-way (Breezee → Zoho). Changes made in Zoho don't flow back to the Breezee prospect record.
The Lead → Contact lifecycle (data consistency)
Zoho splits a person across two objects: a Lead (pre-qualification) is converted to a Contact once your team qualifies them. Breezee is aware of this lifecycle and follows the person wherever they currently live — which is what keeps your CRM consistent and free of duplicates:
| Situation | What Breezee does |
|---|---|
| New prospect | Creates a Lead in Zoho. |
| Lead already exists | Updates only the data Breezee owns — its custom fields always, standard fields only when blank (see below). It never overwrites edits. |
| Lead already converted to a Contact | Finds the Contact and writes the updated data there — it does not recreate a Lead for someone who has already been converted. |
This promote-aware behaviour means a prospect who progresses through your pipeline keeps receiving fresh Breezee data on the correct record, with no duplicate leads piling up behind a contact.

Above: a Lead with two Breezee notes — a confirmed 15-minute meeting booking and a session summary. The Convert button (top right) is Zoho's standard lead-to-contact conversion; once you click it, Breezee's subsequent updates automatically target the resulting Contact.
Which Zoho fields Breezee will never overwrite
As with HubSpot, Breezee follows a strict "fill in the blank, never overwrite" policy for standard fields. If a field already has a value in Zoho, Breezee leaves it untouched — even if Breezee has a different value for that prospect.
| Zoho field | Breezee behaviour |
|---|---|
| First Name | Only written if blank in Zoho |
| Last Name | Only written if blank in Zoho |
| Phone | Only written if blank in Zoho |
| Mobile | Only written if blank in Zoho |
| Title (job title) | Only written if blank in Zoho |
| Account Name (company) | Only written if blank in Zoho |
| Any other native Zoho field | Never written |
The only fields Breezee always updates are its own namespaced custom fields:
| Custom field | Why it always updates |
|---|---|
Breezee Score | The score changes as the prospect engages — it must stay current |
Breezee Source | Reflects the latest source attribution |
This means your sales team's manual edits to names, phone numbers, and job titles in Zoho are always preserved.
Required Zoho scopes
When you complete the OAuth grant, Zoho asks for these scopes:
| Scope | Why we need it |
|---|---|
ZohoCRM.modules.leads.ALL | Create and update Leads, and search Leads to avoid creating duplicates. |
ZohoCRM.modules.contacts.ALL | Update people who have already been converted to Contacts. |
ZohoCRM.modules.notes.ALL | Write session summaries, meetings, and contact requests as Notes. |
ZohoCRM.settings.all | Inspect the field schema and create Breezee's custom fields. |
AaaServer.profile.READ | Read the basic profile of the connecting account. |
offline_access | Obtain a refresh token so the background sync keeps working without re-auth. |
Breezee requests only the scopes it actually uses — there's no access to Deals, Campaigns, or other Zoho modules.
Viewing synced data in Zoho
Every prospect that comes through Breezee appears in Zoho — as a Lead first, and on the Contact once converted. Both modules carry Breezee's custom fields.

In the Leads module you'll see the synced people with Lead Source set to Breezee AI and a Breezee Score column. Add or filter on Breezee Score / Breezee Source from the column menu, just like any other Zoho field.

After a Lead is converted, the same Breezee Score and Breezee Source fields are available on the Contacts module — so the data Breezee maintains stays visible no matter where the person sits in your pipeline.
Disconnecting Zoho
To disconnect, return to the Integrations screen and click Disconnect on the Zoho card, then confirm when asked. The platform revokes its token, stops the sync, and removes its stored OAuth credentials. Data already synced to Zoho stays there — disconnecting doesn't delete anything in Zoho.
Connecting Cal (meeting booking)
Cal is a different kind of integration from the CRMs. Instead of syncing prospect data outward, it lets a visitor book a meeting on your calendar without leaving the chat — the agent shows an in-widget calendar, the visitor picks a time, and the booking lands on your connected Cal account.
The consent flow
Click Connect on the Cal.com tile. The dashboard redirects you to Cal’s consent screen.

This is Cal's screen, not the Breezee dashboard. It lists exactly what Breezee is asking for:
- View personal info and primary email — to identify the connecting account.
- Create, read, update, and delete bookings — to place the meeting on your calendar when a visitor books.
- View availability — to show your real open slots in the in-widget calendar.
- View connected apps — read-only access Cal requires to resolve your event types.
Click Allow. Cal redirects you back to the dashboard, the platform exchanges the authorisation code for an access token and a refresh token, and the integration is live.
After completion the Integrations screen shows that card with a Connected badge and a Disconnect action. The quickest way to confirm the link is live is the skill config below — once Cal is connected, your event types appear there automatically.
Required Cal permissions
| Permission | Why we need it |
|---|---|
| View personal info and primary email | Identify the connecting Cal account. |
| Create, read, update, and delete bookings | Create the meeting when a visitor confirms a slot. |
| View availability | Read your real availability so only open times are offered. |
| View connected apps / event types | List your event types so you can choose which one a skill books. |
Breezee requests only the scopes it uses for booking — there's no access to your CRM, payments, or workflow settings.
Configuring the book-meeting skill
Connecting Cal only establishes the account link. To make a skill actually book meetings, point it at one of your event types.
Open the agent’s Skills, edit the Book meeting skill, and open its configuration. Once Cal is connected, the panel lists the event types from your account:

Pick the event type this skill should book (each shows its title and duration, e.g. "Intro call · 15 min"). That's the entire setup — the in-widget calendar reads availability and creates the booking against the event type you choose.
Connect Cal first. If Cal is not connected yet, the panel shows “Connect Cal.com on the Integrations screen to choose an event type for this skill.” instead of the dropdown. Booking always runs through the in-widget calendar on your connected account.
How visitors book a meeting
Once a skill is pointed at an event type, that's everything you need to do — booking happens inside the chat, with no pop-ups and no redirect to an external page. When the agent decides it's time to book, it renders a calendar in the widget and the visitor:
- Picks a date — only days with availability are selectable.
- Picks a time — the open slots for that day.
- Adds their details — first name, last name and email address, plus a location if the event type offers more than one.
- Clicks Confirm booking — Breezee creates the booking and shows a confirmation.
All of this runs against your connected account's live availability, so a visitor can never book a slot you're not actually free for, and double-bookings are rejected at confirmation time.
What happens after a booking
A confirmed booking does two things:
- Cal sends its standard confirmation email to the attendee (and to you), with calendar invites and Reschedule / Cancel links built in. This is Cal's own email — Breezee doesn't send a competing one.
- Breezee logs the meeting against the prospect, exactly like a contact-form submission: it appears in the prospect's activity timeline, and — if you also have HubSpot or Zoho connected — it's written as a note on the contact (e.g. a "confirmed 15-minute meeting booking" note, as shown in the Zoho section above).
So a booked meeting is visible both on your calendar and in your CRM, with no manual copying.
Rescheduling or cancelling
Reschedule and cancel are handled through Cal’s confirmation email, not the chat widget. The attendee clicks Reschedule or Cancel in the email they received; Cal opens its own hosted page, applies the change against your live availability, updates the calendar invite, and notifies both sides.
Because Cal owns the booking record, this always reflects your real calendar — there's nothing to keep in sync on the Breezee side.
Disconnecting Cal
To disconnect, return to the Integrations screen and click Disconnect on the Cal.com card. The platform revokes its token and removes its stored OAuth credentials, so the in-widget calendar stops offering times. Meetings already booked stay on your Cal calendar — disconnecting doesn’t cancel anything.
Other integrations on the roadmap
The OAuth framework is generic — adding new providers is configuration plus a credential block in the platform's environment, not application code. Likely future additions in approximate priority order:
- Salesforce CRM — same pattern as HubSpot, different OAuth provider
- Slack — pushing high-priority leads into a sales-team Slack channel
- Microsoft Teams — same shape as Slack
- Email (SMTP/SendGrid) — emailed lead summaries to a configured address
None of these are live today; HubSpot, Zoho CRM, and Cal.com are the integrations currently shipping.
What's next
You've reached the end of the configuration tour. From here:
- Appendix A — Glossary — definitions of every term used in the manual
- Appendix B — Troubleshooting — common issues and their fixes
- Appendix C — Release notes — what changed, and when
If you've worked through the manual end-to-end, your tenant is now configured, deployed, and instrumented — ready to handle real visitors. Good luck.