GoHighLevel's own WhatsApp offering rides the Business API (a paid add-on per subaccount, with Meta's per-message fees underneath). If you, or the clients your agency manages, live on a normal WhatsApp number, the alternative is Spun on that number plus GHL's workflow webhooks, which happen to make this the easiest integration on this site: GHL workflows can both receive webhooks and send custom HTTP requests with headers, so no Zapier sits in the middle.
Two flows cover most agency setups: GHL-triggered WhatsApp sends (appointment reminders, follow-up sequences), and WhatsApp events feeding GHL contact timelines and pipelines.
1. Send WhatsApp from GHL workflows
- 1
Create a Spun API key
In Spun: Settings, then Webhooks, then Manage API Keys, then New Key, scoped to send messages (add contacts scopes if you sync fields too). Copy the wap_ key once.
- 2
Add a Custom Webhook action
In your GHL workflow (appointment booked, pipeline stage changed, form submitted), add the Custom Webhook action: method POST, Spun's send-message URL, an Authorization header with the Bearer key, and a JSON body using GHL merge fields.
- 3
Use merge fields for the number and text
Map the contact's phone into "to" and write the message with GHL's personalization tags. The message arrives from your real WhatsApp number, not a template sender.
POST https://api.spun.com/api/integrations/send-message
Authorization: Bearer wap_YOUR_KEY
Content-Type: application/json
{
"to": "{{contact.phone}}",
"text": "Hi {{contact.first_name}}, confirming your appointment on {{appointment.start_time}}. Reply here if you need to reschedule."
}Strip the plus sign and spaces from the phone format if your GHL numbers carry them; Spun expects digits with country code.
2. Feed WhatsApp events into GHL workflows
- 1
Create an inbound webhook trigger in GHL
Start a workflow with the Inbound Webhook trigger and copy its URL.
- 2
Point Spun at it
In Spun: Settings, then Webhooks, then Add Webhook, paste the GHL URL and pick events: incoming message, contact created, label assigned, or lead qualified.
- 3
Map and act in GHL
Use the webhook payload (phone, message text, label) to find or create the contact, add a note to the timeline, move a pipeline stage, or kick off a follow-up sequence.
Label-gate the flows that create pipeline records: let agents apply "Qualified" in Spun, and only that event advances the GHL opportunity. Every conversation should not become a deal.
What to know before you build (agencies especially)
- Each Spun workspace is one organisation with its own API keys. An agency running WhatsApp for multiple clients gives each client their own Spun workspace and keys; one flat plan covers that client's whole team.
- This is not a listed GHL marketplace app: the key is pasted into workflow actions, and Spun webhook subscriptions are created in Spun's Settings UI.
- Rate limit: 60 API requests per minute per key. For blast-style sequences, prefer Spun's own broadcast tools with their built-in pacing over machine-gunning the API.
- GHL's native WhatsApp add-on remains the right choice when the client must have official API sending inside the GHL conversation view; this recipe is for clients on their existing numbers.
Related: WhatsApp + Zapier & Make (payload shapes and the full API) · WhatsApp for virtual assistants and agencies