How do you know if your gym's Facebook ads are working?
Your ads are working when you can name the paying members they produced and what each one cost — not when Ads Manager shows cheap leads. That takes a chain that carries the click through your CRM and your billing system and back to Meta. Meta’s numbers aren’t wrong; they stop at the form.
Updated
What Ads Manager can and can’t see
Ads Manager is Meta’s report card, and Meta grades itself on the last thing it can see. The Meta Pixel, the small script Meta gives you for your website, watches what happens in the browser: the landing page loaded, the form was submitted, the thank-you page appeared. It is good at that. It has no idea what happened next, because nothing after the form happens on your website. The call-back, the appointment, the walk-in and the payment all happen in your CRM, at your front desk and in your billing system, and the Pixel was never invited.
That blind spot becomes a targeting problem the moment you set a campaign’s goal. Tell Meta a form fill is the win and its delivery system goes looking for people who fill forms, and it finds them. It is doing its job. It is just the wrong job, because a cheap lead who never books and a cheap lead who becomes a member look identical in the ad account, and only your front desk knows the difference.
Instant forms, the lead forms that open inside Facebook or Instagram instead of on your site, make the blind spot bigger: the Pixel never sees the form at all, and the lead lands in your CRM carrying Meta’s campaign labels and nothing else. None of this is Meta being dishonest. It is Meta reporting on the part of the journey it can see, and everything that decides whether the ad paid for itself happens after that.
The tracking spine, step by step
The spine is six links. Each one hands a real person to the next, and the click evidence travels with them, so the payment at the end can be credited to the ad at the start. Skip a link and the chain breaks exactly there, which is useful, because a broken link is a diagnosis. The chain itself, from the click or call to the payment that clears, is walked stage by stage on What is AI ad tracking; this is what it takes to build it for Meta.
- 01
Two pixels on the site
The Meta Pixel goes on every page so Meta can see the visit. The Adsu pixel, one script tag loading
Install the Adsu pixeltrack.js, goes on your paid landing pages, your form pages and your thank-you and booking-confirmation pages. It captures the click evidence first-party, on your own domain: the click ID Meta attaches to the link (fbclid), the UTM values, and the campaign, ad-set and ad IDs the URL template carries. From this point the visit belongs to a campaign, not to an anonymous session. - 02
The Conversions API
The Pixel lives in the browser, and the browser is where ad blockers and iOS privacy prompts do their work. The Conversions API is Meta’s server-side channel: whatever hosts your forms sends the same events to Meta from a server, so a form fill still reaches Meta when the browser never reported it. Set it up on your website platform or CRM. It is Meta’s channel, not ours, and its job is to make sure the enquiry reaches Meta at all, so the rest of the chain has something to attach to.
- 03
The URL template and the form handoff
Add Adsu’s Meta URL parameter template at the ad-set or ad level, so every click lands carrying its campaign identity in a form the pixel reads. When a HighLevel form posts inside an iframe and redirects to a thank-you page, append
Tag ad URLs?email={{contact.email}}&phone={{contact.phone}}to the redirect URL. The parent page cannot see inside the iframe; the redirect carries the person’s identity out to it, so the browser visit and the CRM contact become the same person. - 04
GoHighLevel: contacts and appointments
The CRM is where the click becomes a person. HighLevel supplies the contact and every appointment on the calendar, so the enquiry, the booking and whether they showed all sit on one record, at the location that owns the calendar. That record is what the rest of the chain matches against, and it is where speed to lead and no-shows first become visible.
- 05
Mindbody or Stripe: the payment
Your billing system is the revenue authority. When the first membership payment clears in Stripe, Mindbody or WellnessLiving, Adsu matches it to the CRM contact by exact email, then by exact phone when the email does not match. The payment account decides which location gets the credit, so nobody has to guess the gym from a campaign name, and refunds reduce the number rather than leaving the sale overstated.
- 06
The wins, sent back to Meta
Appointment booked, appointment showed and membership paid go back to Meta as the conversions to optimize for. That is the send-back, also called offline conversion tracking: telling the platform which of its clicks became a booking, a visit and a paying member, so its targeting learns who pays instead of who fills forms. Same budget, better people.
Every stage on that spine is a verified one: a real click, a real contact, a real appointment, a payment that cleared. If a link cannot be verified, the stage is not counted and the report says what it could not see. That is what makes the number at the end something you can run a gym on, and it is why the tracking has to be right before the send-back can teach Meta anything true.
Leads but no members: where the chain leaks
“The ads get leads but nobody joins” is the most common complaint about gym Facebook ads, and it is almost never one problem. It is a leak at one stage of a seven-stage chain, and each stage leaks for a different reason. Lay the chain out, put the number each stage produces next to it, and the leak names itself. The numbers are the ones the pricing FAQ and the gym marketing pillar already use, so the scorecard reads the same everywhere.
| Stage | The number it produces | Where it leaks | What to change |
|---|---|---|---|
| Click or call | Clicks and inbound calls, by campaign and location | A stripped URL parameter or a missing pixel loses the source before anyone has spoken to you, and every later stage inherits the gap. | Pixel on every landing, form and thank-you page, URL template on every ad set, and inbound calls followed to the member. |
| Enquiry | Cost per lead | Meta was asked for form fills, so it found people who fill forms. Many never expected a call, and a lead that never reaches the CRM cannot be followed at all. | Land every lead in the CRM with its click evidence attached, and read cost per lead as the start of the scorecard, never the verdict. |
| Appointment booked | Cost per appointment | Speed to lead. An enquiry nobody calls back for a day has usually moved on, and the ad takes the blame for a follow-up problem. | Reply in minutes, book from the first conversation, and send every booking back to Meta so it learns who books. |
| Appointment showed | Show rate and cost per show | No-shows. A campaign can book a full calendar that nobody keeps, and Ads Manager will never show you the empty slot. | Confirm the day before, remind an hour out, and send showed back to Meta so it learns who turns up. |
| Trial | Trial starts, by campaign | Trial-to-member. People finish a trial and drift, and the campaign that brought them looks healthy right up to the payment that never arrives. | Run the close inside the trial, not after it, and read trial starts against memberships paid for the same campaign. |
| Membership paid | Cost per member | The payment clears in Stripe or Mindbody and nobody tells the ad account. This is the stage every Ads Manager report is missing. | Match the payment to the contact by exact email, then exact phone, credit it to the click, and send membership paid back to Meta as the win. |
| Renewal | Lifetime value by source | A member who joins from one campaign and leaves in a month cost the same to win as one who stays for years, and a first-payment report cannot tell them apart. | Credit every renewal to the click that started it, and move budget toward the ads that bring people who stay. |
None of those cells has a formula in it, on purpose. The formulas, and a worked example labelled as one, belong to the cost-per-member page in this section; this table is for finding the leak. Once you know which stage it is, the fix is usually a phone call, a reminder or a close, not a new ad, and the ad account was never going to tell you which.
Judge it per location
One ad account, several gyms, one report: that is how most multi-location operators run Meta, and it is how the location that is losing hides behind the one that is winning. The same ad can fill one gym and flop at another, because the offer, the front desk and the neighbourhood are different even when the creative is identical. An average across locations is not a number you can act on.
The fix is one line per campaign per location, and it starts at the payment, not at the campaign name. The billing account that took the money decides which location gets the credit, so a join at one gym is never booked to another because an ad set was named wrong. Read cost per member by location before you touch a budget: when one location’s campaign is producing members and its twin’s is producing leads, the difference is usually at the desk, not in Ads Manager, and you have just found where to spend the next hour rather than the next dollar.
Big Day Fitness’s owners describe the before and after in their own words: before Adsu they had no idea what the lifetime value of a Facebook customer was against a Google Ads customer or the ad in the local paper; now they know it by source. Read the full story.
Does your CRM already do this?
Partly, and it is worth knowing exactly how far. As of September 2026, HighLevel’s Meta Conversion API workflow action can fire a Lead event on a pipeline stage change, but the revenue in its ad reporting is the sum of the monetary value of won opportunities rather than billed money, and no gym billing system appears on its integrations page (HighLevel help: How to send a Meta Conversion API action for Ad Manager; HighLevel Reporting FAQs; HighLevel integrations). Where the whole sale happens inside HighLevel, from the form to the order form that takes the payment, you get part of this natively, and you should use it.
As of September 2026, Mindbody’s own tracking guidance is browser-side: the Meta Pixel on its branded web tools and widgets, with no Conversions API or offline-conversion upload documented on its site (Mindbody support: How to add Meta Pixel (branded web tools); product update 30 Aug 2026; (mindbodyonline.com · 2026-09-11)). The Pixel on a widget sees the booking page; it does not see the membership that clears a month later, and nothing sends it back.
Adsu sits across both. It receives contacts and appointments from HighLevel, takes the payment from Stripe, Mindbody or WellnessLiving as the revenue authority, matches the two by exact email then exact phone, and sends appointment booked, appointment showed and membership paid back to Meta as the wins. Your CRM keeps doing what it does; the chain just reaches the money, and it reaches it per location. Every system on the spine is on the integrations page.
Questions, answered.
When you can name the paying members a campaign produced, at each location, and what each one cost. Ads Manager can show you clicks and leads, but it cannot see the appointment, the show or the payment, so it cannot answer the question. Carry the click through your CRM and your billing system, count only the stages you verified, and judge the campaign on cost per member. Adsu does this for you.
Usually the ads are doing what they were told: Meta was asked for form fills, so it found people who fill forms. Find the stage that leaks. Leads nobody calls back within minutes, appointments that are never kept, trials that drift. Then send appointment booked, appointment showed and membership paid back to Meta as the wins, so its targeting learns who joins instead of who fills forms, and judge the campaign on cost per member.
Yes. The pixel records the click evidence on the visit, the CRM holds the contact that visit became, and the payment in Stripe or Mindbody is matched to that contact by exact email, then by exact phone. The payment is credited to the click, at the location whose billing account took it, and it goes back to Meta as the win. Adsu treats the billing system as the revenue authority, so a member counts when the payment clears, never on Meta’s own purchase estimate.
Yes. Instagram ads run from the same Meta ad account as Facebook ads, with the same Pixel, the same Conversions API, the same URL parameters and the same click ID on the link. The chain from the click to the payment is identical, and the wins go back to the same account. Adsu reports it by campaign, one line per campaign per location.
Partly. As of September 2026, HighLevel’s Meta Conversion API workflow action can fire a Lead event when a pipeline stage changes, so a booked or showed stage can reach Meta from inside the CRM (help.gohighlevel.com/support/solutions/articles/155000003691). What it cannot send is the membership payment that clears in Stripe or Mindbody, because no gym billing system connects to it, so Meta learns who books, not who pays. Adsu takes the payment from the billing system and sends membership paid back as the win.
Related
How a gym should plan marketing in 2026: five jobs from enquiry to renewal, the metric that proves each one, and the tracking that computes it.
Cost per memberCost per member is ad spend divided by new paying members, per channel and per location. The formula, a worked example, and what to ask your agency for.
Google Ads for gymsHow gyms track which Google Ads produce members: gclid capture, the form-to-join lag, and offline conversions sent from Mindbody, Stripe or GoHighLevel.
MetaMeta + Adsu: Campaign identity, account context, and spend. How it connects, where its reports stop, what Adsu adds per location.
Meta Conversions APIThe Meta Conversions API, CAPI, is the server-side way to send events to Meta, from your systems instead of a browser. What a gym sends through it.
FbclidAn fbclid is the click identifier Meta adds to your landing URL when someone clicks a Facebook or Instagram ad. Why the pixel must see it.
The proof
- Net members
- +21
- Lifetime value added
- $67,000+
Bobby & Maria Gasdia, Big Day Fitness, 2 locations
Stop paying for leads. Start paying for members.
Early access is opening in small groups. Applying takes two minutes, and we’ll tell you straight whether your stack is ready to connect.