CRM
GoHighLevel SMS integration: send and receive texts through your own phone
Published and updated
GoHighLevel workflows can call the textbee API directly. Add a Custom Webhook action that posts to the textbee send endpoint with your API key, and every workflow that reaches that step sends an SMS from your Android phone. For replies, an Inbound Webhook trigger receives the textbee webhook, so an incoming text can update the contact, add a note or start a follow-up. No marketplace app is needed for this route, and it works today.
- Send
- HTTP POST
- to the textbee send endpoint
- Receive
- Webhook
- MESSAGE_RECEIVED, flat JSON
- Pace
- 10 to 15 / min
- per Android phone
- textbee code
- None
- uses what the tool ships today
What you need
- A GoHighLevel sub-account with premium workflow actions enabled at the agency level. Each sub-account gets 100 free premium executions.
- A textbee account with the Android app installed on the phone that holds the SIM, and an API key from the dashboard.
- For replies: a workflow that starts with the Inbound Webhook trigger. Its URL is the address textbee posts to.
- The textbee app on the phone. Download the app, then create an API key in the dashboard.
Send SMS from GoHighLevel
Use the Custom Webhook action, not the older Webhook action. Only the Custom Webhook action can set request headers, and textbee reads the API key from a header.
Turn on premium actions
In the agency view open Settings and enable premium triggers and actions for the sub-account. Without this the Custom Webhook action does not appear in the action list.
Add a Custom Webhook action
Open the workflow, click the plus sign after the trigger or the step that should send the text, and pick Custom Webhook.
Field Value Method POST URL https://api.textbee.dev/api/v1/gateway/send-sms Header x-api-key: YOUR_TEXTBEE_API_KEY Header Content-Type: application/json Paste the JSON body
GoHighLevel fills the custom values when the step runs. Keep recipients inside square brackets: textbee needs an array and rejects a plain string.
JSON{ "recipients": ["{{contact.phone}}"], "message": "Hi {{contact.first_name}}, your appointment is confirmed for {{appointment.start_time}}. Reply STOP to opt out." }Test with one contact
Save and publish the workflow, then add a test contact with a number you can check. The text leaves the phone within a minute. In the textbee dashboard the message shows as sent, then delivered.
Receive SMS in GoHighLevel
The Inbound Webhook trigger accepts any JSON. textbee sends a flat object, so every field maps directly to a workflow variable.
Create the receiving workflow
Add a new workflow, choose the Inbound Webhook trigger, and copy the URL it shows.
Register the URL in textbee
In the textbee dashboard open Webhooks, create one with that URL, select the MESSAGE_RECEIVED event and set a signing secret. GoHighLevel cannot check the signature, so treat the trigger URL itself as a secret and do not post it anywhere.
Capture a sample
Text the phone from another number. GoHighLevel captures the payload and lists sender, message, receivedAt and the other fields as mappable variables.
Act on the text
Add a Create or Update Contact action with sender mapped to the phone field, then an Add Note action with message. Common follow-ups: add a tag such as replied, notify the assigned user, or remove the contact from the drip that sent the original text.
Ask your AI agent to set it up
The prompt below carries the endpoints, the payloads and the GoHighLevel details from this page. Change the line that starts with What I want, paste the prompt into your agent, and it walks you through the setup with your own field names and numbers.
Prompt for your AI agent
Paste it into Claude, ChatGPT, Cursor or any coding agent. It carries the textbee API facts and the GoHighLevel details the agent needs, so it does not guess.
I want to connect textbee to GoHighLevel. textbee is an SMS gateway that sends and receives SMS through my own Android phone. Help me set it up step by step.
Facts about the textbee API. Use only these. Do not invent endpoints or fields.
- Send an SMS: POST https://api.textbee.dev/api/v1/gateway/send-sms with the header x-api-key: <TEXTBEE_API_KEY> and a JSON body like {"recipients": ["+12015550123"], "message": "Hello"}. recipients must be a JSON array of E.164 numbers, even for one number. Optional fields: deviceId, simSubscriptionId, scheduledAt (ISO 8601, in the future). The response is {"data": {"success": true, "smsBatchId": "..."}}.
- Check delivery or read replies: GET https://api.textbee.dev/api/v1/gateway/messages with the same header. Filters: direction=received, smsBatchId=<id from the send>, from and to as ISO timestamps. Each row has a status such as sent, delivered, failed or received.
- Receive an SMS: textbee posts JSON to a webhook URL I register in the dashboard. A MESSAGE_RECEIVED delivery has these top-level fields: smsId, message, deviceId, webhookSubscriptionId, webhookEvent, idempotencyKey, sender, receivedAt. The header X-Signature holds an HMAC-SHA256 hex digest of the raw body, keyed with the signing secret I set on the webhook. Retries reuse the same idempotencyKey.
- Limits: One Android phone sends roughly 10 to 15 messages a minute. Text only, no MMS. Messages over 160 characters are split into segments.
What I want: Send SMS from my GoHighLevel workflows through textbee, and bring replies back into GoHighLevel as contact notes and tags.
GoHighLevel specifics you should know:
- The Custom Webhook action is a premium workflow action. It supports POST, custom headers and a JSON body textbox where custom values like {{contact.phone}} autocomplete.
- The older Webhook action cannot set headers, so it cannot authenticate with textbee.
- The Inbound Webhook trigger is also premium. It captures a sample payload from the first request and exposes top-level keys as variables.
- Premium executions cost $0.01 each after 100 free per sub-account, or less on a Workflows Pro plan.
Give me:
1. The exact clicks and field values in GoHighLevel, using its real field labels.
2. The request body or field mapping, with placeholders for my API key and phone numbers. Never ask me to paste the real key into this chat.
3. A test with one number and what a correct result looks like.
4. The three most likely failure causes and how to check each one.Automations that work well
- Appointment reminders
- Appointment Booked trigger, a Wait step until 24 hours before the start time, then the Custom Webhook action. The reminder leaves your own number, which the client already knows.
- Lead follow-up
- Form Submitted trigger, a short thank-you text, a Wait of one day, then a second text if the contact has not picked up the replied tag.
- Reply handling
- An Inbound Webhook workflow that checks whether message contains YES or STOP, then updates the contact and removes it from other workflows.
- Agency setup
- One API key and one webhook per client sub-account. A client can be disconnected by deleting its key without touching the others. For a separate number per client, register one phone per client and pass its deviceId in the body.
- New lead alert to the rep
- Form Submitted or Opportunity Stage Changed trigger, then a Custom Webhook action that texts the assigned user with the lead name and phone. The rep replies from their own phone.
- Failed payment recovery
- Payment Failed trigger, a text with the update-card link, a Wait of two days, then a second text if the invoice is still open. Two texts recover more than an email chain.
Why teams move GoHighLevel SMS to their own phone
- The bill
- A cloud provider inside GoHighLevel charges per message, per number and often per carrier fee, so an agency with a few active sub-accounts pays every month for traffic it could send from a phone on a flat plan.
- The reply rate
- A rented long code is a number the contact has never seen. A text from the real mobile number the business already uses gets read and answered like a text from a person.
- Control
- The number, the SIM and the message history belong to you, not to a provider account. Switching tools later means changing one workflow action, not porting a number.
A cloud SMS provider in GoHighLevel vs textbee in GoHighLevel
| What you care about | Cloud SMS provider | textbee |
|---|---|---|
| Setup | Buy or connect a number, complete the sender registration your country asks for, then the SMS steps work | Install the app on a phone, create an API key, add one Custom Webhook action per workflow: about five minutes |
| Sender the contact sees | A rented virtual number, or an alphanumeric sender where the country allows it | Your own mobile number, which your contacts already have saved |
| Monthly cost | Per message, plus number rental and carrier surcharges in some countries | A flat plan with messages included: Pro is $14.99 a month for 5,000 messages. No per-message fee, no number rental, no carrier surcharge. |
| Throughput | Set by the provider tier and by sender registration | One phone sends roughly 10 to 15 messages a minute. Add phones to scale. |
| Replies | Inbound webhook from the provider, or the provider app in the tool | textbee webhook: flat JSON, signed with HMAC-SHA256 |
| Where the message leaves from | The provider data center | An Android phone you own, plugged in, on Wi-Fi or mobile data |
| GoHighLevel cost | Provider charges plus the phone system fees GoHighLevel bills | Premium workflow executions only: 100 free per sub-account, then $0.01 each |
Per-message prices by provider and country, with sources and dates, are on the provider comparison pages.
What works and what does not
Works today
- Sending from any workflow step: reminders, drips, follow-ups, form replies
- Personalized text from contact and appointment custom values
- Incoming texts that start workflows, add notes and tags, or notify users
- Delivery status in the textbee dashboard and through the messages endpoint
Not with this route
- The Send button inside GoHighLevel Conversations
- Bulk SMS actions from contact lists
- Replies shown as messages in the Conversations thread
- Delivery status inside GoHighLevel
- Built-in features that use the default SMS provider, such as missed-call text-back
What GoHighLevel charges
The Custom Webhook action and the Inbound Webhook trigger are premium workflow features. Each sub-account gets 100 free executions, then $0.01 per execution from the agency wallet, or less on a Workflows Pro plan. help.gohighlevel.com, checked on September 25, 2026. textbee itself charges a flat monthly plan with messages included; see pricing.
Frequently asked questions
Does this replace Twilio or LC Phone inside GoHighLevel?
No. The webhook route sends from workflows only. The Conversations inbox, bulk actions and features tied to the default SMS provider keep using the provider set in the sub-account. Use textbee for automated texts and reply capture, and keep the default provider for the inbox.
Can one textbee account serve several sub-accounts?
Yes. Create one API key per sub-account in the textbee dashboard and one webhook per receiving workflow. Sends from every sub-account then go through the same phone and count toward the same plan. For a separate number per client, register one phone per client and pass its deviceId in the body.
How fast do workflow texts go out?
A single Android phone sends roughly 10 to 15 messages a minute. A drip to a few hundred contacts drains within the hour. A blast to thousands takes hours, so split large lists or add a second phone.
Can I send an image?
No. textbee sends text only. Put a link to the image in the message instead.
Can I verify that a webhook really came from textbee?
GoHighLevel workflows cannot compute an HMAC, so the trigger URL is the only protection. Keep it private. If you need signature checks, route the webhook through n8n or Make first and forward verified events to GoHighLevel.
Will my existing workflows need changes?
Each workflow that should send through textbee needs its Send SMS step replaced with the Custom Webhook action from this page. Triggers, conditions, waits and custom values stay as they are. Workflows that keep the Send SMS step keep sending through the default provider.
Do replies show up in the GoHighLevel inbox?
Not in the Conversations thread with this route. They arrive through the Inbound Webhook trigger, where a workflow adds them as a contact note, a tag and a notification. The thread view needs the marketplace-app route.
Does this work for agencies in any country?
Yes. The phone and SIM decide which number the contact sees and which country the text leaves from. An agency can run one phone per market, each with a local SIM, and pick the phone per sub-account with deviceId.
Can white-label SaaS agencies use it?
Yes. Each tenant sub-account gets its own API key and its own phone or a shared one. The tenant sees the normal workflow editor; the textbee side stays in your dashboard.
How long does the setup take?
About five minutes with a phone at hand: install the textbee app, register the phone, create an API key, and add the Custom Webhook action to one workflow. Receiving adds a webhook in the textbee dashboard and an Inbound Webhook trigger.
Sources
- help.gohighlevel.com, checked on September 25, 2026
- help.gohighlevel.com: Custom Webhook workflow action, checked on September 25, 2026
- help.gohighlevel.com: Inbound Webhook trigger, checked on September 25, 2026
Read next
- Appointment reminder text messages from your own Android number (SMS API)
- Form and lead follow-up with SMS from your own Android number
- Webhooks documentation
- Zapier SMS integration: send and receive texts with Webhooks by Zapier
- Make (formerly Integromat) SMS integration: send and receive texts with the HTTP module
- All integrations
Your phone is already an SMS gateway. Switch it on.
Set up in minutes and send your first message for free. No credit card, no per-message fees, no carrier contracts.
Need self-hosting help or a custom integration? See services