Case studiesMoonwlkr

Hemp · CBD · Meta + Google Ads · Subscription · USA · Restricted industry

In this category every brand gets banned. This account ran 14 months without one.

CBD on Meta. 14 months. Zero bans. $745K from Google.

Moonwlkr makes premium hemp gummies (Delta-8, Delta-9, HHC, CBD) sold direct-to-consumer on subscription. Most brands in this category get banned on Meta within weeks, or never try at all.

I built the Restricted Industry Framework that keeps the account clean from a normal Facebook account, then rebuilt Google Ads from a near-dead state to $745K conversion value in one year. 14 months and counting, zero restrictions.

Meta account restrictions in 14 months0CBD and hemp gummy ads. Facebook + Instagram. Normal account. No parallel accounts, no workarounds, no black hat.
Meta ROAS · Q1 2026 · max attribution2.90×Jan–Mar 2026. $61,307 spend. ($75,820 1-day view + $102,020 28-day click) ÷ $61,307. Two non-overlapping attribution sources (1-day view + 28-day click which already includes 7-day click). Normal account, restricted product.
Google Ads ROAS · Nov 2024–Aug 2025226%2.26× blended total account, visible in Fig 4 campaigns list. Target: 120% (subscription break-even on first purchase). Prior period: 51%. Visible under AdPistols MCC in every screenshot.
Google Ads conv value · full year 2025$745K+1,862% vs 2024. $339K spend, 20,943 conversions. Prior year spend: ~$21K.

"Just appreciate what you do for us + I don't like money owed lol."

TJ, Brand owner · Moonwlkr · Slack message after I sent the invoice two days early. He paid it within the hour.

What this case study actually proves

  • One brand, one client, 14 consecutive months on Meta + 13 months scaling Google. Not portfolio averaging, not blended agency math.
  • Zero Meta account restrictions in a CBD/hemp category where every other brand gets banned. Architecture, not luck.
  • Real screenshots, real numbers, verifiable math, and a real Slack message from the brand owner.

Who this case study is for

  • CBD, hemp, THC, kratom, cannabis-adjacent DTC brands fighting for Meta access
  • Subscription-first operators where LTV >> first purchase but the algorithm optimises identically on both
  • $5-50K/month Meta accounts that keep getting reset every 6-8 weeks
  • Brands whose agency said 'you can't run paid ads on CBD' or quoted a black-hat workaround

In restricted since

7+ yrs

iOS 14.5 broke default tracking, I rebuilt for restricted in 2019

Active restricted accounts

5+

Currently under management, anonymised by request

Restricted spend processed

€10M+

Across CBD, hemp, peptides, vape, adjacent

This account survival

14+ mo

and counting · year-end update due in this case study

Runs under theRestricted Industry Framework

No black hat. No workarounds. Built for brands that need a sustainable paid channel.

Why CBD brands get banned - and why this account didn't

Every agency tells CBD brands they can't run Facebook. We ran it for 14 months.

Accounts selling CBD and hemp get banned for two reasons: restricted creative and restricted signals. The creative problem is solvable - you learn what language Meta flags. The signal problem is structural. When your browser pixel fires on a hemp product page, Meta's systems see the product content alongside the conversion event. The pixel becomes the liability. The fix isn't better creative - it's moving the conversion signal server-side so Meta receives a clean, complete event with no product-page context attached. The complete implementation runs within the Restricted Industry Framework.

What gets most CBD accounts banned

  • Browser pixel fires with product URL in the referrer, Meta logs the hemp page as event context
  • Events arrive with partial parameters: no hashed email, no phone, no ZIP, low EMQ scores
  • Account gets flagged. Creative gets blamed. Agency recommends a fresh account.
  • New account. Same pixel architecture. Same outcome. Six to eight weeks later.
  • Retargeting audiences built on dirty signals, lookalikes useless, CPM climbs

What I built instead

  • All conversion events routed server-side first, browser pixel backed by CAPI at every touchpoint
  • Full Enhanced Matching parameter set on every Purchase event, with click attribution preserved server-side across the full purchase path
  • A pure server-only event Meta can't tie to a product page, scoring the highest event match quality in the pixel
  • Redundant server-side purchase signal fires regardless of browser state, ad blocker, iOS restriction, or consent dropoff
  • Result: 8.0/10 Purchase EMQ with 100% parameter coverage. Account invisible to the restriction triggers that take down default setups.
MoonWlkr Main Meta Pixel, PageView 406K, Add to Cart 365K, Signal CAPI 8.3/10 EMQ, Purchase 8.0/10, all events active with Multiple integration

Fig 1, Meta Pixel overview · Full event funnel · EMQ scores across all events + Purchase parameter coverage

Aug–Sep 2024. Full event funnel running with browser + server integration on every event. A dedicated server-only event scores the highest EMQ in the entire pixel because it carries no browser component for Meta to tie back to a product page. This is what a clean architecture looks like from Meta's side.

Purchase EMQ breakdown (8.0/10): every Purchase event sends the full Enhanced Matching parameter set, all hashed, all at 100% coverage. CAPI recovering +14.5% conversions the pixel alone missed. Click attribution preserved server-side across the full purchase path, present in every payload. This is the signal coverage that keeps the account restriction-proof.

Meta Ads Jan–Dec 2025 vs Jan–Dec 2024, $130,531.88 spend in 2025 vs $0.00 in 2024, $222,322.41 website purchase conversion value

Fig 2, Meta full year 2025 vs 2024 · $0 spend in 2024 · $130,531 in 2025 · $222,322 website purchase conv value

Jan–Dec 2025 vs Jan–Dec 2024. Prior year spend: $0.00. The account wasn't running Meta in 2024. Full year 2025: $130,531.88 spend, $222,322.41 website purchase conversion value. Restricted product, normal account, running the full year without interruption.

What rotation actually costs CBD/hemp brands per year

Run the math on a default CBD Meta setup. Typical pattern: account runs 6-8 weeks, gets banned, rebuild, repeat 3-4× per year.

  • Each rebuild costs 4-6 weeks of pipeline. 3 bans/year = 16 weeks offline = 31% of your year not converting.
  • Each ban resets the algorithm and retargeting audiences. Six weeks of compounding learning lost. The brand campaign at 36.43× ROAS doesn't exist without 14 months of continuous data feeding it.
  • Most CBD brands give up on Meta entirely and pay 15-20% affiliate commission instead, losing customer data ownership and paying more per sale than working ads would cost.
  • At Moonwlkr's scale, the broken-default outcome (no Meta + broken Google) was costing roughly $500K-$1M/year in revenue the brand was leaving on the table. The infrastructure rebuild was the cheapest line item in the entire P&L impact.

Most operators don't run this math because the cost shows up as "we couldn't scale", not as a line item.

Sound familiar? I can usually tell you in 30 minutes whether the same fix applies to your category.

Book a 30-min diagnostic →

What you should stop doing immediately

Five default setups that guarantee your CBD account dies or underperforms.

If you recognise any of these in your current setup, you already know why the channel isn't working. None of them are fixable with "better creative" or "smarter bidding."

Running the default Meta pixel on your hemp/CBD product domain. You're feeding Meta's classifiers a complete map of what you sell, every page view. The pixel becomes the liability.

Browser-only attribution in a restricted category. You're losing 60%+ of conversions to iOS, ad blockers, and consent dropoffs, and the algorithm trains on the wrong signal.

Rotating Meta ad accounts every 6-8 weeks because the previous one got banned. Each fresh account starts the algorithm at zero. Retargeting audiences gone. Lookalikes useless.

Tracking a single 'Purchase' goal on a subscription product. The algorithm bids the same on a $7 repeat box as on a $200 LTV new subscriber, the new customer is worth 5-10× more.

Paying agencies to R&D on your account, your budget, your bans. They learn at your expense, you write the tuition.

Tracking architecture - Restricted Industry Framework

Most accounts get banned because the pixel is the liability. I moved the liability server-side.

Every Purchase event carries the full Enhanced Matching parameter set with click attribution preserved server-side across the full purchase path, full attribution even when the browser can't carry the click data forward. A pure server-only event ensures Meta never sees restricted product context alongside the conversion signal.

This replaced a previous third-party attribution solution. Off-the-shelf tools couldn't deliver the event-level architecture a restricted-category brand needs to survive on a normal account at scale. The custom implementation is now running across Meta, Google, and Snapchat, same framework, each channel built on it from scratch.

Tracking architecture: customer browser + store backend feed server-side processing, which routes masked payloads to Meta CAPI, Google Ads Enhanced Conversions, and GA4
Two sources (customer browser + store backend) feed a server-side processing layer. The server reconciles attribution and purchase, restores data lost to iOS / ad blockers, encodes identity for Enhanced Matching, strips non-compliant data, and a compliance gate forwards per-destination payloads only. Meta receives a masked payload. Google Ads receives Enhanced Conversions. GA4 sees the full picture for analytics. Restricted product context never leaves the server.

Server-side first, by default

All ad-platform events flow through the server before send. Full Enhanced Matching parameter set on every purchase, click attribution preserved across the full path, redundant capture so no event is lost to iOS, ad blockers, or consent dropoffs. The brand domain stays out of Meta's policy review layer entirely.

Creative strategy for restricted brands

  • Lifestyle and benefit-led creative only, no product imagery
  • Mix of produced video, AI video, AI-generated design, classic static
  • Benefit language Meta's classifiers don't flag, no restricted terminology
  • Compliance-aware landing layer maintains learning and attribution end to end

The full framework is documented for brands in restricted categories: supplements, CBD/hemp, adult wellness, gambling-adjacent, and other Meta and Google restricted verticals.

Restricted Industry Framework →

Google Ads - from $21K annual to $745K

The account existed. It just wasn't working.

November 2024: $4,562 monthly spend. $2,332 monthly conversion value. 51% ROAS - below breakeven on first purchase, on a subscription product where first purchase is subsidized by LTV. The structure wasn't catastrophically wrong. It just hadn't been built for the subscription math.

Thirteen months later: $339K annual spend. $745K conversion value. 219% ROAS. Four campaigns. One brand campaign at 36× ROAS harvesting high-intent searches on minimal spend. One non-brand volume campaign at 1.45× - on a subscription product, 145% first-purchase ROAS is profitable when you factor in LTV. Demand gen and a prospecting campaign feed the pool that makes both efficient.

November 2024 - before

Monthly spend

$4,562

Monthly conv value

$2,332

ROAS

51%

Full year 2025 - after

Annual spend

$339K

Annual conv value

$745K

ROAS

219%

search · gummies · brand

36.43×

$7,996 spend

  • 18,433 clicks at $0.43 CPC, buyers who already know Moonwlkr
  • 29.05% CTR, the highest intent segment in the account
  • 3,489 conversions, $291K conversion value on under $8K spend ($7,996 × 36.43× = $291,375)
  • This ROAS is partly a function of demand gen investment building brand recognition

search · gummies · non-brand

1.45×

$245,972 spend

  • 108,697 clicks, the main volume driver across all hemp search terms
  • 145% ROAS on first purchase. Subscription LTV is where the real margin is.
  • 14,964 conversions, builds the remarketing and lookalike audience pools
  • $353K conversion value, the largest absolute revenue contributor
Google Ads Jan–Dec 2025 vs Jan–Dec 2024, $339,591 spend +1,477%, ROAS 2.19× +24%, 20,943 conversions +1,321%, $745,032 conv value +1,862%

Fig 3, Google Ads full year 2025 vs 2024 · +1,477% spend · +1,862% conv value · 219% ROAS

Jan–Dec 2025 vs Jan–Dec 2024. Spend: $339,591 (+1,477%). ROAS: 2.19× (+24%). Conversions: 20,943 (+1,321%). Conv value: $745,032 (+1,862%). The 2024 baseline (~$21K) was the account before AdPistols. Every +∞ column in the non-brand campaign confirms it launched fresh in this period with no prior data.

Moonwlkr Google Ads campaigns list Nov 2024 – Aug 2025, brand ROAS 36.43×, non-brand ROAS 1.45×, total account 2.26 ROAS

Fig 4, Campaign breakdown · Nov 2024–Aug 2025 · ROAS by time window + conv value per campaign

All four campaigns: ROAS by time, conversions, conversion value, spend vs prior period. Total account: 2.26× ROAS, 178,210 clicks, 21,765 conversions, $303,737 spend. Every campaign shows +∞ or strong positive delta vs Jan–Oct 2024.

Subscription tracking - built for LTV, not just first purchases

Most accounts track one "Purchase" goal. I track three.

Purchase + New Customer + Subscription Start. Different signals for different bidding strategies. When Google Smart Bidding sees one conversion called "purchase," it treats every purchase identically. A twelfth-box repeat customer valued the same as a first-time subscriber, that's backwards. The algorithm needs to know the difference between a $7 repeat box and a $200 LTV new subscriber. New customers are worth 5–10× more over lifetime. The algorithm should bid accordingly.

Moonwlkr tracks three conversion actions. Purchase is primary - Google uses it for bidding. New Customer and Subscription Start are secondary - they tell the algorithm what kind of purchase just happened. Last 30 days: 395.71 purchases. 206.13 flagged as new customers. 76.62 as Subscription Start. That's 52% first-time buyers - and Google knows it.

Next step: shift the primary optimisation target to New Customer and Subscription Start only. Stop paying acquisition cost for repeat orders. Let Smart Bidding hunt first-time subscribers exclusively - the segment where LTV actually starts.

Purchase (primary)

395.71

$30,410.54 all conv. value

All conversions in last 30 days. The primary signal Google uses for bidding.

New Customer (secondary)

206.13

$14,178.30 all conv. value

52% of purchases are first-time buyers. Google tracks them as a separate signal.

Subscription Start (secondary)

76.62

$5,396.76 all conv. value

New subscribers entering the recurring revenue loop, the customers worth acquiring.

Google Ads Customer lifecycle optimisation goal, Purchase primary, New Customer secondary, Subscription Start secondary, $45.69 incremental value for new customers

Fig 5, Customer lifecycle goal + conversion action breakdown · Purchase primary · New Customer + Subscription Start secondary

Lifecycle goal (Apr 16–May 15, 2026): $45.69 incremental value per new customer, 5 acquisition segments. Retention: not set - the account is acquisition-focused. Conversion actions: Purchase primary - 395.71 conversions ($30,410.54), 10 of 12 campaigns · New Customer secondary - 206.13 ($14,178.30) · Subscription Start secondary - 76.62 ($5,396.76). 52% of purchases are first-time buyers - and Google tracks them separately.

Q1 2026 - new ownership, same infrastructure, accelerating results

The company was sold. Now it's finally scaling.

Ownership changes usually pause acquisition. This one didn't. Q1 2026 vs Q4 2025 on Google Ads: ROAS up 66%. Conversions up 97%. The infrastructure built for the previous owner runs for the new one - same architecture, larger budget, same playbook. Snapchat is next: same server-side framework, new channel, same principle. Build the tracking first. Then spend.

Previous quarter

Q4 2025

~1.2×

~$43K spend · ~616 conv

Q4 2025 baseline, the comparison period for Q1 2026.

Jan–Mar 2026

Q1 2026

1.98×

$50,340 spend · 1,220 conv

+66% ROAS, +97% conversions vs Q4 2025. Google Ads accelerating under new ownership.

Apr–May 2026

Last 30 days

8.82×

$899 spend · 85 conv

Meta AP_sales_cold_purchase-click+view. Highest ROAS in the account. Cold audience converts on impression, not just click.

Google Ads Q1 2026 Jan–Mar 2026 vs Q4 2025 Oct–Dec 2025, ROAS 1.98× +66%, 1,220 conversions +97%, $99,763 conv value +95%, $50,340 spend +17%

Fig 6, Google Ads Q1 2026 vs Q4 2025 · ROAS +66% · Conversions +97% · Conv value +95%

Jan 1–Mar 31, 2026 vs Oct 3–Dec 31, 2025. Spend: $50,340 (+17%). ROAS: 1.98× (+66.47%). Conversions: 1,220 (+97.09%). Conv value: $99,763 (+94.66%). Brand campaign: ROAS 15.88× (+255.96%). Non-brand: 1.61× (+60.89%). Demand gen: 3.15× (+161.61%).

Meta ROAS · Q1 2026 · max attribution

2.90×

($75,820 1-day view  +  $102,020 28-day click)  ÷  $61,307 spend

New ownership context: the brand changed hands at the start of Q1 2026. Same infrastructure, larger budget under the new owner. Zero learning lost in the transfer, what ran for the previous owner runs identically for the new one.

Meta Ads Q1 2026, $61,307.76 spend, $84,244 Website purchases total, conv value by attribution window: 1-day view $75,820 · 1-day engaged $1,350 · 7-day click $65,503 · 28-day click $102,020

Fig 7, Meta Q1 2026 · $61,307 spend · purchase conversion value by attribution window

Jan 1–Mar 31, 2026. Total spend: $61,307.76. Website purchases total: $84,244.31. Conversion value by attribution window: 1-day view $75,820.87 · 1-day engaged $1,350.14 · 7-day click $65,503.41 · 28-day click $102,020.58. AP_sales_cold_purchase-click+view: $20,092 under 1-day view vs $2,788 under 28-day click - the cold audience converts on impression. Restricted product, normal account, full quarter without interruption.

14 months. Two ownership eras. Two platforms scaling. If you're in restricted and want this kind of continuity, 30 minutes is enough for me to tell you whether the framework fits your category.

Book a 30-min diagnostic →

Methodology

How to verify these numbers yourself.

Everything on this page is calculable from the screenshots above. Here's the math and what's intentionally hidden.

Numbers are platform-native

Nov 2024–Aug 2025 (10 months): 226% blended (2.26× total account in Fig 4). Full-year 2025: 219% blended ($745,032 ÷ $339,591 = 2.19×, Fig 3). All figures pulled directly from Google Ads and Meta Ads Manager. Every screenshot shows OT_moonwlkr under AdPistols MCC in the header.

EMQ is Meta-attested

Purchase 8.0/10 and the highest-EMQ server-only event at 8.3/10 are Meta's own quality signals in Events Manager, not third-party estimates. These are the scores Meta gives when the CAPI payload contains enough valid Enhanced Matching to attribute the event to a real user identity.

Brand identity is public, performance data is real

Moonwlkr is named publicly with the client's consent. Every performance figure (spend, ROAS, EMQ, conversion value, restriction count) is the real account data. The Slack message in the hero is from TJ, the brand operator.

What's intentionally not shown

The exact server-side schema, attribution restoration logic, compliance-aware landing layer, and compound-level policy interpretation stay inside paying engagements. This page shows the outcome, the conceptual flow, and the verification math, not the build manual. My clients pay for that privacy.

Meta Q1 2026 ROAS 2.90×, max non-overlapping attribution

Spend $61,307.76. 1-day view $75,820.87 + 28-day click $102,020.58 = $177,841.45 ÷ $61,307.76 = 2.90×. Two non-overlapping sources: 1-day view (impression-based) + 28-day click (broadest click window, already includes the 7-day click value inside it, summing 7d and 28d would double-count). The 1-day engaged ($1,350.14) is excluded to keep the math clean. Fig 7 shows all attribution windows for transparency.

What working with me looks like

From your first call to an account that scales without resets.

No deck, no procurement, no 6-month "discovery." This is what an engagement actually looks like, end to end.

1Week 1

Diagnostic & feasibility

Live audit of your current Meta and Google accounts, restriction history, and Restricted Industry Framework fit for your category. Written scope with build cost, ongoing cost, and timeline before any commitment.

2Weeks 2-3

Framework build

Restricted Industry Framework deployment: server-side attribution layer, compliance-aware landing pattern, account architecture, creative system. Ads start running where it's safe, so you don't lose weeks of pipeline.

3Months 2-3

Scale phase

Algorithm learns from clean signal, ROAS ramps. Subscription logic, lifecycle conversion goals, and additional architecture layered in as the category and product model demand.

4Month 4+

Ongoing partnership

Campaign management, creative refresh, channel expansion (Snapchat, TikTok, programmatic). Quarterly architecture reviews. Account stability compounds, you stop firefighting and start scaling.

Common questions before you book

The seven things every restricted-vertical operator asks me first.

Is server-side + compliance-aware landing against Meta or Google ToS?

No. The pattern is the same family of cross-domain attribution publishers, affiliates, and large e-commerce brands use. The setup runs on a normal account whose content is compatible with platform policy. Data goes server-side, where it's reconciled, encoded, and cleaned before send. No misrepresentation, no false claims. Defensible under any audit.

How long until I see results?

Infrastructure goes live in 3-4 weeks. Algorithm learning takes 6-12 weeks of clean signal. Moonwlkr's Google account went from 51% to 226% ROAS in ~9 months. The Meta channel hit sustained running at scale across 14 months. The framework rewards patience.

What does it cost?

Build is one-time, scoped after the diagnostic. Ongoing management uses the Restricted Vertical Framework tier on the pricing page: from €6,000/month per channel (Google + Meta together from €12,000/month). Setup from €5,000, scoped after the diagnostic. Ad spend always billed separately direct to platform.

What if I'm in THC, kratom, nootropics, peptides, vape, or hemp-adjacent?

Same playbook with category-specific tuning. The architecture is vertical-agnostic. Category-specific work is in policy interpretation, creative framework, and market-by-market compliance. I've run this in CBD, hemp, peptides, vape, kratom-adjacent, and other restricted categories.

What if my account gets restricted anyway?

It happens, even with the best architecture. When it does, I know the appeal process, I keep backup account structure ready, and recovery is 1-2 weeks instead of 6+. Restricted is a marathon. The point of this work is to make restrictions rare and recovery fast, not to claim immunity.

If this works so well, why isn't every agency doing it?

Technical barrier is high. Most agencies optimise for ad spend, not for infrastructure that lives upstream of ads. Building this requires server engineering, compliance interpretation, and ongoing platform monitoring. Not a 90-day learning curve for someone coming from generic DTC.

What happens if we stop working together?

Full handoff documentation is part of every engagement: architecture diagram, runbook, monitoring playbook, escalation contacts. Your in-house team or any future operator can pick up the work. Clients stay because they want to, not because they're locked in.

Operator's note

The brand owner pays invoices early. That's what 14 months of zero bans, $745K from Google, and a Meta channel that runs from a normal Facebook account buys you in a category where every other brand gets banned. Not because of luck, because of architecture.

I've been keeping restricted-category ad accounts alive since iOS 14.5 broke standard tracking. Seven years, 5+ active restricted accounts under management. I know which compounds Meta flags, which Google policy interpretations shift quarterly, where the default approach stops working.

To be clear: this is not a workaround. The architecture is the same family of cross-domain attribution publishers, affiliates, and large e-commerce brands rely on. Fully documented. Defensible under any audit. No misrepresentation, no policy violation waiting to surface.

Tell me your category and what you're running into. I'll tell you whether the same framework applies, what it would cost to build, and what it would cost to keep running. No pitch.

📅 Year-end 2026 update

Full year data and the second-ownership-era arc will be added here in Q1 2027 once the account closes the year under new ownership. This case study is a living document, not a snapshot. The engagement is still active.

What this case study doesn't include - and why

  • Subscription LTV breakdown, the math that makes 145% first-purchase ROAS profitable. Commercially sensitive.
  • Full Meta spend totals, client preference on total budget disclosure.
  • Snapchat results, channel launched after this case study was written.
  • Server-side GTM container and CAPI event schema, proprietary architecture.

"Extremely knowledgeable and thorough, Marek is one of the best!"

Moonwlkr logo

Moonwlkr · cbd gummies · Upwork verified

Visual proof of the quote in the hero

Slack message, TJ: just appreciate what you do for us + I dont like money owed lol

Slack from TJ at Moonwlkr after I sent the invoice on the 29th (date said the 1st). Paid within the hour.

Selective by design · 1-2 capacity slots per quarter

Minimum engagement 3 months. Minimum spend $10K/month.

If you're above those numbers and your CBD/restricted account keeps getting reset before you can build any compounding data, three ways to start the conversation.

Starting from zero? Possible if you have capital to invest. The setup phase takes 2-3 months and needs substantial upfront investment before ROAS catches up. Better suited to brands already running, but if you're committed and funded, I can take you from $0 to scale.

Book my 30-min restricted-vertical diagnostic →

Or email contact@adpistols.comand describe your category and what you're running into.