Back to blogRevenue-Driven Marketing · Pillar Page

Real ROI in gym marketing: why CPL misleads you and how to measure with billing data

Real ROI in gym marketing: why CPL misleads you and how to measure with billing data

Almost every gym optimizes its campaigns by cost per lead. And cost per lead is a deceptive metric: the campaign that brings you leads at €5 may be worse business than the one that brings them at €15, if the second group stays 14 months paying membership and the first cancels within 2. The only real measure of marketing is connecting what you spend on ads to what those members actually bill in your management software. Everything else is an approximation, and some approximations are so bad they push you to turn off your best campaigns.

This article covers the full picture: why CPL misleads with numbers right in front of you, what the complete data chain looks like from ad to collected payment, what you need to close it, what changes in your P&L when you do, and how to start this very week even if you have no integration set up.

The problem: CPL measures the door, not the business

Cost per lead tells you how much you pay for a filled-in form. Nothing else. It doesn't tell you whether that form converts to a visit, whether the visit converts to a sign-up, or whether the sign-up pays 6 months or 20. In a gym the money isn't in the form: it's in months 8, 12, and 15 of a member who sticks around.

The bias is systematic, not random. Aggressive offers ("first month free", "express challenge", teaser prices) generate cheap leads because they attract everyone, including the type who jumps from gym to gym chasing promotions. More serious offers generate pricier leads because they filter. If you optimize by CPL, you and the algorithm are pushing budget exactly toward the worst possible member. You're paying to select badly.

The numbers: two campaigns, same spend, wrong winner

Picture two Meta campaigns with €1,000 each, at the same gym with a €49/month membership.

Campaign A is a teaser offer: "2 weeks for €9". CPL of €5. Campaign B sells the full program with visible pricing: "train with a plan and coaching, from €49/month". CPL of €15.

Looking at the Meta dashboard, Campaign A wins by a mile: three times the leads for the same money. Any agency report would tell you to move all the budget to A. Now let's follow the money over 12 months:

Campaign A (leads at €5) Campaign B (leads at €15)
Spend €1,000 €1,000
Leads 200 67
Lead → sign-up conversion 8% 18%
Sign-ups 16 12
Cost per sign-up €62 €83
Average retention 3 months 14 months
Fees collected per sign-up €147 €686
12-month revenue €2,352 €8,232
Return per euro spent €2.4 €8.2

Campaign A isn't terrible: it returns more than it costs. But Campaign B generates 3.5x the revenue on the same spend. Notice the perverse detail: A wins on CPL and even wins on cost per sign-up. If you only look at acquisition metrics, A looks better in every column. It only loses where it matters, revenue, and that column doesn't appear anywhere in the Meta dashboard.

The specific numbers will vary for your gym. The structure of the deception won't. An offer that attracts promotion-hunters will always have better CPL and worse retention than one that attracts people willing to pay your real price. If you want to benchmark your own costs before reading on, here are CPL benchmarks by channel and gym type and a complete guide to customer acquisition cost in fitness.

The complete data chain: from ad to monthly payment

Measuring real ROI means being able to answer this question for every campaign: how much money has this gym billed from members who came in through here? To answer it you need a chain with five links:

  1. Ad: the specific campaign and ad set that generated the click.
  2. Lead: the form with name and phone number, tagged with its source campaign.
  3. Sign-up: that lead appears as a new member in your management software.
  4. Collected payments: each month that member pays, the amount adds to their source campaign.
  5. LTV by campaign: with enough months of data, you know how much a member from each campaign is worth on average.

The fragile link is the third one. From ad to lead, Meta and Google handle it for you. From sign-up to payments, your management software has everything. The leap from lead to sign-up is where the chain breaks in 95% of gyms: the lead lives in a spreadsheet or the ad dashboard, and the member lives in Mindbody or AimHarder, and nobody crosses the two worlds. Phone number is the natural key for crossing them, because it exists on both sides.

When the chain is closed, your marketing KPIs change in nature. You stop looking at intermediate metrics (CPL, CTR, cost per visit) as if they were the result and they become what they are: diagnostics. The result is revenue per campaign, and from there come the two metrics that truly run the business: how much it costs to acquire a member and how much a member bills over their lifetime.

What you need to close the chain

Three pieces, from least to most sophisticated.

Source recorded on every sign-up. The absolute minimum: when someone joins, there's a record of where they came from. An "origin" field in your management software or, if it doesn't have one, a separate sheet. Without this there's nothing to measure.

Your management software talking to your campaigns. This is the real quality jump. Mindbody, Glofox, AimHarder, WodBuster and others know exactly who pays, how much, and since when. If that information gets crossed automatically with the advertising origin of each member (via API, periodic export, or an intermediary platform), you get revenue by campaign without manual work. Which management software you use and what it allows you to integrate largely determines how easy this step is; those with an open API give you the full chain, closed ones force you to monthly exports.

Sending value back to the platforms. The advanced level: sending Meta not just "a conversion happened" but how much it's worth, via offline conversions or the Conversions API. We cover this in the next section, because it's where measurement stops being a report and starts changing what the algorithm does with your money.

Do you need expensive software? Not to start. The spreadsheet version works (the template is below). But the manual version has a ceiling: it depends on someone maintaining it every month, and the moment that person gets overwhelmed, the chain breaks again.

What changes when you close the chain

This isn't a bookkeeping exercise. Three specific decisions change.

You turn off "cheap" campaigns that lose money. The case from the table above: without billing data, Campaign A would have kept eating budget for months with its great CPL. With data, you turn it off or change the offer. It's common to discover that your campaign with the worst CPL is your best campaign, and vice versa.

You increase budget on "expensive" profitable campaigns with confidence. When you know that a Campaign B member leaves you €686 and costs €83, scaling stops being scary. You can afford CPL rising to €20 or €25 as you expand budget, because you know the real margin you're working with. The person optimizing by CPL cuts back precisely when they should invest. The effect on your overall marketing ROI is direct: money migrates from campaigns that look good to the ones that are good.

You teach Meta who a good member is. This is the part almost no one does, and the one that pays most in the medium term. Meta optimizes toward whatever you mark as a conversion. If the conversion is "lead", it finds you people who fill in forms. If you send it the "sign-up" event with its value via offline conversions or CAPI, the algorithm starts looking for people similar to your paying members, not your curious onlookers. It's slow (needs dozens of events to learn) and never perfect, but the compounding effect at 6 months is significant: average lead quality rises without you touching anything.

There's a fourth, less measurable effect: conversations with your agency or whoever runs your campaigns change tone. "We brought CPL down 20%" stops being a presentable achievement if campaign revenue doesn't keep pace.

The honest objection: attribution is never perfect

Before you set this up, let's be clear: no attribution system is exact. The member who saw your ad three times, never clicked, and two weeks later walked in because your name rang a bell won't appear in any campaign. The one who came through a friend but filled out an ad form will show up in the wrong place. iOS cuts data, people change phones, some members arrive through two channels at once.

Doesn't matter. The choice isn't between perfect attribution and imperfect attribution; it's between 80% connected and 0% connected. With 80% you can already tell a campaign returning €2 per euro from one returning €8, and that's the decision that moves your P&L. Attribution purists don't bill more than you; they just argue more.

A reasonable safeguard: review the total once a quarter. If your campaigns "account for" more sign-ups than you've actually had, something is being double-counted. If they account for less than 60-70%, you have an invisible channel (word of mouth, Google Maps, the sign above the door) that's worth at least estimating.

How to start this week, without any integration

Don't wait for APIs to be connected. A monthly spreadsheet gives you 70% of the value with one hour of work per month. The columns:

Column Where it comes from
New member name Management software (that month's sign-ups)
Phone number Management software
Sign-up date Management software
Origin (campaign/channel) Cross-reference by phone with leads from the ad dashboard; if not found, ask at sign-up
Monthly fee Management software
Still active (yes/no) Monthly review, one column per month
Cumulative fees Formula: fee × months active

The process: on day 1 of each month, export the previous month's sign-ups, cross-reference them by phone against your Meta and Google leads, and update the activity column for previous months. After 3 months you can already see retention differences by campaign. After 6, you have a pivot table showing how much each campaign bills per euro invested, the figure this article has been arguing for since the first paragraph.

Two tips that prevent 90% of errors: always ask "how did you find us?" at sign-up (it covers the gaps in phone cross-referencing) and record the origin at the moment, not from memory at the end of the month.

When the spreadsheet runs out of headroom, and it will if you're handling more than 30-40 leads a month, it's time to automate the cross-referencing. There are platforms that connect campaigns, leads, and sign-ups in a single flow (Pilotium among them; you can also set it up with your management software and Zapier if it has an API). The criterion for choosing is one: does revenue by campaign update itself.

Where this fits in the rest of your marketing

This way of measuring is the final layer on top of everything else. The funnel is still the same: ad, lead, contact, visit, sign-up. The metrics at each funnel stage are still your diagnostic tool for knowing where the process breaks. What changes is the judge: the final stage is no longer "sign-up" but "collected payments", and that judge reorders all the earlier decisions.

Two big topics remain that deserve their own articles: how to properly calculate member LTV (including cancellations, freezes, and fee changes) and how to move from measuring by revenue to systematically optimizing campaigns by revenue. We'll publish those soon in this same cluster.

For now, the task is concrete: open your management software, export sign-ups from the last 3 months, and cross the phone numbers with your Meta leads. Two hours of work. If you discover your sign-ups come from where you thought, congratulations, you're in the minority. If you discover the opposite, you've just found money that's been hiding behind a pretty CPL for months.

Stay Ahead of the Game

Weekly AI marketing insights. No spam. Unsubscribe anytime.