Gym marketing

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

Book a demo

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.

  1. 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 track.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.

    Install the Adsu pixel
  2. 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.

  3. 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 ?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.

    Tag ad URLs
  4. 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.

  5. 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.

  6. 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.

StageThe number it producesWhere it leaksWhat to change
Click or callClicks and inbound calls, by campaign and locationA 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.
EnquiryCost per leadMeta 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 bookedCost per appointmentSpeed 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 showedShow rate and cost per showNo-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.
TrialTrial starts, by campaignTrial-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 paidCost per memberThe 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.
RenewalLifetime value by sourceA 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.

The proof

Net members
+21
Lifetime value added
$67,000+

Bobby & Maria Gasdia, Big Day Fitness, 2 locations

Read the full story