Closed-loop attribution in fitness marketing: every euro of membership revenue traced back to its campaign
Closed-loop attribution means one thing: every euro of membership you collect can be traced to the campaign that brought in that member. Not "this month we had 14 sign-ups and spent €1,200 on ads," but "the September Meta campaign has generated €3,430 in membership revenue so far, and Google has generated €890." Almost no gym has this set up. Not because of a lack of expensive technology, because of four specific gaps that nobody closes. This article shows you where they are and how to seal them with what you already have.
If you're not yet convinced that measuring by revenue is the only serious way to judge your campaigns, start with the full case against CPL as a decision metric. Here we take that premise as given and get into the how.
Open loop vs closed loop, in plain terms
An open loop is what almost everyone has: you know which campaign brought each lead, because Meta and Google hand you that data. And the trail ends there. The lead lands in your WhatsApp or your spreadsheet, someone calls them, they maybe come in for a trial, they maybe sign up at the front desk. But that sign-up lives in your management software with no connection to the original campaign. Your ads dashboard counts form fills; your management software counts memberships; nobody crosses the two.
A closed loop is when the trail runs all the way to the end. The lead who came in through campaign X converted on the 12th, pays €55/month, and has made 7 payments. Those €385 are logged against campaign X. When they cancel, the counter stops. With that, you can answer the only question that matters: which campaign makes money, and which just makes noise?
The practical difference is stark. With an open loop, your best campaign and your worst campaign can look identical for months. With a closed loop, you can tell them apart within a quarter.
Why the cycle is especially long (and physical) in fitness
In e-commerce, the loop closes itself: click, purchase, order tied to the same email. Everything happens on the same screen in ten minutes. In a gym, it doesn't. The typical journey:
- Someone sees your ad on Instagram on a Tuesday night and fills out the form.
- You message or call them the next day. Or two days later, which is more common.
- They come in for a trial class on Saturday. In person, at your location.
- They sign up at the front desk, a week or three weeks after the click. The person typing their details into the management software is your receptionist, not a system.
- They pay membership fees for months. The real money arrives here, spread across a year.
Between the click and the first payment there can be 10–25 days, and the critical moment, the sign-up, happens offline, with a person typing by hand in software that knows nothing about Meta. Each hop in that journey is a chance to lose the thread.
Where the trail breaks at each hop
Put numbers to the loss. These are typical ranges, not laws, but the order of magnitude repeats gym after gym:
| Hop | What gets lost | Typical matching loss |
|---|---|---|
| Ad → lead | Almost nothing: the platform tags the lead with its campaign | 0–5% |
| Lead → contact | Badly typed phone numbers, duplicate leads, throwaway form fills | 5–10% |
| Contact → visit | Nobody notes which campaign brought the person who came for a trial | 20–40% |
| Visit → sign-up | The receptionist signs someone up with no source field, or fills it in as "Instagram" by eye | 30–60% |
| Sign-up → payments | If the sign-up wasn't linked to the lead, the payments can no longer be attributed | 100% of what was lost earlier |
Notice the pattern: the trail doesn't break because of technology, it breaks because of human process at the front desk. The big losses are at hops 3 and 4, which happen at your location. That's why the fix isn't buying a tool and forgetting about it; it's sealing four specific points, two of which are pure front-desk discipline.
The four seams of a closed loop
1. A unique lead identifier: the normalized phone number
You need a key that exists in both worlds: in the Meta lead and in the member profile. Email fails more than you'd think (people use one address for forms and another for everything else). The phone number is the right key in fitness, because the gym always asks for it and the lead actually provides a real one, since they expect you to call.
The trap: the same phone number written three ways won't match. "612 345 678", "+34612345678", and "0034 612345678" are the same person and three separate records for an automated match. Always normalize to international format without spaces (+34612345678) on both sides. This 10-minute fix alone lifts matching by 15–25%. It's the cheapest improvement in this entire article.
2. Source recorded at sign-up
Sign-up is where the loop lives or dies. Two rules for reception, no exceptions:
First: a mandatory "source" field for every new sign-up, with a closed list of options (Meta, Google, referral, walked past, other). A closed list, not a free-text field, because free text ends up full of "internet" and "social media," which are useless.
Second: the phone match overrides what the member says. People give inaccurate answers to "how did you hear about us?", not because they're lying, but because they don't remember: they saw your ad four times, filled out the form, and three weeks later they tell you "a friend mentioned it." If their phone number is in your Meta leads, that sign-up belongs to Meta, whatever they say. The front-desk question is a safety net for the ones that don't match, not the primary source.
3. The connection to payments
This is the difference between measuring sign-ups and measuring business. Your management software already knows how much each member pays and since when; all that's missing is for that information to flow back to the original campaign. Three levels, from manual to automated: a column of cumulative payments in the matching spreadsheet (the template from the pillar article works as-is), a monthly payment export crossed by phone number, or an integration that does it automatically via API. Which management software you use determines which of the three applies: with an open API, you automate; without one, you export once a month and that's it.
The manual level works. Its problem is durability, not accuracy: the month reception is slammed, nobody updates the spreadsheet, and a closed loop with two-month gaps becomes an open loop again.
4. A reasonable attribution window
How long does a sign-up count toward its original campaign? My recommendation for a local gym: 90 days from the lead. That covers the typical decision cycle well (which rarely stretches beyond a month) and leaves room for the classic "I saw it in January and joined in March when the weather got better."
What about someone who filled out your form and walks through the door 8 months later? Don't attribute them to the campaign. I know that stings, because the ad did something. But if you stretch the window to a year, you'll end up attributing to old campaigns sign-ups that actually came through another channel, and your ROI numbers will inflate just enough to make bad decisions with confidence. Log them as "recovered lead" in a separate category if you want to track them, and keep the window at 90 days. A slightly pessimistic and credible system beats an optimistic and doubtful one.
Attribution models without a PhD
If you've read about attribution, you've encountered first touch, last touch, linear, U-shaped, and the rest. For a neighborhood gym, 95% of that literature is irrelevant, it's designed for businesses with eight channels and six-month sales cycles.
What you need to know: first touch attributes the sign-up to the first known touchpoint (the ad that introduced that person); last touch, to the last one before conversion. For budget decisions, use last touch: it's simple, auditable, and in a local business with two or three channels it rarely gets it seriously wrong. Keep first touch as a quarterly curiosity question: which channel discovers new people? If Meta discovers and referrals close, that's useful information about how your funnel works, not a reason to build multi-touch attribution.
Sophisticated models make sense when you have volume and plenty of channels. A chain with 15 locations, maybe. Your gym, no. The complexity of the model should never exceed the quality of your data, and your data, freshly stitched together, will be decent but not surgical.
The achievable precision: 70–85%, and that's enough
With the four seams properly closed, a typical gym can attribute 70–85% of sign-ups to a specific source. The rest gets lost in unmatched phone numbers, people who came in without leaving a digital trace, and front-desk errors. You're not going to hit 95%, and chasing it is a bad deal: the last few percentage points of precision cost more than the information they provide is worth.
Why is 75% enough? Because the decisions you're making are broad. Telling apart a campaign that returns €2 for every €1 spent from one that returns €7 doesn't require lab-grade precision; it requires the bias to be similar in both, and it is, because they both suffer the same matching losses. Campaign-to-campaign comparisons are robust even when the absolute numbers wobble.
The alarm signal runs the other way: if you're attributing less than 60% of your sign-ups, you don't have a precision problem, you have an open seam. It's almost always seam 1 (unnormalized phone numbers) or seam 2 (reception not recording the source). Check those two before touching anything else.
The minimum closed-loop spreadsheet
One tab, one row per sign-up, updated monthly:
| Column | Where it comes from |
|---|---|
| Normalized phone (+34...) | Management software |
| Sign-up date | Management software |
| Lead date | Meta/Google dashboard, crossed by phone |
| Source campaign | The match; if no match, the front-desk answer |
| Within window (≤90 days) | Formula: sign-up date − lead date |
| Monthly fee | Management software |
| Active months | Reviewed on the 1st of each month |
| Attributed revenue | Fee × active months |
A pivot table on top (attributed revenue by source campaign) and you have a closed loop. An hour and a half per month. After six months, that pivot table is worth more than any report an agency has ever shown you, because it reorders which metrics you look at and in what sequence: the ads dashboard becomes a diagnostic tool, and revenue by campaign becomes the verdict.
The next level: closing the loop for the algorithm too
Everything above closes the loop for you, so you make better decisions. There's a second closure, more powerful still: feeding Meta the list of who actually became paying members, so its algorithm stops looking for form-fillers and starts looking for people similar to your paying members. That's offline conversions, and they deserve their own article because they're the technical lever with the highest return per hour invested in this entire cluster.
And before both of those, it's worth being clear on what source data you store for each lead and how, because a closed loop built on poorly tagged leads inherits all that dirt from the base.
This week's task is modest and pays off immediately: normalize the phone numbers from your sign-ups over the last three months, cross them against your leads, and see how many match. That percentage is your starting point. If it's above 70%, you can start judging campaigns by revenue. If it's not, you know exactly which of the four seams to close first.