Як виглядає глибокий аудит 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.
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.
🔒 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.
P02. 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.
P13. 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.
P22 Full findings table (17)
| # | Area | Finding | Sev. | Conf. |
|---|---|---|---|---|
| F1 | Geo / compliance | The 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). | P0 | 95% / 80% |
| F2 | Measurement | The purchase_test conversion has primary_for_goal=true and recorded a conversion on the new campaign → double-counting risk. | P1 | 90% |
| F3 | Measurement / leads | Phone/leads under-counted: 1,488 hover_phones + 814 form_start (GA4, 30d) vs ~5 in Ads. Smart Bidding doesn't optimize on calls. | P1 | 75% |
| F4 | Structure / naming | Inconsistent campaign/group naming (a brand typo, default group names) — off standard. | P3 | 95% |
| F5 | PMax signals | Both groups of the active campaign (cat. B) have 0 search themes and 0 audience signals → PMax learns blind. | P2 | 95% |
| F6 | PMax creative | One group is empty (ad_strength=POOR, no headlines/media); the other is AVERAGE with a slangy/truncated headline. | P2 | 85% |
| F7 | Assets | No callouts, structured snippets, price or promotion on any campaign — despite a strong set of ALLOWED offers. | P2 | 90% |
| F8 | Product / feed | SKU 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). | P2 | 80% |
| F9 | Product / waste | Top-spend products with no conversions (4 items, ₴1,602 / ₴737 / ₴548 / ₴516, 0 conv) — candidates to isolate into a low-priority listing group. | P2 | 70% |
| F10 | Geo efficiency | 5 regions with spend and no conversions (≈10.6% spend, 0 conv) — watchlist; don't cut blind (small sample). | P2 | 60% |
| F11 | Geo concentration | Kyiv = 29% spend (ROAS 10 / 5.6); top-ROAS regions (40 / 35 / 48 / 31 / 27) are underfunded → room to concentrate. | P2 | 65% |
| F12 | Budget / strategy | Active campaigns exceed the ROAS target by 3–4×, budget not fully spent → room to scale / lower tROAS (after margin). | P2 | 70% |
| F13 | GA4 hygiene | GA4 sources include dev/spam referrers (localhost:8000, 127.0.0.1, a spam domain) with no internal filter. | P3 | 90% |
| F14 | Channels / incrementality | An independent paid channel outside Google Ads drives ₴665,646 revenue from 1,049 sessions → affects Ads attribution. | P2 | 80% |
| F15 | Merchant | 1 product disapproved (legal takedown, RU+UA); 2,968 offers in unknown (diagnostic rights — see §6). | P3 | 70% |
| F16 | Devices (CTV) | Tiny Connected TV spend with no conversions (~₴62) — immaterial, monitor. | P3 | 80% |
| F17 | Funnel | A sharp drop view_item (24,683) → add_to_cart (123) over 30d — typical for high-consideration, pointing to a phone/offline path outside Ads. | P2 | 65% |
3 Action plan — ADD before REMOVE
| Prio. | What | Expected effect |
|---|---|---|
| P0 | Add the 16 occupied-cities exclusions to the new campaign (copy from the other 4) | Remove non-delivery/leak in a war zone; compliance |
| P0 | Remove purchase_test from primary (secondary / archive) | Clean purchase count, no double-counting |
| P1 | Wire call/lead measurement as an Ads conversion (runbook below) | Smart Bidding "sees" phone sales |
| P1 | Add search themes + audience signals to category-B groups | Better PMax learning and targeting |
| P1 | Add callouts / snippets / price / promotion to the 2 active campaigns | CTR / ad quality, SERP coverage |
| P2 | Fill or turn off the empty asset group (POOR) | Remove ballast, raise ad_strength |
| P2 | Test: ↓tROAS on active campaigns OR ↑budget +10–25% (after margin) | More volume while keeping profitability |
| P2 | Resolve 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)
| Campaign | Status | Action | Mode |
|---|---|---|---|
| Category A (PMax) | ENABLED · ROAS 15.2 | KEEP + signals/assets; test ↑budget / ↓tROAS | phased / experiment |
| Category B (PMax, new) | ENABLED · ROAS 10.9 | PROTECT (geo exclusions) + signals + fill the groups | direct + phased |
| "Everything else" + B | PAUSED · ROAS 7.3 | INVESTIGATE — why paused; possible consolidation | question to client |
| Category C (electric) | PAUSED · ROAS 0.27 | KEEP PAUSED — weak economics | do_nothing |
| Category D (niche) | PAUSED · ROAS 31.6 (84 clicks) | INVESTIGATE — little data, high return; relaunch for the season | experiment |
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
Foundation
ADD
Tune
Prune
Scale
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):
| Type | Copy (by category) | Verdict | Reason |
|---|---|---|---|
| H | Buy [category A] | KEEP | EXCELLENT, intent-match |
| H | Economical [category A] for the home | KEEP | Benefit, grounded |
| H | Best [category-A goods] for the home | REPLACE | Soft superlative "best" → "from an official dealer" (trust) |
| H | Top [sub-category A] | REPLACE | "Top" is weak → "[sub-category] −15%" (benefit, grounded on the LP) |
| H | [Category A] + warranty | KEEP | Confirmed service/warranty in ALLOWED |
| H | Best prices on [slang for cat. B] | REPLACE | Slang/truncation + superlative → "[category B] in stock" (clarity) |
| H | [Category B], top range | KEEP | Intent (2,400/mo) |
| H | (no brand hook) | ADD | Brand-query demand 1,900/mo → "[brands]" (social proof) |
| H | (no service hook) | ADD | service-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 30d — add_to_cart without purchase → remarketing (no RM audiences in PMax signals today).
- High-intent — view_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
| Campaign | Status | Spend ₴ | Conv. | Value ₴ | ROAS | Target |
|---|---|---|---|---|---|---|
| Category A | ENABLED | 51,135 | 25.0 | 775,813 | 15.2 | 3.7 |
| Category B | ENABLED | 8,419 | 9.0 | 91,331 | 10.9 | 4.7 |
| Other + B | PAUSED | 13,120 | 8.0 | 95,902 | 7.3 | 14.0 |
| Category C | PAUSED | 11,270 | 1.0 | 3,042 | 0.27 | 14.0 |
| Category D | PAUSED | 1,451 | 2.0 | 45,922 | 31.6 | 14.0 |
| Total | 85,396 | 45.0 | 1,012,010 | 11.9 |
| Geo (top) | Spend ₴ | ROAS | Signal |
|---|---|---|---|
| Kyiv city | 16,648 | 10.0 | top-spend, strong |
| Region H | 3,929 | 40.6 | ⭐ underfunded |
| Region G | 4,594 | 35.1 | ⭐ underfunded |
| 5 regions | ≈9,000 | 0 | ❌ 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).