Guide

Import GoHighLevel leads into Booked55 automatically

GoHighLevel runs the front of the funnel: the landing pages, the SMS follow-ups, the appointment booking. Booked55 is where a rep works the relationship after that. This guide wires the two together with one workflow and one URL, so the hand-off stops being a copy-paste job.

What you get

  • No copy-paste. The lead is created in Booked55 the moment it enters the trigger stage in GoHighLevel. Nobody exports a CSV or re-types a phone number.
  • The lead arrives with context. Name, email, phone, company, address, the GoHighLevel tags, where the lead came from, and the note attached to the stage change. With a token, the whole note history follows.
  • Duplicates get merged. A contact you already have is found by GoHighLevel id, email or phone and updated in place. What a rep typed is never overwritten.
  • The sales process starts on the right stage. A stage mapping puts the lead on the Booked55 pipeline and stage you choose, so the follow-up automations for that stage start immediately.

Before you start

You need four things:

  • Owner or manager role in Booked55. Integrations lives under Workspace → Settings and is available on every workspace.
  • Admin access to the GoHighLevel sub-account. You will create a workflow there and, optionally, a Private Integration token.
  • A decision on which GoHighLevel stage means “sales takes over”. That stage is the trigger. Everything before it stays in GoHighLevel; everything from it onward is worked in Booked55.
  • Optionally, the Booked55 pipeline and stage the lead should land on. You can add this later. The connection works without it.

Step 1: Create the connection in Booked55

  1. Open Workspace → Settings → Integrations and click Connect.
  2. Choose GoHighLevel.
  3. Give the connection a name. It is only for you, so “GoHighLevel: main funnel” is fine. Click Create.
  4. Copy the webhook URL Booked55 shows you. It is shown once.

The connection opens on three tabs. Setup holds the webhook URL and the test button. Settings holds everything about how leads are handled once they arrive. Events is the log of every webhook received.

Treat the URL as a password

The URL contains the connection's secret: anyone who has it can post leads into your workspace. If it ever leaks, open the Setup tab and regenerate it, then paste the new URL into GoHighLevel. The old URL answers 404 from then on.

Step 2: Build the GoHighLevel workflow

The workflow does one thing: when an opportunity enters your hand-off stage, it posts that opportunity to Booked55.

  1. In GoHighLevel, go to Automation → Workflows and click Create Workflow. Start from scratch.
  2. Add the trigger Pipeline Stage Changed.
  3. Add two filters: In Pipeline, set to the pipeline the lead lives in, and Pipeline Stage, set to your hand-off stage. Without them the workflow fires on every stage change in every pipeline.
  4. Add the action Webhook (some accounts list it as Webhook (Outbound)). Method POST. Paste the URL from Step 1.
  5. Optional: add custom data key/values to the webhook action, such as the campaign name or the rep who qualified the lead. Booked55 receives them and keeps them with the event as source data.
  6. Save, then Publish.

Saved is not published

A workflow that is saved but not published never fires. This is the single most common reason “nothing arrives”. Check the publish toggle at the top of the workflow before you check anything else.

Step 3: Send a test

Before you touch a real opportunity, prove the Booked55 side. On the connection's Setup tab, click Send test event. Booked55 runs a sample payload through exactly the path a real webhook takes. Within a few seconds a contact called Jordan Lee from Acme Roofing appears in your contacts, with a note attached. Delete it afterwards if you like.

Then prove the GoHighLevel side. Move a real opportunity (or a throwaway one) into the hand-off stage and open the Events tab. Every webhook is listed with a status: received, processing, processed, failed or skipped. A processed event links to the contact it created or updated. A failed one shows the error and a Retry button. A skipped one shows why: duplicate, duplicate_contact, org_suspended or feature_disabled.

GoHighLevel's own test panel lets you pick more than one contact. Each one arrives as its own event and its own lead, so a batch of three test contacts shows up as three rows on the Events tab.

The Events tab is a recent log. Raw payloads are cleared after 7 days and events are deleted after 30.

Step 4: Map stages

A processed webhook creates or updates a contact. To also put that contact on a Booked55 pipeline, open the Settings tab and add a stage mapping row.

Each row has four parts: the GoHighLevel pipeline name (optional; leave it blank to match that stage name in any pipeline), the GoHighLevel stage name, and the Booked55 pipeline and stage to land on. Names are matched case-insensitively. After the first real events come through, Booked55 suggests the GoHighLevel stage names it has seen, so you do not have to type them from memory.

GoHighLevel pipelineGoHighLevel stageBooked55 pipelineBooked55 stage
SalesAppointment BookedSales ProcessAppointment Set

With that row, an opportunity moved into Appointment Booked in GoHighLevel's Sales pipeline becomes a contact on Appointment Set in Booked55's Sales Process pipeline.

Below the rows, Default pipeline and stage catches anything no row matches, so a lead from a stage you did not map still lands somewhere. If neither a row nor a default matches, the contact is still created, just without a pipeline item.

Step 5: Bring the notes across (optional, recommended)

The webhook carries at most one note: the one attached to the trigger. A lead that was nurtured for weeks usually has more than that, and the rep picking it up wants all of it.

To import the contact's whole note history, give the connection read access to GoHighLevel:

  1. In GoHighLevel, open Settings → Private Integrations and create a new token. Give it the View Contacts scope (contacts.readonly) and nothing else.
  2. In Booked55, open the connection's Settings tab, paste the token into Credentials → Private Integration Token, and save.

From then on, each imported lead brings its complete note history. Notes arrive as completed note tasks on the contact, which is the Notes card on the contact page, so the rep can read the story before the first call. If you would rather not bring notes across at all, set Notes to Don't import.

Booked55 stores the token encrypted and only ever uses it to read contacts and notes. If GoHighLevel rejects the token (revoked, expired, wrong scope), the connection shows Credentials invalid. Leads keep importing; they just arrive without the history until you paste a working token.

If you only came for the setup, you can stop reading here. The connection is live. The rest of this page is for the day an event shows up as failed or a lead lands somewhere you did not expect, and you want to know what Booked55 was thinking.

What happens on every lead

Every webhook goes through the same three steps:

  1. Stored first. The webhook is written to the Events tab as received before anything else happens, so a lead is never lost to a downstream error. Payloads over 256 KB are rejected.
  2. Matched. Booked55 looks for an existing contact by the GoHighLevel contact id, then by email, then by phone.
  3. Created or updated. No match means a new contact. A match means the When a contact already exists setting decides what happens next.

Update and append is the setting most teams want. It fills fields that are empty, adds tags and phone numbers that are not there yet, appends notes it has not seen before, and moves the contact to the mapped stage. It never overwrites something a rep typed, and it never changes the email or the assignee. The alternatives are Skip, which leaves the existing contact untouched and marks the event duplicate_contact, and Always create, which makes a new contact every time and is only for teams that accept duplicates.

If the contact is already on a Booked55 pipeline, Contact already on a pipeline decides whether it is moved to the mapped stage or left where it is.

The company is matched by name or created, with its website when GoHighLevel had one. The opportunity itself (name, status, lead value, pipeline and stage, location) is kept with the contact as source data, so nothing GoHighLevel sent is thrown away. Every contact, company, pipeline item and note is recorded as created by the Acting user you chose in Settings and assigned to the Assignee, with the contact source set to GoHighLevel.

Working the lead in Booked55

From here the lead is an ordinary contact on a stage. It carries a Source: <GoHighLevel source> tag (Source: Facebook Ads, Source: Website Form, whatever GoHighLevel recorded), the GoHighLevel tags, any Tags to add you set on the connection, and the Product/Service type if you chose one. Because it landed on a stage, the rep gets that pipeline's activity automations from that stage: the first call task, the follow-up sequence, whatever you have configured. Deals, tasks and coaching work exactly as for any other contact, and the lead counts toward the funnel on the Sales Process page.

One thing this does not do: nothing flows back. A stage change or a note in Booked55 is not written to GoHighLevel. We went one direction on purpose, because a rep's working notes and a marketing system's contact record are different things, and we are not yet sure they should be merged. An official Booked55 app for GoHighLevel is planned (one-click install, no URL to copy), and whether it syncs both ways is the question we are still arguing about. The webhook connection you set up today keeps working either way.

Troubleshooting

Nothing arrives

The Events tab is the first place to look. If it is empty, the webhook never reached Booked55: the workflow is saved but not published, the filters do not match the stage you moved the opportunity to, the URL was pasted wrong (an unknown URL answers 404, which shows in the workflow’s execution log in GoHighLevel), or the connection is switched off. A connection also switches itself off after 25 consecutive failures; the Events tab shows why, and Active on the Settings tab turns it back on.

Contact created, but no pipeline item

No mapping row matched the stage name and there is no default pipeline and stage. Matching is case-insensitive, but “Appt Booked” and “Appointment Booked” are different names. Fix the row or set a default; the next lead lands where you want it.

Contact landed on the wrong stage

The contact was already on a Booked55 pipeline and Contact already on a pipeline is set to Leave where it is. Switch it to Move to the mapped stage if the GoHighLevel stage should win.

No notes came across

There is no Private Integration token on the connection, or it shows Credentials invalid. Also check that Notes is set to Create note tasks rather than Don’t import.

Duplicates

The email or phone differs between the two systems (a typo, a second address, a formatted number), so the match failed and Booked55 created a new contact. Once a contact has been imported it is matched by GoHighLevel id from then on, so a fix in either system holds. The reverse also happens: two GoHighLevel contacts that share a phone number, such as an office line, are one contact to Booked55.

Wrong owner

Check Assignee on the Settings tab. Booked55 never reassigns an existing contact, so changing the assignee affects new leads only.

Event marked skipped: duplicate

An identical webhook within 10 minutes of the previous one is skipped on purpose, so a workflow that fires twice, or a retry from GoHighLevel, does not create two of everything.

Full reference

Every setting, status and field, on the docs site

This guide covers the path most teams take. The docs list every field on the connection, every event status, and exactly what is imported.

Send your next lead straight to a rep

Start a 14-day free trial and connect GoHighLevel in about ten minutes.