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.
This is not reading material. This is an audit.
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.
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 honestly | Know what is really happening |
| 02 · Close the leak | Funnel & page |
| 03 · Let retention run | Email & repeat |
| 04 · Only then scale | Add budget |
What you need: access to Meta Ads Manager, your store backend (order data), your email platform, and an empty spreadsheet. Nothing more.
| Part | The question it answers |
|---|---|
| 01 · The attribution audit | How much revenue does Meta not see? |
| 02 · The ad audit | What do you scale, what do you kill, what do you leave alone? |
| 03 · The funnel audit | Where do you lose the click you paid for? |
| 04 · The retention audit | What money are you leaving on the table every month? |
| 05 · The weekly rhythm | The rhythm that keeps it that way. |
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.
| Default | I too started here by simply opening Meta Ads Manager and reading off the ROAS column. |
| Why that is a problem | That 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 open | Your 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. |
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.
Your Meta ad spend for the same 30 days (if you also run on other channels, add those in).
Your real marketing efficiency, not the ROAS your dashboard claims (that one counts too little and double at the same time).
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.
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.
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 revenue | What 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. |
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.
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.
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.
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)Scale, kill, or leave alone.
| Default | The ROAS column in Ads Manager, per adset. |
| Why that is a problem | On exactly that number I have paused winners and scaled losers myself. It is a measurement, not a truth. |
| What we open | We 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.
| Metric | What it tells you | Threshold |
|---|---|---|
| MER | Are you making money across everything? | Above your break-even |
| AMR | Are you winning new customers? | Above your break-even |
| CTR | Do the hook and the ad creative land? | ~4% is strong; below 1% is weak |
| Frequency | Are you becoming annoying? | > 2.5 = fatigue |
| Orders / week | Enough 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.
| If | Then |
|---|---|
| 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 CTR | Refresh. 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 volume | Kill. 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.
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 spendSplit your orders in Shopify by new vs returning customer (Shopify tags this automatically). Take only the new-customer revenue from the last 30 days.
Divide that by your total ad spend. That is your AMR.
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.
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.
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.
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.
Where do you lose the click you paid for?
| Default | Your store's theme editor, on a laptop. |
| Why that is a problem | The 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 open | Your 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. |
Make a real purchase in your own store. Yes, actually check out.
The money you leave on the table every month.
| Default | The campaign tab of your email tool: how many emails, how many opens. |
| Why that is a problem | Open 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 open | Klaviyo: 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.
| Flow | When | What it does |
|---|---|---|
| Welcome | Right after sign-up | Establishes the relationship. Highest open rate of anything you send. |
| Abandoned cart | 1u · 24u · 72u | The strongest earner. Catches the purchase intent at its highest moment. |
| Post-purchase | On shipping & +14 days | Turns 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.
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.
The rhythm that keeps it that way.
| Default | Diving into the dashboard again every week and steering on instinct. |
| Why that is a problem | Without 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 open | Ads 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.
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.
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.
Test angles, not colours. A different button colour is not a test. A different story is.
Hypothesis → what you did → result → decision. This log becomes your proof of what does and does not work in your market.
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.
Everything starts with the concept. The structure follows from that, then the ad creative in the adset, then the budget.
| 80 / 20 | 80% 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. |
| Order | First 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 open | AI 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. |
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.
| Campaign | Adset | Ads |
|---|---|---|
| Scaling · Advantage+ | Adset Belgium · Adset Netherlands | your 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.
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.
| Type | Why it works |
|---|---|
| Founder video | You explaining your brand. Builds trust and gets high retention on cold audiences: people buy from people. |
| Social proof | Screenshots of press, reviews and known customers. Proof sells; it takes the doubt away. |
| UGC / avatar | An avatar your customer recognises themselves in. Seeing it worn is wanting it. |
| Packshot / 3D | For 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.
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.
The tools I use, and what I look at on each one. Nothing more.
| Tool | What I look at on it |
|---|---|
| Meta Ads Manager | CTR, frequency, spend and reach. Not the ROAS column. |
| WeTracked.io | Real attribution for Meta and Klaviyo: my MER and AMR. |
| Shopify | Orders and first source per order. I build in the theme code (trust strips, badges). |
| Lucky Orange | Session recordings: where customers get stuck. Free alternative: Microsoft Clarity. |
| Klaviyo | Retention and email marketing. Revenue per flow (from WeTracked), and I only email the engaged segment. |
| Reviews.io | Reviews per product as social proof. |
| Higgsfield | AI ad creative, always on the real product photo. |
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.
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 stepYou 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
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.