HubSpot
Run your workspace's CRM on HubSpot: deals, tasks and notes written through, outreach logged on the timeline, and campaigns that stop when HubSpot says a contact has moved on.
HubSpot mode makes HubSpot your workspace's CRM. The deals, pipelines, tasks and notes you see in Zexr are HubSpot's records, and your outreach is logged on each contact's HubSpot timeline.
Switch to HubSpot
Open Integrations > HubSpot and select Connect.
Sign in to HubSpot, pick the account, and approve the permissions.
Go through the setup wizard. Every question has a default that works, so you can finish without changing anything.
Finish the wizard. The dashboard fills in as the first pull runs, usually within a minute or two.
Good to know
- Every change you make in Zexr is written to HubSpot first. If HubSpot refuses it, nothing is saved.
- A deal opened in HubSpot, a lifecycle stage you choose or an email opt-out holds the contact's campaigns.
- Pipelines and stages are managed in HubSpot only.
- It works with free HubSpot.
- Switching back or disconnecting deletes nothing on either side.
A workspace can use Zexr's own CRM or HubSpot. In HubSpot mode, HubSpot is the system of record. The deals, pipelines, tasks and notes you see in Zexr are HubSpot's records, mirrored into Zexr so lists, search and the board stay fast, and every change you make in Zexr goes to HubSpot first. Your outreach is logged on each contact's HubSpot timeline, and HubSpot can stop a campaign when a contact becomes a deal or a customer.
The basic HubSpot connection (a contact upsert from an automation or Push to CRM) works without HubSpot mode. This page covers the full mode.
- Deals, pipelines, tasks and notes are HubSpot's. A deal you create, move or edit in Zexr is written to HubSpot before it is saved here. If HubSpot refuses it (a required property, a missing permission), you see HubSpot's reason and nothing is saved.
- Your outreach lands on the HubSpot timeline. Sends and replies are logged as email activities, bounces and unsubscribes are recorded, and booked meetings become HubSpot meetings.
- A "Zexr" property group on HubSpot contacts carries each contact's outreach status, so HubSpot users can filter lists, build reports and trigger workflows on it.
- HubSpot can stop outreach. A deal opened in HubSpot, a lifecycle stage you choose or an email opt-out holds the contact's campaigns.
- The contact panel shows HubSpot's side. In the contact drawer and the inbox, a contact shows its HubSpot owner, lifecycle stage, lead status, company and any properties you choose, and you can edit the owner, lifecycle stage and lead status in place.
- Open Integrations > HubSpot and select Connect. Sign in to HubSpot, pick the account, and approve the permissions. Connecting takes someone who can install apps in that HubSpot account.
- The setup wizard opens. Every question has a default that works, so you can finish it without changing anything and adjust later. It asks which activity to log, whether Zexr may create contacts and companies, what a positive reply does, which rules stop outreach, which deal pipelines to mirror, and how contact fields map.
- Finish the wizard. Zexr creates the Zexr property group in HubSpot and starts the first pull: owners, pipelines, then recent deals and tasks. The dashboard fills in as it runs, usually within a minute or two.
After setup the same page holds the settings and the sync health panel. Changing them needs the manage_settings permission.
A connection made before HubSpot mode existed needs a reconnect
Earlier HubSpot connections only asked for contact access. HubSpot mode also needs companies, deals, owners and the contact schema, so the page asks you to reconnect before you can switch, and the switch is refused with crm_reauth_required until you do.
| Record | Direction | How |
|---|---|---|
| Deals | Both ways | Zexr writes through to HubSpot. Changes in HubSpot are pulled every minute |
| Pipelines and stages | HubSpot to Zexr | Managed in HubSpot only. Pulled every 30 minutes, and sooner when a deal arrives in a stage Zexr has not seen |
| Tasks | Both ways | Zexr writes through. Tasks owned by matched members are pulled every minute |
| Notes | Both ways | Zexr writes through. A contact's HubSpot notes are pulled when you open the contact |
| Task types | HubSpot to Zexr | Fixed to HubSpot's: To-do, Call, Email, LinkedIn |
| Owners | HubSpot to Zexr | Pulled every 30 minutes and matched to members by email |
| Contacts | Both ways, per field | Owner, lifecycle stage, lead status, company, opt-out and the fields you map. See contacts and field mapping |
| Outreach activity | Zexr to HubSpot | See activity logged to HubSpot |
Zexr pulls only what changed since the last pull, so the minute-by-minute pull stays light. Opening a contact in Zexr also refreshes that contact's HubSpot record, deals, tasks and notes on the spot.
Deals and pipelines
The Pipelines page lists only your HubSpot pipelines, and creating, renaming or deleting a pipeline or stage is refused with crm_managed_externally: make the change in HubSpot and it appears in Zexr within minutes. In the wizard you can limit the mirror to some pipelines; deals in the others are not mirrored.
Deals in a pipeline that only exists in Zexr are hidden from the deal table and board while HubSpot is your CRM. They are not deleted: copy them into HubSpot or switch back to see them again.
In HubSpot, won and lost are stages rather than a status. Marking a deal won or lost in Zexr moves it to the pipeline's first closed-won or closed-lost stage, and moving it to a closed stage sets its status. Stages carry HubSpot's closed flag, won flag and probability. A deal owned by someone in HubSpot who is not a workspace member shows that owner's name.
Deals created by an automation's Create deal or Move deal stage action reach HubSpot too, through the sync queue rather than at once.
Tasks
The Tasks page shows the HubSpot tasks owned by HubSpot users who are matched to workspace members. The first pull brings in tasks changed in the last 90 days. A contact's own tasks are pulled when you open the contact, whoever owns them.
| Zexr | HubSpot |
|---|---|
Priority low, medium, high, urgent | Low, Medium, High (urgent is written as High) |
Status pending, in progress, completed, cancelled | Not started, In progress, Completed, Deferred |
| Assignee | Task owner. A member with no matched HubSpot owner cannot be assigned (crm_owner_unmapped) |
Creating, editing or deleting a task type is refused with crm_managed_externally, because HubSpot's task types are fixed. Tasks Zexr opens by itself, such as follow-up tasks from replies and an automation's Create a task, are written to HubSpot as well.
A Zexr contact is linked to a HubSpot contact by email address. Linking happens when Zexr emails the contact, when you open it, when HubSpot changes a contact whose address Zexr has, and after an import from a HubSpot list.
When Zexr emails someone HubSpot does not have, it creates the HubSpot contact (on by default). With company creation on (also the default), the new contact is associated with the company on its email domain, and a company is created when HubSpot has none. Free mail domains such as gmail.com never become companies. With creating contacts off, a contact HubSpot does not have is simply not logged there.
Each mapped field has a direction:
| Direction | What happens |
|---|---|
| Push | Zexr writes the field to HubSpot when the contact is edited in Zexr and each time it emails them |
| Pull | A change in HubSpot is copied onto the Zexr contact |
| Both | The most recent change wins: an edit in HubSpot is copied onto the Zexr contact, and an edit in Zexr is written to HubSpot |
The defaults map first name, last name, company and phone to firstname, lastname, company and phone, all Both. A custom field maps as custom:<key>. A blank value in HubSpot never blanks a Zexr field, and the email address is never overwritten from HubSpot.
You can also pick up to 40 extra HubSpot properties to show on the contact panel.
| In Zexr | In HubSpot | Default |
|---|---|---|
| A campaign email is sent | An outgoing email activity with the subject and body | On |
| The contact replies | An incoming email activity | On |
| An email bounces | The logged email is marked BOUNCED | On |
| The contact unsubscribes | A note on the contact, and zexr_unsubscribed set | On |
| A meeting is booked through Calendly or Cal.com | A HubSpot meeting | On |
| An open | zexr_last_opened_at updated, no timeline entry | Off |
| A click | zexr_last_clicked_at updated, no timeline entry | Off |
Each email activity is associated with the contact, its company and its open deals. Its owner is the member who owns the sending mailbox when that member is matched to a HubSpot owner, otherwise the contact's owner. Activity is logged within seconds and never depends on your webhooks or their per-minute limit, so a large send is logged in full.
Opens and clicks are off by default because mail privacy proxies and security scanners open and click on their own, and HubSpot timelines fill with noise. Turned on, they only update the two properties, at most once an hour per contact, and never create a contact in HubSpot.
Zexr creates a Zexr group of contact properties in HubSpot when you switch, and keeps it up to date (on by default; turning it off stops every property write, including opens and clicks). Properties you or your HubSpot admins already changed are left as they are.
| Property | Holds |
|---|---|
zexr_status | contacted, replied, interested, not_interested, meeting_booked, bounced or unsubscribed. A later send never moves a contact back from a reply status to contacted |
zexr_last_campaign | The name of the last campaign that emailed the contact |
zexr_last_contacted_at | When Zexr last emailed the contact |
zexr_last_replied_at | When the contact last replied |
zexr_reply_intent | How Zexr classified the latest reply |
zexr_last_opened_at | Last open, when open logging is on |
zexr_last_clicked_at | Last click, when click logging is on |
zexr_unsubscribed | Set when the contact unsubscribes from Zexr outreach |
zexr_link | A link that opens the contact in Zexr |
HubSpot's owners (its users) are matched to workspace members by email address. Where the addresses differ, pick the member by hand on the HubSpot page; a match you choose is kept and never replaced by the email match. Matching decides:
- whose tasks appear on the Tasks page
- who owns the email activity a mailbox logs
- which HubSpot owner a deal or task gets when you assign it to a member in Zexr
- who the Zexr card acts as, and so what a HubSpot user can do from it
When a reply is classified as interested, Zexr can:
- set the contact's lead status (default
In progress) - set its lifecycle stage (off by default). HubSpot refuses to move a lifecycle stage backwards; the lead status is still set when it does
- create a deal in a pipeline and stage you choose (off by default). It is skipped when the contact already has an open deal
The follow-up task comes from your existing reply follow-up setting and is written to HubSpot like any other task.
Exit rules hold a contact in every campaign it is in when HubSpot says it has moved on, so nobody gets a follow-up after becoming a deal or a customer. A held lead stays held until someone resumes it; the hold shows the reason, such as "A deal was opened in HubSpot".
| Rule | Default |
|---|---|
| A deal associated with the contact is opened in HubSpot | On. Only deals created in the last 48 hours count, so the first pull's existing deals stop nobody |
| The contact's lifecycle stage changes to one you choose | On, for Opportunity and Customer |
| The contact opts out of email in HubSpot | On. The address is added to the suppression list |
Import guards
Guards decide who an import from a HubSpot list leaves out:
| Guard | Default |
|---|---|
| Skip contacts opted out of email | On |
| Skip contacts in these lifecycle stages | On, for Customer and Evangelist |
| Skip contacts with an open deal | On |
| Skip contacts owned by someone outside the workspace | Off |
Two things put Zexr inside HubSpot itself, so a rep never has to switch tabs to act on a contact:
- The Zexr card on every contact record shows the contact's Zexr status, each campaign they are in with its step, and why a lead is paused. From the card you can add the contact to a campaign, pause or resume all of their campaigns, and open them in Zexr. A contact new to Zexr is created from the HubSpot record when you add them.
- The "Add to Zexr campaign" workflow action enrolls a workflow's contacts in the campaign you pick, so a HubSpot list, form or lifecycle change can feed outreach on its own. Contacts who opted out of email in HubSpot are skipped, and the action reports what happened in its output for the next step of the workflow.
The card acts as the Zexr member matched to the HubSpot user viewing it (see owners), with that member's role:
| On the card | The member needs |
|---|---|
| See the contact's Zexr status and campaigns | View campaigns and view contacts |
| Add to campaign | Manage campaigns and manage contacts |
| Pause or resume campaigns | Manage campaigns |
A HubSpot user with no matched member, or whose member is still invited, is banned from signing in, or lacks the permission, sees why on the card and changes nothing. The workflow action has no viewer: it is set up by whoever can edit HubSpot workflows, and it acts as the workspace owner.
The card and the workflow action need the HubSpot account to be in HubSpot mode in exactly one Zexr workspace. When more than one workspace has it connected in HubSpot mode, both refuse until only one does.
On the HubSpot page, pick one of your HubSpot lists. The preview counts who would come in and who is skipped, by reason: opted out, lifecycle stage, open deal, owned by someone outside the workspace, no email address, and duplicate address. Continue, and the list becomes an ordinary contact import, finished in the usual import review where you pick the campaign, labels and duplicate handling.
One import takes up to 25,000 contacts; a larger list is cut off at that number and the preview says so. The imported contacts are linked to their HubSpot records a couple of minutes later, so their first sends log against the right person.
List import needs HubSpot's list permission, which is optional. A connection without it is asked to reconnect and allow list access.
When a workspace that used Zexr's CRM switches, its own deals, tasks and notes are not in HubSpot yet. The HubSpot page counts them and copies the kinds you pick, once:
- Deals move onto your first HubSpot pipeline. Each keeps its stage when HubSpot has a stage with the same name, and otherwise goes to the first stage that matches its status (open, won or lost)
- Tasks and notes are created in HubSpot with their contact and deal
A record already in HubSpot is never copied twice, so running it again only picks up what was missed. A Zexr deal, task or note you edit after switching is also created in HubSpot at that moment.
The HubSpot page shows what is waiting, what failed in the last runs, how many records are mirrored, and when each pull (owners, pipelines, deals, tasks, contacts) last ran with any error it hit. Sync now starts a full pull; a second one within 30 seconds is refused with crm_sync_running.
Changes you make in the dashboard go to HubSpot while you wait. Activity logging, automation-written records and copies go through a queue that retries a failure with growing gaps (a minute, five minutes, half an hour, up to several hours) before marking it failed. Failed items stay listed for 30 days with a plain-language reason. Retry sends them again and Discard drops them.
| You see | What to do |
|---|---|
| Reconnect HubSpot | HubSpot revoked Zexr's access or a permission is missing. Reconnect from Integrations and approve every permission |
| HubSpot refused the change | HubSpot's own rule, shown in its words (for example a required deal property). Fix it in HubSpot or on the record, then retry |
| This record no longer exists in HubSpot | It was deleted in HubSpot. Discard the item |
| That member is not a HubSpot user yet | Match the member to a HubSpot owner in owners |
| HubSpot did not answer | HubSpot was slow or down. It retries by itself |
Zexr keeps its calls under HubSpot's limit for each HubSpot account (about 90 requests every 10 seconds, shared across every Zexr process), and waits and retries when HubSpot asks it to slow down.
Choosing Zexr as the CRM again, or disconnecting HubSpot, stops the sync and the activity logging. Nothing is deleted on either side: the deals, pipelines, tasks and notes that were mirrored stay in Zexr as ordinary records you can edit, the hidden Zexr-only pipelines come back, and HubSpot keeps everything that was written there. Switching back to the same HubSpot account later picks up the same records rather than duplicating them.
A workspace export carries the CRM mode, its setup choices, the owner matches, which Zexr record is which HubSpot record, and each contact's HubSpot details, so the destination keeps updating the same HubSpot records instead of creating duplicates. The sync queue and the pull checkpoints stay behind; the destination starts its own pull. Reconnect HubSpot on the destination unless it uses the same HubSpot app and the archive carried credentials.
Does it work with free HubSpot? Yes. Contacts, companies, deals, tasks, notes, owners and custom contact properties are all part of HubSpot's free CRM. The list and email-reading permissions are optional, so an account that cannot grant them still connects; only list import is unavailable without the list permission.
Which permissions does Zexr ask for? Read and write on contacts, companies and deals, read on owners, and read and write on the contact schema (for the Zexr property group). Lists and email reading are asked for as optional.
Why are opens off? Mail privacy proxies and security scanners open and click automatically, so opens are a weak signal and would bury the timeline. Turned on, they only update zexr_last_opened_at and zexr_last_clicked_at.
What happens to my data when I disconnect? Everything that was mirrored stays in Zexr as ordinary records, and nothing is removed from HubSpot. See switching back and disconnecting.
Can I edit pipelines in Zexr? No, while HubSpot is your CRM. Edit them in HubSpot and they update in Zexr within minutes.
Does every member need a HubSpot seat? No. Members without a matched owner still see deals, tasks and notes; they cannot be assigned HubSpot deals or tasks, and their mailboxes log email under the contact's owner.
Next steps
Slack
Ask the Zexr assistant from Slack, work inbox replies in a Slack channel, and route notifications to the right channels.
Pipedrive
Run your workspace's CRM on Pipedrive: deals, activities and notes written through, outreach logged on the person, and campaigns that stop when Pipedrive says someone has moved on.