GoHighLevel + iMessage: A Setup Guide for Lead Gen Agencies
Install the iMessage (ZeroSettle) app on a client's GoHighLevel sub-account and choose it as the sub-account's SMS provider: from then on, texts from the conversations inbox, the mobile app, workflow Send SMS actions and bulk actions go out as iMessages from the client's own ZeroSettle number, each marked delivered or failed. Replies, and texts the number sends from the API, the ZeroSettle console or the hosted AI agent, land in the contact's conversation. Every send follows ZeroSettle's rules (STOP, at most 2 texts before a first reply, a daily cap on new contacts), so speed-to-lead and follow-up workflows need to be built around them. This guide covers setup, workflow design, bulk actions, consent and what it costs per client.
Key takeaways
- What it does: the client's iMessage number becomes the sub-account's SMS provider. GoHighLevel keeps working as before; the texts arrive as blue-bubble iMessages from the client's number.
- Structure: install on each client sub-account, never the agency. A sub-account connects to one ZeroSettle account, so give each client its own account, name and photo.
- Speed to lead: the first text to a form lead is a new contact. Pro allows 5 a day; Growth allows 50 a day per number, at most 3 every 15 minutes. Leads who text first never count as new contacts.
- Follow-up: at most 2 texts before a lead's first reply. A third is refused and marked failed in GoHighLevel.
- Consent: text only people who gave the client their number for this purpose. No purchased, scraped or cold lists.
- Price: Pro $49/month for one number; Growth $199/month per number (or $599/month for 3 numbers from a Growth link, plus $199 per extra number); Enterprise custom, through sales.
What does the iMessage (ZeroSettle) app do in GoHighLevel?
The iMessage (ZeroSettle) app makes a client's ZeroSettle number the SMS provider for one GoHighLevel sub-account, so the texts that sub-account already sends go out over iMessage from that number. ZeroSettle runs the number on Apple hardware we operate for you in a server facility, and nothing in GoHighLevel has to be rebuilt.
- Sending. Texts from the conversations inbox, the mobile app, workflow Send SMS actions and bulk actions are sent from the client's number. Each is marked delivered or failed, with the reason.
- Logging. Replies, and texts the number sends from the ZeroSettle API, the console or the hosted AI agent, show up in the contact's conversation. A number the sub-account doesn't have yet gets a new contact, unless you turn that off. Photos, videos and voice messages show as
[photo],[video]and[voice message]. - LeadConnector. LeadConnector is HighLevel's white-label brand. It is the same app, with the same setup and behavior; only the install page differs.
GoHighLevel records these as SMS; the person on the other end sends and receives iMessages.
How should an agency set up numbers across client sub-accounts?
Give each client sub-account its own ZeroSettle account and number, and add numbers to a client only when its campaigns need more first texts a day. Three facts from the docs push you there:
- One account per sub-account. A sub-account connects to one ZeroSettle account: installing it for a second account comes back with an error until the first disconnects or no longer has a paid number.
- The lead sees the client, not the agency. Set each account's App/Brand Name and photo to the client's business.
- Limits and opt-outs stay separate. Each number has its own daily new-contact allowance, and a STOP blocks every number on the account, so one client's opt-outs never touch another's.
Each account signs in with a phone number. On Growth the owner can invite team members, so a client that owns its account can bring the agency in to work on it. How many numbers a client needs depends on how many conversations it starts each day: a med spa whose leads mostly tap a "Text us" button needs few new-contact slots, while a home service client texting every lead-ad form fill needs more. For a client-side view of the same playbook, see iMessage for lead generation and real estate lead follow-up over iMessage.
How do you connect a client sub-account?
Connecting takes a ZeroSettle number for the client, one OAuth approval on the client's sub-account, and one setting in GoHighLevel. Plan on these steps for each client:
- Get the client's number. Pro is self-serve at portal.zerosettle.io/imessage, and a Pro account can upgrade to Growth in the console; a Growth link starts on Growth with 3 numbers. Sign in with a phone number (a one-time SMS code), answer the use-case question, set the client's brand name and photo, and subscribe. Numbers not paid for within 30 minutes are released.
- Decide who answers. In the console's Messaging tab, under Who answers, choose Managed by API if GoHighLevel workflows and staff will send. A new signup starts Managed by AI Agent, and a number managed by the AI agent only sends through the agent, so GoHighLevel's sends from it are marked failed. (More on this choice below.)
- Start the connection. In the ZeroSettle console, open Settings → CRM → GoHighLevel (or LeadConnector) and choose Connect with GoHighLevel.
- Pick the client's sub-account and approve the app. Install it on the sub-account, not the agency: an agency-level install comes back with an error.
- Switch the SMS provider. In GoHighLevel, open Settings → Phone Numbers → Advanced Settings → SMS Provider, choose iMessage (ZeroSettle) and save.
- Test it. From your own iPhone, text the client's number. The text should appear as an incoming SMS in a contact's conversation. Reply from the GoHighLevel inbox and check that it is marked delivered.
Step 5 is the one people miss
Until you choose iMessage (ZeroSettle) as the SMS provider, messages are logged but GoHighLevel keeps sending its texts through its old provider. If a test reply arrives from the old number, check this setting first.
Onboarding many clients? Your tooling can start the install with the client's API key ("brand": "leadconnector" for white label), then open the returned authorize_url in a browser signed in to GoHighLevel.
BASE=https://portal.zerosettle.io # TOKEN is the client account's API key
curl -s -X POST -H "Authorization: Bearer $TOKEN" -H 'Content-Type: application/json' \
-d '{"brand":"gohighlevel"}' $BASE/api/imessage/integrations/gohighlevel/oauth
# {"authorize_url": "https://marketplace.leadconnectorhq.com/oauth/chooselocation?…"}
Two settings, through PATCH /api/imessage/integrations/gohighlevel:
create_contacts:falselogs only messages with numbers the sub-account already has, useful if the number also gets vendor texts you don't want in the CRM.line_id: with several numbers, the one GoHighLevel sends from.nullsends from the number the conversation is already on.
GET /api/imessage/integrations/gohighlevel returns the connection: the sub-account's location_name, last_synced_at, last_error and pending (writes still waiting on GoHighLevel, such as messages to log and send statuses to report). POST /api/imessage/integrations/gohighlevel/check rechecks the connection. Full reference: CRM integrations.
How do you build a speed-to-lead workflow that stays within the limits?
Send one plain-text message the moment the form arrives, ask one easy question, and let the lead's reply open the conversation. Your form or lead-ad trigger and a Send SMS action do the work.
That first text is a new contact, because the number starts the conversation: 5 a day on Pro; 50 per number on Growth, at most 3 every 15 minutes (the day resets at 3 AM Eastern). Write it to the iMessage rules:
- Say who you are and what they asked for. "It's Marco at Brightline Painting, about the exterior estimate you just requested" beats a generic greeting.
- No link. A link to someone who has never texted the number shows as plain text they can't tap; send it after they reply (see why first-message links aren't tappable).
- No photo, video or voice message. ZeroSettle refuses them to a contact who has never replied.
- End on a question they can answer in a word: one story or two, this week or next, a time of day.
- Sat 10:14 AM
- Business: Hi Tasha, it's Marco at Brightline Painting. Thanks for requesting an exterior painting estimate. Is the house one story or two?
- Lead: two. the trim is peeling the worst
- Business: Got it, trim prep is part of every exterior quote. I can come look Thursday at 10 or Friday at 2. Which works better?
- Lead: friday
- Business: You're booked for Friday at 2. Here's what to expect at the visit: https://brightline.example/estimate-visit
Campaign spikes. On Growth, a number opens at most 3 new conversations in any 15 minutes, so if an ad brings ten form fills in ten minutes, three get texted and the rest are marked failed with the new-contact limit; call those leads. To raise the ceiling, add numbers (each has its own allowance), or put a "Text us now" button with a pre-filled sms: link on the thank-you page: people who text first never count as new contacts, their links are tappable from the start, and their conversation stays out of the Screen Unknown Senders list that iOS 26 uses for texts from unknown senders. How to get customers to text you first shows the link format, and texting lead ad leads in seconds and speed to lead for home service businesses go deeper on the first minutes.
How should follow-up sequences change on iMessage?
Cap every sequence at two texts before the lead's first reply, then hand non-responders to calls or email. ZeroSettle allows at most 2 messages to a contact who has never sent the number anything; a third is refused with 403 awaiting_reply and marked failed in GoHighLevel. Messages sent within 5 minutes of the first count as one, and once the lead sends anything back (a text, photo, voice note or tapback), that rule is gone for that contact.
| Step | What the workflow does | Why |
|---|---|---|
| 1. Trigger | A form or lead-ad submission that includes texting consent | Consent for this purpose comes first |
| 2. Text 1 | Send SMS: who you are, what they asked for, one question | Uses one new-contact slot; no link or photo |
| 3. Wait | Wait for a reply, then exit the sequence when one arrives | A reply removes the two-text rule and makes links tappable |
| 4. Text 2 | If no reply by the next day: one short, low-pressure check-in | The last text allowed before a reply |
| 5. Other channels | Still no reply: a call task or email, no third text | A third text is refused; repeated unanswered texts get numbers flagged |
A second text that works: "Hi Tasha, Marco again from Brightline. Happy to price the trim only if that's easier. Want a couple of times?"
In the docs' words, "Repeated messages to people who never answer are the fastest way to get a number flagged by Apple: when that happens every send fails, to everyone." Keep promotional texts between 8 AM and 9 PM in the recipient's time zone. More patterns are in lead nurture on iMessage without getting your number flagged and what happens if your number is flagged.
Can you use bulk actions with an iMessage number?
Yes, and they work best for contacts who already have a conversation with the client's number. Every recipient of a bulk action goes through the same rules as a single send, so the result depends on who is on the list:
| Recipient | What happens |
|---|---|
| Texted the number first, or already has a conversation with it | Sent. Counts toward the 10,000 messages a day, sent and received, each number allows with known contacts |
| Never messaged by this number | A new contact: sent while the day's allowance lasts, then marked failed with the new-contact limit |
| Got 2 texts and never replied | Marked failed: waiting on their first reply |
| Texted STOP to any of the account's numbers | Marked failed: opted out |
So a bulk "spring special" to 400 past customers on a brand-new number is mostly new contacts: only 5 (Pro) or 50 per number (Growth) go each day, and on Growth no more than 3 in any 15 minutes, so a batch of 50 takes more than four hours to go out. Split the list into daily batches, space the sends out, and send only to customers who agreed to texts from the business. Bringing back past painting customers walks through a reactivation that respects the cap. Never load a purchased or scraped list into a sub-account and blast it.
Should GoHighLevel or the hosted AI agent run the conversation?
Let GoHighLevel run it when the client's staff or your workflows reply; let ZeroSettle's hosted AI agent run it when the client wants every text answered at once without staff. The choice is per sender (a name and photo and its numbers), and it is either-or.
| Question | Managed by API | Managed by AI Agent |
|---|---|---|
| Who replies | Staff in GoHighLevel, your workflows, or your own code | The hosted agent, from the business context you write |
| Sends from GoHighLevel | Sent from the client's number | Marked failed: the number only sends through the agent |
| Logged in GoHighLevel | Every reply and send | Every reply and every text the agent sends |
| Starting a conversation | A workflow Send SMS action | Start a conversation in the console, or POST /api/imessage/agent/start from your code |
| Credits | None for texts | One per text the agent sends |
With the agent, GoHighLevel becomes the record: the client sees every text in the contact's conversation while the agent answers. The agent knows only its business context and any files you connect (it can also use tools from MCP servers you add), follows the same rules (STOP, the new-contact limits, at most 2 texts before a first reply), and by default follows up once, the morning after a lead goes quiet. The setup is in AI agent in the console; qualifying leads with an AI agent shows how to brief it, and how the hosted agent works covers its settings.
Why would a GoHighLevel send be marked failed?
A GoHighLevel send is marked failed when one of ZeroSettle's sending rules refuses it, and the failure carries the reason. Sends from GoHighLevel follow the same rules as POST /api/imessage/send:
| Rule (the matching API error code) | Cause | What to do |
|---|---|---|
Subscription (payment_required) | The number's subscription is not active | Update the card under Settings → Billing |
STOP (recipient_opted_out) | The person texted STOP to one of the account's numbers | Don't retry. Only their START opts them back in |
Unanswered texts (awaiting_reply) | Two texts already sent with no reply | Wait for a reply; use calls or email meanwhile |
New contacts (new_contact_limit) | The day's (or 15 minutes') new-contact allowance is used | Send later, add a number, or move from Pro to Growth |
| AI agent | The number is managed by the AI agent, which only sends through the agent | Switch to Managed by API, or let the agent start the conversation |
If nothing is being logged or sent at all, look at last_error and pending in the integration status, and recheck the connection with POST /api/imessage/integrations/gohighlevel/check. If every send fails, to everyone, the number may have been flagged by Apple: see what happens if your number is flagged. The full code table is in Errors, limits, and compliance.
One more gap: iMessage reaches Apple devices, and SMS fallback is a limited pilot ZeroSettle must enable per account, so keep a call or email step for leads who never reply.
What consent do you need before texting leads?
Text only people who gave the client their number for this purpose, and keep the record. That means an estimate or quote request, a web form or lead-ad form whose consent language covers texts from the business, a past customer who agreed to texts, or someone who texted the number first. It never means purchased lists, scraped numbers, door-knock sheets or cold texting. As the docs say, "If you are unsure whether you have consent, you don't." ZeroSettle suspends lines used for unsolicited messaging.
- The law. In the United States, the FCC's rules generally require prior express written consent for advertising or telemarketing covered by the autodialer rules, and do-not-call and state laws may apply too. Other countries have their own rules. Read iMessage marketing and TCPA consent; this is not legal advice.
- Say who you are in the first text, using the client's business name.
- STOP is enforced for you. When a contact texts STOP (or a phrase such as "remove me" or "wrong number"), ZeroSettle blocks every number on the account from reaching them, and any GoHighLevel send to them is marked failed. The STOP itself still lands in the contact's conversation.
CANCELandENDare not recognized as opt-outs, so treat them as opt-outs yourself in GoHighLevel. - Lead-ad forms: the consent language should name texting by the client's business, and each client should hold its own consent records.
What does it cost an agency per client?
A client's single number costs $49 a month on Pro, Growth is $199 a month per number (or $599 a month for 3 numbers from a Growth link), and Enterprise pricing is custom, through sales. Pick the plan by how many conversations the client starts each day:
| Plan | Price | New contacts a day | Fits |
|---|---|---|---|
| Pro | $49/month for one number | 5 | A client whose leads mostly text first; 500 free credits once |
| Growth (upgrade in the console) | $199/month per number | 50 per number, at most 3 per 15 minutes | A client texting every form fill; team members; 1,000 free credits once |
| Growth link | $599/month for 3 numbers, plus $199 for each extra number | 150+ (50 per number) | One high-volume client whose numbers work as one |
| Enterprise | Custom, through sales | Custom | High volume and compliance needs; book a demo |
Every number allows 10,000 messages a day, sent and received, with known contacts. Subscriptions carry a 30-day money-back guarantee.
Credits pay only for the hosted AI agent's texts (one per text it sends) and for videos; free credits come once per account and never refill, and packs (1,000 for $50 or 5,000 for $200) never expire. A client whose staff answer from GoHighLevel uses no credits for texts. Full details are in ZeroSettle pricing and the Your iMessage number docs. To set up the first client, get a number and connect its sub-account.
Frequently asked questions
Can we install the iMessage (ZeroSettle) app at the agency level?
No. Install it on each client's sub-account. An agency-level install comes back with an error, and each sub-account connects to one ZeroSettle account.
Does it work with LeadConnector?
Yes. LeadConnector is HighLevel's white-label brand: same app, same setup and same behavior. Only the install page differs, so choose LeadConnector instead of GoHighLevel under Settings, CRM in the ZeroSettle console.
Will leads on Android get our texts?
Don't count on it. iMessage reaches Apple devices. SMS fallback is a limited pilot that ZeroSettle must enable for an account, so keep a call or email step in the workflow for leads who are not on iMessage.
Do leads who text the client's number first count toward the daily limit?
No. People who text the number first, and ongoing conversations, never count as new contacts. Only conversations the number starts do: 5 a day on Pro, and 50 a day per number on Growth with at most 3 every 15 minutes.
Can the first text include a booking link or a photo?
A link in a text to someone who has never texted the number shows as plain text they can't tap, and ZeroSettle refuses photos, videos and voice messages to a contact who has never replied. Make the first text plain words that end on a question, and send the link after they answer.
What happens to logged conversations if we disconnect?
They stay in GoHighLevel. After a disconnect nothing more is logged and texts from GoHighLevel are no longer sent from the number, so choose another SMS provider in the sub-account. Uninstalling the app in GoHighLevel disconnects too.
Sources
- ZeroSettle iMessage API docs: CRM integrations, “GoHighLevel and LeadConnector” (connect, settings and status, what lands in GoHighLevel). Checked November 2, 2026.
- ZeroSettle iMessage API docs: Errors, limits, and compliance, including “Limits”, “Compliance: you need consent” and “STOP is enforced”. Checked November 2, 2026.
- ZeroSettle iMessage API docs: Your iMessage number, “Pricing”, “Getting your number” and “More than one number”. Checked November 2, 2026.
- ZeroSettle iMessage API docs: Send a message, “Links in a first message” and “SMS fallback”. Checked November 2, 2026.
- ZeroSettle iMessage API docs: AI agent and AI agent in the console, “Managed by AI Agent” and “Credits”. Checked November 2, 2026.
- 47 CFR 64.1200, Delivery restrictions, Electronic Code of Federal Regulations. Checked November 2, 2026.