# Does the wider DTC beauty/hair/supplement field draw its own CTA button? Mostly no — 6 of 66.

Audited 2026-09-18 against the Obvi finding in `../CTA-FINDING.md`. Source: GetHookd MCP
`search_ads`, geo US, `ad_format="images"`, `ads_per_brand_limit=2`, seven short free-text queries
(`hair growth`, `collagen`, `thinning hair`, `wrinkles`, `serum`, `biotin`, `hair`) sampled across
launch history (2018 → 2026-09-17) and across performance tiers. Profile used: niche 5 Beauty, US.

Every ad was downloaded to `images/` and read as pixels. Two sheet sets were built and every one
was opened: bottom-38% crops (`sheets/bottom-01..06.jpg`) and full frames
(`sheets/full-01..06.jpg`), plus `sheets/zoom-borderline.jpg` for six judgement calls.
`cta_type` / `cta_text` were ignored throughout — they describe Meta's own button bar.

## Counts

- **45 distinct brands, 66 static image ads.** No brand contributes more than 2 ads.
- **`drawn_button`: 6 (9.1% of ads, 6 of 45 brands = 13%)**
- **`label_pill`: 25 (37.9%)**
- **`no_pill`: 35 (53.0%)**
- Separately: **4 more ads carry a drawn click instruction with no enclosing shape** — bare type or
  a bare arrow. Counted as `no_pill`/`label_pill` under the strict definition, but they are drawn
  CTAs and you should know about them. Strict + unenclosed = 10 of 66 (15.2%).

### The 6 `drawn_button` ads, named

| Brand | brand_id | ad_id | The device | Advertiser | days_active | perf |
|---|---|---|---|---|---|---|
| The Hair Wellness Lab (yoracare.com) | 4340387 | **143519928** | full-width dark-green pill, `BUY 1 GET 1 FREE`, bottom of frame; plus a `GET YOURS NOW!` starburst mid-frame | DTC | 40 | **100 Winning** |
| Her Hair Company | 6161337 | **170059661** | magenta rectangle, `SHOP KINKY STRAIGHT`, **mid-frame** | DTC | 18 | **84 Optimized** |
| Hollywood Hair Bar | 2023 | **24167330** | pale-pink pill, `SHOP BEAUTY`, bottom-right | DTC | 128 | n/a |
| Circcell Skincare | 8083283 | **172144205** | outlined pill, `Shop circcell.com`, bottom-centre | DTC | 15 | 1 Testing |
| Ink & Insights | 257911 | **178935161** | coral pill, `Learn More`, lower-centre | search arbitrage (daily-buzzz.com) | 2 | 1 Testing |
| Bob's Hideout | 5909194 | **170867953** | maroon rounded rect, `Here's How`, **mid-frame** | search arbitrage (daily-buzzz.com) | 16 | 1 Testing |

### The 4 unenclosed drawn click instructions

- `43444864` Hair Growth Journey — "Click Below To Learn How", set type under the headline.
- `172903160` Serene Scribe Search — "Learn More", **underlined type on black**, not in the yellow block.
- `82050223` Fleava — "TAP HERE!" in 60pt type with a red arrow pointing at a colour blob.
- `130856738` Eco Strawberry — "USE PROMO CODE 20SALENOW **AND BUY NOW!**", set type beside the jar.

Both mid-frame buttons (`170059661`, `170867953`) were **invisible in the bottom-38% crop** and only
turned up on the full-frame sheets. If you audit only the bottom band you will undercount by a third.

## Verdict

**QUALIFY.** The wider set supports the direction of the Obvi finding — 91% of 66 statics across 45
brands draw no CTA button, and the click is left to Meta's bar with the offer in the headline field —
but it does **not** support "never". A real 9% minority draws one, and that minority is **not** just
low-performance dropshippers: the two highest-scoring drawn buttons in the whole sample belong to
established DTC advertisers (Hair Wellness Lab, perf 100 "Winning", 40 days live; Her Hair Company,
perf 84 "Optimized"), while the two arbitrage pages that draw the most conventional "Learn More"
pills both score 1 "Testing". Drawing a button is a live, occasionally winning option in this
category — it is simply the minority choice, and when it wins it carries an **offer or a category**
(`BUY 1 GET 1 FREE`, `SHOP KINKY STRAIGHT`), never a bare "Shop Now".

Dropping the in-image button from our layouts is well supported as the house default. Claiming the
category "does not do it" is not.

## What the bottom third carries instead

Devices counted across 66 ads; an ad can carry more than one, so this sums past 66.

| Bottom-third content | Ads |
|---|---|
| Nothing — bare photo, model, product or white space | 16 |
| Spec / ingredient row, spec roundels or a spec band | 13 |
| Proof line, review card, review count or proof stat | 9 |
| Band or solid colour block (full-bleed, square corners) | 6 |
| Drawn button | 6 |
| Press logo, award seal or certification badge (VOGUE, BuzzFeed, Amazon, dermatest) | 5 |
| Legal / FDA disclaimer or study footnote | 5 |
| Guarantee line (30-, 60-, 90-day money-back) | 4 |
| Before/after proof tiles | 4 |
| Product line-up | 4 |
| Price block, promo code or offer line (not a button) | 4 |
| Usage line ("2–3 drops before bed") | 2 |
| URL watermark | 2 |

The Obvi bottom-furniture vocabulary — proof line, guarantee with a glyph, spec row, press logos —
**is the category vocabulary**, confirmed well outside Obvi. Two additions worth having:
**before/after tiles** (Eqqualberry, JSHealth, Wild Growth) and a **bare full-bleed band** carrying
one line of proof or one certification row (Hair Loss Advice, Multi Collagen Complex, Live Conscious).

### On `label_pill` — the distinction that matters

25 of 66 carry a pill/rounded/badge device that is **not** a button. They hold ingredients
(Laced Hair Care `145524743`), specs (Wellah `178827104`, The Collagen Co. `64460877`), objections
(Revetix `178400562`), benefits (Particle `90776602`), proof counts (Live Conscious `89027597`),
discounts (eSalon `81771628`, Particle `148824694`), awards and seals (Dr.FORHAIR `169049906`),
mock UI — chat bubbles and a search field (JSHealth `173977235`, Quasi `178258518`), and one
arrow-shaped device holding a claim rather than an instruction (Dr. Groot `81767144`).
The rounded shape is common; the **click instruction inside it** is what is rare.

## Sample composition, stated plainly

39 of 45 brands are own-brand DTC or DTC-adjacent (44 ads `dtc`, plus 2 reseller, 1 Amazon-led).
6 brands are not DTC ecommerce: 8 ads from search/content-arbitrage pages, 2 from a local salon
lead-gen advertiser, 2 affiliate/marketplace round-ups, and 7 ads run advertorial funnels.
That mix is what the queries returned, not a design. Two caveats on the sample:
`max_ad_copy_length` was applied on batches 2–7 to hold response size down, which biases toward
shorter-copy ads; and `query` + `niche=5` together returned zero rows, so niche was dropped and the
topical queries did the scoping.

## Files

- `manifest.json` — all 66 ads: brand, brand_id, advertiser_type, classification, reason,
  bottom-third contents, bare-text-CTA flag, days_active, performance_score, local image path.
- `images/` — 66 original creatives, named `<ad_id>.jpg`.
- `sheets/bottom-01.jpg` … `bottom-06.jpg` — bottom-38% crops, brand + ad id burned on each tile.
- `sheets/full-01.jpg` … `full-06.jpg` — full frames, same labelling.
- `sheets/zoom-borderline.jpg` — the six judgement calls at full resolution.
- `rows/batch01..07.tsv`, `rows/all.tsv` — the row-level search record.
