Measured September 21, 2026 against the Brandmov ad library: 923 spa ads from 290 separate businesses. Run-time uses Meta's own ad start date, so it measures how long an advertiser kept paying rather than how well the ad converted.
You have just signed a local client. One location, a modest monthly budget, an owner who mostly wants the phone to ring. You have no reference material, no creative, and no real sense of what advertising in their category even looks like. The usual move at this point is to open the Meta Ad Library, scroll until something looks nice, and rebuild it in the client's colours.
That is guessing with extra steps. What follows is the process we run instead. Six steps, about three hours, and it ends with a finished ad and a priced recommendation you can put in front of the client before any of their budget has been spent. It is worked end to end on a spa because that is our deepest local category, 923 ads from 290 separate businesses, but the steps run unchanged for a dentist, a roofer, or a pest control company. Every table below is the actual output of the step it sits under, not an illustration of one.
The six steps. 1. Get the client's numbers, then build the reference set. 2. Sort by run-time and log thirty ads. 3. Extract the offer, not the creative. 4. Price one offer into the client's margins. 5. Write the ad. 6. Set the refresh dates, then watch the right three competitors.
Step 1. Get the client's numbers, then build the reference set
Before you open anything, get four numbers out of the client. You cannot price an offer in step 4 without them, and asking for them after you have already shown someone creative is a much worse conversation. Five minutes on the kickoff call is enough.
Ask for these four, in this order. 1. Average ticket: what does one visit actually bill? 2. Gross margin on it, after product and the practitioner's time. 3. Repeat rate: of ten first-time customers, how many come back at all? 4. The number they will trade for a new customer. Most owners have never been asked the fourth one and will answer the third by feel. Take the feel; it is still better than assuming.
Now filter the ad library down to your client's industry and leave that tab open for the rest of the afternoon. For a spa that is every spa ad we hold, and a hand-picked cut of them sits inside step 3 below so you can see the finished output before you run it yourself. You are not hunting for your client's actual competitor, who may not advertise at all. You are after the pattern across everyone in the category, which is a much more reliable thing to build on than one neighbour's guesswork.
The reason this is worth doing at all is that local ads sit still long enough to be studied:
The median spa ad runs 48 days and only 28% are switched off inside the first month. Forty-nine have been live for more than six months and the oldest is closing on four years. A spa finds an offer that fills the calendar and then leaves it alone. So what you are about to read is not a feed of ads that looked good. It is a shelf of offers that survived, each one something a specific business keeps paying to put in front of a specific town.
This is also your pitch. You do not have to promise a prospect a viral creative. You have to show them that the spa across town has been running the same offer for eleven months, and that you can tell them what it is. That is a much easier sentence to say in a first meeting, and it is checkable while you are sitting there.
Step 2. Sort by run-time and log thirty ads
This is the step almost everyone skips and it is the entire value of the exercise. Sort the filtered feed by longest-running and work down the top thirty. The prettiest ad in any feed is frequently one that was switched off three weeks ago, and you will never know that by looking at it.
Open a spreadsheet before you start reading, because doing this from memory produces an impression rather than a list. Five columns, one row per ad: advertiser, days live, the offer in plain words, the price it names, and the button. Two minutes an ad, so an hour for the thirty. Save each ad to a board as you go, so the client can see the evidence later without you rebuilding the research.
One caution. Because long run-times are normal here, age on its own does not crown a winner: a three-year-old ad is sometimes just a forgotten one, still running because nobody turned it off. Read the thirty as a set and look for what repeats. The repetition is the signal, not the single oldest ad.
Step 3. Extract the offer, not the creative
Only the third column really matters, and it is the one that takes discipline: what is being given away, at what price, to whom. Not "nice before and after". Not "clean layout". The offer list is the deliverable. The images are very nearly incidental. Here is what that looks like filled in, against the six ads below.
What step 3 looks like when it is done
Six ads pulled by hand out of the spa file, one for each play rather than the six that ran longest. The label under each is the line that would go on your offer list. Four of the six put a price or a deadline on the creative itself. Open the full feed →
| Advertiser | Days live | The offer, in one line | Price on the creative |
|---|---|---|---|
| Élan Vital | 1,309 | Buy one get one on the wrinkle treatment, free consult, 18 spots left | $7.99 per unit |
| Buinewicz | 982 | A patient tells her own story, month-end pricing attached | "Special pricing" |
| Dose of Aesthetics | 967 | Lip filler sold as a spec sheet: product, downtime, how long it lasts | $500 |
| Vein Envy | 681 | Vein removal priced per leg area, named as a monthly special | $150 / $300 |
| TREAT Medspa | 369 | Half off a named device treatment, new patients only | 50% off |
| Kyss Med Spa | 182 | Five treatments priced on one card, with a bundle at the bottom | $169 to $1,499 |
Nothing about the photography made it onto the list. That is the point of the step.
Read down the third column and the structures announce themselves. A new-customer discount. A bundle. A per-unit or per-area price. A deadline. Four of the six put the actual number on the creative. Do this thirty times and you will have four or five structures with a count next to each, which is the thing you take into step 4. You are no longer guessing what works in the category; you have a tally.
And the tally holds up across the whole file, not just these six:
Nearly three quarters name a discount, a special, or a promotion outright. Four in ten print an actual price in the body copy. There is no brand-building restraint here and no holding the price back for the landing page. The buyer is comparing two spas ten minutes apart and the number is the decision. The copy is long too, 854 characters on average, which is several paragraphs listing treatments, naming product brands, stating prices, and answering the obvious objection inside the ad itself.
Those six come out of the same library the six steps run on. If you want the other 917 spa ads, plus the ten other local industries behind them, Brandmov is on Earlybird at a one-time price at the moment. Either way, keep reading. The process is the part that does the work.
Step 4. Price one offer into the client's margins
Now put the tally against the four numbers from step 1. The arithmetic takes about ten minutes and almost nobody does it, which is why so many local accounts end up running the category's most popular offer at a loss.
Work it as three lines. Take the client's average ticket, multiply by gross margin to get the contribution on one visit, and multiply that by the share they said they would trade for a new customer. Whatever comes out is the total budget for the offer and the ad spend together. Then check each structure from your tally against it.
Worked, on a $1,200 spa. $1,200 ticket at 70% margin is $840 of contribution. The owner will trade a third of it, so $280 buys one new customer, ads included. The category's commonest offer is 50% off the first treatment, which costs $600 of that margin on its own, before a penny of media. It does not fit, no matter how many competitors run it. A flat $150 off fits with $130 left for ads. A free add-on that costs $40 to deliver fits comfortably.
Same tally, a $90 spa, opposite answer. $90 at 60% margin is $54 of contribution, and a third of that is $18. No discount survives $18 on a single visit. So the offer cannot buy a visit, it has to buy a member: a first facial at $49 that opens a monthly plan, where the real margin is the fourth month. The reference set did not change. The answer did.
The rule underneath both: offer cost plus ad cost has to come in under ticket, times margin, times the share the client will trade. If the category's most popular structure fails that test, take the second most popular. Do not discount into a loss because everyone else is.
This is the conversation that makes you a consultant rather than a button-pusher, and it is the reason the research step is worth billing for on its own. You are not bringing the client an ad. You are bringing them the four offers their category runs on, the count next to each, and a recommendation with the margin arithmetic attached.
Step 5. Write the ad: offer button, long copy, cheap format
Now the creative, and here the data makes two of the three decisions for you. Start with the button. We grouped every spa ad by its call-to-action and measured the median run-time of each group, then measured it a second way, per brand, so that one spa running forty ads counts once rather than forty times:
| Call to action | Ads | Brands | Median days (per ad) | Median days (per brand) |
|---|---|---|---|---|
| See details | 42 | 22 | 88 | 84 |
| Shop now | 45 | 12 | 42 | 74 |
| Get offer | 205 | 78 | 58 | 61 |
| Learn more | 312 | 84 | 47 | 56 |
| Book now | 247 | 42 | 28 | 51 |
Run-time is a proxy for advertiser satisfaction, not a direct conversion measure. An ad that keeps running is one the advertiser keeps paying for.
Lead with the offer, not the booking. Book now ranks last on both measures, but read the two right-hand columns against each other before you take that too far. Per ad, Book now looks catastrophic at 28 days against 58 for Get offer. Per brand it is 51 against 61, which is a much milder story. Most of that dramatic ad-level gap is not the button at all, it is concentration: Book now's 247 ads come from just 42 spas, while Get offer's 205 are spread across 78. A handful of booking-led advertisers are cycling through a lot of short-lived creative and dragging the ad-level median down with them.
The honest version, and the one worth taking into a client call: the button is a mild signal and the advertiser behind it is a strong one. Put the offer on the button, put the price in the body copy, write long, and let the booking happen on the landing page where the ask is cheaper to make.
The third decision is the one you can stop agonising over. Static ads run a median 47 days, video 50. That gap is noise. Whether you shoot video for a local client is a budget question and not a performance one, which is genuinely useful to know before you quote a retainer.
Read the brand column, always. Any ad-level statistic about a small local industry is one prolific advertiser away from being wrong. When you cut these numbers for your own client's category, check the brand count next to the ad count before you put a figure in a deck.
So: a still image, an offer on the button, and several paragraphs of price-explicit copy. Here is the whole thing written out, for the $1,200 spa from step 4, using the structure its margins actually support.
Primary text
You have been meaning to book this for about a year.
New patients get $150 off a first treatment at [clinic], through the end of the month. Here is exactly what that is:
A 20 minute consult with our injector, no charge and no pressure. A written plan with the price on it before anything is booked. Treatment the same day if you want it, or not at all.
Most first visits run $900 to $1,400 after the credit. You will see it settle in 3 to 5 days and it holds for 3 to 4 months. If you have never done this before, that is most of the people who sit in our chair.
We are on [street], ten minutes from [landmark], and parking is free.
Pick a time below. If it is not for you after the consult, you pay nothing.
Headline: $150 off your first treatment
Button: Get offer
Format: one still photo of the actual room and the actual injector
Destination: a booking page that repeats the $150 above the fold
Every choice in there traces back to a column you have already read. The price is in the body because 41% of the category puts it there and the buyer is comparing two spas ten minutes apart. It runs to roughly 800 characters because the category average is 854 and the long ones answer the objection inside the ad. The button is Get offer rather than Book now because the ask on the creative should be smaller than the ask on the landing page. It is a photograph rather than a video because static and video tie at 47 days against 50, so the format is a budget decision. And the offer is $150 rather than half off because that is what the arithmetic in step 4 allowed.
Swap the bracketed details for the client's own and that is a shippable ad, built in an afternoon, with a reason behind every line you can defend when the owner asks.
Step 6. Set the refresh dates, then watch the right three competitors
The day the ad goes live, put three dates in the calendar. With a category median of 48 days you do not need to rebuild creative every fortnight, and saying so up front is a retention argument the category backs you up on.
The three dates. Day 14: look at spend and cost per lead, and change nothing. Anything you touch this early you are reading noise into. Day 42: refresh the creative, keep the offer. New photo, new opening line, same number. Day 90: re-run steps 2 and 3 from scratch. The offer list moves over a quarter, and a tally you collected in spring is not the one the category is running by summer.
Then pick the competitors to watch, and pick three rather than ten. The way to choose them is not to rank the biggest businesses in the county, it is to ask the client one question: who do customers say they went to instead? The front desk knows. Those three are the list.
Add them to a watchlist by name and let it track them, so a new offer landing across town reaches you as an alert rather than as something the client mentions on a call six weeks late. Steps 1 to 5 tell you what the category runs on. This is the part that keeps you ahead of the street.
Why a pattern beats a neighbour
One thing to be clear about before you take this to a client: the reference set is not a directory of your client's street. It very likely does not contain the spa two blocks over, and it does not need to. What you are taking out of it is the shape of the offers the category runs on, and that shape is remarkably stable. A first-treatment discount does the same job wherever the spa is.
The same goes for the rest of it. The CTA finding is about the size of the ask, not about any particular audience. The long-copy, price-explicit pattern reflects how anybody chooses between two local providers within driving distance of each other. So use the library for the pattern, price the offers into your client's own market, and lean on step 6 when what you want is the three businesses on your client's actual street.
The short version
Do this, in order.
1. Get four numbers from the client: average ticket, gross margin, repeat rate, and what they will pay for a new customer.
2. Filter the library to their industry, sort by longest-running, and log thirty ads in five columns. An hour.
3. Turn column three into a tally of four or five offer structures with a count next to each.
4. Test each structure against ticket times margin times the share they will trade. Pick the one that fits, not the one that is commonest.
5. Write it as a still image, an offer on the button, and about 800 characters with the price in them.
6. Diary day 14, day 42 and day 90. Watchlist the three competitors the front desk actually hears about.
That is an afternoon's work, and what lands on the client's desk at the end of it is an offer tally, a margin calculation and a finished ad, rather than a mood board and a guess.
Running this for more than one client? The library you filter in step 1, the boards you save offers to in step 3, and the competitor watchlists in step 6 are all the same tool. Brandmov is listed on Earlybird right now at a one-time price rather than a monthly line item against every retainer you run. See the Earlybird listing →






