Case 04 · Kesha Select · Paid growth · Aug to Sep 2026

Meta ads, planned and measured

I stood up paid social for a store that had never run it: audited the account, split it into clean lines, fixed attribution, wrote the creative playbook and gave the owner one number to steer by. Within weeks the live ads' cost per purchase sat in the top tenth of the food category.

ProblemBlended audiences and broken attribution hid acquisition cost
My contributionAccount structure, attribution, dashboard and creative playbook
OutcomeThree legible campaign lines · top-decile benchmark snapshot

Artifact and decisions

one issue · 5 linked fixes · numbers match the callouts

The issue

We could not tell what a new customer actually cost

One blended campaign, inconsistent tags and personalized landing pages meant the 2.5× gap was a measurement artifact as much as a fact. The group below makes every later number legible before any budget moves.

Sanitized account-structure recreationDiagram preferred over an Ads Manager dump
1 Account structure · after the rebuildone campaign line per audience
LineAudience2 Lands on3 May advertiseCost / purchase
ReturningLifecycle segments, exported nightlyOne campaign page, personalization offHero SKUs only, scorecard-passed 1.0×
New customersLookalike of the four-year coreSame campaign page, tagged as its own lineHero SKUs only, scorecard-passed 2.5×*
Local25 miles around the pop-upClearance pageClearance, treated as inventoryfirst-order goal
5Daily health check · one trusted number
7-day ad spend ÷ 7-day store revenuewithin target
Creative age, best-performing adday 8 of ~9
4Creative calendar · this week
New videos shot3 of 3
Concepts this month7 of 10

Simplified recreation in English. Costs are relative to the returning line. *As first measured, on broken attribution. No spend or account data appears.

1Three campaign lines
Targets · a blended CPA that hid both audiences

Returning, new and local, each with its own audience, budget and cost per purchase.

2Attribution convention
Targets · orders the store and the ad platform disagreed on

One tagging scheme on every ad; personalized destinations turned off for paid traffic so an ad lands on one page.

3Hero-SKU gate
Targets · ads for products with no proven pull

A scorecard with a pre-launch check; only items that already sell get budget.

4Creative cadence
Targets · results decaying after about nine days

Two to three new videos a week, ten concepts a month, the product being eaten or used first.

5One trusted number
Targets · decisions made on numbers nobody believed

Seven-day spend over seven-day revenue, computed from two tables the owner already trusts, checked daily.

01 DiscoverAudit the account
02 DefineEfficiency or measurement?
03 PrioritizeTrust before spend
04 BuildStructure, tags, creative
05 MeasureTop-decile cost per purchase
06 LearnAds amplify fit
01Discover
PM strategy

Audited the account before touching a budget. One campaign served returning and new customers together, so the blended cost per purchase hid both. Ads pointed at personalized destinations, so a returning customer and a stranger saw different pages under the same ad. Purchases were attributed with inconsistent tags, so the store and the ad platform disagreed about what worked.

Eng execution

Pulled ad-level spend and results into the same SQLite store as the Shopify order sync, joined on campaign tags, and listed every landing URL the ads used. The join itself exposed the problem: a large share of ad-attributed orders had no usable source tag at all.

02Define
PM strategy

The question the owner asked was "should we stop paying for new customers". The question worth answering first was "do we know what a new customer costs". Four hypotheses: H1 new-customer acquisition is inefficient and should be cut. H2 the measurement is broken, so efficiency is unknown. H3 creative fatigue, not targeting, is the real constraint. H4 we are advertising the wrong products.

Evidence
H1 cut acquisition → deferred: CPA measured on broken data H2 measurement broken → yes: tags + personalized destinations H3 creative fatigue → yes: results decay in about 9 days H4 wrong products → yes: featured items ≠ what the group buys
03Prioritize
PM strategy

Trust before spend. Nothing gets scaled or cut on a number nobody believes. Order of work: fix attribution, split the account so each audience has its own line and its own cost, keep one clean acquisition test line running while the decision waits, then fix product selection and creative cadence.

Eng execution

Sized the fix by where it lived: tags and destinations were a configuration change, the campaign split was an account rebuild, and the creative pipeline needed people and a calendar, not code. Configuration went first because it made every later number legible.

04Build
PM strategy
  • Account structure. Three lines: returning customers, new customers, and local (a geo-targeted line around a Bay Area pop-up and clearance, treated as inventory and first-order acquisition rather than revenue).
  • Product selection. A hero-SKU scorecard with a pre-launch check. Only items with proven pull get advertised. The top creative slot is reserved for new items and brands.
  • Creative playbook. Food creative lives about nine days. Plan two to three new videos a week and at least ten concepts a month. Lead with the product being eaten or used, never a ranking slide or a price tag.
  • Decision rule. Every campaign gets a daily health check against one metric everyone trusts.
Eng execution

Wrote one tagging convention and applied it to every ad. Turned off personalized destinations on paid traffic so an ad lands on one page. Exported the returning and new audiences from the lifecycle segments I had built for the migration study, so the ad account, the CRM and the store agreed on who was who. Built the daily health check as a query over spend and orders, not a manual read of two dashboards.

trusted_metric = sum(spend, 7d) / sum(store_revenue, 7d)
05Measure
Cost per purchase · live ads vs the food category
Category, typicalmedian
Kesha Select, live adstop 10%
Returning-customer linelowest

With attribution fixed and the lines split, the account read cleanly for the first time: the live ads' cost per purchase sat in the top decile of the food category, and the returning-customer line was the cheapest purchase the store could buy. The apparent 2.5× penalty on new customers turned out to be a measurement artifact, which the rebuild removed.

What the plan delivered
Cost per purchase vs the food categorytop 10%Campaign lines with their own cost and audience3, from 1Orders the store and the ad platform disagreed onresolvedCreative lifespan, diagnosed and planned aroundabout 9 daysSteering metric adopted by the owner7-day spend ÷ revenue

A merchandising fix came free with the measurement: one campaign's featured page had sold under five percent of that campaign's revenue because it did not match what the community was posting. The next campaign synced the page to the daily posts.

06Learn
PM strategy

Ads amplify product fit; they cannot create it, so only proven items get budget. With Meta running efficiently, the strategic call was where the next dollar goes: the only scalable new-customer channel that does not depend on an aging Facebook group is intent search, so the Q4 plan opens Google Search and Merchant Center from zero while Meta holds at its efficient level.

Eng execution

A metric nobody can compute from raw data is a metric nobody trusts. The spend-to-revenue ratio survives because it is one query over two tables the owner already believes. Every attribution fix became a rule in the pipeline so the next campaign starts clean.

What I would not claim

The category benchmark is a snapshot from the weeks the account ran under the new structure, not a quarter of data. The 2.5× figure is presented as what the broken measurement showed, not as a finding about new customers.

Rule this produced

One trusted number for paid. Rolling seven-day ad spend divided by store revenue, until attribution is proven clean.