Free · read in full

The DTC Growth Audit.

This is the audit I run on every brand before I touch anything. Run it through your own numbers and you will see exactly where your revenue leaks and the order in which you fix it.

Written by Efe Zomoregie, founder of Northbound · Growth Partners in Belgium. Every example in here comes from Rivali in Ghent, the luxury home linen and nightwear brand whose entire e-commerce I built and ran. No made-up scenarios. Five parts: attribution, ads, funnel, retention and the weekly rhythm. It takes about two hours and you need nothing from me to run it.

The playbook · how to use this

Read this first.

This is not reading material. This is an audit.

Rather not do the maths by hand?

Let an AI do it for you. Open ChatGPT or Claude, paste your numbers, and use this prompt:

"I run an e-commerce brand. Everyone stares at ROAS, but I want the numbers that actually decide whether I make money. My numbers for the last 30 days: total revenue from my backend = [X], cost of goods sold (COGS) = [X], variable costs such as shipping and transaction fees = [X], total ad spend, mostly Meta = [X], new-customer revenue from Shopify = [X]. Calculate and explain: (1) my contribution margin in %, (2) my MER = total revenue ÷ ad spend, (3) my AMR = new-customer revenue ÷ ad spend, and (4) my break-even MER (1 ÷ contribution margin). Say what each number means, and explain why these matter more than my ROAS."

Open your Meta Ads Manager, your Shopify backend and your email tool. Block out some time. Work through the four parts in order, because the order is half the work.

The order I work in — The North

I always measure honestly first, then close the leak, then let retention run, and only scale once the bottom line adds up. I call it The North: set your direction first, then move. When I once did it the other way round, adding budget while the funnel was broken, I only burned money faster. The order has been fixed ever since.

01 · Measure honestlyKnow what is really happening
02 · Close the leakFunnel & page
03 · Let retention runEmail & repeat
04 · Only then scaleAdd budget
You cannot outspend a leaking funnel. And you cannot optimise what you do not measure correctly. That is why this audit starts with your numbers, not with your ads.

What you need: access to Meta Ads Manager, your store backend (order data), your email platform, and an empty spreadsheet. Nothing more.

PartThe question it answers
01 · The attribution auditHow much revenue does Meta not see?
02 · The ad auditWhat do you scale, what do you kill, what do you leave alone?
03 · The funnel auditWhere do you lose the click you paid for?
04 · The retention auditWhat money are you leaving on the table every month?
05 · The weekly rhythmThe rhythm that keeps it that way.
01

The attribution audit

How much revenue does Meta not see?

Attribution is a simple question: which ad gets the credit when someone buys? This is mostly about Meta, because that is where you spend the most and where measurement breaks hardest (iOS, cookie banners). Trust what Meta reports about itself and you are steering your budget on numbers that are wrong.

DefaultI too started here by simply opening Meta Ads Manager and reading off the ROAS column.
Why that is a problemThat column is Meta's own claim about Meta's own work. It counts too little (iOS, ad blockers and cookie banners break the pixel: someone sees your ad on their phone and buys three days later on their laptop) and too much at the same time (view-through: the platform also claims sales from people who only saw your ad and never clicked it).
What we openYour backend order data as the truth, WeTracked.io for server-side measurement per order — it runs on your own server instead of in your visitor's browser, where an ad blocker or cookie notice can stop it, and an empty spreadsheet to lay it side by side. Meta you use here only to read off your ad spend.
This is the most important exercise in this document. At Rivali, where I ran the e-commerce, orders came in across two stores: alongside the new Shopify store, an older environment without a Meta pixel kept selling. As long as you don't know which sales come in where, you are steering your ads on an incomplete picture.
Step 1 — Pull your real revenue from your backend

Go to your store backend (not Meta Ads Manager). Take the last 30 days. Note down: total revenue, new-customer revenue (Shopify: new vs returning), and number of orders. This is your truth.

Step 2 — Pull your total ad spend

Your Meta ad spend for the same 30 days (if you also run on other channels, add those in).

Step 3 — Calculate your MER MER = total revenue from your backend ÷ your ad spend

Your real marketing efficiency, not the ROAS your dashboard claims (that one counts too little and double at the same time).

Step 4 — Calculate your contribution margin and your break-even Contribution margin = (revenue − COGS − variable costs) ÷ revenue
Break-even MER = 1 ÷ contribution margin

A margin of 40%? Then your MER has to be above 2.5 to make money. Don't know your margin? Stop here and work it out, this is the foundation.

Step 5 — Calculate your AMR AMR = new-customer revenue ÷ ad spend

Take only your new-customer revenue. Is your MER above break-even but your AMR below it? Then you are mostly paying to buy back your own customers, not to grow.

Step 6 — Count your 'untracked' revenue

Label your orders from the last 30 days by first source. What percentage comes back as unknown / direct / no source? That percentage is your blind spot.

% untracked revenueWhat you do
< 10%Healthy. Normal noise. Carry on.
10–20%You are missing signal. Fix tracking and UTMs — those are the little labels behind your ad links that tell you afterwards which ad produced which order.
> 20%You are steering blind. Stop scaling.
The most expensive mistake you can make right now

Pausing an adset because it shows '0 sales' — an adset is the group of settings that decides who an ad is shown to and for how much money. With a good CTR (the percentage of people who see your ad and click it) and zero recorded sales, the odds are those sales landed somewhere else: on a second domain, via Google, or via an old site that still ranks. I nearly paused my best-selling campaigns in exactly that way.

Part 01 · the fixes

The three leaks that caused our untracked revenue

Leak 1 — More than one sales channel or domain

At Rivali there was still an old site online that kept ranking on the brand name, with broken tracking. People saw an ad, searched for the brand later, and bought there. Meta never saw those sales. That is how part of our untracked revenue leaked away.

What I did: pushed for a 301 redirect to consolidate everything into one tracked store. As long as that was not live, I reconciled by hand, every order against the backend, and never judged on Meta ROAS alone.

Leak 2 — Client-side tracking (the default)

Our tracking was client-side, the default. iOS, ad blockers and cookie banners broke the pixel, and we easily lost 20 to 30% of our signal that way.

What I did: switched on server-side tracking (Conversions API), and clicked through the checkout myself to check whether the purchase event really arrived in the Events Manager.

Leak 3 — No UTMs, or sloppy ones

Our UTMs were sloppy, so the backend could not see where an order came from, even though the rest of the tracking was fine.

What I did: gave every ad a fixed UTM structure, no exceptions.

?utm_source=meta&utm_medium=paid&utm_campaign=(campaign)&utm_content=(ad)
Do this now: write down your percentage of untracked revenue. That one number decides whether you can scale next month or have to repair.
02

The ad audit

Scale, kill, or leave alone.

DefaultThe ROAS column in Ads Manager, per adset.
Why that is a problemOn exactly that number I have paused winners and scaled losers myself. It is a measurement, not a truth.
What we openWe use Ads Manager only for the numbers Meta observes itself and cannot distort: CTR, frequency, spend and reach. For 'am I making money here?' we look at WeTracked.io and at our MER and AMR.

Open your Ads Manager, last 7 days, at adset level. Switch on these columns: spend, CTR, frequency, reach. For 'am I making money here?' you look at your backend and your MER and AMR, not at the ROAS column.

The only metrics that count

MetricWhat it tells youThreshold
MERAre you making money across everything?Above your break-even
AMRAre you winning new customers?Above your break-even
CTRDo the hook and the ad creative land?~4% is strong; below 1% is weak
FrequencyAre you becoming annoying?> 2.5 = fatigue
Orders / weekEnough volume to judge?< ~5 = noise, don't decide

CPM (what you pay per thousand impressions) and CPC (what you pay per click) you ignore. They say nothing about making money. One expensive click that converts beats ten cheap ones that don't.

The decision tree

IfThen
MER and AMR above break-even & enough volume (>5 orders/week)Scale. +20 to 30% every 3 to 4 days. Then do nothing for 3 to 4 days. Big jumps reset the learning phase.
Frequency above 2.5 & falling CTRRefresh. Fresh ad creative in the same adset. Never a new adset, that resets the learning.
Weak CTR and no revenue on any channel and enough volumeKill. All three have to be true. If one is missing, you don't kill.

Refreshing: keep 2 to 3 ad creatives live at once in your winning adset. Test angles, not colours.

Killing: '0 sales' with a good CTR is not a loser. That is a tracking problem until proven otherwise. Check part 01 first.

Part 02 · continued

The question your ROAS does not answer.

A blended ROAS above break-even looks healthy. But split it up and the picture flips. Standard ad accounts spend most of their budget on people you already knew: existing customers, retargeting, your email list. They buy anyway. Buying them again through ads is not growth, it is expensive retention.

The number that does tell you is your AMR (Acquisition MER): the revenue from new customers only, divided by your total ad spend.

AMR = revenue from new customers ÷ total ad spend
Step 1

Split your orders in Shopify by new vs returning customer (Shopify tags this automatically). Take only the new-customer revenue from the last 30 days.

Step 2

Divide that by your total ad spend. That is your AMR.

Step 3

Compare it with your ROAS. Running a ROAS of 5 but 70% comes from existing customers? Then your AMR is about 1,5. You are then mostly paying to buy back your own customers, not to grow.

The fix in one sentence: exclude existing buyers from your acquisition campaigns and steer on 7-day click, so Meta only chases people you did not already have.

How I find winners

I don't target interests, the machine does that better than I do. My ad creative is my targeting: I take a problem, attach a persona to it, and build an angle around that. That is what I test: different angles on the same product, not five variants of the same ad. And I never lean on one winning ad, I keep several strong angles live at once and keep feeding them.

The structure I run (and why)

I work with 3 campaigns, each with its own job. Not dozens of separate campaigns bidding against each other.

Why so simple? Every extra campaign or adset splits your data and lengthens the learning phase. 3 campaigns with their own job give the algorithm more signal per euro. You test in the one and scale the winners in the other.

Part 02 · continued

How I test with concepts

I don't test single ads, I test concepts. A concept is 1 problem, 1 persona, 1 angle. For example: problem a pair of jeans that goes baggy after the first wash, persona someone who picks quality over fast fashion, angle jeans that last for years. I work that concept into several formats (static, video, UGC) and run it against other concepts. A winning concept I scale and develop further; a concept that doesn't land, I drop. That way I know not only which ad wins, but why, and that I can repeat.

How I scale

The rule that saves you money: below ~5 orders a week, no ad set number is real. You do not make money decisions then. You wait for volume, or for a clean blended number.
03

The funnel audit

Where do you lose the click you paid for?

DefaultYour store's theme editor, on a laptop.
Why that is a problemThe editor doesn't let you fix the very things that cost you conversion: a purchase event that is not recorded, trust signals above the fold, checkout friction. And your buyer is not on a laptop, they are on their phone.
What we openYour phone (you look at what your buyer sees), the Shopify theme code on a draft theme, and the Meta Events Manager to check whether your purchases arrive.
Do this on your phone, not on your laptop. An adset that brings in a lot of clicks and barely any sales is a reason to investigate the path — page, price, offer or measurement. On its own it is not proof of a single cause.

Walk through your own product page (on mobile)

Test your checkout — with your own money

Make a real purchase in your own store. Yes, actually check out.

The discipline: fix the funnel before you scale the spend. Budget on a leaking funnel simply burns faster.
04

The retention audit

The money you leave on the table every month.

DefaultThe campaign tab of your email tool: how many emails, how many opens.
Why that is a problemOpen rates don't pay bills. A campaign is sent once; a flow earns for every new visitor, forever. In the beginning our flows were barely set up.
What we openKlaviyo: the Flows tab and the revenue per flow column. Your own inbox to test your flows. And Reviews.io for social proof that feeds back into your emails.

Email is the highest-margin channel in e-commerce. No ad costs, no platform commission. And in the beginning ours was simply switched off.

Test your own flows

The three flows that make the money

FlowWhenWhat it does
WelcomeRight after sign-upEstablishes the relationship. Highest open rate of anything you send.
Abandoned cart1u · 24u · 72uThe strongest earner. Catches the purchase intent at its highest moment.
Post-purchaseOn shipping & +14 daysTurns one buyer into a returning one. Asks for the review.

Flows before campaigns. Always. A campaign is sent once. A flow earns on autopilot for every new visitor, forever.

The deliverability rules (don't ignore these)

Email the engaged segment, not your whole list. Mailing dead profiles pulls your opens down and trains inbox providers to send you to spam.

Never mail an old, unvalidated list in one go. I was once handed a list: "it's ours, feel free to use it." One campaign later: 8.92% bounce and the account under review. Since then I validate every inherited list before I send it a single email.

Deliverability is the asset. You borrow reach against it. One bad send can destroy a list you spent years building.
05

The weekly rhythm

The rhythm that keeps it that way.

DefaultDiving into the dashboard again every week and steering on instinct.
Why that is a problemWithout a fixed rhythm you steer on noise: you react to daily numbers, you reset your learning phase, and you no longer remember what you already tried last month.
What we openAds Manager, WeTracked.io, your backend and a test log: the document that after three months is your most valuable asset.

An audit is a snapshot. This is the rhythm that keeps you from drifting off again. Every week, the same loop, about an hour.

Monday · pull the numbers

Ad spend (Meta) · revenue from your backend (new-customer separately) · number of orders · email revenue · last week's revenue. Calculate: your MER and AMR, growth versus last week, and your percentage of untracked revenue.

Monday · judge your adsets

Winners (above break-even) → scale +20–30%. Fatigue (frequency > 2.5) → fresh angle in the same adset. Losers (weak CTR and no revenue and enough volume) → kill. Judge on blended, never on Meta ROAS.

Tuesday · launch 3 to 5 new angles

Test angles, not colours. A different button colour is not a test. A different story is.

Every week · log every test

Hypothesis → what you did → result → decision. This log becomes your proof of what does and does not work in your market.

Faster with AI

You can connect Claude straight to your Meta ads and your Shopify through MCP connectors. It then pulls your ad spend, revenue and orders itself, calculates your MER and AMR, and gives you the recommendations. You keep the final decision. That turns the Monday round into a few minutes instead of an hour.

The rule that protects everything: the rhythm produces recommendations, not automatic actions. No budget change without a deliberate decision. Scale on autopilot and you scale your own mistakes.
Part 06 · how I work

The ad creative & structure

Everything starts with the concept. The structure follows from that, then the ad creative in the adset, then the budget.

80 / 2080% of your result sits in your images and hooks. 20% in the settings. So that is where I put my time, straight after the concept.
OrderFirst the concept, then the structure, then the ad creative in the adset, and only then the budget. The settings are the last thing I touch.
What I openAI ad creative I make in Higgsfield, always on the real product photo. Claude I use for analysis, structure and to check my Dutch for mistakes. The copy I write myself: AI is too generic for that and makes too many mistakes.

Structure — where the concepts land

You saw the campaigns in Part 02: 1 testing, 1 scaling with Advantage+, and 1 retargeting. Your winning concepts from testing you scale in the scaling campaign. Within those campaigns I split by geo: 1 adset Belgium, 1 adset Netherlands. The less I fragment, the faster it learns.

CampaignAdsetAds
Scaling · Advantage+Adset Belgium · Adset Netherlandsyour winning concepts

The largest part of the budget goes to prospecting. Optimise for purchases, never for clicks. I never copy a winning adset to scale it, that resets the learning phase. New ad creative goes into the existing adset.

Why I start with Belgium

I start in Belgium because the brand already has some name recognition here: that audience is warmer and converts better. I deliberately leave the Netherlands for later, until iDEAL is in order. iDEAL is the payment method Dutch customers expect; without that option you leave conversion on the table at checkout, however good your ads are. First iDEAL, then I scale on to NL.

Ad creative — what works

TypeWhy it works
Founder videoYou explaining your brand. Builds trust and gets high retention on cold audiences: people buy from people.
Social proofScreenshots of press, reviews and known customers. Proof sells; it takes the doubt away.
UGC / avatarAn avatar your customer recognises themselves in. Seeing it worn is wanting it.
Packshot / 3DFor the dynamic retargeting and warm audiences: the product cleanly in frame.

I always mix photo and video in the same adset, Meta rewards this. Use the real product photo as the basis: otherwise AI gets patterns and fabrics wrong.

Hooks — stopping the scroll

Always run several hooks against each other. You never know in advance which one wins, let the data speak. Does the CTR drop below ~1% or the frequency rise above ~1.8? Fresh ad creative in the same adset, pause the tired one.

What I run it on

The tools I use

The tools I use, and what I look at on each one. Nothing more.

ToolWhat I look at on it
Meta Ads ManagerCTR, frequency, spend and reach. Not the ROAS column.
WeTracked.ioReal attribution for Meta and Klaviyo: my MER and AMR.
ShopifyOrders and first source per order. I build in the theme code (trust strips, badges).
Lucky OrangeSession recordings: where customers get stuck. Free alternative: Microsoft Clarity.
KlaviyoRetention and email marketing. Revenue per flow (from WeTracked), and I only email the engaged segment.
Reviews.ioReviews per product as social proof.
HiggsfieldAI ad creative, always on the real product photo.
Tools don't solve strategy. This stack works because everything is operated and owned by the same person. Not five parties each guarding their own dashboard and pointing at each other when it doesn't grow.
Before we close · our standards

You never sign anything you don't understand.

This audit was free and without conditions. That is not a marketing trick, it is how we work. In case you ever work with us, here is what we stand for.

A contract you don't fully understand is not an agreement. It is a gamble. And we don't gamble with someone else's business. So we go through every clause with you until you can retell it in your own words: what counts as a new customer, how the fee is calculated, what happens if it doesn't work. No small print, no surprises on invoice three.

And if we notice it is still not clear, we don't sign. Better no client than a client who doesn't know exactly what they are saying yes to.

We don't work with everything. Not even for the money.

The common thread: we don't grow brands that sell addiction, push people into debt, exploit people or harm children. We do grow brands we can scale with a clear conscience. Full stop.

The next step

Ready to scale on profit, not on ROAS?

You have just read my whole system, nothing held back, because the information is not my edge. My edge is this: I am one operator who reads your P&L, not just your ad manager. I understand the cash flow and margins of e-commerce, and I only charge on the new customers I add. An agency sells you hours and ROAS; I sell you growth in your bank account. That is the difference.

What it costs, no detour. A Pilot of €2,500 one-off, thirty days, to work through your economics and run one acquisition test. Or the partnership straight away: €3,500 per month with no onboarding or setup costs for the full management of your Meta Ads with the creative strategy around it; Google Ads, the core flows in Klaviyo and CRO advice we add where that makes sense. Creative production and your ad budget are not included. What you pay exactly depends on your ad budget, your markets and how complex your measurement is.

Minimum term 8 weeks. Shorter cannot be measured fairly: the first weeks go into setting up and learning. After that it continues per month with a notice period of 4 weeks; you can give notice during those first 8 weeks, but the partnership does not end before the minimum term. Creative production is not included — that is made by our regular partner Third Witness and you pay them directly.

I work with a limited number of brands at a time. On direct competition we make an agreement at the intro call that we can both keep.

Book your call →

northboundgp.com · efe@northboundgp.com

Northbound · Growth Partnersnorthboundgp.com
The next step

Stuck in your own numbers?

In thirty minutes we go through your ads, your product page and your email flows live and you see the three biggest leaks. No pitch. You keep the findings, even if we don't work together.