Brand cannibalisation
Pause brand search for a week and see how much of the volume organic absorbs. Whatever organic recovers, you were previously buying from yourself.
brand paid clicks × (1 − click-share you would keep organically)
Google Ads integration
Google will happily spend your budget on people who were coming anyway. Kepra separates brand from generic, attaches profit to individual keywords, and shows what Performance Max is actually doing with the money it takes.
What we pull
OAuth · incremental sync
Each keyword carries its own profit after COGS — so 'løbesko' burning DKK 8,400 a month with nothing to show becomes impossible to miss.
Brand search converts beautifully because those people already decided. We split it out so it stops flattering the campaigns that actually have to do the work.
Performance Max is a black box by design. By matching orders ourselves we can still attribute the profit it generates — and show when it's simply harvesting demand you already had.
What we catch on Google Ads
Brand keywords and PMax often re-buy traffic that would have arrived organically. When the incremental profit doesn't justify the spend, we say so.
Broad, high-intent-looking keywords that convert on brand searches later — you pay twice for the same customer, and only the second touch gets the credit.
Performance Max reallocates spend automatically. Without independent profit tracking you learn about it a month later, in the accounts.
A target ROAS built on revenue ignores your margin. We compute the break-even ROAS your actual COGS implies, so the target means something.

Google Ads → Kepra
Reading
spend + matched orders
Deciding
profit after COGS and LTV
Your call
nothing moves until you say so
Pushing
executed over MCP, logged
Verdict: The keyword "løbesko" has spent DKK 8,400 in 30 days for DKK 0 profit — the clicks convert on brand searches you already win.
Google's disagreement with reality is different from Meta's. Meta over-attributes; Google mostly over-values traffic you already owned. These four lines separate the two.
Pause brand search for a week and see how much of the volume organic absorbs. Whatever organic recovers, you were previously buying from yourself.
brand paid clicks × (1 − click-share you would keep organically)DKK 8,400 on a generic keyword producing 14 orders looks like DKK 600 per order. If 11 of those were existing customers, the real cost of a new one is DKK 2,800.
spend ÷ orders from customers with no prior purchaseBroad match can spend a fifth or more of a campaign on terms that never convert profitably. The search-terms report shows it; the campaign view hides it.
spend on terms with zero profit ÷ total campaign spendAt DKK 400 gross profit and a 2% conversion rate, DKK 8.00 is the most a click can cost before the keyword loses money. Google will happily bid past it.
gross profit per order × conversion rateGoogle optimises to conversions you told it to want. If you told it revenue, it will buy revenue at any margin.
Three reports inside Google Ads will show you most of this today. None of them is where the interface wants you to look.
Open the Search terms report on your best-performing Shopping or broad-match campaign, last 90 days.
Look at: Sort by cost descending and read the terms with zero conversions.
The total spend on those rows is money you can stop spending this afternoon. Check what share of the campaign it is.
Segment your brand campaign by “Search terms → your own brand name”.
Look at: Compare its cost per conversion against the account average.
Brand campaigns almost always show the best ROAS in the account. That is the tell, not the trophy — those customers were typing your name.
Open Auction insights on your top generic campaign.
Look at: Your impression share versus overlap rate with competitors.
High overlap with a low top-of-page rate means you are paying to lose auctions. Bid down and measure profit, not position.
In Attribution, switch the model from data-driven to last-click.
Look at: How much conversion credit moves between campaigns.
Large swings mean the model is doing heavy lifting. Neither view is the truth — but the size of the gap is how much guessing sits under your numbers.
Where this runs out: None of these can tell you what a customer is worth after the first order, or reconcile a sale that Meta is also claiming. Deterministic matching against your real orders is what closes that gap.
Google Ads is wired in as typed MCP tools. Pausing a dead keyword or correcting a target ROAS becomes one approval instead of a trip through three screens.
google.keyword.pause(keyword_id)approval requiredgoogle.campaign.set_budget(id, amount)approval requiredgoogle.campaign.set_bid(id, target_roas)approval requiredgoogle.negative.add(campaign_id, term)approval requiredAs well as anyone can. Google restricts PMax reporting, but because we match orders to clicks ourselves, we can attribute profit to PMax even where its own reporting stays vague.
Yes — and with Shopify COGS attached, Shopping is where profit tracking pays off fastest, because margins vary wildly per product.
The ROAS at which an order stops losing money once COGS, fees and refunds are paid. On a 62% gross margin that's 1.61 — we compute yours from real data.