How to add WhatsApp to GoHighLevel.
The complete recipe for wiring always-on WhatsApp into a HighLevel sub-account: inbound messages fire your workflows, any workflow can send WhatsApp back, and your client’s onboarding is one QR scan. No Meta Business API. No business verification. No 24-hour window. No template approval. Total time: under 45 minutes for your first sub-account, under 10 for every one after that.
Why not GHL's native WhatsApp?
HighLevel does ship a native WhatsApp integration. It rides Meta’s WhatsApp Business API, which means every client you onboard inherits the full Business API gauntlet: Meta business verification per client (days to weeks), template pre-approval for any outbound after the 24-hour customer service window, per-conversation Meta fees on top of the GHL add-on price, and a display-name review process.
For agencies whose clients want WhatsApp to behave like a phone (real back-and-forth conversations, follow-ups on day three, no message categories), that model fights you the whole way. The approach in this tutorial connects through the client’s actual WhatsApp instead, so none of those rules exist. The trade-off is the honest one we always state: it’s built for real one-to-one conversations, not mass broadcast. If you need one-to-many blasts at scale, use the Business API for that and read the two-paths explainer first.
Create the inbound workflow in HighLevel
We start on the HighLevel side because Mossmoon delivers events to a webhook URL you attach to the line when you create it. In your client’s sub-account, go to Automation > Workflows > Create Workflow > Start from Scratch. For the trigger, choose Inbound Webhook.
HighLevel generates a unique webhook URL for that trigger. Copy it. Every event Mossmoon fires for this client’s line (inbound messages, line ready, line disconnected) will POST to this URL and start the workflow.
Provision a Mossmoon line for the sub-account
Sign up at mossmoon.app/signup and grab an API key from Dashboard > API keys. Then create the line, passing the GHL webhook URL from step 1 and the sub-account (location) ID as your external reference:
curl -X POST https://mossmoon.app/api/v1/wa/lines \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"mode": "existing",
"webhook_url": "https://services.leadconnectorhq.com/hooks/...",
"agency_external_user_id": "ghl_location_ve9EPM428h8vShlRW1KT"
}'Mossmoon returns:
{
"line_id": "wa_8f3c2e1a",
"status": "pending_link",
"mode": "existing",
"monthly_price_cents": 1500,
"connect_url": "https://mossmoon.app/wa/connect/<token>",
"webhook_secret": "wsec_...",
"created_at": "2026-08-24T14:30:00Z"
}Three things to save: the line_id (your outbound action in step 5 uses it), the connect_url (your client’s onboarding link), and the webhook_secret (shown exactly once; it signs every webhook so you can verify authenticity). Nothing bills yet: billing starts only when the QR is actually scanned.
Have your client scan the QR
Send the connect_url to your client, or embed it in your client portal as a “Connect WhatsApp” button, link, or iframe (iframe embeds show no Mossmoon branding). They open it, open WhatsApp on their phone, tap Settings > Linked Devices > Link a Device, and scan. End to end this takes under two minutes.
The line transitions to ready within seconds of the scan, and Mossmoon fires line.ready at the workflow from step 1. Their WhatsApp now stays connected 24/7 through Mossmoon’s hosted infrastructure, whether their phone is on, asleep, or on a plane. The 7-day free trial starts here on your first line; $15/month per line after.
Map the inbound payload in your workflow
Text the connected number from another phone so HighLevel captures a sample payload on the Inbound Webhook trigger. The JSON that arrives (abridged):
{
"event": "message.received",
"line_id": "wa_8f3c2e1a",
"agency_external_user_id": "ghl_location_ve9EPM428h8vShlRW1KT",
"ts": "2026-08-24T14:35:22.001Z",
"data": {
"message_id": "wamsg_a1b2c3d4e5f6",
"from_me": false,
"from": "+15551234567",
"from_name": "Sarah K",
"is_group": false,
"type": "chat",
"text": "Hi, is the 3pm slot still available?",
"media_url": null,
"message_ts": "2026-08-24T14:35:21.812Z"
}
}HighLevel exposes every field of that JSON as mappable data in the steps after the trigger. The two you’ll use constantly: data.from (the sender’s number, for the contact lookup) and data.text (the message body, for your AI or routing logic). A typical inbound workflow: If/Else on event, then Find/Create Contact by phone from data.from, then add a note or tag with data.text, then whatever automation the client is paying you for. The full payload reference (media fields, group context, reply quotes) is in the webhook docs.
Add the outbound Custom Webhook action
Outbound is one workflow action you can drop into any funnel, drip, or automation in the sub-account. In the workflow editor, add an action and choose Custom Webhook:
{
"to": "{{contact.phone}}",
"text": "Hi {{contact.first_name}}, your appointment is confirmed for tomorrow at 3pm. Reply here if you need to reschedule."
}That’s your “Send WhatsApp” action, reusable everywhere GHL lets you add a webhook step. Mossmoon answers 202 Accepted with a message_id and "status": "queued", then fires message.delivered or message.failed back at your inbound workflow URL as the send progresses. The message arrives from the client’s own WhatsApp number, in the same thread the end-customer already has with them.
Three patterns agencies ship in week one
- AI receptionist on the client’s number. Inbound message triggers the workflow, the workflow calls your AI step with
data.text, and the reply goes back out through the Custom Webhook action. The end-customer sees one continuous conversation with the business they already know. - Appointment booking with WhatsApp confirmations. Calendar booking fires a workflow that sends confirmation and reminders over WhatsApp. “Reply here to reschedule” comes back through the inbound trigger and routes into a rebook workflow.
- Cold-lead revival without templates. A drip workflow that follows up on day 3, day 7, and day 14 over WhatsApp, written like a human because no template approval stands in the way. Replies land in the same workflow engine that sent them.
Running this across many clients? The whole recipe is repeatable per sub-account: one workflow, one POST, one QR. The GoHighLevel agencies page covers the multi-client economics ($15 flat per line, easy to mark up), and your Mossmoon dashboard includes a GHL section for connecting lines to sub-accounts’ native Conversations as well.
Wire WhatsApp into a sub-account this afternoon.
First line free for 7 days. No Meta onboarding. One QR scan per client. Workflows trigger immediately.
Related reading: HighLevel agencies guide · Goghl.ai comparison · Business API vs personal API · Webhook setup guide