Top Voice Top Voice
AI setup
← All articles

We Stopped Chasing ROAS. We Started Paying for Profit (Our Google Ads Playbook)

June 30, 2026
google adsppcroasecommercepaid growthcase study

We took an account from a 2.8 ROAS to a 3.6 ROAS without raising bids.

We changed what we told Google to optimize.

Most teams feed Google revenue-as-value. Machines do what we ask. They go find cheap revenue. Then finance asks why gross profit is flat.

If you want profit, you have to pay for profit. Here’s how we structure Google Ads to reward profit per order instead of topline.

The problem with ROAS everyone quotes

  • ROAS hides margin. A $100 order with 15% margin is not the same as $100 at 65%.
  • Shipping, payment fees, and returns turn “winners” into bleeders.
  • Automation will push volume to SKUs and queries that clear tROAS, even if they lose money after the fact.

If your conversion value is wrong, your bidding is wrong. Simple.

Case study: e‑commerce with 1,700 SKUs

Category: home goods. Mix of lightweight accessories and bulky items.

Baseline (30‑day average):

  • Blended ROAS: 2.8
  • AOV: $105
  • CPA: $38
  • Gross profit after ad spend: inconsistent, often negative on “hero” SKUs due to returns and shipping surcharges

What we changed:

1) We rebuilt “value” as profit, not revenue

For every SKU we computed expected profit per order:

Profit = Price − COGS − Shipping − Packaging − Payment Fees − Pick/Pack − Expected Returns Cost

  • We pulled COGS and ship classes from the ERP.
  • We estimated returns by category and size (e.g., 22% return rate on bulky decor vs 6% on small accessories). Expected returns cost = Return Rate × (Refunded Amount + Reverse Logistics).
  • We refreshed the file daily.

Implementation options:

  • If you can edit the purchase event: send profit as the conversion value on the transaction.
  • If you can’t change the front end: import offline conversions with GCLID/gbraid and set the value to profit (order‑level works; SKU‑level is better if you split orders in the import).

Either way, Google now sees profit dollars as the thing to maximize.

2) We told Google who is worth more

We used Conversion Value Rules for known differences:

  • New customer? +30% value multiplier (makes bidding more aggressive on first‑time buyers).
  • Returning customer on discount code list? −20%.
  • High‑cost shipping regions? −15%.

These aren’t made up. They reflect LTV and delivery economics. If LTV is 1.4× on first‑time buyers from non‑promo traffic, you can afford to pay more today.

3) We restructured campaigns by margin tier

We labeled items in the feed:

  • custom_label_0 = MarginTier: High (≥55%), Mid (35–54%), Low (≤34%)
  • custom_label_1 = ReturnRisk: High/Med/Low

Then we split Performance Max:

  • PMax High Margin (target new customers): Maximize conversion value with tROAS tuned to break‑even × growth (details below)
  • PMax Mid Margin: tROAS slightly above break‑even
  • PMax Low Margin: capped daily budget with higher tROAS; goal is only profitable tail sales

Search campaigns:

  • Exact/MG modified themes for high‑margin, high‑intent queries
  • Branded segmented and capped to avoid PMax cannibalization
  • DSA isolated for discovery with conservative budgets

We separated Shopping listings inside PMax asset groups by margin tier to keep machine learning focused.

4) We set targets from contribution margin, not gut feel

Break‑even tROAS by tier:

  • tROAS_break_even = Revenue / (Ad Cost) when Profit_after_ads = 0
  • Rearranged: tROAS_break_even = 1 / Contribution_Margin

Example:

  • High tier CM = 0.6 → break‑even tROAS = 1 / 0.6 = 1.67
  • We set tROAS at 2.0 for High (gives room to scale while keeping profit), 2.6 for Mid, 3.4 for Low

When in doubt, start targets 10–20% above break‑even, then adjust based on marginal ROAS (see below).

5) We reallocated budget by marginal ROAS

We didn’t chase blended ROAS. We looked at what the next dollar would return.

Weekly, per campaign:

  • If Marginal ROAS (last 20% of spend) > Target ROAS by 15% → increment budget +20%
  • If Marginal ROAS < Target ROAS by 15% → cut budget −20% and/or raise tROAS 10%
  • If total conversions < 50/week → combine cohorts; don’t starve learning

We also throttled Low tier to a fixed ceiling so it couldn’t crowd out High tier when demand spiked.

Results after the switch

  • Blended ROAS rose from 2.8 → 3.6
  • Ad spend shifted: −37% on Low margin SKUs, +52% on High margin SKUs
  • Revenue dipped 6% short‑term; contribution profit from ads rose 48%
  • Return‑prone products lost impression share; first‑time buyer share of conversions increased from 41% → 58% due to value rules

No creative overhaul. No heroic bid tweaks. We just paid Google more for what grows the business and less for what hurts it.

The playbook you can copy this quarter

1) Build the profit file

  • Columns: SKU, Price, COGS, ShipClass, Avg Ship Cost, Payment Fee %, Pick/Pack, Return Rate, Return Cost
  • Compute Profit_per_SKU and Profit_Per_Order
  • Refresh daily; store it where both your feed and analytics can read it

2) Tag the feed

  • custom_label_0 = MarginTier (High/Mid/Low)
  • custom_label_1 = ReturnRisk (High/Med/Low)
  • custom_label_2 = NewVsRepeat intent if you can infer (e.g., product types mostly bought by new customers)

3) Send profit as value

  • Best: fire purchase with value = Profit (GTM, server‑side preferred)
  • Good: offline import with GCLID/gbraid; one row per order‑item with profit value
  • Sanity check: sum of daily “conversion value” in Google Ads ≈ profit model totals

4) Apply value rules

  • +X% for first‑time buyers (based on LTV uplift)
  • −Y% for discount‑driven audiences
  • −Z% for high shipping zones or high return cohorts

5) Restructure campaigns

  • Split PMax by MarginTier asset groups; exclude brand from PMax where needed
  • Keep Brand Search separate with caps
  • Isolate High‑intent Search themes for High margin SKUs

6) Set tROAS by math

  • Use contribution margin to set break‑even
  • Add 10–20% buffer above break‑even for scale

7) Allocate budget on marginal return

  • Review last 7 days; inspect spend vs value curves
  • Move budget from Low to High tier when marginal ROAS favors High

Guardrails and gotchas

  • Don’t double‑count value. If you send profit and then mark up with value rules, confirm the multipliers reflect strategy (e.g., LTV) not margin again.
  • Keep sample sizes healthy. If a PMax split has <50 conversions/week, merge tiers or relax targets.
  • Watch brand cannibalization. PMax loves brand; cap or exclude to keep non‑brand honest.
  • Refresh returns. If your returns spike after seasonality, your profit model needs to reflect it within days, not months.
  • QA the math: Pull a random 20 orders each week. Compare imported profit to finance reports. Fix drift fast.

SaaS note: same idea, different math

If you’re SaaS, value = Expected Revenue × Gross Margin.

  • Send or import lead conversions with stage weights (SQL × P(win) × ACV × GM).
  • New ICP with higher LTV? Use value rules to boost.
  • Set tCPA/tROAS from payback targets (e.g., 6‑month payback → Max CPA = 6 months of gross margin contribution / target).

Machines will buy the customers you tell them to buy.

The takeaway

Google isn’t over‑ or under‑bidding you. It’s optimizing exactly what you feed it.

When we switched from revenue to profit in the conversion value, automation moved budget to the right queries, SKUs, and audiences on its own. ROAS went up. Profit went up more.

If your account reports “great ROAS” and finance still hates the P&L, change the value signal. We’re happy to review your setup and sketch the profit model in a 30‑minute audit.