Every webhook that connects GoHighLevel to the Growthlio Command Centre: what each one does, when to call it, what to send and what comes back. 9 endpoints, no login needed.
GCC (the Growthlio Command Centre) is the brain behind each client account. GoHighLevel stays the place where contacts, calendars and messages live; GCC does the thinking (AI replies, calls, tasks, ad signals) and GHL tells it what happened by calling the endpoints on this page. Every endpoint is an HTTPS POST to https://command.growthlio.com with a JSON body.
Provisioning secret
One per agency, sent as x-provision-secret. Only for setting up new clients.
Account secret
One per client account, in the GHL custom value replio_webhook_secret. The snapshot workflows use it.
Workspace token
A bearer token for the ads outcomes endpoint, issued by Growthlio.
Field names are forgiving: camelCase, snake_case and GHL nested shapes (contact.id, location.id) are all accepted, top level or under customData.
A merge tag GHL could not fill in (a literal {{ .. }}) counts as empty, not as a value.
Retry any 5xx 2 to 3 times, a few seconds apart. Every endpoint here is safe to repeat unless it says otherwise.
A 200 can still mean "nothing to do" (duplicate, unmatched, skipped). Read the status field, not just the HTTP code.
Secrets and tokens are given to you privately and never appear on this page. Keep them out of client visible config and source control.
Client setup
Bring a new paying client into GCC.
Provision a new client
POST/api/clients/provision
One call when a new client pays and their GHL sub-account exists. GCC creates the access key it needs for that sub-account, creates (or reuses) the client in your workspace and returns the client onboarding link for you to send. Round trip is one to two seconds.
When to call it
Last step of your payment or sign-up automation. Safe to call again for the same sub-account, so it can also sit on a "retry if setup incomplete" path.
Called by
Your GHL agency or SaaS workflow (Webhook action), or n8n.
Auth: Shared provisioning secret
Header x-provision-secret. Growthlio gives you this privately; it is never in this guide. The workspace is decided from your companyId on our side, so a call can only ever set up accounts in your own agency.
Body fields
locationIdRequiredalso: location_id
The new client GHL sub-account id. In a sub-account workflow: t1xDJ87jWjC1gmCMpg04.
companyIdRequiredalso: company_id
Your GHL agency id. Same every time, hard-code it. An agency Growthlio has not mapped is refused.
Growthlio access to that agency needs reconnecting.
Tell Growthlio. Retry after they confirm.
413
Body over 16 KB.
Send only the two fields.
502
Brief GHL hiccup upstream.
Retry 2 to 3 times, a few seconds apart.
503
Provisioning temporarily unavailable.
Retry after a short wait.
Safe to repeat?
Safe to repeat. A second call for the same sub-account reuses the existing key and onboarding link. created tells you which happened (true = new, false = already set up).
Set it up in a GHL workflow
In the workflow, after payment, add a Webhook (custom webhook) action.
Method POST, URL https://command.growthlio.com/api/clients/provision.
Headers: x-provision-secret = the secret Growthlio gave you, content-type = application/json.
Raw JSON body: {"locationId":"t1xDJ87jWjC1gmCMpg04","companyId":"YOUR_AGENCY_ID"}.
Save the response and use onboardingUrl in the next step to text or email the client.
Send onboardingUrl to the client yourself (SMS or email). GCC also emails it to the sub-account business email when one is set (emailed: true), but that is only a backup.
Always retry 5xx before alerting a human.
Conversations
Lead replies, timeline events and bookings coming in from GHL.
Inbound lead message
POST/api/replio/webhook
The main conversation path. A lead replies by SMS, Instagram or Messenger, GHL forwards it here, and the AI agent reads the thread, decides and answers in GHL. Tags, bookings and handoffs happen inside the same call.
When to call it
On every inbound customer message in an account with an AI agent. The Command Centre snapshot already carries this workflow.
Called by
GHL workflow Webhook action (Customer Replied trigger), including the split account forward from a client-owned location.
Auth: Per account secret
Header X-Replio-Webhook-Secret. In a GHL workflow use Npk0zT8p5I9wEPt3BCmy0OkYBtA3v9aeSoGZG8SWO6E; GCC writes that custom value when the account is deployed. The secret only works for its own account.
invalid_json or missing location, contact or message.
Fix the webhook body.
401
Missing or wrong secret.
Use Npk0zT8p5I9wEPt3BCmy0OkYBtA3v9aeSoGZG8SWO6E.
402
halt_reason subscription_required.
The account subscription is not active. Talk to Growthlio.
429
Over 600 calls a minute per IP or per location.
Back off and retry.
Safe to repeat?
No route level dedupe, but a turn that was already answered halts with double_text_already_answered, so a repeat does not double reply. Every raw payload is logged.
A 200 with halt_reason set is normal: the agent decided not to answer (opted out, human took over, outside hours and so on).
Can take up to 300 seconds on long turns. Do not set a short timeout on the GHL action.
Lead timeline event
POST/api/os/events
Records something that happened to a lead (booked, confirmed, no show, hot lead and so on) on its timeline in Growthlio OS. Action kinds also create a staff call task and a notification.
When to call it
From the webhook steps in the AI Command Centre snapshot, at each stage of the booking and show-up flow.
Called by
GHL workflow Webhook action in the snapshot.
Auth: Per account secret
Header X-Replio-Webhook-Secret. In a GHL workflow use Npk0zT8p5I9wEPt3BCmy0OkYBtA3v9aeSoGZG8SWO6E; GCC writes that custom value when the account is deployed. The secret only works for its own account.
One row per account, contact, kind and appointment. A retry returns status duplicate with HTTP 200.
An unknown location returns 200 with status unmatched, so a misrouted workflow does not error loop.
Still booked check
POST/api/os/appointment-check
After a cancellation, checks whether the lead still holds another live booking. If yes, GCC tags the contact "appointment | still booked" so the rebooking sequence can stop.
When to call it
Top of the Cancelled Rebooking Sequence in the snapshot.
Called by
GHL workflow Webhook action in the snapshot.
Auth: Per account secret
Header X-Replio-Webhook-Secret. In a GHL workflow use Npk0zT8p5I9wEPt3BCmy0OkYBtA3v9aeSoGZG8SWO6E; GCC writes that custom value when the account is deployed. The secret only works for its own account.
Body fields
contact_idRequiredalso: contactId
The GHL contact id.
location_idRequiredalso: locationIdlocation.id
The GHL sub-account id.
appointment_idalso: calendar.appointmentId
The booking that was cancelled, so it is not counted.
If the calendar read fails the answer is still 200 with checked: false. Treat that as "not still booked".
Opportunity changed
POST/api/ghl/opportunity
Keeps GCC pipeline view in step with GHL in near real time when an opportunity changes stage or status. Without it, GCC catches up on its twice daily sync.
When to call it
Opportunity Status Changed or Pipeline Stage Changed trigger, only in accounts where live pipeline numbers matter.
Called by
GHL workflow Webhook action.
Auth: Per account secret
Header x-replio-ghl-secret, value Npk0zT8p5I9wEPt3BCmy0OkYBtA3v9aeSoGZG8SWO6E. A missing header is refused before anything is read.
Body fields
locationIdRequired
The GHL sub-account id.
opportunity.idRequiredalso: opportunityIdid
The opportunity id. The body may be flat or nested under opportunity.
Places an outbound AI phone call to the lead through Retell. The outcome is written back to the GHL contact as tags and the AI Memory field when the call ends.
When to call it
From the snapshot workflows "3 - Voice: Confirm Call [Switch]" and "3 - Voice: Speed To Lead Call [Switch]", once voice is set up for the account.
Called by
GHL workflow Webhook action in the snapshot.
Auth: Per account secret
Header X-Replio-Webhook-Secret. In a GHL workflow use Npk0zT8p5I9wEPt3BCmy0OkYBtA3v9aeSoGZG8SWO6E; GCC writes that custom value when the account is deployed. The secret only works for its own account.
Body fields
contact_idRequiredalso: contactId
The GHL contact id.
location_idRequiredalso: locationIdlocation.id
The GHL sub-account id.
purposeRequired
showup_confirm (confirm a booking) or stl_first_contact (speed to lead first call).
persona_name, company_name, timezone
Who the caller is and the lead local zone.
script, first_message
Override the opening line or script for this call.
One call per account, contact, purpose, appointment and day, with a per contact lock. A repeat returns status skipped, reason duplicate.
status skipped is a 200, not an error. reason says why (duplicate, outside calling hours, voice not set up and so on).
Ads outcomes
Tell Meta what really happened to a lead.
Qualified lead to Meta
POST/api/ads/ghl/qualified
A lead the account marked qualified is recorded and sent to Meta as a QualifiedLead conversion, so ads optimise toward real prospects instead of form fills.
When to call it
The "Ads: Qualified lead to Meta" workflow in the Full snapshot.
Called by
GHL workflow Webhook action in the snapshot.
Auth: Per account secret
Header X-Replio-Webhook-Secret. In a GHL workflow use Npk0zT8p5I9wEPt3BCmy0OkYBtA3v9aeSoGZG8SWO6E; GCC writes that custom value when the account is deployed. The secret only works for its own account.
One qualified event per contact. A repeat is a 200 duplicate.
The stage is always qualified on this route. For other stages use the outcomes endpoint.
Returns 200 unmatched when the account has no ads client in GCC.
Lead outcome (any stage)
POST/api/ads/clients/{clientId}/outcomes
Tells Meta what really happened to a lead: qualified, contacted, booked, showed, closed or lost. Each becomes a conversion event Meta can optimise for.
When to call it
Any CRM stage change you want Meta to learn from. Works from GHL, n8n or any CRM that can send a webhook.
Called by
GHL workflow, n8n or another CRM.
Auth: Workspace API token
Header Authorization: Bearer <token>. Growthlio issues the workspace token (it starts envk_ and is shown once; only a hash is stored). clientId in the URL is the GCC ads client id, also given by Growthlio.
Body fields
stageRequiredalso: Stageeventstatus
lead, qualified, contacted, booked, showed, closed or lost.