UPLIFY/
Google Ads · PMax / Shopping · sample audit
UPLIFY · Deep audit sample

Comprehensive Google Ads audit of an online store

A real audit of a real UPLIFY client — fully anonymized. The niche, brands, domain and all account IDs are hidden; all the analysis, methodology, structure and actual metrics are preserved unchanged.

Platform
Google Ads · PMax / Shopping
Period
90 days
Findings
19
Sources
Ads · GA4 · Merchant · KP
Actions coverage
19/19 · 100%
🔒 Anonymized. The name, domain, niche, brands and IDs (Ads / GA4 / Merchant) are removed. This is a real report — the numbers, geos, account structure and conclusions are real; product categories are masked to A / B / C.
Data limitations

What narrows the conclusions — read first

🟡 Data limitations
  • STEP-0 not filled in by the client: no margin, target CPA/ROAS, stock, promo calendar, or pause context → conclusions about budget scaling and paused campaigns are narrowed (client_input). This does NOT block the audit — it only narrows the relevant conclusions.
  • Merchant connected — feed read (≈2,969 offers) + account-level statuses; item-level per-offer statuses are limited by access rights (2,968 in unknown) → product conclusions are narrowed to feed level + a roadmap to lift the limitation (see “Audiences & feed”).
  • PMax API: no per-asset conversions / search IS / placement cost → waste/scale at the asset level is presented via impressions/CTR, not cost-proof.
  • Conversion lag: the new campaign (category B) is <30 days old, with a large share of UNKNOWN-lag → the recent window is under-counted, confidence is reduced.
  • GSC unavailable — the organic cross-check is limited (not a blocker; we worked with Ads + GA4 + Keyword Planner).
Profile

Store profile + Claim Ledger

An online store of mid-to-high-ticket home goods with a broad assortment (≈1,480 unique SKUs × 2 languages). High-ticket considered demand (a long purchase decision), pronounced seasonality of two product lines, an active phone order channel. The site is bilingual UA/RU (hreflang uk, ru, x-default) — this explains the SKU duplication in the feed as deliberate localization, not an error.

Allowed

Free shipping above an order threshold; official dealer → manufacturer warranty; installments / pay-in-parts; service maintenance; government support program.

Forbidden

"#1 / best / cheapest / market leader"; guaranteed savings as an unconditional promise; any superlative without proof.

Verify

Specific discount %s in copy (they change); "delivery in 1 day"; free service.

Summary

Executive summary

₴85,396
Spend · 90 days
≈₴1.01M
Web-conversion value
11.9
Blended ROAS (web-purchase)
19
Findings · 100% coverage

The account has 5 campaigns, all Performance Max (2 active, 3 paused). Health is above average. On paper the active campaigns exceed their target ROAS by 3–4× (category A: 15.2 vs. a 3.7 target; category B: 10.9 vs. a 4.7 target).

⚖️ BUT this ROAS must be read net-of-counter-evidence, not by the best number. PMax has no own-brand exclusion and credits itself with hot brand + remarketing demand (brand queries ≈5k/mo — “Keywords & copy”) → the averaged ROAS is inflated, and the real economics of acquiring NEW customers are unknown (new-vs-returning is not separated). So the scaling verdict is "verify first, don't scale blindly", even at 15× on paper.

Measurement verdict — "web purchases can be trusted, the full funnel with a correction." Web-conversion value in Ads (₴1,012,010) nearly matches GA4 google/cpc purchaseRevenue (₴966,281) — a ~4.7% gap, below the 15% threshold → web-purchase is reliable. BUT the phone/lead path is materially under-counted (1,488 hover_phones + 814 form_start in GA4 vs. ~5 in Ads).

1. Compliance / geo

P0

The new active campaign (cat. B) has no exclusions of occupied cities that are set on the other 4 (16 cities). Budget waste in the war zone + non-delivery risk → add exclusions.

2. Measurement (GATE)

P1

The test conversion purchase_test is still primary; phone/lead conversions are under-counted → Smart Bidding optimizes on only part of the purchases. We lock the signal BEFORE scaling.

3. Brand + growth

P2

PMax eats the own brand with no brand-exclusion and there's no separate brand-Search → the brand is managed poorly (F4/F5). Cat. B groups have no search-themes/signals; missing callouts / snippets / price / promotion.

Measurement · GATE

Signal first, then scale

Any automated bidding strategy is only as smart as the conversion signal is clean. In PMax this is doubly critical: bidding is fully automated (tROAS/tCPA), there are no manual modifiers — the algorithm optimizes on exactly what we marked as a conversion.

measurement gate ● before scaling
What to close before scaling
  • Test conversion in primary. purchase_test has primary_for_goal=true and has already recorded a conversion on the new campaign → double-counting and tROAS distortion.
  • Phone/leads under-counted. 1,488 hover_phones + 814 form_start (GA4, 30d) vs. ~5 in Ads → some "zero" products/geos actually drive calls. Don't cut blind.
  • Signal value / quality. The Ads↔GA4 reconciliation on web-purchase is clean (+4.7%), but low-volume GA4 breakdowns should be read with a measurement caveat (sampling/thresholding) — not as exact zeros.
Sequencing rule
  • 1. Remove the test conversion from primary.
  • 2. Wire qualified calls / submit-leads as conversion actions (secondary/observe).
  • 3. Wait 2–3 weeks for clean data.
  • 4. Only then touch budget/tROAS. Otherwise Smart Bidding will "cement" the current distortions.
Findings

Full findings table (19)

Each finding has a severity (P0–P3), a confidence and a decision type — it determines what the finding turns into next (the "Actions" section). A strong senior knows how to fix, to investigate, and to deliberately do nothing.

#AreaFindingSev.Conf.Decision
F1Geo / complianceThe new campaign (cat. B) targets the whole country with no exclusions of the 16 occupied cities that are set on the other 4. Verified GAQL; recommendation on the presumption of an oversight (STEP-0 empty → confirm).P095/80%protect
F2MeasurementThe purchase_test conversion has primary_for_goal=true and recorded a conversion on the new campaign → double-counting risk.P190%fix
F3Measurement / leadsPhone/leads under-counted: 1,488 hover_phones + 814 form_start (GA4, 30d) vs. ~5 in Ads. Smart Bidding doesn't optimize on calls.P175%fix
F4PMax / cannibalization (D-9)PMax with no brand-exclusion absorbs brand search + remarketing → the averaged ROAS (15.2 / 10.9) is inflated by cheap brand/retarget sales. New-vs-returning is not separated → the real CPA on NEW customers is unknown.P180%investigate
F5Brand coverage (D-10)No dedicated brand-Search campaign; brand demand (≈5k/mo — “Keywords & copy”) is taken by PMax more expensively and without control. The own brand should be the cheapest and highest-converting channel — right now it's unmanaged.P280%protect
F6PMax signalsBoth asset groups of the active campaign (cat. B) have 0 search-themes and 0 audience signals → PMax learns blind.P295%fix
F7PMax creativeOne group is empty (ad_strength=POOR, no headlines/media); the other is AVERAGE, with a headline using slang/truncation.P285%fix
F8ExtensionsAcross all campaigns there are no callouts, structured snippets, price, promotion — despite a strong set of ALLOWED offers.P290%fix
F9Product / feedSKU duplicates between the RU/UA feeds split impressions and budget: one language version converts, the duplicate has 0 conv and burns budget (confirmed on 5 SKUs).P280%fix
F10Product / wasteTop-spend products with no conversions (4 items, ₴1,602 / ₴737 / ₴548 / ₴516, 0 conv) — candidates for isolation into a low-priority listing group.P270%investigate
F11Geo efficiency5 regions with spend and no conversions (≈10.6% spend, 0 conv) — watchlist; don't cut blind (small sample, call path).P260%watchlist
F12Geo concentrationKyiv = 29% spend (ROAS 10 / 5.6); top-ROAS regions (40 / 35 / 48 / 31 / 27) are underfunded → room to concentrate.P265%scale
F13Budget / strategyActive campaigns exceed their ROAS target by 3–4×, budget isn't fully spent → room to scale / lower tROAS (after margin AND after F4).P270%investigate
F14GA4 hygieneGA4 sources contain dev/spam referrers (localhost:8000, 127.0.0.1, a spam domain) with no internal filter.P390%fix
F15Channels / incrementalityAn independent paid channel outside Google Ads drives ₴665,646 in revenue from 1,049 sessions → it affects Ads attribution.P280%investigate
F16Merchant1 product disapproved (legal-takedown, RU+UA); 2,968 offers in unknown (diagnostics rights — see “Audiences & feed”).P370%protect
F17Devices (CTV)Minor spend on Connected TV with no conversions (~₴62) — immaterial, monitor.P380%do nothing
F18FunnelA sharp drop view_item (24,683) → add_to_cart (123) over 30d — typical for high-consideration, points to a phone/offline path outside Ads.P265%investigate
F19Structure / namingInconsistent campaign and group naming (a typo in the brand, default RU group names) — off-standard.P395%fix
Action plan

Action plan — ADD before REMOVE

Prio.WhatExpected effect
P0Add exclusions of the 16 occupied cities to the new campaign (copy from the other 4)Remove non-delivery/waste in the war zone; compliance
P0Remove purchase_test from primary (secondary / archive)Clean purchase count, no double-counting
P1Wire call/lead measurement as a conversion in Ads (runbook below)Smart Bidding "sees" phone sales
P1Add brand-exclusion to PMax (exclude OWN brand terms) + create a brand-Search campaign paused with real brand keywordsThe real non-brand economics become visible; cheaper, managed brand traffic
P1Add search-themes + audience signals to cat. B groups (category-specific, not "generic")Better PMax learning and targeting
P1Add callouts / snippets / price / promotion to the 2 active campaignsCTR / ad quality, SERP coverage
P2Fill or disable the empty asset group (POOR)Remove ballast, raise ad_strength
P2Customer Match (buyers 540d) — prepare after client consent on data + consent termsLAL signal / exclusion of existing customers from prospecting
P2Test: ↓tROAS of active campaigns OR ↑budget +10–25% — only after margin AND the cannibalization check (F4)More volume while preserving profitability
P2Sort out the RU/UA SKU duplicates in the feed (supplemental / custom_label)Less impression/budget cannibalization

Runbook for the "call measurement" step

To avoid the typical "calls in GA4, 0 in Ads" gap:

  1. In GA4 mark call_phones + form_start/submit as key events with correct counting (one per session for a call).
  2. Import these key events into Ads as conversion actions; count = One for a call (not Every).
  3. Keep on secondary (observe) until quality is confirmed — do NOT push straight to primary.
  4. After 7–14 days, reconcile the Ads conversion count with GA4; if a CRM is available — reconcile call→sale so that only qualified leads make it into primary.
Manageability

Success criteria, monitoring and rollback

Every P0/P1 action comes with a "before" snapshot, a control metric, an observation window and an explicit rollback trigger defined BEFORE rollout. No change is applied without a way back.

ChangeControl metricWindowRollback trigger
Geo exclusion of 16 cities (F1)impressions/spend on excluded geos; non-delivery3–7 dayscat. B conversions drop >15% with no ROAS change
Remove the test conversion (F2)primary conversion count, tROAS stability7 daysCPA jump >20% → return as observe
Calls/leads in Ads (F3)Ads conv vs. GA4 events; quality (CRM)7–14 daysspam leads in primary → keep secondary
Brand-exclusion + brand-Search (F4/F5)non-brand ROAS (true), brand CPC/CTR/IS14 daysoverall CPA rises while brand reach drops → narrow the exclusion
Signals + extensions (F6/F8)ad_strength, CTR, group conv-rate14 dayslearning degrades → roll back the signal
Closed loop

"Actions" — every finding → a decision

A report is not a PDF that ends up in a drawer. In UPLIFY OS every finding necessarily gets a destination — the "0 report-only" invariant:

  1. Action — an executable, reversible card in OS (prepare → manager approve → execute → undo), with a log and a "before" snapshot. E.g. add_geo_exclusion, add_asset_group_signal, create_search_campaign.
  2. Task — something a human does outside the API (a Customer Match list after client consent; a spec for the tech specialist on call tracking). It becomes a trackable task.
  3. Watchlist — under observation, the decision deferred until data accumulates (weak geos, CTV).
  4. N/A — deliberately not applicable (with a reason). It's recorded too, not "forgotten".

The link is two-way: every Action/Task knows which finding it stems from, and coverage is counted as processed / total. In this audit — 19/19 (100%). A routing example:

FindingDecisionDestination
F1 geo exclusionprotectAction add_geo_exclusion (reversible)
F2 test conversionfixTask for a manager (change the conv-set in the Ads UI)
F4 PMax cannibalizationinvestigateTask: separate new-vs-returning + brand-exclusion
F5 brand coverageprotectAction create_search_campaign (brand, paused)
F11 weak geoswatchlistWatchlist (decision after data volume + calls)
F17 CTV ₴62do nothingN/A (immaterial impact, deliberate)
Structure

Target structure map (before → after)

CampaignStatusActionMode
Category A (PMax)ENABLED · 15.2KEEP + brand-exclusion + signals/extensions; test ↑budget / ↓tROAS only after F4phased
Category B (PMax, new)ENABLED · 10.9PROTECT (geo exclusion) + signals + fill the groupsdirect
Brand Search (new)CREATECREATE paused — capture brand demand cheaply, remove from PMax (F5)create
Category "everything else" + BPAUSED · 7.3INVESTIGATE — why paused; possible consolidationclient
Category C (electrical)PAUSED · 0.27KEEP PAUSED — weak economicsdo_nothing
Category D (niche)PAUSED · 31.6INVESTIGATE — little data (84 clicks), high return; relaunch for the seasonexperiment
Principle: the structure by product economics is logical — we respect the split (different margins/seasonality). ADD first (signals, extensions, geo protection, brand) → stabilization → scaling.
Budget

Budget + experiment design

CampaignCurrent (90d)Budget actionlost ISRationaleConf.
Category A₴51,136hold → test ↑ after F4n/aROAS 15.2 on paper, but inflated by cannibalization — investigate first70%
Category B₴8,419hold + signalsn/anew, <30d, lag not matured — too early to touch budget65%
Top-ROAS geo≈₴8,500redirect hereROAS 27–48, underfunded (F12)65%
🟡 Budget increases are blocked until margin / target-ROAS is confirmed — the minimum-evidence rule. None of the active campaigns is currently budget-constrained (spend < cap), so a direct ↑budget won't add volume without lowering tROAS.
📐 Experiment design: a 50/50 PMax experiment split. Conversion volume is small (cat. A ≈8/mo; cat. B 9 in <30 days), so a statistically significant read of the ROAS effect needs 6–10 weeks per arm, read with a confidence interval, not a point estimate. Scaling is phased (+10–15% per step), and "success" counts only at ≥20–30 conversions per arm.
Roadmap

90-day roadmap

W1–2 · Foundation

Stop the leaks

P0: occupied-cities geo exclusions + remove the test conversion from primary. Set up call measurement, GA4 filters, fix the disapproved product.

W3–4 · ADD

Brand + signals

Brand-exclusion in PMax + brand-Search paused; signals for cat. B groups; callouts/snippets/price/promotion; fill the empty group; fix the naming.

W5–7 · Tune

Learning

Let PMax learn on clean conversions; separate new-vs-returning (F4); test ↓tROAS (experiment); monitor lag.

W8–10 · Prune

Cleanup

SKU duplicates and waste products in the feed; decisions on weak geo regions based on accumulated data (accounting for calls).

W11–13 · Scale

Scale

After confirming margin AND a clean signal — scale into top-ROAS regions; consider relaunching the niche campaign for the season.

Keywords & copy

Keyword bank + copy analysis

Keyword Planner (UA, real volumes/mo — keywords masked): category B — top query 49,500, then 18,100 / 8,100 / 2,400 / 1,900 / 880; category A — top 12,100, then 2,900 / 2,400 / 1,900 / 1,300 + brand queries 1,900 / 1,600 / 720 / 590. The high-frequency brand queries (≈5k/mo) are exactly the demand that PMax now absorbs without control (F4/F5).

A full breakdown of the headlines of the two active groups (copy is masked to the category level; verdict + reason — as in the real report):

TypeCopy (by category)VerdictReason
HBuy [category A]KEEPEXCELLENT, intent-match
HEconomical [category A] for homeKEEPBenefit, grounded
HBest [A products] for homeREPLACESoft superlative "best" → "from the official dealer" (trust)
HTop [subcategory A]REPLACE"Top" is weak → "[subcategory] −15%" (benefit, grounded on the LP)
H[Category A] + warrantyKEEPConfirms service/warranty in ALLOWED
HBest prices on [cat. B slang]REPLACESlang/truncation + superlative → "[category B] in stock"
H[Category B], top seriesKEEPIntent (2,400/mo)
H(no brand hook)ADDBrand-query demand 1,900/mo → "[brands]" (social proof)
H(no service hook)ADDService-query demand 880/mo → "Warranty and service" (benefit)
⚙️ Executable copy-replacement cards are generated by a separate live COPY-HOOKS engine (the "Copy" tab in OS) — here it's analysis only. In PMax assets are NOT judged on conversions (per-asset conv=0 always).
Creative

Prompt cards for new images

Ready to paste into a generator for the weak/empty group. Each is a "draft concept, needs a brand/legal review." The product is masked; the technique (formats, prohibitions) — as in the real report.

1) Product in a modern interior

1.91:1 · PMax/Display
"Photorealistic modern living room in warm daylight, a sleek product of [category B] in use, clean Scandinavian interior, Ukrainian middle-class apartment, soft natural light, shallow depth of field. Mood: comfort and calm. NO brand logos, NO competitor logos, NO celebrities, NO on-image text/banner, NO fake UI. Aspect 1.91:1."

2) Product in a home interior

1:1 · PMax · trust
"Photorealistic product of [category A] neatly placed in a tidy modern room of a private Ukrainian home, soft natural lighting. Mood: reliability and quality. NO brand logos, NO text overlay, NO people faces, NO fake screenshots. Aspect 1:1."

3) Seasonal comfort

4:5 · Discovery/Display
"Photorealistic cozy family home interior with bright window light, a modern [category B] product in a comfortable everyday setting, plants and warm tones, calm mood. NO logos, NO celebrities, NO before/after, NO promotional text. Aspect 4:5."

4) Studio trust-shot

1.91:1 · premium
"Photorealistic clean studio product shot of a modern product on a light neutral background with soft shadow, premium e-commerce look, space on the side for later text placement. Mood: clarity/trust. NO logos, NO text, NO watermark, NO competitor branding. Aspect 1.91:1."
Audiences & feed

GA4 audiences + Merchant supplemental

GA4 audiences

Buyers 90d (exclusion from prospecting + LAL); cart-abandoners 30d (add_to_cart without purchase → remarketing); high-intent (view_item ≥2 or hover_phones/form_start without a purchase); engaged ≥N for LAL. The signal must match the campaign's product mix — a category audience goes EXACTLY into its own campaign, not a "generic" one.

Merchant — 5-layer doctrine

Supplemental only (never products.insert). setup/feed: custom_label margin_tier / performance / season. title: formulas by "reason to buy." price/description: a price corridor; the description as a keyword source. image: no watermarks. moderation: fix disapproved (F16), reconcile price site↔feed.

Lifting the item-level limitation

(1) request a Standard/Admin role in Merchant for the service account (or do a one-off Diagnostics→Products export); (2) re-run the statuses with full rights; (3) only then draw item-level conclusions on waste/price/stock. Until then Shopping conclusions are narrowed, not final.

Risks

Risks and caveats

🟡 Read before deciding
  • Small conversion volume (8–9/mo per active campaign) → read with a confidence interval, not weekly point estimates; don't pause/scale on 1–2 conversions.
  • Conversion lag in the new campaign → the recent window systematically under-counts real value; verdicts on the fresh period come with reduced confidence.
  • The phone channel is invisible to Ads until call measurement is wired — some "zero" geos/products actually drive leads.
  • Scaling is blocked until margin/target-ROAS is confirmed AND the cannibalization check (F4) is done — bare revenue-ROAS ≠ profit.
  • Merchant item-level is narrowed by access rights — product conclusions are feed-level until the limitation is lifted.
  • Seasonality of two lines → a correct comparison only within seasonal windows.
Appendix

Coverage + summary

CampaignStatusSpend ₴Conv.Value ₴ROASTarget
Category AENABLED51,13625.0775,81315.23.7
Category BENABLED8,4199.091,33110.94.7
Other + BPAUSED13,1208.095,9027.314.0
Category CPAUSED11,2701.03,0420.2714.0
Category DPAUSED1,4512.045,92231.614.0
Total85,39645.01,012,01011.9
Geo (top)Spend ₴ROASSignal
Kyiv16,64810.0top-spend, strong
Region H3,92940.6⭐ underfunded
Region G4,59435.1⭐ underfunded
5 regions≈9,0000❌ watchlist (0 conv)

Analysis coverage: campaigns 5/5 (100% spend); asset groups 13/13; products top-30 by spend; geo — all 23 oblasts + Kyiv (100%); all 14 conversion actions.  Actions coverage: 19/19 findings (100%) routed to Action / Task / Watchlist / N-A — the "0 report-only" invariant.

GAQL: campaign · conversion_action(+segments) · campaign_criterion LOCATION · geographic_view · segments.device/lag · asset_group(+asset/signal) · campaign_asset · shopping_performance_view · customer · brand-exclusion check. GA4: sessionSourceMedium, newVsReturning, eventName. Keyword Planner. Merchant: product_statuses.

Reconciliation: Ads value 1,012,010 ↔ GA4 google/cpc 966,281 → +4.7% (value-level, web-purchase; doesn't cover the phone path). Data — at the real query time (live read-only).

Nestor AI — UPLIFY's AI operator

How this audit was made

This report was prepared by Nestor AI — our AI operator inside UPLIFY OS: senior-level account analysis using our own methodology. Every proposed change ("Actions") is approved by a manager — nothing is applied to the account automatically, every change is reversible, logged and has a rollback trigger. Every finding leads to a decision: an action, a task, a watchlist item, or a deliberate "do nothing" — nothing is left as mere text.

© UPLIFY · AI-first performance agency · sample anonymized: a real client, the numbers / geo / structure are real; the niche, brands and identifiers are removed