Як виглядає глибокий аудит пошукової реклами Google Ads (Search) інтернет-магазину від UPLIFY?
A real (anonymized) deep Google Ads Search audit of an online store by UPLIFY: 16 findings, search-terms analysis, negatives, Quality Score, RSA and impression share, 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
Search audit
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. This is an audit specifically of Search campaigns — keywords, search terms, negatives, Quality Score, RSA and impression share.
🔒 Anonymized. Name, domain, niche, brands and IDs (Ads / GA4) removed. This is a real report — figures, geo, account structure and conclusions are real; product categories and keywords masked to A / B / C and category level.
🟡 Data limitations — read first
- STEP-0 not filled in by the client: no margin, target CPA/ROAS, pause context or brand restrictions → conclusions about scaling and target bids are narrowed (client_input). This does NOT block the audit — it only narrows the relevant conclusions.
- 90-day search terms read in full (search-terms report + n-gram), but Google hides part of the "other search terms" with low volumes → the waste estimate is a lower bound; the real share of junk traffic is higher.
- Offline conversions / CRM absent: phone sales are not imported into Ads → the call path is under-counted, and some "zero" keywords actually bring leads (this narrows conclusions about turning keywords off).
- Auction Insights sampled — competitor impression shares are given as a trend, not as an exact metric.
- GSC unavailable — the organic/brand-demand cross-check is limited (not a blocker; we worked on 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 SKU × 2 languages) and an active phone order channel. Considered demand (a long purchase decision) → many informational queries in the niche ("how to choose", "which is better", "reviews") and strong brand demand for the store's own name. The site is bilingual UA/RU. This is a profile in which Search is simultaneously highly profitable on transactional and brand queries and very easy to bleed budget on informational/non-targeted traffic — which is why keyword and negative hygiene is critical here.
CLAIM LEDGER — what can / cannot be claimed in ad copy:
- ALLOWED free delivery above an order threshold; official dealer → manufacturer warranty; installments / financing; service & maintenance; in stock.
- FORBIDDEN "#1 / best / cheapest / market leader"; guaranteed savings as an unconditional promise; any superlative without proof (also a risk of ad disapproval under Google policy).
- VERIFY specific discount % in copy (they change → risk of mismatch with the LP); "delivery in 1 day"; prices in descriptions.
1 Executive summary
The account has 6 Search campaigns (5 active, 1 paused): Brand, two category campaigns (A, B), a Generic/competitive one, a DSA, plus one old paused campaign. Health is average. 90-day spend — ₴118,240, web-conversion value — ≈₴1,015,000, blended ROAS ≈ 8.6. BUT this blend is misleading: the Brand campaign delivers ROAS ≈ 41.9 and "pulls" the whole account up — the true non-brand Search ROAS ≈ 4.7, and the competitive campaign is just 2.2.
Measurement verdict — "trust web purchases; the full funnel with a caveat." Web-conversion value in Ads almost matches GA4 google/cpc purchaseRevenue (a ~5% 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), and the non-brand campaigns run on Maximize Clicks — i.e. they optimize for cheap clicks, not for sales.
1. Keyword and negative hygiene — critical
64% of non-brand keywords are broad match without a shared negatives list. The search-terms report shows that ≈27% of non-brand spend (≈₴28,600) goes to non-targeted queries: informational ("how to choose"), used, repair, "DIY", competitor brands, jobs. This is the fastest way to claw back budget.
P02. Measurement + bid strategy
The test conversion purchase_test is still primary; phone/lead conversions are under-counted; the non-brand campaigns run on Maximize Clicks → Smart Bidding can't optimize on value. First fix the signal, then migrate the bidding.
P13. Quality and reach ceiling
Brand traffic leaks into non-brand (no brand-exclusion — can't see the real non-brand economics); 7/12 groups have POOR/AVERAGE RSA with over-pinning; 0 structured snippets, 3 campaigns lack sitelinks; the non-brand campaign loses IS(budget) 26% + IS(rank) 33% → the demand is there and we aren't capturing it.
P22 Measurement (GATE) — signal first, then bidding
A Search audit starts with measurement, because any automated bid strategy is only as smart as the conversion signal is clean. There are three issues here to close before migrating to Smart Bidding:
- Test conversion in primary. purchase_test has primary_for_goal=true → a risk of double counting and of distorting tCPA/tROAS if we migrate now.
- Phone/leads under-counted. 1,488 hover_phones + 814 form_start (GA4, 30d) vs ~5 in Ads → for a high-consideration niche with a call channel this means that a significant share of non-brand keywords looks "zero" while actually generating calls. Don't cut blind.
- Value not passed. Some conversion actions have no value → tROAS "sees" incomplete revenue.
Sequencing rule: (1) remove the test conversion from primary → (2) wire qualified calls / submit-leads / purchase as conversion actions (secondary/observe; keep hover_phones/form_start diagnostic-only, not optimization goals) → (3) wait 2–3 weeks of clean data → (4) only then migrate the bidding. Otherwise Smart Bidding "cements" the current distortions.
3 Account architecture + full findings table (16)
The structure by campaign is sensible (brand / categories / DSA), but inside there's a mix of brand and non-brand traffic, broad without negatives, and weak RSAs. Below is the full register of findings with severity and confidence.
| # | Area | Finding | Sev. | Conf. |
|---|---|---|---|---|
| F1 | Keywords / negatives | 64% of non-brand keywords are broad without a shared negatives list. Search terms: ≈27% of non-brand spend on non-targeted queries (informational, used, repair, competitors, jobs). Fact verified via the search-terms report. | P0 | 90% |
| F2 | Structure / brand | Brand queries leak into the non-brand campaigns (no brand-exclusion negatives; 1,142 brand clicks — §4) → non-brand ROAS inflated, brand traffic burns more expensively at lower QS. | P1 | 95% |
| F3 | Search terms / n-gram | Top junk tokens: used, repair, DIY, [competitor], manual, jobs — ₴28.6k over 90d in total, ≈0 conv. | P1 | 85% |
| F4 | Negatives / conflict | A campaign-level negative [token] blocks a converting query in another group (the negative "eats" money). The old paused campaign adds negatives to the shared list. | P2 | 80% |
| F5 | Quality Score | 41% of non-brand spend on keywords with QS ≤4. The weakest component is Landing Page Experience (non-brand keywords point to the home page, not the category) + Ad Relevance. | P2 | 85% |
| F6 | RSA / ads | 7/12 groups have POOR/AVERAGE ad strength; in 4 groups all headline positions are pinned (kills RSA combinations); 6 groups have <8 headlines; one group has only 1 RSA. | P2 | 90% |
| F7 | Assets / extensions | 3 campaigns have no sitelinks; 0 structured snippets across the account; no price/promotion despite a strong set of ALLOWED offers; no call asset / lead form (and the channel is phone-based). | P1 | 90% |
| F8 | Impression share | Category A loses IS(budget) 26% + IS(rank) 33% → we aren't capturing real demand. Brand loses IS(rank) 10% due to a competitor bidding on the brand. | P1 | 85% |
| F9 | Bid strategy | Non-brand campaigns run on Maximize Clicks on a conversion account → optimizing for cheap clicks, not value. Migration to tCPA/tROAS — after the measurement fix. | P1 | 90% |
| F10 | Measurement | The test conversion purchase_test in primary; phone/leads under-counted (1,488 hover + 814 form_start in GA4 vs ~5 in Ads); some actions without value. | P1 | 80% |
| F11 | Duplicate keywords | The same keyword in 2+ groups → internal competition, unpredictable serving, dilution of QS data. | P2 | 85% |
| F12 | Landing pages | Non-brand category keywords point to the home page, not a category LP → hits LP experience in QS and CVR. | P2 | 80% |
| F13 | Geo / compliance | Occupied-cities exclusions are set on 4/6 campaigns — 2 campaigns without exclusions (a leak in a war zone + a non-delivery risk). No ad schedule → spend in nighttime 0-conv hours. | P0 | 90% |
| F14 | Devices | Mobile = 58% of spend, CVR ≈0.7× of desktop, no device-efficiency review (observe for now, don't cut). | P3 | 75% |
| F15 | Auction Insights | A competitor's impression share grows +12 pp on non-brand; pressure on brand defense → monitor, hold the brand IS. | P3 | 65% |
| F16 | Structure / naming | Inconsistent campaign/group naming (default RU names), an old paused campaign with active negatives in the shared list — off standard. | P3 | 95% |
4 Search Terms + negatives — the main lever
This is the signature section of a Search audit: an n-gram breakdown of the 90-day search-terms report. The principle — not "turn keywords off", but block non-targeted queries with negatives and move broad into a controlled mode (phrase / exact + broad only under Smart Bidding with a clean signal).
TOP waste tokens (n-gram, by category):
| Token / pattern | Spend ₴ | Conv. | Action |
|---|---|---|---|
| used, 2nd-hand, pre-owned* | 6 240 | 0 | negative (exact+phrase), a "used" list |
| repair, fix, not working | 5 110 | 1 | negative "service-intent" |
| DIY, how to make, schematic | 4 880 | 0 | negative "DIY/info" |
| [competitor brands] | 5 360 | 3 | move into a separate conquest campaign or negative |
| manual, reviews, forum | 3 920 | 2 | negative "research", some → into a separate info group |
| jobs, work, wholesale, dropship | 3 090 | 0 | negative "non-buyer" |
| Total waste | ≈28 600 | 6 | ≈27% of non-brand spend |
Brand leak in reverse: in the non-brand campaigns we found 1,142 clicks on brand queries (the store's own name) — they should go to the cheap Brand campaign with a higher QS, not burn the non-brand budget. This is part of F2.
Negatives structure (target): 3 shared lists — used/repair/DIY, non-buyer (jobs/wholesale), brand-exclusions (brand as a negative in non-brand) — attached to all non-brand campaigns; remove the conflicting negatives (F4). No "mass keyword turn-off" without checking the call path.
5 Quality Score + full RSA analysis
Quality Score (by category, by spend): 41% of non-brand spend on keywords with QS ≤4, 33% on QS 5–7, only 26% on QS 8–10. Decomposition: Landing Page Experience = Below average on 7 of 12 groups (home page instead of category, F12), Ad Relevance = Below average on 5 groups (RSA doesn't contain the keyword text), Expected CTR = Average/Above. So QS is fixed with landing pages + RSA relevance, not bids.
Full review of the headlines of two non-brand groups (copy masked to category level; verdict + reason + claim safety — as in the real report):
| Type | Copy (by category) | Verdict | Reason |
|---|---|---|---|
| H (pin 1) | Buy [category A] in Ukraine | KEEP | Intent-match, but unpin it — let RSA test the position |
| H | [Category A] from an official dealer | KEEP | Trust, ALLOWED (warranty/dealer) |
| H | Best [category-A goods] 2026 | REPLACE | Superlative "best" (FORBIDDEN + disapproval risk) → "[category A] in stock" |
| H | Top prices on [slang for B] | REPLACE | Slang + "top" is weak → "[category B] — installments" |
| H | [Category A] + warranty | KEEP | Confirmed service/warranty in ALLOWED |
| H | (no delivery hook) | ADD | ALLOWED offer → "Free delivery" (≤30) |
| H | (no category-keyword) | ADD | Ad Relevance → add a headline with the exact keyword text |
| D (pin) | description pinned to position 1 | REPLACE | Unpin the description → give RSA 2–4 descriptions without pins |
⚙️ Pin rule: avoid over-pinning. Pin only what's critical (brand/legal/required keyword) and as few assets as possible; when all positions are pinned, RSA can't build combinations and ad strength drops to POOR. Executable replacement cards are generated by the live engine COPY-HOOKS (the "Texts" tab in OS) — here it's analysis only.
5b RSA — a ready set for a weak group
A ready-to-paste set for a group with POOR. Each headline ≤30 characters, descriptions ≤90; "a draft concept, needs brand/legal review against the Claim Ledger." The category is masked; the technique (counts, pins, prohibitions) is as in the real report.
Headlines (up to 15 — full set for better ad strength)
≤30 chars each · pin only if needed (here — keyword at pos.1)
"Buy [category A] · [Category A] in stock · [Category A] from a dealer · Official warranty · Free delivery · Installments · [Category A] with service · Delivery across Ukraine · [Sub-category A] in the catalog · Phone consultation · [Category A] to order · 0% financing · Verified quality · Wide range of [A] · Order online"
Descriptions (up to 4 — no pins)
≤90 characters · each contains 1 ALLOWED offer + intent (count placeholders when filled)
"Official dealer of [A]: manufacturer warranty and service. Free delivery above [threshold]. · Wide range of [A] in stock. Installments and 0% financing. · We'll help you choose by phone. Delivery across Ukraine, cash on delivery. · [A] with warranty and maintenance. Order online or call."
Prohibitions (claim-safety)
check before publishing
"NO "#1 / best / cheapest / leader"; NO unconditional savings promises; NO specific discount % (they change); NO delivery times without confirmation; avoid over-pinning (pin only critical); each headline ≤30, description ≤90 characters (count with placeholders filled); verify that the offers in the headlines match the landing page."
6 Impression Share + bid-migration design
📊 Reach ceiling. Category A: search_impression_share 41%, lost_IS(budget) 26%, lost_IS(rank) 33% — i.e. we aren't capturing 59% of available impression share: part through budget (easily fixed), part through position/QS (fixed via §5 + landing pages). Brand: IS 88%, lost_IS(rank) 10% — a competitor bids on our brand, hold the brand defense.
🟡 Budget increases are blocked until margin / target-CPA are confirmed (client_input) — minimal-evidence rule. But sequencing matters more than speed: first remove waste (§4) → budget frees up on its own → redirect it into IS(budget) for cat. A.
📐 Bid-migration design. Non-brand is on Maximize Clicks today. Route: (1) fix measurement (GATE) → (2) Maximize Conversions without tCPA for 2–3 weeks (build a base) → (3) add tCPA at the level of the current actual, no more aggressive → (4) for cat. A with value — test tROAS as a 50/50 experiment. Read by a confidence interval, not a point; "success" only with ≥20–30 conversions per arm and a window for conversion lag. Keep Brand separate (Manual/Max Conv, don't mix with non-brand).
7 Action plan — ADD/PROTECT before REMOVE
| Prio. | What | Expected effect |
|---|---|---|
| P0 | Attach 3 shared negatives lists (used/repair/DIY, non-buyer, brand-exclusions) to all non-brand campaigns | Stop the ≈₴28.6k/90d leak; higher QS and CVR |
| P0 | Add occupied-cities exclusions to the 2 campaigns without them; add an ad schedule | Compliance; remove nighttime 0-conv traffic |
| P1 | Remove purchase_test from primary; wire calls/leads (secondary) | Clean signal before the bid migration |
| P1 | Brand-exclusion negative in the non-brand campaigns (brand as a negative); strengthen brand defense | Real non-brand economics visible; cheaper brand traffic |
| P1 | Sitelinks on 3 campaigns + structured snippets + call asset/lead form across the account | CTR, SERP coverage, the call path in the report |
| P1 | Migrate non-brand from Maximize Clicks → Max Conv → tCPA (after GATE) | Optimization for sales, not cheap clicks |
| P2 | RSA: remove excess pins, build up to 15 headlines / 4 descriptions on the weak groups | Ad strength POOR → GOOD/STRONG, more combinations |
| P2 | Non-brand keywords → category landing pages (not the home page) | LP experience in QS, higher CVR |
7b Target structure map (before → after)
| Campaign | Status / ROAS | Action | Mode |
|---|---|---|---|
| Brand (separate, unprotected in non-brand) | ROAS ≈41.9 | PROTECT: brand-exclusion negative in non-brand + brand defense | direct |
| Category A (Search) | ENABLED · ROAS 5.7 | PROTECT + SCALE: negatives, landing pages, IS(budget), tCPA | phased / experiment |
| Category B (Search) | ENABLED · ROAS 4.2 | FIX: RSA, negatives, landing pages; then scale | phased |
| Generic / competitive | ENABLED · ROAS 2.2 | INVESTIGATE: hard negatives or narrow exact; conquest separately | experiment |
| DSA | ENABLED · ROAS 7.5 | KEEP + page feed on categories, negative DSA targets | keep / tune |
| Old paused | PAUSED | ARCHIVE: remove the negatives from the shared list | do_nothing |
Principle: ADD first (negatives, extensions, landing pages, clean measurement) and PROTECT (brand, cat. A) → signal stabilization → only then the bid migration and scaling.
7c 90-day roadmap
Stop the bleed
Signal
Creative
Bidding
Scale
8 Appendix — coverage + summary
| Campaign | Status | Spend ₴ | Conv. | Value ₴ | ROAS | Strategy |
|---|---|---|---|---|---|---|
| Brand | ENABLED | 12 400 | — | 520 000 | 41.9 | Max Clicks |
| Category A | ENABLED | 41 300 | — | 235 000 | 5.7 | Max Clicks |
| Category B | ENABLED | 33 800 | — | 142 000 | 4.2 | Max Clicks |
| Generic / comp. | ENABLED | 18 900 | — | 41 000 | 2.2 | Max Clicks |
| DSA | ENABLED | 9 100 | — | 68 000 | 7.5 | tCPA |
| Old | PAUSED | 2 740 | — | 9 000 | 3.3 | — |
| Total | 118 240 | 1 015 000 | 8.6 | ex-brand 4.7 |
| Ceiling signal | Category A | Brand | Action |
|---|---|---|---|
| Search IS | 41% | 88% | capture cat. A demand |
| Lost IS (budget) | 26% | 2% | after waste → budget into cat. A |
| Lost IS (rank) | 33% | 10% | QS/landing pages; brand defense |
- Coverage: campaigns 6/6 (100% spend); ad groups 12/12; top-200 keywords by spend; search terms 90d (n-gram); geo — all regions + Kyiv; all conversion actions; RSA of all active groups (ad strength + pins).
- GAQL: campaign(+bidding_strategy) · ad_group · ad_group_criterion KEYWORD(+quality_info) · search_term_view · ad_group_ad(RSA, ad_strength) · campaign_asset/asset · campaign_criterion(LOCATION, NEGATIVE) · geographic_view · segments.device · auction_insight. GA4: sessionSourceMedium, eventName, hover_phones/form_start. Keyword Planner.
- Reconciliation: Ads value ↔ GA4 google/cpc → +5% (value-level, web-purchase; doesn't cover the phone path). Data — live query time (read-only).