PricingOpen the demo
Google Ads logo

Google Ads integration

Profit per keyword. Including the ones PMax hides.

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

  • Spend at campaign, ad group and keyword level
  • Search terms and match types
  • Shopping and Performance Max breakdowns
  • Target ROAS and bidding configuration

OAuth · incremental sync

Keyword-level profit

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 vs generic, separated

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.

PMax, partially opened

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

The leaks this platform is best at hiding.

01Paying for customers you already had

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.

02Generic terms that never pay back

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.

03PMax eating the budget quietly

Performance Max reallocates spend automatically. Without independent profit tracking you learn about it a month later, in the accounts.

04Target ROAS set on the wrong number

A target ROAS built on revenue ignores your margin. We compute the break-even ROAS your actual COGS implies, so the target means something.

The loop, on Google Ads
Google Ads logo

Google Ads → Kepra

K
  1. Reading

    spend + matched orders

  2. Deciding

    profit after COGS and LTV

  3. Your call

    nothing moves until you say so

  4. 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.

Pause keywordawaiting your approval
Show your working

The maths behind every verdict.

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.

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)

True cost per new customer

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 purchase

Search-term tax

Broad 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 spend

Break-even CPC

At 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 rate

Google optimises to conversions you told it to want. If you told it revenue, it will buy revenue at any margin.

Do this without us

Four checks you can run in Google Ads today.

Three reports inside Google Ads will show you most of this today. None of them is where the interface wants you to look.

  1. 1

    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.

  2. 2

    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.

  3. 3

    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.

  4. 4

    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.

What the agent may do in Google Ads

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.

mcp · google-ads
  • google.keyword.pause(keyword_id)approval required
  • google.campaign.set_budget(id, amount)approval required
  • google.campaign.set_bid(id, target_roas)approval required
  • google.negative.add(campaign_id, term)approval required
Can you track Performance Max properly?

As 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.

Do you support Shopping campaigns?

Yes — and with Shopify COGS attached, Shopping is where profit tracking pays off fastest, because margins vary wildly per product.

What is a break-even ROAS?

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.

Kepra needs all four to tell the whole truth