HubSpot
| Status | Kind | How you connect |
|---|---|---|
| Coming soon | CRM | One click: approve bubbl3 on HubSpot's own page |
HubSpot isn't offered yet. This page says what it will do and what you can use meanwhile: a Lead URL, or Zapier, Make or n8n.
What it does
Connecting HubSpot lets bubbl3:
- import contacts (everything, a list, a lifecycle stage, an owner, or those changed since a date) and keep new and changed contacts coming;
- log every text bubbl3 sends or receives on the contact as an SMS communication;
- keep opt-outs in step through bubbl3's own contact property, Opted out of texts (bubbl3): ticking it in HubSpot opts the contact out in bubbl3, and a STOP in bubbl3 ticks it;
- update properties and lifecycle stages when a workflow or conversion event asks;
- on portals that include custom channels, add bubbl3 to a HubSpot inbox, so your team can read and answer iMessage threads in HubSpot.
Setup
You need full access to integrations in bubbl3, and to be a HubSpot super admin (or have permission to install apps).
- In bubbl3, open Settings, Integrations, choose HubSpot, then Connect.
- On HubSpot's page, choose the portal and approve bubbl3.
- Choose what to import, check the count, and check the field mapping. Mobile phone is the number texts go to, then phone.
- Answer How did these leads agree to hear from you? It records each contact's consent; "Not sure" records it as unknown. Either way the contacts can be texted, because you confirmed when connecting that everyone you send has agreed to receive texts from you, unless your workspace only texts opted-in contacts.
- Optional: under Inbox channel, choose a HubSpot inbox and the bubbl3 line or pool. If your portal's plan doesn't include custom channels, bubbl3 says so and keeps logging texts on the timeline instead.
bubbl3 adds the Opted out of texts (bubbl3) property when you connect, so you can filter on it straight away.
Disconnect
Disconnect from the connection page in Settings, Integrations.
- Stops at once: imports, new and changed contacts, text logs, writebacks and the inbox channel. bubbl3 turns its channel account off in HubSpot.
- Deleted at once: bubbl3's access tokens (HubSpot is asked to revoke them unless another bubbl3 workspace uses the same portal and login) and the links between bubbl3 contacts and HubSpot contacts. Opt-outs still waiting to reach HubSpot are dropped.
- Kept: contacts imported from HubSpot, with their messages, labels and consent, unless you tick Also delete the contacts imported from it (needs full access to contacts). Communications, notes and property values bubbl3 wrote stay in HubSpot, and so does the opt-out property.
- Deleted later: the updates HubSpot sent bubbl3 are deleted 30 days after they arrived.
To remove the app from HubSpot too, uninstall it under Connected apps in HubSpot.
Data shared
From HubSpot to bubbl3: contacts' first and last names, email, mobile and phone, company, owner, lifecycle stage, original source, time zone, custom properties (up to 100) and the opt-out property; list memberships when you import a list; the portal's domain; messages your team writes in bubbl3's inbox channel.
From bubbl3 to HubSpot: an SMS communication on the contact for each text bubbl3 sends or receives; texts and replies published in the inbox thread, with their statuses; the opt-out property on STOP; property values, lifecycle stages, notes and custom events when you ask.
Scopes and permissions
| Scope | Why bubbl3 needs it |
|---|---|
oauth | Added to every HubSpot app; listed so the install page asks for exactly bubbl3's set |
crm.objects.contacts.read | Search and read contacts to import them, and receive contact updates |
crm.objects.contacts.write | Write properties, lifecycle stages and the opt-out, and log texts |
crm.lists.read | Import the members of a list |
crm.schemas.contacts.read | Read your custom contact properties, so they reach bubbl3 |
crm.schemas.contacts.write | Create bubbl3's opt-out property when you connect |
conversations.read (optional) | List your inboxes for the inbox channel |
conversations.custom_channels.read (optional) | Read bubbl3's inbox channel and its accounts |
conversations.custom_channels.write (optional) | Connect the channel to an inbox, publish messages and report their status |
The optional scopes are asked for only when bubbl3's inbox channel is available. A portal that doesn't grant them still connects and gets timeline logging.
Events
What bubbl3 receives
| Event in HubSpot | In bubbl3 |
|---|---|
contact.creation | New contact. bubbl3 reads the contact, imports it and starts "Lead imported from CRM" workflows. |
contact.propertyChange | Contact updated. bubbl3 reads the contact again; starts "CRM contact updated" workflows. |
contact.propertyChange on the opt-out property | Opt-out. Ticked opts the contact out, whatever else the record says. Unticking it never opts anyone back in. |
OUTGOING_CHANNEL_MESSAGE_CREATED | Text to send. A message someone on your team wrote in bubbl3's inbox channel. bubbl3 sends it, or marks it failed with the reason. |
CHANNEL_ACCOUNT_PURGED | Channel removed. The channel account was deleted in HubSpot, so bubbl3 turns the inbox channel off. |
What bubbl3 writes back
| What | Where it shows in HubSpot |
|---|---|
| Text log | An SMS communication on the contact: "Text sent by bubbl3 to …" or "Text received by bubbl3 from …" |
| Replies | The contact's reply in the inbox thread |
| Message status | Sent, read or failed (with the reason) on the inbox message |
| Opt-outs | Opted out of texts (bubbl3) ticked |
| Field updates | The contact property you chose |
| Stage changes | The contact's lifecycle stage |
| Notes | A note on the contact from a conversion event |
| Custom events | A custom event occurrence from a conversion event, on portals that take them |
Sending rules that still apply
HubSpot never texts anyone itself. Texts your team sends from HubSpot through bubbl3, and workflows that HubSpot's contacts start, go through the same checks as a text you send from bubbl3. Nothing in HubSpot can turn them off.
- Consent. When you connect HubSpot or create a lead source, you confirm that everyone you send to bubbl3 has agreed to receive texts from you, so its contacts can be texted straight away. bubbl3 never texts a contact who opted out, and a workspace set to text only opted-in contacts texts only them.
- Opt-out. Replying STOP opts a contact out at once. bubbl3 also records it in HubSpot.
- Quiet hours. No texts from 8:00 PM to 9:00 AM in the contact's own time zone (HubSpot's time zone for the contact when it has one, else the phone's area code). A text due then waits until the morning.
- Pacing. Each line texts at most 15 new contacts an hour and 50 a day (fewer while a new line warms up), and spaces texts 20 to 90 seconds apart. A big import or batch is queued and sent as the limits allow, never dropped.
- First messages. Until a contact replies, a text can't include links, photos or files, phone numbers or email addresses, must be 300 characters or fewer, and at most 3 texts go out.
What HubSpot is told when bubbl3 doesn't send
In the HubSpot inbox thread the message is marked failed, with the reason as its error. HubSpot has no pending status, so a held text gets a timeline note saying when it's scheduled.
| Reason | Code | What you see |
|---|---|---|
| A link before the contact replies | pre_reply_link_blocked | Not sent: "Links can't be sent until the contact replies" |
| A photo or file before the contact replies | pre_reply_media_blocked | Not sent: "Photos and files can't be sent until the contact replies" |
| A phone number before the contact replies | pre_reply_phone_blocked | Not sent: "Phone numbers can't be sent until the contact replies" |
| An email address before the contact replies | pre_reply_email_blocked | Not sent: "Email addresses can't be sent until the contact replies" |
| A first message that is too long | pre_reply_too_long | Not sent: "First messages must be 300 characters or fewer" |
| Too many texts without a reply | pre_reply_message_limit | Not sent: "Already sent 3 texts without a reply. Wait for the contact to reply" |
| The same text to too many people today | identical_text_limit | Not sent: "This exact text went to 20 people from this line today" |
| The line is paused after unanswered texts | unanswered_streak_limit | Not sent: "This line is paused after too many unanswered texts" |
| The contact opted out | contact_opted_out | Not sent: "The contact opted out of texts" |
| The workspace texts only opted-in contacts | consent_required | Not sent: "This workspace only texts contacts who opted in" |
| No line can reach the contact | line_unavailable | Not sent: "bubbl3's line for this contact isn't available" |
| Quiet hours | quiet_hours | Held: "Scheduled for 9:00 AM America/Chicago, quiet hours" |
| The line's daily limit | daily_new_contact_cap | Held: "Scheduled for Oct 15, 9:00 AM America/Chicago: today's limit for this line is reached" |
| The line's hourly limit of new contacts | hourly_new_contact_cap | Held: "Scheduled for 2:00 PM America/Chicago: this hour's limit of new contacts for this line is reached" |
The numbers are the default limits; a line's own limits change them. bubbl3's other checks (no phone number, a number that doesn't match) have their own plain reasons.
Limits and known gaps
- HubSpot allows 110 requests every 10 seconds per portal, and 5 searches a second; bubbl3 stays inside that and waits when it's reached.
- HubSpot contacts have no tags, so tag filters and tag writebacks aren't offered. Deal pipelines aren't the contact's, so a stage change sets the lifecycle stage.
- A list can't be combined with other import filters.
- HubSpot has no API for its own SMS subscription status, which is why bubbl3 uses its own opt-out property.
- HubSpot publishes outgoing inbox messages only on open threads. If it refuses a first text to someone who never wrote, bubbl3 logs it as a communication instead, so each text reaches HubSpot once.
- Custom channels need a HubSpot plan that includes them; HubSpot decides, and bubbl3 shows its answer.
Troubleshooting
- The connection needs attention. HubSpot refused to renew bubbl3's access, which is also how an uninstall shows. Reconnect from the connection page.
- The inbox channel says your portal isn't eligible. Your HubSpot plan doesn't include custom channels, or the optional scopes weren't granted. Texts keep logging on the timeline.
- A message in the inbox shows failed. Its error is bubbl3's reason, such as a link in a first message or a contact who opted out.
- Opting out in HubSpot doesn't seem to work. Use the Opted out of texts (bubbl3) property, not HubSpot's email or SMS subscription settings.