Professional haircare · Google Ads + Meta · Canada + USA · 4 years
iOS 14 wiped most Facebook advertisers overnight. Framar held 95% attribution and scaled 200% MoM through it.
Built a $4M paid channel from nothing. iOS 14 hit, we scaled 200%.
Established professional haircare brand. Real distribution, salon customers, product sold on reputation. What didn't exist: a single paid acquisition channel. No Google Ads. No Facebook. No tracking. I built the entire paid infrastructure from a blank account, on top of a proven brand.
Three years later: $4.03M year one. $5.89M in the iOS 14 year while competitors went dark. 95% attribution intact, server-side from day one. Q2 2022 still climbing.
Shopify / DTC brands rebuilding paid. 1-2 engagements per quarter.
"Marek is always amazing to work with. Handles all our issues and concerns with every project, and is very knowledgable. Highly recommend!"
Francesco G. · Framar · Upwork-verified 5★ review after a 4-year engagement
What this case study actually proves
- One brand, one client, three years compounded. Real engagement, not portfolio averaging or blended agency math.
- Built from CA$0, every comparison column in the 2020 Google Ads report shows +∞. The channel literally didn't exist before this engagement.
- Two independent revenue sources agree (Google Ads + Shopify, Google Analytics as a third). iOS 14 attribution defended structurally, not by claim.
Who this case study is for
- DTC brands with proven product and distribution but no paid acquisition channel built yet, you have a real business, you need a real funnel
- Shopify operators whose attribution broke during iOS 14, migration, or ATT and never fully recovered
- Founders running Meta + Google together who want one attribution layer instead of two competing dashboards
- Brands at €10K+/month paid spend ready to compound into year 2 and 3, not just chase a single ROAS spike
E-commerce since
14+ yrs
Google Ads, GMC, Meta, server-side tracking, Shopify and beyond
E-com accounts managed
150+
Shopify, headless, custom storefronts, classic platforms
E-com spend processed
€50M+
Across DTC, marketplaces, fashion, peptides, haircare, lifestyle
This case scale
$9.9M+
$4.03M year 1 + $5.89M year 2, both Shopify-confirmed, 4-year engagement
Every number below is documented with screenshots from the actual accounts.
The numbers
Two independent sources, same number, neither requires you to take my word for it.
The $4.03M is not total company revenue. It's what the paid channel produced in the first year it existed. The 18.14× ROAS comes from Google Ads. The $4.03M comes from Shopify Analytics, a separate system with no reason to agree with the ad platform unless the revenue actually happened. They agree. Look at the Shopify curve: it inflects in April 2020. That's the exact month Google Shopping went live.

Fig 1, Google Ads full year 2020 · 18.14× ROAS · Every comparison column shows +∞
178,030 clicks · 40,430 conversions · CA$2.53 CPA · CA$102,458 spend. The +∞ in every delta column is not a display error. The prior-period value was CA$0.00. The account didn't exist before January 2020.

Fig 2, Shopify 2020 · $4,035,304 · +256% YoY · Shopify Analytics, not ad platform data
Online Store: $3,998,110 (+264%). Point of Sale: $36,855 (+8%). The revenue curve inflects in April 2020, the moment Google Shopping went live. Shopify has no reason to agree with Google Ads unless the revenue happened.
The starting point
Established brand. Zero paid acquisition. I built the $4M channel from a blank account.
Framar wasn't a startup. It was an established professional haircare brand with real distribution, real salon customers, and a product that sold on reputation. The business worked. What didn't exist was a single paid acquisition channel, no Google Ads account, no Facebook campaigns, no conversion tracking, no GTM, no pixel. Two markets, Canada and the USA, both at CA$0 in paid spend.
I built it properly, tracking foundation first, account structure second, scale third. Nothing was inherited. No campaigns to audit, no bad history to clean up. The +∞ in every column of the 2020 annual report is what a genuine zero baseline looks like. Good foundation, proven brand, full control from day one.
01
Tracking first
GTM deployed, pixel verified, server-side CAPI live. No paid spend until attribution was clean and validated.
02
Google Ads
Shopping and Search live across Canada and USA, separate architectures, manual layer, scripts running from day one.
03
Meta Ads
ToFu cold prospecting launched once Shopify had enough purchase data to seed lookalike audiences with real buyers.
04
ML activated
Smart Shopping and PMax introduced only after manual campaigns built enough conversion history for the algorithm to train on.
What you should stop doing immediately
Five default setups that guarantee your DTC account underperforms in the post-iOS 14 era.
If you recognise any of these in your current setup, you already know why the channel isn't compounding. None of them are fixable with "better creative" or "smarter bidding."
Running the Shopify native pixel as your primary attribution layer. It fires undefined parameters, loops, accepts hacker injection, Meta and Google train on the corruption upstream of every campaign decision.
Building lookalike audiences from a contaminated buyer list (bot traffic, undefined ATC events, looped fires). Your CPA inflates 2-3× while you blame creative.
Treating Google and Meta as two separate dashboards instead of one cross-channel attribution layer. You over-spend on whichever platform last-clicks loudest and under-spend the actual demand creator.
Launching Smart Shopping / PMax / Advantage+ campaigns before manual layers build conversion history. The algorithm has no signal to train on, you fund its learning at full price.
Letting the browser carry your most critical event (Purchase). iOS, ad blockers, and consent dropoffs strip 30–50% on average. Server-to-server webhook is the only setup that survives ATT cleanly.
What flying blind through iOS 14 cost competitors
The cost most DTC operators paid (and are still paying) when the foundation wasn't server-side:
- Browser pixel attribution dropped 60–80% overnight when ATT shipped. Smart Bidding and Meta optimisation starved on the remaining 20–40%.
- Shopify's native pixel fires events with undefined parameters, infinite loops, and hacker injection, corrupted signal upstream of every campaign decision.
- Lookalike audiences trained on garbage signal = retargeting budget set on fire. CPA inflates 2–3×, ROAS reads collapse, founders blame creative.
- Without server-side webhook capturing click IDs the moment a visitor lands, you cannot rebuild attribution after iOS strips the cookie. The data has to be there before the purchase, not after.
Framar didn't notice ATT shipping because the data was already server-side. Most brands lost six months of scale figuring this out. Some never recovered.
Sound familiar? I can usually tell you in 30 minutes whether your tracking foundation is the bottleneck.
Book a 30-min diagnostic →Google Ads
Most accounts accumulate. I engineered this one, every keyword earns its place or gets cut.
Alpha/Beta is a promotion system, not a naming convention. Every keyword starts in Beta, broad or phrase match, grouped by category, zero assumptions. When a keyword proves it converts at target CPA, it graduates to Alpha: exact match only, its own ad group, full bid control. Branded campaigns are completely isolated from non-brand, no budget bleed, no Quality Score interference, no cannibalisation.
Shopping ran in two layers. Manual first, full bid control per product, scripts automating bid adjustments, search term hygiene, and budget reallocation. Smart Shopping and Performance Max came only after the manual layer had built enough conversion history for the ML to train on. Running machine learning on an account with no signal history is how you burn budget on garbage.
Google Ads architecture, Alpha/Beta keyword promotion system across Search and Shopping
Keywords start in Beta (discovery). When they prove performance, they graduate to Alpha, exact match, dedicated ad group, full bid control. Branded terms are fully isolated. Shopping layer 1 is manual with automated scripts; layer 2 activates only once conversion history exists.
Search, Brand
- Brand Alpha: exact match, one keyword per ad group, maximum Quality Score, full bid control
- Brand Beta: broad + phrase match, continuously discovering new branded search variations
- Fully isolated from non-brand, no budget bleed, no Quality Score interference, no cannibalisation
Search, Non-Brand
- Non-Brand Beta: broad + phrase, grouped by product category, foil, dispensers, accessories
- Non-Brand Alpha: exact match only, terms promoted from Beta when they prove performance
- Search term reports reviewed continuously, negatives applied at campaign and account level
Shopping
- Manual layer first, full bid control per product, scripts running bid adjustments and search term hygiene
- Budget reallocation automated via scripts based on product-level ROAS
- Smart Shopping and Performance Max introduced only after manual layer built enough conversion history
18.14×
Annual ROAS, full year 2020
CA$102,458 spend. CA$1,857,900 revenue attributed. Every comparison column shows +∞, there was no prior year to compare against.
23.62×
Peak ROAS, August–September 2020
The account hit its highest efficiency in the August–September window. Built-up conversion history by then, the algorithm had real signal to work with.
Meta Ads
Four layers. Hard exclusions at every boundary. Cold traffic never sees what warm traffic sees.
Most Meta setups run one broad campaign and call it a funnel. This is four distinct layers, each with its own CBO budget, its own audience pool, its own creative brief, and hard exclusion rules at every boundary. Audiences don't bleed. The signal stays clean. The algorithms optimise against real data instead of noise.
Meta full-funnel architecture, ToFu → MoFu → BoFu → Post Purchase · Independent CBO budgets per layer
Four layers with hard audience exclusions at every boundary. Winning ad sets from ToFu graduate to MoFu. Post Purchase runs across three separate time windows, most brands skip this layer and leave the margin on the table.
CBO $200–1,000/day · Conversion objective
Two parallel cold pools compete for the same budget: LLA (built from buyers, high-value visitors, video viewers, page engagers) and Interest (professional beauty, salon & haircare, competitor brands, DTC buyers). The algorithm picks winners. Winning ad sets graduate to MoFu. All web visitors and all buyers excluded, ToFu touches only people who have never been to the site.
CBO $0–100/day · Conversion objective
Web visitors (30/60/90/180-day windows), 50%+ video viewers, page engagers. The creative brief changes: cold creative prospects, MoFu creative builds trust, testimonials, UGC, product education, social proof. ToFu winners run here alongside dedicated nurture formats. BoFu audiences excluded.
Two parallel CBOs · Up to 5% of total budget each
Highest-intent audiences only: Add to Cart, Initiate Checkout, recent web visitors. Two separate campaigns run in parallel: (1) MoFu winners with urgency messaging, (2) Dynamic Product Ads showing the exact products the user browsed. Conversion objective on both. Every dollar optimising toward purchase events.
CBO up to 1% · Three time windows
1–7 days: upsell while the purchase is still fresh. 7–30 days: cross-sell into adjacent categories. 30–180 days: reactivation with new arrivals and seasonal offers. The acquisition cost is already paid. This layer is pure margin. Most brands skip it entirely.
Google and Meta weren't two separate channels, they were one compounding loop.
Google captured demand. Meta created it. Every buyer Google converted became a seed for Meta's lookalike audiences, real purchase events, not interest proxies. Every Meta campaign that warmed a prospect made the Google retargeting pool sharper. The two channels shared one attribution layer, so budget allocation responded to actual cross-channel contribution, not last-click. That compound loop is why the numbers grew the way they did.
2020
$4.03M
Year one · Google Ads live from April
2021
$5.89M
+46% · iOS 14 year · both channels scaled
Q2 2022
+28% QoQ
Year three · compounding still accelerating
Meta, Google Analytics data · facebook.com/cpc · November vs October 2021
Revenue: $126,792 vs $55,153 (+129.89% MoM) · Transactions: 1,205 vs 635 (+89.76%) · CVR: 2.28% vs 1.64% (+39.57%). This is the iOS 14 period, most advertisers were cutting spend. GA is a third independent source. Note: Google Analytics systematically underattributes paid social (last-click, single-device, no cross-device matching), these numbers are the floor, not the ceiling.

Fig 3, Meta Ads Manager: ToFu, MoFu, BoFu running in parallel · separate budgets, separate objectives
The actual account, not a diagram. Each layer is its own campaign with its own budget and its own creative set. The structure enforces the funnel logic. Audiences can't bleed between layers because the architecture physically prevents it.
Tracking · iOS 14
iOS 14 wiped out most Facebook advertisers overnight. Framar didn't notice, the attribution was already server-side.
When Apple's ATT hit, browser pixels broke across the industry. Attribution windows collapsed. Retargeting audiences shrank. Advertisers who'd been scaling pulled spend because they couldn't read their own results. This wasn't a campaign problem, it was a tracking problem. Campaign structure doesn't help when the signals going into the algorithm are gone.
Framar scaled through it. Every attribution identifier, fbclid, gclid, fb_browser_id, ga_client_id, was captured server-side the moment a visitor landed, then written permanently into the Shopify order record. iOS deletes browser cookies. It cannot delete a server database record. When the purchase webhook fired, the full attribution payload was already there, intact, regardless of what the browser survived.
What we caught mid-engagement
- Shopify native pixel firing ATC events with content_ids: undefined and value: 0.00
- Events looping, the same ATC firing multiple times per second from a single pageview
- Hacker attacks injecting fake purchase sequences, conversions firing with no real orders behind them
- Meta building lookalike audiences from corrupted signals
- Google Smart Bidding optimising toward phantom conversions, every CPA metric meaningless
How we rebuilt it
- Disabled Shopify native tracking entirely, no partial patch, full replacement
- Rebuilt every event in GTM manually: every parameter explicit, every value validated
- Deduplication logic, parameter validation, and loop detection built directly into the tag layer
- Server-side GTM handling all destinations, Meta CAPI, Google Ads Enhanced Conversions, GA4
- Shopify webhook firing server-to-server on every purchase, zero browser dependency on the most critical event

Fig 4, ATC events looping with undefined parameters, the corrupted signals Meta was training on
Multiple fires per minute. content_ids: ["undefined"], value: 0.00. Meta flagged them: "Custom data not being displayed." Every one was a corrupted signal. The lookalike model was training on garbage. We caught it, disabled the source, and rebuilt.

Fig 5, Shopify order: click IDs written server-side the moment the user lands
fbclid, gclid, fb_browser_id, ga_client_id, all captured on landing and written into the Shopify order before the user buys anything. iOS cannot touch a server record. When the purchase webhook fires, the attribution is already there.
95%
Attribution held through iOS 14
Browser pixel signals degraded industry-wide. Framar's purchase data originates from Shopify webhooks, server-to-server, no browser involved. iOS 14 couldn't touch it.
200–300%
MoM growth while competitors pulled spend
Clean attribution gave the algorithms real signal to act on. Competitors went dark because they couldn't read results. We used the gap to scale.
+37.3%
Conversions recovered by server-side CAPI
CAPI recovered purchase events the browser pixel alone would have missed. Not a workaround for iOS 14, a permanent structural advantage over pixel-only setups.
Want this attribution architecture in your stack? 30 minutes, your account, honest read on whether the same framework fits.
Book the call →Results year by year
$4.03M year one. $5.89M in the iOS 14 year. Q2 2022 still accelerating. It didn't peak, it compounded.
Year one is easy to dismiss: pandemic tailwind, strong product, lucky start. Year two rules that out. $5.89M in 2021, the iOS 14 year, when most advertisers saw revenue stall and attribution collapse. Then Q2 2022 came in 28% above Q1. Three years in, the business was still accelerating. Clean tracking compounds: clean tracking means clean bidding, clean bidding means better allocation every cycle, better allocation means the results of last month fund the growth of next month.
Year one was the floor.
$4.03M in year one. $5.89M in the iOS 14 year. Q2 2022 still climbing. A clean tracking foundation compounds, every cycle cleaner signals, better bidding, higher allocation efficiency than the cycle before.
2020
$4.03M
+256% vs 2019
Built from CA$0. The channel didn't exist twelve months earlier. Every comparison column in the Google Ads report shows +∞.
2021
$5.89M
+46% vs 2020
The iOS 14 year. Attribution held at 95%. We scaled while most advertisers froze.
Q2 2022
$1.47M
+28% vs Q1
One quarter, and still climbing. The run-rate put 2022 on track to exceed 2021.

Fig 6, Shopify 2021 · $5.89M · +46% · The iOS 14 year produced more than the year before it
Online Store: $5,883,857 (+47%). Year one wasn't the peak. It was the floor.

Fig 7, Shopify Q2 2022 · $1,472,658 · +28% vs Q1 · Year three, still climbing
April–June vs January–March 2022. Three years in, no sign of a plateau.

Fig 8, Google Analytics · Facebook paid · November vs October 2021 · Revenue +129.89% MoM
facebook.com/cpc. Revenue: $126,792 vs $55,153 (+129.89%). Transactions: 1,205 vs 635 (+89.76%). CVR: 2.28% vs 1.64% (+39.57%). This is the iOS 14 period, most advertisers were pulling spend. Google Analytics is a third independent source, separate from both Meta and Shopify.
Operator's note
The Framar engagement ran from early 2020 through early 2024. The infrastructure I built compounded for four years, every number on this page is from that window. The engagement ended on terms unrelated to performance.
I've been running Google Ads, Meta, GMC, and server-side tracking for e-commerce since 2010. Fourteen years, 150+ accounts, €50M+ in managed spend. I know which Shopify defaults break attribution, which pixel events fire phantom signals, where the funnel logic leaks audiences between layers, and how to build a tracking foundation that survives iOS updates, browser restrictions, and ad blockers.
Tell me what your stack looks like, what got broken (or was never built), and what you're trying to scale. 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.
Methodology
Every number here is documented. Here's exactly what you can verify independently.
Two independent sources. Neither requires trust.
The 18.14× ROAS comes from Google Ads campaign data via GTM purchase events. The $4.03M and $5.89M come directly from Shopify Analytics, a system with no reason to agree with the ad platform unless the revenue actually happened. They agree. The Shopify growth curve inflects in April 2020: the exact month Google Shopping went live.
The CA$0 baseline is proven by the data, not by us.
Every comparison column in the 2020 Google Ads annual report shows +∞. That is only mathematically possible when the prior-period value is exactly CA$0.00. No legacy account. No inherited campaigns. No prior history. The channel didn't exist.
What I managed. What the founder managed.
Google Ads and the full tracking architecture were built and managed by me. Meta was co-managed with the founder, who wanted to run the channel hands-on. Where the founder ran campaigns independently, I don't attribute those results to AdPistols.
What working with me looks like
From your first call to a paid channel that compounds.
No deck, no procurement, no 6-month "discovery." This is what an engagement actually looks like, end to end.
Diagnostic & blueprint
Audit existing tracking, account structure, feed quality. Identify what's broken vs what's missing. Written scope with build cost, ongoing cost, and timeline before any commitment.
Tracking foundation
Server-side GTM, Meta CAPI, Google Ads Enhanced Conversions, click-ID capture on landing, Shopify webhook for purchases. Tested in parallel with the old setup, swapped over when validated.
Channel build
Google Ads architecture (Alpha/Beta on Search, manual + ML Shopping). Meta funnel layers with hard audience exclusions. Cold pools seeded from real buyer data, not interest proxies.
Scale + compound
Weekly bid reallocation, audience refresh, creative iteration. Cleaner signal = faster compounding. Quarterly architecture reviews. Full handoff documentation kept current the whole time.
Common questions before you book
The six things every DTC operator asks me first.
How long until I see results?
2-3 months for tracking foundation + early channel signal. Google Ads typically inflects 60-90 days after Shopping data starts feeding the algorithm. Meta cold pools need real purchase data to seed properly, that takes 4-8 weeks of clean signal. The compounding payoff comes in months 6-12 once both channels share attribution.
What if my attribution is already broken post-iOS 14 / ATT?
Same playbook as the Framar tracking rebuild. Identify what's broken (Shopify pixel, ATC loops, missing CAPI, undefined params), full server-side replacement, click-ID capture on landing, webhook for purchases. Most rebuilds run 3-6 weeks. After that, Smart Bidding and Meta optimisation can read your signal again.
What does the build cost?
Depends on scope, never less than €6,000. Tracking + Google Ads + Meta + reporting layer typically scopes between €8K–€15K one-time for the build. Ongoing management is separate, Full Stack retainer from €5,000/month per channel (Google + Meta together from €9,000/mo) or single-channel Growth start from €3,500/mo that auto-upgrades past €30K/mo profit. Scoped after the diagnostic, fixed price before any work starts.
What if my Shopify is headless / Plus / custom?
All setups workable. Custom pricing reflects actual complexity. Headless and migrated-off-Shopify cases are where the framework shines because off-the-shelf solutions stop working at that complexity level. Framar was vanilla Shopify; the same architecture has been adapted across headless, Plus, and custom storefronts.
Do you replace my existing agency or co-pilot?
Both work. I can run the tracking + funnel infrastructure layer while an existing agency keeps account management, or take over end-to-end. Tell me what model fits your operation. No exclusivity demand.
What happens if we stop working together?
Full handoff: architecture diagram, runbook, GTM container documentation, server-side schema, escalation contacts. Your in-house team or any future operator can pick up the work. Framar ran for 4 years; clients stay because they want to, not because they're locked in.
What this case study doesn't show, and the specific reason for each
Three things are missing. Each has a specific reason. None of them affect the numbers shown above.
- Monthly spend breakdown, the commercial relationship prevents full disclosure. Annual and quarterly totals are shown instead.
- Campaign creative assets, ad copy and visual creative belong to Framar and aren't mine to share.
- Full 2022 and 2023 data, campaigns ran until early 2024. When the engagement ended, the client revoked account access before screenshots could be exported. Q2 2022 is the last data I have. The channel continued performing; I simply don't have the documentation to prove it.
"Marek is always amazing to work with. Handles all our issues and concerns with every project, and is very knowledgable. Highly recommend!"

Framar · ecommerce · Upwork verified
Selective by design · 1-2 e-commerce engagements per quarter
Building from zero, or rebuilding a broken foundation? Both start with a 30-minute call.
Shopify or DTC, paid spend €10K+/month, 3-month minimum engagement. Your account. Your numbers. An honest read on what's broken and whether this is the right fit, no pitch, no deck.
Path 1 · Free
Tracking Diagnostic
6 questions. 90 seconds. Find out if broken tracking is costing you revenue, includes a 30-minute call to walk through the findings together.
Run the Diagnostic →Path 2 · Paid
Full Audit
Up to 3 marketing channels in one written report: structure, tracking, attribution, plus an AI opportunity layer. Delivered within 72 hours. €1,500 fixed.
See audit options →Path 3 · Direct
Strategy Call
Skip the steps. 30 minutes, your situation, my read, honest answer on fit and what it costs.
Book the Call →Or email contact@adpistols.com, describe your account and what you're seeing. I read every one.