Guide · n8n template · 6 min read
GoHighLevel appointment booking from n8n, via one webhook
If your agency runs clients on GoHighLevel, a voice agent or form that books appointments also has to keep the contact and pipeline right. This workflow does all of that from one webhook: it checks the slot, books the appointment and creates or moves the opportunity, so the CRM matches what happened on the call.
Free template: Book appointments and manage sales opportunities via webhooks in HighLevel
By MD Faizan Uzzaman · Verified n8n Creator · Published 12 Oct 2026
Can n8n book appointments in GoHighLevel?
Yes. This workflow checks the slot, creates or updates the contact and books a 30-minute appointment in a GoHighLevel calendar, all from one webhook call.
- A POST request arrives at the webhook (/ray/book-appointment) with the caller's name, phone, address, service type and preferred date and time.
- n8n calls a separate Check Slot Availability workflow.
- If the slot is taken, it returns a "not booked, slot unavailable" response.
- If it's free, it builds a 30-minute window and creates or updates the contact in GoHighLevel.
- It books the appointment in your GoHighLevel calendar, then searches the pipeline for an existing opportunity for that contact or phone.
- It updates that opportunity's stage or creates a new one, and sets custom fields (service type, preferred date and time, event ID) through the LeadConnector API.
- It returns a "booked" response, starts a background workflow with the booking details and routes any GoHighLevel failure to an error workflow.
Which IDs do you need from GoHighLevel?
Five kinds of ID tie the workflow to the right account and pipeline. Update them before you publish.
| ID | Used for |
|---|---|
| Location ID | The sub-account the contact and appointment live in |
| Calendar ID | Where the 30-minute appointment is booked |
| Pipeline ID and stage ID | Where the opportunity is created or moved |
| Custom field IDs | Service type, preferred date/time and event ID on the opportunity |
How do you set it up?
You need GoHighLevel OAuth2, GoHighLevel/LeadConnector private integration bearer token connected in n8n. Then:
- Import the template into n8n.
- Add GoHighLevel OAuth2 credentials (contacts, calendar and opportunities).
- Add a GoHighLevel/LeadConnector private integration bearer token for the custom-field HTTP request.
- Update the location, calendar, pipeline, stage and custom field IDs to match your account.
- Publish the sub-workflows (Check Slot Availability, Background Workflow, Error Workflow) and confirm their workflow IDs.
- Copy the webhook URL and have your voice agent or form send the required fields to it.
What should you test before it goes live?
The edge cases, not just the happy path.
| Test | What should happen |
|---|---|
| Request a slot that's already taken | "Not booked, slot unavailable" response, nothing created in GoHighLevel |
| Existing contact books again | Contact updated, not duplicated; existing opportunity moved |
| Brand-new caller | New contact, appointment and opportunity with custom fields set |
| GoHighLevel API error | Routed to the error workflow instead of failing silently |
Does it update the sales pipeline too?
Yes. It finds the contact's existing opportunity and moves its stage, or creates a new one, then sets service type, preferred date/time and event ID as custom fields.
Which credentials does it need?
GoHighLevel OAuth2 for contacts, calendar and opportunities, plus a LeadConnector private integration token for the custom-field update.
Can a voice agent call it?
Yes. Any system that can send a POST request with the required fields can, including Vapi and Retell agents.
Related