What does a deep Google Ads audit of an online store by UPLIFY look like?

A real (anonymized) deep Google Ads audit of an online store by UPLIFY: 24 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 · deep audit sample · google ads

Comprehensive Google Ads audit of an online store.

A real audit of a real UPLIFY client — fully anonymized. Niche, brands, domain and all IDs are hidden; all analytics, methodology, structure and actual metrics are preserved unchanged.

platform
Google Ads · PMax / Shopping
period
90 days
findings
24
sources
Ads · GA4 · Merchant · KP
validation
independent · 20 review notes
🔒 Anonymized. Name, domain, niche, brands and IDs (Ads / GA4 / Merchant) removed. This is a genuine report — the numbers, geo, account structure and conclusions are real; product categories are masked as A / B / C.
/ if you have exactly ninety seconds

The audit in 90 seconds.

audit-digest · 90s read nestor ai · verified
5 key takeaways
  • Web purchases can be trusted (Ads↔GA4 discrepancy just 4.7%), the phone channel is nearly invisible to Smart Bidding.
  • The new campaign with no exclusions for the 16 occupied cities — a compliance hole (P0).
  • Active campaigns exceed the ROAS target by 3-4× — there is room to scale once margins are confirmed.
  • Brand demand of ~4 800 queries/mo is not split into a dedicated campaign — blended ROAS is flattered.
  • The feed is “thin”: 412 of 2 969 offers with issues, on average 9 of 25+ attributes filled in.
First 3 actions (P0/P1)
  • Geo exclusions for occupied cities on the new campaign.
  • Test conversion purchase_test — out of primary.
  • Calls/leads → conversions in Ads (runbook in §3).
win type
  • Measurement: Smart Bidding will see phone sales.
  • Waste: cut waste on geo / products / duplicate SKUs.
  • Scale: 3-4× headroom on tROAS + underfunded top regions.
3 key limitations
  • Margins/targets not provided (client_input) → ₴ scaling blocked until confirmed.
  • Merchant item-level limited by access rights → product conclusions at feed level.
  • New campaign <30 days → read with a conversion-lag adjustment.
what makes the audit deep
  • 100% of spend covered: 5/5 campaigns, 13/13 asset groups, all 23 regions, all 14 conversion actions.
  • Every finding comes with evidence (GAQL / GA4 / Merchant) and a confidence %.
  • Ads↔GA4 reconciliation at value level, independent validation of the report.
/ honesty before conclusions

Data limitations — read these first.

what narrows this audit's conclusions
  • STEP-0 not completed by the client: no margins, target CPA/ROAS, stock or promo calendar → budget-scaling conclusions are narrowed (client_input). This does not block the audit — it only narrows the relevant conclusions.
  • Merchant is connected, feed read (≈2 969 offers); item-level statuses limited by access rights (2 968 in unknown) → product conclusions at feed level + a roadmap to lift the limitation (§6).
  • PMax API: no per-asset conversions / search IS / placement cost → asset-level waste/scale is presented via impressions/CTR, not cost-proof.
  • Conversion lag: new campaign (category B) <30 days, large share of UNKNOWN lag → the recent window is under-credited, confidence lowered.
  • GSC unavailable — organic cross-check limited (not a blocker; we worked with Ads + GA4 + Keyword Planner).
/ §0 · context

Store profile + Claim Ledger.

An online store of mid-to-high ticket products for the home, ≈1 480 unique SKUs × 2 languages. High-ticket, high-consideration demand (long decision cycle), pronounced seasonality across two product lines, an active phone order channel. The site is bilingual UA/RU — so SKU duplication in the feed is deliberate localization, not an error.

allowed

free delivery above a threshold · official dealer → manufacturer warranty · installment / split payment · after-sales service · state support program.

forbidden

“#1 / best / cheapest / market leader” · savings guarantee as an unconditional promise · any superlative without proof.

verify

specific % discounts in copy (they change) · “1-day delivery” · free service.

/ §1 · executive summary

Account state at a glance.

₴85 396
spend over 90 days
≈₴1 012 010
web conversion value
11.9
blended ROAS (web, excl. phone)
3-4×
ROAS target overshoot by active campaigns

Measurement verdict — “web purchases can be trusted, the full funnel — with an adjustment”. Web conversion value in Ads (₴1 012 010) nearly matches GA4 (₴966 281) — a ~4.7% discrepancy, below the 15% threshold. But the phone/lead path is heavily under-counted: 1 488 hover_phones + 814 form_start in GA4 vs ~5 in Ads — Smart Bidding sees only part of the conversions.

Compliance / geo

P0

The new active campaign (category B) lacks exclusions for the 16 occupied cities, which are set on 4 other campaigns. Budget waste + non-delivery risk → add the exclusions.

Measurement

P1

The test conversion is still primary and records conversions (double counting); phone/lead conversions are heavily under-counted → Smart Bidding optimizes only toward web-purchase.

Growth / hygiene

P2

3-4× ROAS headroom → room to scale (after margins); category B groups have no search-themes / signals; callouts / snippets / price / promotion are missing.

/ §2 · full findings table

24 findings — each with evidence.

P0 — critical now · P1 — significant, this week · P2 — this month's plan · P3 — hygiene.

#AreaFindingSev.Conf.
F1Geo / complianceThe new campaign (cat. B) targets the whole country with no exclusions for the 16 occupied cities, which are set on 4 other campaigns. Fact verified via GAQL.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 does not optimize toward calls.P175%
F4Structure / namingInconsistent campaign and group naming (a typo in the brand, default Russian 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 slang/truncated headline.P285%
F7ExtensionsNo callouts, structured snippets, price or promotion on any campaign — despite a strong set of ALLOWED offers.P290%
F8Product / feedDuplicate SKUs across the RU/UA feeds split impressions and budget: one language version converts, the duplicate has 0 conv and burns budget (5 SKUs confirmed).P280%
F9Product / 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%
F10Geo performance5 regions with spend and no conversions (≈10.6% of spend, 0 conv) — watchlist; don't cut blindly (small sample).P260%
F11Geo concentrationKyiv = 29% of spend (ROAS 10 / 5.6); top-ROAS regions (40 / 35 / 48 / 31 / 27) underfunded → room for concentration.P265%
F12Budget / strategyActive campaigns exceed the ROAS target by 3-4×, budget is not fully spent → room to scale / lower tROAS (after margins).P270%
F13GA4 hygieneGA4 sources include dev/spam referrers (localhost:8000, 127.0.0.1, a spam domain) with no internal-traffic filter.P390%
F14Channels / incrementalityAn independent paid channel outside Google Ads drives ₴665 646 in revenue from 1 049 sessions → affects Ads attribution.P280%
F15Merchant1 product disapproved (legal takedown, RU+UA); 2 968 offers in unknown (diagnostics rights — see §6).P370%
F16Devices (CTV)Minor spend on Connected TV with no conversions (~₴62) — immaterial, monitor.P380%
F17FunnelSharp drop from view_item (24 683) → add_to_cart (123) over 30d — typical for high-consideration, points to a phone/offline path.P265%
F18Merchant / feedThe feed is “thin”: 412 of 2 969 offers with item-level issues (no GTIN, short titles, boilerplate descriptions, watermarked photos, price mismatch) — §6a.P185%
F19Structure / brandNo branded Search campaign despite ~4 800 brand queries/mo: brand runs through PMax (pricier, no control) and inflates blended ROAS.P185%
F20Structure / SKUOne PMax “for everything”: top-30 SKUs drive 68% of spend, but are mixed with a ~1 450 SKU tail → Smart Bidding averages the bids.P180%
F21Signals / audiencesNot a single category-level audience signal: viewers of category A products are not fed as a signal into the category A campaign.P290%
F22MeasurementEnhanced Conversions disabled — without hashed first-party data, matching typically loses 5-15% (especially cross-device).P285%
F23PMax / mix≈38% of the active campaign's impressions are Display/YouTube placements with 0.1% CTR and zero conversions — a candidate for channel cleanup.P270%
F24Search queries≈14% of Shopping traffic spend goes to queries outside new-product purchase intent (used, repair, spare parts) → account-level negatives.P275%
/ §3 · action plan

ADD before REMOVE.

Prio.WhatExpected effect
P0Exclude the 16 occupied cities on the new campaign (copy from the 4 others)Eliminate non-delivery / waste; compliance
P0Remove purchase_test from primary (secondary / archive)Clean purchase count, no double counting
P1Connect call/lead measurement as a conversion in Ads (runbook below)Smart Bidding “sees” phone sales
P1Add search-themes + audience signals to cat. B groupsBetter 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 dead weight, raise ad_strength
P2Test: ↓tROAS on active campaigns OR ↑budget +10-25% (after margins)More volume while preserving profitability
P2Resolve RU/UA SKU duplicates in the feed (supplemental / custom_label)Less impression/budget cannibalization

“Call measurement” runbook — to avoid the “calls in GA4, 0 in Ads” gap

  1. In GA4, mark call_phones + form_start/submit as key events (one per session for a call).
  2. Import into Ads as conversion actions; count = One for the call.
  3. Keep on secondary (observe) until quality is confirmed — don't push straight to primary, so the current tROAS isn't broken.
  4. After 7-14 days reconcile Ads ↔ GA4; if a CRM is available — reconcile call→sale.
/ §3a · controllability

Success criteria, monitoring and rollback.

Every change is controlled: the control metric, observation window and rollback trigger are defined before implementation. A “before” snapshot is stored; rollback is a single action.

ChangeControl metricWindowRollback trigger
Geo exclusion of 16 citiesImpressions/conversions in remaining geos stable7 daysConversions drop >15% outside the excluded geos (unlikely)
purchase_test → secondaryPurchase conversion count (minus duplicates)7 daysPrimary conversions drop >20% → check the tags
Calls → Ads conversionsAds ↔ GA4 ↔ CRM reconciliation on count/quality7-14 daysJunk calls >30% → keep secondary, raise the duration threshold
Search-themes + cat. B signalsCampaign ROAS, share of new users14 daysROAS −10% two weeks in a row → remove the added signals
Brand Search (§3e)Total brand conversions PMax+Search; brand CPC14-21 daysTotal conversions drop >10% → return brand to PMax
/ §3b-3c · structure and budget

Target structure map before → after.

CampaignStatusActionMode
Category A (PMax)ENABLED · ROAS 15.2KEEP + signals/extensions; 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 for the client
Category C (electric)PAUSED · ROAS 0.27KEEP PAUSED weak unit economicsdo_nothing
Category D (niche)PAUSED · ROAS 31.6 (84 clicks)INVESTIGATE little data, high return; relaunch for the seasonexperiment
🟡 Budget increases are blocked until margins / target ROAS are confirmed (client_input). None of the active campaigns is currently budget-capped, so a direct budget ↑ won't add volume without lowering tROAS.

📐 Experiment design: PMax experiment 50/50. Conversions are few (8-9/mo), so a significant read of the ROAS effect takes 6-10 weeks per arm; read with a confidence interval, not a point estimate. Scaling is phased (+10-15% per step); “success” only with ≥20-30 conversions per arm.
/ §3d · 90 days

The 90-day roadmap.

W1-2

Foundation

P0: geo exclusions + test conversion out of primary. Call measurement, GA4 filters, fix the disapproved product.

W3-4

ADD

Signals for cat. B groups; callouts / snippets / price / promotion; fill the empty group; 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; decisions on weak geos based on accumulated data.

W11-13

Scale

After margins — scale into top-ROAS regions; relaunch the niche campaign for the season.

/ §3e · restructuring

Brand Search + Winners / Long tail.

1 · Split out Brand Search

F19

Brand queries (~4 800/mo) are the highest intent and the cheapest click, but are currently served by PMax with no copy control and inflate blended ROAS. Steps: brand core as exact/phrase → exclude brand from PMax (negative list) → read brand/generic separately.

2 · Winners / Long tail split

F20

Top-30 SKUs = 68% of spend and ROAS 15+, but mixed with a ~1 450 SKU tail. Via supplemental feed (reversible): PMax Winners (~60% of budget, aggressive tROAS) / PMax Catalog (~35%) / Low-priority (waste + duplicates, ~5%).

3 · Seasonal track for cat. B

SEASON

In a shared campaign the seasonal peak competes with evergreen exactly when demand is most expensive. A separate campaign + custom_label_2=season: raise the budget 2-3 weeks before the peak — and wind it down just as controllably.

Migration is phased to avoid resetting learning: W1 — labels in the supplemental feed; W2 — Winners on ~20% of budget in parallel; W3-4 — shift budget based on actual ROAS. Every step comes with a “before” snapshot and a rollback trigger (§3a).

/ §4 · keyword bank + copy

Copy analysis with verdicts.

Keyword Planner (UA, real volumes/mo): 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 reserve for search-themes and a future Search campaign.

TypeCopy (by category)VerdictReason
HBuy [category A]KEEPEXCELLENT, intent-match
HEconomical [category A] for the homeKEEPBenefit, grounded
HBest [products A] for the homeREPLACESuperlative “best” → “from an official dealer” (trust)
HTop [subcategory A]REPLACE“Top” is weak → “[subcategory] −15%” (benefit, grounded on the LP)
H[Category A] + warrantyKEEPService/warranty confirmed 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 & service”

⚙️ Executable copy-replacement cards are generated by the COPY-HOOKS live engine (the “Copy” tab in OS) — this is analysis only. In PMax, assets are not judged by conversions (per-asset conv=0 always).

/ §4b · creative

Prompt cards for new images.

Ready to paste into a generator for the weak/empty group. Each is a draft concept and needs brand/legal review. The product is masked; the technique is as in the real report.

1 · Product in a modern interior

1.91:1 · pmax/display · photorealism
"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 · desire
"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 · 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 · signals

GA4 audiences + category signals.

Base audiences (GA4 → Ads)

Buyers 90d — exclusion from prospecting + LAL signal · Cart abandoners 30d — remarketing (currently no RM audiences in PMax signals) · High-intent — view_item ≥2 or hover_phones/form_start without a purchase · Engaged ≥N — for LAL.

The principle of signal match

A signal must match the campaign's product mix — a “generic” audience applied to all campaigns dilutes PMax learning. Category-level signals today — zero (F21).

Audience (GA4)ConditionSignal target
Category A viewers, 30dview_item where item_category=A, no purchaseCategory A campaign (audience signal)
Category B viewers, 30dsame for BCategory B campaign
Cart without purchase, by categoryadd_to_cart − purchase, by item_categoryMatching campaign — the warmest signal
Cat. A buyers → cross-sellcat. A purchase within 180dCategory A accessories campaign (repeat purchase)

Merchant supplemental feed: custom_label_0 = margin_tier · custom_label_1 = performance (bestseller / 0-conv) · custom_label_2 = season · RU/UA SKU deduplication. Supplemental only — never products.insert.

/ §6a · merchant

A deep dive into the feed.

This is what a product breakdown looks like with full Merchant rights (item-level): for each issue type — how many offers, what it threatens, how to fix it. Total: 412 of 2 969 offers (≈14% of the feed).

IssueOffersRiskHow to fix
No GTIN/MPN187Limited performance, weaker matchingGTIN from the supplier; where missing — honestly set identifier_exists=false
Short title without attributes94Doesn't match long-tail queriesTemplate: [Category] [Brand] [Model] [Key attribute]
Boilerplate supplier description61Duplicated content → weaker relevanceRewrite the top-50 by spend; the rest in phases
Watermarked / low-quality photos38Disapproval risk + lower CTRClean pack shots (GMC requirements)
Site price ≠ feed19Suspension risk for price mismatchMore frequent feed refresh + monitoring
“Phantom” out-of-stock12Lost impressionsReconcile stock statuses, fix the sync
Disapproved (legal)1Product not shown at allRemove the claim from the page + re-review
“Thin feed” → enrichment plan (supplemental; the primary feed stays untouched). Currently filled on average: 9 of 25+ attributes. W1: custom_label_0-2 → unlocks Winners/Losers and profitability bidding · W2: title enrichment for 94 short ones + product_type to 3 levels · W3-4: GTIN campaign across 187 offers + photo cleanup for 38 · ongoing: sale_price for promos + daily disapprove/mismatch monitoring.
/ §7 · risks

Risks and caveats.

what to keep in mind when reading the numbers
  • Low conversion volume (8-9/mo per campaign): read tests with a confidence interval over 6-10 weeks, not a weekly point.
  • Conversion lag: high-ticket demand converts slowly — recent-window estimates are systematically understated.
  • The phone channel is invisible until call measurement is in place — ROAS judgments cover web purchases only.
  • ₴ scaling is blocked until the client confirms margins/targets — the minimum-evidence rule.
  • Item-level Merchant conclusions require full access rights — until then they are narrowed, not final.
  • Seasonality: week-over-week comparisons are valid only with category A/B seasonal windows taken into account.
/ §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% of spend) · asset groups 13/13 · geo — all 23 regions + Kyiv · all 14 conversion actions. GAQL: campaign · conversion_action · campaign_criterion LOCATION · geographic_view · segments.device/lag · asset_group · shopping_performance_view. Reconciliation: Ads 1 012 010 ↔ GA4 966 281 → +4.7% (web-purchase). Data — live read-only.

Nestor AI — the AI operator of UPLIFY OS

How this audit was made.

This report was prepared by Nestor AI — our AI operator in UPLIFY OS: senior-level analysis using our own methodology, with independent validation (20 review notes incorporated). All proposed changes are approved by a manager — nothing is applied automatically; every change is reversible and logged.

© UPLIFY · AI-first performance agency · uplify.agency · sample anonymized: a real client; the numbers / geo / structure are real