Google Ads for gyms: measure members, not clicks
Most gyms measure clicks or a submitted form. Neither tells you who actually signed a contract. Here's the setup that does.
Originally written in German — read it on visnakovs.de.
Google Ads for gyms rarely fails on budget. It fails on the question of what the account even counts as success. Most gyms measure clicks, or at best a submitted form. What happens after, whether someone shows up for a trial session and whether that turns into a contract, Google never sees. That’s exactly where the lever sits: a clear offer, a conversion that sits as close to the signed contract as possible, and offline conversion import, which feeds the actual contracts from your gym software back into the account.
What shows up in the search results on this topic is step-by-step guides from software vendors and agency sites. Set up a campaign, add keywords, set a budget. Anyone can do that. The part that decides whether a gym makes money with Google Ads or burns it is missing entirely from those guides. That’s what this is about.
1. Google Ads for gyms: a clear offer, real conversions
Before a campaign runs, you need an answer to an uncomfortable question: what exactly should someone do after clicking? “Learn more about us” isn’t an answer. A gym that works with Google Ads has an offer you can say in one sentence, and a path to close that doesn’t need a follow-up question.
The best case is the online sign-up: choose a membership, enter your details, sign the contract online, done. Then the conversion is identical to revenue. Google sees in real time which click turned into a paying member, and Smart Bidding can optimise on that directly instead of on a proxy. If your gym software offers this, it’s the option to go with, even if some prospects still prefer to walk in.
The second case is booking a trial session: a fixed appointment, name, phone, email, on the calendar. That’s a noticeably better conversion than an open contact form, because a booked appointment is a commitment, not a “get in touch sometime”. And it’s the step just before the contract, one that can later be cleanly linked to it.
Everything else, “get in touch now”, an open contact form with no time slot, or a price list to download, is noise for the bidding automation. It optimises for people who like filling in forms, not for people who want to train.
The three conversions a gym actually has
A gym wins members through three paths. Each needs its own tracking, or Google ends up optimising for whichever one it happens to see.
Trial session booking or online sign-up through the website. This is the easy part. The booking confirmation fires a conversion event, either through the Google tag directly or through Google Tag Manager. Two details matter: the conversion must only fire on the confirmation, never when the form opens. And it should carry the click ID (GCLID) and the email address along, because you’ll need both later for importing contracts. The technical setup for that is in setting up Enhanced Conversions.
Calls. A large share of gym enquiries come by phone, especially from older audiences and anyone with a specific question about opening hours, classes, or cancellation terms. Two paths, both directly inside Google Ads:
- Calls from the ad through the call asset. Google runs a forwarding number, measures the duration, and counts calls above a minimum length as a conversion. Set that minimum to at least 30 to 60 seconds, or you’ll be counting wrong numbers and hang-ups.
- Calls from the website through the website call conversion. The Google tag swaps your phone number on the page for a forwarding number when the visitor arrived via an ad. That way you see which click led to the call.
The difference between a real call tracking setup and the default click-to-call link is in call tracking for Google Ads. A click on the number is not a call.
Walk-ins. Every guide goes quiet here, honestly, because it’s the uncomfortable part: someone who just walks in has no click Google could attribute. What works is a combination of two things. First, a promo code that only appears on the ad landing page (“mention code STARTKLAR at the front desk”), which the front desk enters into the gym software at sign-up. That gives you a reliable count, but no attribution to the individual click. Second, “How did you hear about us?” as a required field, not free text, at contract signing. Together these don’t give you perfect attribution, but they give you a number you need for the break-even calculation below. And the walk-ins who already booked a trial session online, you’ll catch those anyway through the import in the next section.
2. From lead to member: feeding contracts back through offline conversion import
This is the core of the whole setup, and the reason most gym accounts burn money even though the report looks fine. If you optimise for “trial session booked”, you get more booked trial sessions. Google has no way of knowing that bookings from the search “gym free trial” mostly never show up, while bookings from “cancel gym membership and switch” almost all sign. So the automation bids on the cheap bookings, cost per lead drops, and nothing happens at the front desk.
Offline conversion import reverses that. You don’t report the booking as the success signal to Google, you report the signed contract. For a gym, that looks like this:
- Capture it at booking. The trial session form stores the GCLID in a hidden field and passes it, along with name, email, and phone, to your gym software or CRM. Nothing works without this step, so check first whether your booking tool even passes that field through.
- Keep the status current. Your front desk already records whether someone showed up for their trial and whether a contract resulted. Those two statuses just need to sit cleanly in the data, along with the plan.
- Feed it back. Once a week, export the new contracts with GCLID, timestamp, and contract value, and upload them to Google Ads. That can be a CSV, a linked Google Sheet, or directly through the Google Ads API if your software supports it.
- Switch over. Once enough contracts are in the account, switch the bidding strategy to the “contract signed” conversion and let “trial session booked” keep running as a secondary conversion.
If your software can’t store the GCLID, there’s a more robust route: Enhanced Conversions for Leads. You upload the new member’s email address or phone number as a SHA-256 hash; no plain text ever leaves your system. Google matches the contract to the original click using the hash. For gyms this is often the more practical route, because the email gets captured at sign-up anyway, while the GCLID only survives if someone routed it through three systems beforehand. I’ve laid out the basics of both routes in detail in offline conversion import: optimising lead gen for real revenue; here are just the gym-specific points:
- Pass along the contract value. A twelve-month contract is worth more than a month-to-month plan. If you upload the value too, Google can optimise for revenue instead of headcount.
- Report two stages. “Showed up for trial” as an early signal, “contract signed” as the late one. That gives the automation faster feedback while still learning towards the actual close.
- Set the click-to-conversion window to 90 days. Someone who books a trial in January and signs in March still needs to count.
- Consent. You may only process the GCLID and email hash where consent exists and is correctly reflected in Consent Mode. That applies to a gym exactly as it does to any online shop.
The result after a few weeks: Google shifts budget towards the search terms, ads, and times of day that turn into members, and pulls it away from sources that only ever deliver trial sessions with no follow-through. Cost per lead in the account often goes up in the process. That’s not a mistake, it’s the first time the number actually means something.
Before you import any contracts: check with the tracking check (in German) whether your website even measures conversions and consent cleanly. Importing onto a leaking foundation just delivers garbage with a value tag attached.
3. Radius, January, and the Google-or-Meta question
Once the measurement is in place, three settings decide whether the budget actually lands inside your catchment area.
Controlling radius properly
A gym has a catchment area of a few kilometres, often just a couple of neighbourhoods in big cities. Yet most gym campaigns run on “City X” with the location option “presence or interest”. That reaches people interested in the city too, but living elsewhere. The right setting is a radius around the gym’s address plus the “presence” option, meaning only people actually there. I described the same trap in Google Ads for tradespeople, and it costs local businesses in every industry money.
Three details no guide mentions:
- Exclude neighbouring towns if another gym in your chain sits there, or the drive is too long. A radius is a circle; your catchment area rarely is.
- Bid adjustments by distance only work with manual bidding. Once you use Smart Bidding, Google ignores location bid adjustments. Anyone who wants to bid harder in nearby neighbourhoods needs either separate campaigns per zone, or has to trust that imported contracts show the automation where members actually come from. The second is the better route.
- “Gym near me” is the single most important search in your industry, and it has no place name. Google matches it based on the user’s location. That only works with the presence option and a linked Google Business Profile, so the address shows as a location asset under the ad.
Check the “Distance” report under locations weekly. It shows how much budget is flowing into clicks outside your real catchment area.
January: move budget forward instead of tweaking bids
January is peak season, everyone knows it, and every gym bids at once. Click prices rise because more advertisers compete for the same searches. Two things regularly go wrong here.
First, budget only gets raised in January itself. Then the bidding automation enters the most expensive week of the year with no learning buffer. Better: raise the daily budget gradually from mid-December, so the campaign enters January with data instead of a learning phase.
Second, seasonality adjustments in Smart Bidding get used the wrong way. They’re built for short events lasting a few days, where the conversion rate spikes temporarily, a weekend promo price, for instance. For a whole month it’s the wrong tool; a six-week adjustment distorts bids instead of steering them. The automation learns January demand on its own if it gets budget and clean conversions. Bid adjustment and budget adjustment are two different levers, and for the season, budget is the right one.
And in February, demand drops off. That’s not a campaign failure, it’s the calendar. Anyone who panics and swaps keywords or restructures the strategy then throws away the learning phase they just paid for in January.
Google or Meta: decide by cost per member
Nearly every forum thread on this topic asks whether Google Ads or Meta Ads is better for gyms, and the answers are opinions. The honest answer is a measurement question, and you can’t answer it without the import from section 2.
The two channels do different things. Google catches people who are already searching: “gym near me”, “gym with classes”, “trial session”. That’s demand that already exists. Meta creates demand among people who aren’t searching right now, through images, video, and an offer. That’s why cost per lead is often lower on Meta and the close rate lower too, and the reverse on Google. Comparing by clicks or by leads leads to the wrong decision.
The rule I work by: compare both channels by cost per member, meaning ad spend divided by contracts attributed to that channel. The channel with the lower cost per member gets more budget first, until its cost per member rises. On Google that tends to happen quickly, because search demand in the catchment area is finite. Then Meta is the next lever. So the usual order is: exhaust Google first, then scale Meta. But that’s the default order, not a rule. Your numbers can flip it.
KPI table and break-even per member
So the decision doesn’t come from gut feeling, one table filled in weekly is enough.
| Metric | Where from | Why |
|---|---|---|
| Calls of 30 seconds or more | Call conversions in Google Ads | Shows whether the ads trigger real conversations |
| Trial sessions booked | Website conversion | Early signal, but only a first step |
| Showed up | Gym software | Show rate; if it drops, a search is pulling curious people rather than interested ones |
| Contracts signed | Gym software, imported | The only number that means revenue |
| Cost per lead | Cost divided by bookings | Early warning system, not a success measure |
| Cost per member | Cost divided by contracts | The number you allocate budget by |
| Share of clicks outside catchment area | “Distance” report | Wasted spend you can fix directly |
You work out your own break-even threshold with your own numbers; only your gym knows them. As an illustration, here’s an example with made-up figures: a plan costs €40 a month, and you assume a twelve-month term, so €480 revenue per member. Out of ten trial sessions, three sign, so a trial session is worth €144 on average. If you decide you want to spend at most a quarter of first-year revenue on acquisition, a member may cost €120 and a trial session €36. If your cost per lead is above that, the problem sits either in the close rate or in the search that brought the lead. Without the import from section 2 you can’t tell those apart. With it, you can see it per keyword.
How your click prices and conversion rates compare to other local service businesses is in the Google Ads DACH benchmarks (in German). For the break-even calculation, though, your own close rate is what counts, not the market average.
Bottom line
Google Ads for gyms works when the account optimises for what your gym actually sells: memberships, not clicks and not forms.
- A clear offer and the shortest path to close. Online sign-up if your software supports it, otherwise a booked trial session. Anything vaguer teaches the automation the wrong lesson.
- Three conversions, three tracking paths. Bookings through the tag, calls through forwarding numbers, walk-ins through a code and a required question at the front desk.
- Feed contracts back. Offline conversion import or Enhanced Conversions for Leads turns “lead booked” into “became a member”. Only then does cost per lead mean anything, and only then can you honestly compare Google and Meta.
- Radius and season as settings, not hope. Radius plus presence, weekly distance report, budget ramped up from December, nothing rebuilt in February.
If you want to know where your account currently stands in this order, I’m happy to take a look with you. No agency commission, no contract lock-in.
FAQ
How do I track calls from Google Ads for my gym?
Through two Google-native paths: the call asset in the ad with a forwarding number, and the website call conversion, where the Google tag swaps your number on the page. Both count calls above a minimum duration as a conversion; set that minimum to 30 to 60 seconds so wrong numbers don’t count.
What does an offline conversion import get me if I only have a few contracts a month?
Even with few contracts, Google learns which search terms and ads bring members. Also report “showed up for trial” as an early signal, so the automation has more data while still learning towards the contract. Until enough contracts accumulate, the booking stays the primary goal.
Google Ads or Meta Ads for a gym?
Google catches existing demand, Meta creates new demand. Compare both by cost per member, not clicks or leads, and scale whichever has the lower value first. In most gyms that’s Google, until search demand in the catchment area is exhausted, then Meta.
Should I use the seasonality adjustment in January?
No. It’s built for short events lasting a few days, not a whole month. Instead, ramp the budget up gradually from mid-December so the campaign enters January with data, and leave the bidding strategy alone in February.