GoHighLevel
| Status | Kind | How you connect |
|---|---|---|
| Coming soon | CRM | One click: approve bubbl3 on GoHighLevel's own page |
GoHighLevel 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
GoHighLevel (HighLevel) is the CRM many agencies and lead-gen teams run on. Connecting it lets bubbl3:
- import contacts from a sub-account (everything, a tag, a pipeline or stage, or the last few days) and keep new and changed contacts coming;
- become the sub-account's texting provider, so texts your team sends from GoHighLevel Conversations go out as iMessage through bubbl3, and contacts' replies show up in the same conversation;
- log every text bubbl3 sends on the contact as a note;
- keep opt-outs in step: Do Not Disturb in GoHighLevel opts the contact out in bubbl3, and a STOP in bubbl3 turns on SMS Do Not Disturb in GoHighLevel;
- update fields, tags and pipeline stages when a workflow or conversion event asks.
It's for agencies (connect once at agency level, then pick sub-accounts) and for single businesses (connect one sub-account).
Setup
You need full access to integrations in bubbl3, and to be an admin of the GoHighLevel agency or sub-account.
- In bubbl3, open Settings, Integrations and choose GoHighLevel, then Connect.
- On GoHighLevel's page, choose the agency or the sub-account and approve bubbl3.
- Agency connection: back in bubbl3, pick the sub-accounts to connect. Each becomes its own connection.
- Choose what to import. bubbl3 shows how many contacts that is before anything is imported.
- Check the field mapping. Name, mobile, email, owner, tags and source are mapped for you; unmapped custom fields go into the contact's custom fields.
- 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 Texting provider, choose the line or pool and turn on Make bubbl3 your texting provider. Texts sent from GoHighLevel Conversations then go through bubbl3.
You can also install bubbl3 from the GoHighLevel Marketplace; you land in bubbl3 with the connection made and carry on from step 4.
Disconnect
Disconnect from the connection page in Settings, Integrations, or uninstall bubbl3 in GoHighLevel. Uninstalling an agency disconnects every sub-account connected through it.
- Stops at once: imports, new and changed contacts, the texting provider, text logs and writebacks. Texts your team sends from GoHighLevel stop reaching bubbl3.
- Deleted at once: bubbl3's access tokens and the links between bubbl3 contacts and GoHighLevel contacts. Opt-outs still waiting to reach GoHighLevel are dropped.
- Kept: contacts imported from GoHighLevel, with their messages, labels and consent, unless you tick Also delete the contacts imported from it (needs full access to contacts). Notes, tags and fields bubbl3 already wrote stay in GoHighLevel.
- Deleted later: the updates GoHighLevel sent bubbl3 are deleted 30 days after they arrived.
Data shared
From GoHighLevel to bubbl3: contacts' names, phones, email, owner, tags, source, custom fields, time zone and Do Not Disturb settings; opportunities' pipeline and stage (for import filters and stage changes); the sub-account's name; texts your team sends from Conversations while bubbl3 is the texting provider. For other messages GoHighLevel sends only that a message happened, never its text.
From bubbl3 to GoHighLevel: a note on the contact for each text bubbl3 sends (and each reply, when bubbl3 isn't the texting provider); contacts' replies into the conversation, with how many photos or files they sent (the files stay in bubbl3); delivered, read and failed statuses with the reason; SMS Do Not Disturb on STOP; fields, tags and stages when you ask.
Scopes and permissions
| Scope | Why bubbl3 needs it |
|---|---|
contacts.readonly | Search and read contacts to import them, and read one contact when it changes |
contacts.write | Turn on Do Not Disturb when someone opts out, update fields and tags, and add notes |
opportunities.readonly | Import by pipeline or stage, and find a contact's opportunity |
opportunities.write | Move an opportunity's stage when a workflow asks |
locations.readonly | Name the sub-account on the connection, and test the connection |
oauth.readonly | List the sub-accounts an agency installed bubbl3 on |
oauth.write | Let an agency connection connect each sub-account |
conversations/message.write | Post contacts' replies into the conversation and update message statuses |
Events
What bubbl3 receives
| Event in GoHighLevel | In bubbl3 |
|---|---|
ContactCreate | New contact. Imported and matched on phone and email; starts "Lead imported from CRM" workflows. |
ContactUpdate, ContactDndUpdate, ContactTagUpdate | Contact updated. Changes are applied; starts "CRM contact updated" workflows. Do Not Disturb on opts the contact out. |
InboundMessage | Incoming message seen. Recorded without its text; nothing is sent or logged. |
OutboundMessage | Outgoing message seen. Recorded without its text; nothing is sent or logged. |
ProviderOutboundMessage | Text to send. A text your team sent from GoHighLevel while bubbl3 is the texting provider. bubbl3 sends it, or tells GoHighLevel why not. |
INSTALL | App installed. Recorded only. |
UNINSTALL | App uninstalled. Disconnects the sub-account, or the agency and its sub-accounts. |
What bubbl3 writes back
| What | Where it shows in GoHighLevel |
|---|---|
| Text log | A note on the contact for each text bubbl3 sends |
| Replies | The contact's reply in the conversation |
| Message status | Delivered, read or failed (with the reason) on a text sent from GoHighLevel |
| Opt-outs | SMS Do Not Disturb turned on |
| Field updates | The contact field you chose |
| Tags | Tags added or removed |
| Stage changes | The contact's opportunity moved to the stage |
| Notes | A note on the contact from a conversion event |
Sending rules that still apply
GoHighLevel never texts anyone itself. Texts your team sends from GoHighLevel through bubbl3, and workflows that GoHighLevel's contacts start, go through the same checks as a text you send from bubbl3. Nothing in GoHighLevel can turn them off.
- Consent. When you connect GoHighLevel 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 GoHighLevel.
- Quiet hours. No texts from 8:00 PM to 9:00 AM in the contact's own time zone (GoHighLevel'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 GoHighLevel is told when bubbl3 doesn't send
The message in the GoHighLevel conversation is marked failed with the reason. A held text stays pending, and a note on the contact says 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
- GoHighLevel allows 100 requests every 10 seconds and 200,000 a day per sub-account; bubbl3 stays inside that and waits when it's reached.
- GoHighLevel has no contact lists in its API, so you can't import a list: use a tag.
- A pipeline or stage count counts opportunities, so a contact with two opportunities there counts twice in the preview. They're imported once.
- A stage change for a contact with no opportunity in that pipeline does nothing.
- Texts from GoHighLevel's own workflows may still use GoHighLevel's phone system rather than bubbl3, depending on how GoHighLevel routes workflow texts for your account. Send a test from a workflow before you rely on it.
- A workflow can't write Do Not Disturb or opt-out tags, so nothing can opt a contact back in.
Troubleshooting
- The connection needs attention. GoHighLevel stopped accepting bubbl3's access, or bubbl3 couldn't renew it. Reconnect from the connection page; nothing is lost while you do.
- A text sent from GoHighLevel shows failed. The status carries bubbl3's reason, such as a link in a first message or a contact who opted out. See the sending rules below.
- Texts from GoHighLevel don't reach bubbl3. Check Texting provider is on for the sub-account and a line or pool is chosen, and that the contact's phone in GoHighLevel matches the number bubbl3 has.
- A contact won't import. bubbl3 needs a phone number it can text. Contacts with Do Not Disturb on import as opted out.