Як виглядає глибокий аудит Google Ads інтернет-магазину від UPLIFY?

A real (anonymized) deep Google Ads audit of an online store by UPLIFY: 17 findings, full methodology, action plan and a 90-day roadmap. Prepared by the AI operator Nestor AI; a manager approves it.

Google AdsPerformance MaxGoogle ShoppingROASMerchant CenterUPLIFYNestor AI

UPLIFY · Sample deep audit

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 analysis, methodology, structure and actual figures are kept intact.

Platform: Google Ads · PMax / Shopping Period: 90 days Findings: 17 Sources: Ads · GA4 · Merchant · Keyword Planner Validation: independent (gpt-5.2), 20 notes

🔒 Anonymized. Name, domain, niche, brands and IDs (Ads / GA4 / Merchant) removed. This is a real report — figures, geo, account structure and conclusions are real; product categories masked to A / B / C.

🟡 Data limitations — read first

  • 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 limited by access rights (2,968 in unknown) → product conclusions narrowed to feed level + a roadmap to lift the limit (§6).
  • PMax API: no per-asset conversions / search IS / placement cost → asset-level waste/scale is shown via impressions/CTR, not cost-proof.
  • Conversion lag: the new campaign (category B) is <30 days with a large UNKNOWN-lag share → the recent window is under-counted, confidence lowered.
  • GSC unavailable — organic cross-check limited (not a blocker; we used Ads + GA4 + Keyword Planner).

0 Store profile + Claim Ledger

An online store of mid-to-high ticket home goods with a wide 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 (several numbers, a schedule, a "call me back" widget). The site is bilingual UA/RU (hreflang uk, ru, x-default) — this explains SKU duplication in the feed as deliberate localization, not an error.

CLAIM LEDGER — what can / cannot be claimed in ads:

  • ALLOWED free delivery above an order threshold; official dealer → manufacturer warranty; installments; service & maintenance; state support program.
  • FORBIDDEN "#1 / best / cheapest / market leader"; guaranteed savings as an unconditional promise; any superlative without proof.
  • VERIFY specific discount % in copy (they change); "delivery in 1 day"; free installation.

1 Executive summary

The account has 5 campaigns, all Performance Max (2 active, 3 paused). Health is above average. 90-day spend — ₴85,396, web-conversion value — ≈₴1,012,010, blended ROAS ≈ 11.9 (on web purchases, excluding the phone channel). Active campaigns exceed their target ROAS by 3–4× (category A: 15.2 vs target 3.7; category B: 10.9 vs target 4.7).

Measurement verdict — "trust web purchases; the full funnel with a caveat." 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) — Smart Bidding sees only part of the conversions.

1. Compliance / geo — critical

The new active campaign (category B) has no occupied-cities exclusions that are set on the other 4 campaigns (16 cities). Budget leak into a war zone + a delivery/compliance risk → add the exclusions.

P0

2. Measurement

A test conversion purchase_test is still primary and records conversions on the new campaign (double counting); phone/lead conversions are materially under-counted → Smart Bidding optimizes only on web purchases.

P1

3. Growth / hygiene

Active campaigns exceed their ROAS target by 3–4× → room to scale (after confirming margin); category-B groups have zero search themes / audience signals; all campaigns lack callouts / snippets / price / promotion despite a strong set of ALLOWED offers.

P2

2 Full findings table (17)

#AreaFindingSev.Conf.
F1Geo / complianceThe new campaign (cat. B) targets the whole country without the 16 occupied-cities exclusions set on the other 4 campaigns. Fact verified via GAQL; the recommendation assumes an oversight (STEP-0 empty → confirm).P095% / 80%
F2MeasurementThe purchase_test conversion has primary_for_goal=true and recorded a conversion on the new campaign → double-counting risk.P190%
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%
F4Structure / namingInconsistent campaign/group naming (a brand typo, default group names) — off standard.P395%
F5PMax signalsBoth groups of the active campaign (cat. B) have 0 search themes and 0 audience signals → PMax learns blind.P295%
F6PMax creativeOne group is empty (ad_strength=POOR, no headlines/media); the other is AVERAGE with a slangy/truncated headline.P285%
F7AssetsNo callouts, structured snippets, price or promotion on any campaign — despite a strong set of ALLOWED offers.P290%
F8Product / feedSKU duplicates between RU/UA feeds split impressions and budget: one language version converts, the duplicate gets 0 conv and burns budget (confirmed on 5 SKUs).P280%
F9Product / wasteTop-spend products with no conversions (4 items, ₴1,602 / ₴737 / ₴548 / ₴516, 0 conv) — candidates to isolate into a low-priority listing group.P270%
F10Geo efficiency5 regions with spend and no conversions (≈10.6% spend, 0 conv) — watchlist; don't cut blind (small sample).P260%
F11Geo concentrationKyiv = 29% spend (ROAS 10 / 5.6); top-ROAS regions (40 / 35 / 48 / 31 / 27) are underfunded → room to concentrate.P265%
F12Budget / strategyActive campaigns exceed the ROAS target by 3–4×, budget not fully spent → room to scale / lower tROAS (after margin).P270%
F13GA4 hygieneGA4 sources include dev/spam referrers (localhost:8000, 127.0.0.1, a spam domain) with no internal filter.P390%
F14Channels / incrementalityAn independent paid channel outside Google Ads drives ₴665,646 revenue from 1,049 sessions → affects Ads attribution.P280%
F15Merchant1 product disapproved (legal takedown, RU+UA); 2,968 offers in unknown (diagnostic rights — see §6).P370%
F16Devices (CTV)Tiny Connected TV spend with no conversions (~₴62) — immaterial, monitor.P380%
F17FunnelA sharp drop view_item (24,683) → add_to_cart (123) over 30d — typical for high-consideration, pointing to a phone/offline path outside Ads.P265%

3 Action plan — ADD before REMOVE

Prio.WhatExpected effect
P0Add the 16 occupied-cities exclusions to the new campaign (copy from the other 4)Remove non-delivery/leak in a war zone; compliance
P0Remove purchase_test from primary (secondary / archive)Clean purchase count, no double-counting
P1Wire call/lead measurement as an Ads conversion (runbook below)Smart Bidding "sees" phone sales
P1Add search themes + audience signals to category-B groupsBetter PMax learning and targeting
P1Add callouts / snippets / price / promotion to the 2 active campaignsCTR / ad quality, SERP coverage
P2Fill or turn off the empty asset group (POOR)Remove ballast, raise ad_strength
P2Test: ↓tROAS on active campaigns OR ↑budget +10–25% (after margin)More volume while keeping profitability
P2Resolve RU/UA SKU duplicates in the feed (supplemental / custom_label)Less impression/budget cannibalization

Call-measurement runbook (to avoid the classic "calls in GA4, 0 in Ads" gap)

  • In GA4, mark call_phones + form_start/submit as key events with correct counting (one per session for a call).
  • Import these key events into Ads as conversion actions; count = One for a call (not Every).
  • Keep them secondary (observe) until quality is confirmed — don't push straight to primary, so as not to break the current tROAS.
  • After 7–14 days, reconcile Ads conversion counts with GA4 (Ads ≪ GA4 — the import only captures gclid sessions); with a CRM, reconcile call→sale so only quality leads reach primary.

3b Target structure map (before → after)

CampaignStatusActionMode
Category A (PMax)ENABLED · ROAS 15.2KEEP + signals/assets; test ↑budget / ↓tROASphased / experiment
Category B (PMax, new)ENABLED · ROAS 10.9PROTECT (geo exclusions) + signals + fill the groupsdirect + phased
"Everything else" + BPAUSED · ROAS 7.3INVESTIGATE — why paused; possible consolidationquestion to client
Category C (electric)PAUSED · ROAS 0.27KEEP PAUSED — weak economicsdo_nothing
Category D (niche)PAUSED · ROAS 31.6 (84 clicks)INVESTIGATE — little data, high return; relaunch for the seasonexperiment

Principle: a structure split by product economics is sound — we respect the separation (different margins/seasonality). ADD first (signals, assets, geo protection) → stabilize → scale.

3c Budget + experiment design

🟡 Budget increases are blocked until margin / target-ROAS are confirmed (client_input) — minimal-evidence rule. None of the active campaigns are currently budget-capped (spend < limit), so a direct budget ↑ won't add volume without lowering tROAS.

📐 Experiment design. A PMax 50/50 experiment. Conversion volume is low (cat. A ≈8/mo; cat. B 9 over <30 days), so a statistically meaningful read of the ROAS effect needs 6–10 weeks per arm, read by a confidence interval, not a point. Scale step-by-step (+10–15% per step, not +25% at once), with a window for conversion lag; "success" only when ≥20–30 conversions per arm are accumulated.

3d 90-day roadmap

W1–2
Foundation
P0: occupied-cities geo exclusions + remove the test conversion from primary. Set up call measurement, GA4 filters, fix the disapproved product.
W3–4
ADD
Signals for category-B groups; callouts/snippets/price/promotion; fill the empty group; fix naming.
W5–7
Tune
Let PMax learn on clean conversions; test ↓tROAS (experiment); monitor lag.
W8–10
Prune
SKU duplicates and waste products in the feed; decide on weak geo regions from accumulated data.
W11–13
Scale
After confirming margin — scale into top-ROAS regions; consider relaunching the niche campaign for the season.

4 Keyword bank + full ad-copy analysis

Keyword Planner (UA, real monthly volumes — specific 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.

💡 High-volume brand queries are a strong reserve for PMax search themes and a future Search campaign (use brands only as an official dealer).

Full review of the two active groups' headlines (copy masked to category level; verdict + reason + claim safety — as in the real report):

TypeCopy (by category)VerdictReason
HBuy [category A]KEEPEXCELLENT, intent-match
HEconomical [category A] for the homeKEEPBenefit, grounded
HBest [category-A goods] for the homeREPLACESoft superlative "best" → "from an official dealer" (trust)
HTop [sub-category A]REPLACE"Top" is weak → "[sub-category] −15%" (benefit, grounded on the LP)
H[Category A] + warrantyKEEPConfirmed service/warranty in ALLOWED
HBest prices on [slang for cat. B]REPLACESlang/truncation + superlative → "[category B] in stock" (clarity)
H[Category B], top rangeKEEPIntent (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 & service" (benefit)

⚙️ Executable copy-replacement cards are generated by a separate live engine, COPY-HOOKS (the "Texts" tab in OS) — here it's analysis only. In PMax assets are NOT judged by conversions (per-asset conv=0 always).

4b Creative — prompt cards for new images/video

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

1) Product in a modern interior

1.91:1 (1200×628) · PMax/Display · photoreal

"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 (1200×1200) · PMax · trust/expertise

"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 (desire/relief)

4:5 (portrait) · 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 (space for text)

1.91:1 · clean e-commerce · 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."

5–6 GA4 audiences + Merchant supplemental feed

GA4 audiences (create → export to Ads via the link, not Ads SDK):

  • Purchasers 90d — exclusion from prospecting + a LAL signal (purchase).
  • Cart-abandoners 30dadd_to_cart without purchase → remarketing (no RM audiences in PMax signals today).
  • High-intentview_item ≥2 OR hover_phones/form_start without purchase → a warm signal (especially the phone path).
  • Engaged ≥N — for LAL as a PMax audience signal.

Merchant supplemental feed with custom_label (supplemental only — never products.insert):

  • custom_label_0 = margin_tier (high/mid/low) — bidding by profitability.
  • custom_label_1 = performance (bestseller / 0-conv) — isolate waste products into a low-priority group.
  • custom_label_2 = season — sync with seasonal demand.
  • RU/UA dedup: ensure one SKU across two languages doesn't cannibalize impressions (feed_label / language targeting by group).

Roadmap to lift the item-level limit: (1) request a Standard/Admin role in Merchant for the audit service account (or export Diagnostics→Products once from the UI); (2) re-run statuses with full rights; (3) only then make item-level conclusions on waste/price/stock. Until then, Shopping conclusions stay narrowed, not final.

8 Appendix — coverage + summary

CampaignStatusSpend ₴Conv.Value ₴ROASTarget
Category AENABLED51,13525.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
Kyiv city16,64810.0top-spend, strong
Region H3,92940.6⭐ underfunded
Region G4,59435.1⭐ underfunded
5 regions≈9,0000❌ watchlist (0 conv)
  • Coverage: campaigns 5/5 (100% spend); asset groups 13/13; top-30 products by spend; geo — all 23 regions + Kyiv (100%); all 14 conversion actions.
  • GAQL: campaign · conversion_action(+segments) · campaign_criterion LOCATION · geographic_view · segments.device/lag · asset_group(+asset/signal) · campaign_asset · shopping_performance_view. GA4: sessionSourceMedium, newVsReturning, eventName. Keyword Planner. Merchant: product_statuses. fetch_page.
  • Reconciliation: Ads value 1,012,010 ↔ GA4 google/cpc 966,281 → +4.7% (value-level, web-purchase; doesn't cover the phone path). Data — live query time (read-only).