What this screen does
WAGHL raises three kinds of event. This screen answers one question for each: who gets told, and where?
| Event | When it fires | Who it can reach |
|---|---|---|
| Payment & billing | A payment is due, a trial expires, or an account is deactivated | You (agency owner) |
| Token expiry | A sub-account's GHL token expires and needs a resync | You (agency owner) |
| Disconnect | A client's WhatsApp session drops | Your client — and/or an extra number you choose |
Every one of those can also be pushed to your own endpoint as JSON. See Webhook notifications.
Notification Number
The number alerts are sent from. It can be a number already connected to one of your sub-accounts, or a different one you dedicate to notifications — you'll see an option to scan and connect it.
Agency Owner Notifications
Two independent toggles for the events that concern you rather than your client.
Payment & Billing
Fires when a payment is due, a trial expires, or an account is deactivated. Leave this Yes if you want to know about billing events on your sub-accounts.
Token Expiry
Fires when a sub-account's token expires and messaging stops until you resync it. This one is worth keeping on: an expired token is silent from the client's side — they'll just notice messages aren't arriving.
Where these alerts are sent
Send to Registered Number
Sends to your account's registered mobile number — the one on your WAGHL profile, not the sending number above. Set this to No only if you want alerts going exclusively to the additional number below.
Additional number (optional)
Copies every agency alert to one more WhatsApp number. Useful for a business partner, a VA, or an ops channel. Leave it blank if you don't need it.
Sub-account Client Notifications
The one event that reaches your client directly.
Send on Disconnect
Messages the client on WhatsApp when their session drops, so they can rescan without opening a ticket. Set to No if you'd rather handle disconnects quietly yourself.
Send to Connected Number
Sends to the client's own WhatsApp number — the one that just disconnected.
Additional number (optional)
One number copied on every client disconnect, across all your sub-accounts. Your support desk, typically.
The disconnect message
The message your client receives. Three parts, and only two are yours to edit:
Opening text — editable
Your own words. Write it in any language; WhatsApp delivers exactly what you type.
The fixed block — labels editable, values locked
Auto-filled with the affected sub-account. You can rename the labels — translate "Location id:" and "Location Name:" or reword them — but the values are inserted at send time and can't be changed. {{msg}} is simply where your opening and closing text lands; it isn't something you edit or remove.
Location id: *{{location}}*
Location Name: *{{location_name}}*
{{msg}}
Closing text — editable
Reconnection instructions, your support link, whatever's useful.
{{location}} and {{location_name}} are replaced automatically with the affected sub-account when the message sends. Delete them and your client gets an alert that doesn't say which account it's about.
Webhook notifications
Push the same events to your own endpoint as JSON — log them, raise a ticket, alert Slack, whatever you run.
Set a URL to switch it on
Paste any valid http(s) URL. A URL set = webhooks on. Blank = off. There are no per-event toggles — if you're listening, you get everything.
Receive the POST
A plain POST with Content-Type: application/json. Each event fires once — it's a data feed, not a reminder, so it won't repeat even when the WhatsApp reminders do.
Payload
Three event types. All share event, location, location_name and message; two add one field each.
| Field | Sent on | What it is |
|---|---|---|
event | all | disconnect, resync, or payment_due |
location | all | The GHL sub-account (location) ID |
location_name | all | The sub-account's name |
message | all | The rendered notification text |
device | disconnect only | The WhatsApp number that dropped |
payment_link | payment_due only | Your payment link for that client |
Disconnect:
{
"event": "disconnect",
"location": "abc123",
"location_name": "Acme Dental",
"device": "919876543210",
"message": "<the WhatsApp text>"
}
Token expiry — note no device:
{
"event": "resync",
"location": "abc123",
"location_name": "Acme Dental",
"message": "<the WhatsApp text>"
}
Payment due — also covers trial expiry and deactivation:
{
"event": "payment_due",
"location": "abc123",
"location_name": "Acme Dental",
"payment_link": "https://your-domain.com/payment_due_info.php?id=...",
"message": "<the WhatsApp text>"
}
What your endpoint should do
- Don't rely on a retry. Each event is sent once. If your endpoint is down when it fires, that event is gone — the WhatsApp alert is your backstop.
- Expect new fields. Parse the ones you need and ignore the rest, so a future addition doesn't break you.
Common setups
Hands-off — clients fix their own disconnects
Payment & Billing Yes · Token Expiry Yes · Send on Disconnect Yes · Send to Connected Number Yes. You hear about billing and token events; clients handle their own rescans.
White-glove — you handle everything
Send on Disconnect No, and put your support number in the client additional number field. Clients never get an automated message; your desk sees every drop.
Piped into your own tooling
Set a Webhook URL and keep the WhatsApp toggles on as a fallback. Your system gets structured events; you still get a message if it breaks.
Troubleshooting
| Symptom | Check |
|---|---|
| No agency alerts at all | Is Send to Registered Number set to No with no additional number? That combination silences them. Also confirm your profile's registered mobile number is correct. |
| Nothing arrives on any channel | The Notification Number must be a connected device. If it's unpaired, nothing can send — though webhooks still fire. |
| Clients aren't told about disconnects | Send on Disconnect and Send to Connected Number both need to be Yes. |
| Alert doesn't say which account | A variable was removed from the message. Restore {{location}} and {{location_name}}. |
| "Invalid Webhook URL" on save | Needs a full URL with scheme — https://example.com/hook, not example.com/hook. |
| Additional number rejected | Enter digits with country code and no +, e.g. 919876543210. Blank is fine — it just means no extra recipient. |
| Webhook fires, nothing lands | Check your endpoint is reachable and accepting POST at the exact URL you saved. Each event is sent once with no retry, so anything missed while the endpoint was down or slow won't come back. |
What's next?
- Send internal notifications — alert your team from GHL workflows
- Premium actions & webhook — the wider webhook surface
- Error 301: Account not active — what clients see when billing lapses