The firm’s in-house team plans the campaigns and designs the funnels. What they needed was someone to make those designs actually work inside GoHighLevel: pages that track properly, ads that learn from good leads instead of any lead, and follow-ups that know when to stop.
About this build. This is an example build based on a real brief. The client is anonymised, nothing shown is client data, and there are no results numbers here on purpose: the point is to show how the system is designed and why each piece exists.
The problem
Three things were quietly costing the firm money. Meta was optimising ads on every form fill, including people who never booked a consultation. Leads who started intake and dropped off simply disappeared. And people who had already booked kept getting “are you still interested?” emails, because the email sequences had no idea a booking happened in another system.
How I built it
Step 01
Define what a “good lead” looks like before building anything
WhyIf every form fill counts as a conversion, Meta learns to find more form fillers, not more clients. The firm needed the system to know the difference between someone who glanced at a page and someone who was ready to book.
HowI mapped each funnel step to a tag and a lead score in GoHighLevel, so every contact carries a record of how far they got. Custom fields hold the case type and state, which later decide routing and ad audiences.
- Tags per funnel step:
funnel-step-1,intake-started,consult-booked - Custom fields: case type, state, lead score, source campaign
- One naming convention, documented, so the marketing team can read it without me
Two visitors enter the funnel. One books, one stops at the intake form and gets flagged.
Step 02
Flag people who start intake but never finish
WhySomeone who fills half an intake form is a warm lead with a reason to call a lawyer. Losing them silently is the most expensive leak in a legal funnel.
HowA workflow starts when the intake form is started. It waits, then checks whether the submission tag exists. If not, the contact is tagged, scored down for ad optimisation and sent a short, human follow-up. The same signal goes to Meta as a custom event, so the ad account can build audiences from it.
The If / Else step decides the path. Only people who did not finish get flagged.
Step 03
Send conversions from the server, not just the browser
WhyBrowser pixels miss a growing share of conversions because of ad blockers and iOS privacy settings. If Meta cannot see the conversion, it cannot optimise for it, and the cost per signed client goes up.
HowThe pixel stays on the funnel pages, and a GoHighLevel workflow sends the same events through the Conversions API. Both carry the same event_id, so Meta deduplicates them and counts each conversion once. Only qualified events are sent as Lead; everything else goes as lower-value custom events.
- Pixel on every funnel page, events fired on real actions, not page loads
- Server-side events with hashed email and phone for better matching
- Shared
event_idfor deduplication, checked in Events Manager
The same event arrives twice, from browser and server. Meta keeps one.
Step 04
Turn comments into conversations automatically
WhyPeople comment “how much?” or “consult” on legal ads at all hours. Replying a day later loses most of them, and replying in public is not ideal for legal questions.
HowA comment trigger listens for keywords on selected posts. It sends a private DM with the booking link, creates or updates the contact, and tags the source so these leads can be measured separately from form leads.
A comment with the keyword becomes a DM and a tagged contact in seconds.
Step 05
Stop follow-ups the moment someone books
WhyNothing makes a firm look careless faster than emailing “are you still interested?” to someone who booked yesterday. Bookings happen in the GHL calendar, but also by phone and directly in Clio.
HowEvery nurture workflow has a goal step. When an appointment is booked in the GoHighLevel calendar, or when the Clio status changes and arrives through Zapier as a webhook, the contact jumps straight to the goal and leaves the sequence.
The goal step catches a booking from any source and ends the sequence.
Step 06
Clean up the CRM sync so both systems agree
WhyWhen Clio and GoHighLevel disagree, marketing works from the wrong list: retained clients get promotional emails and the reporting cannot be trusted.
HowI rebuilt the Zapier sync to match on email first and phone second, so it updates existing contacts instead of creating duplicates. Clio’s matter status is mapped to a custom field and to pipeline stages, and an existing duplicate list was merged once before the new sync went live.
What the firm gets
- Ads that optimise on qualified leads, not every form fill
- Drop-offs flagged and followed up instead of lost
- Conversions tracked even when the browser pixel is blocked
- Comment leads captured and attributed automatically
- No more nurture emails after a consult is booked
- One contact list that matches Clio
My role: I take the marketing team’s designs and direction and build them so they work in practice. Strategy and creative stay with the team.