Brand Search CPC Analysis
Summary
The “Brand Search - SC” campaign (ID 66) experienced a sudden CPC increase of ~4x starting January 29, 2026. Daily spend nearly tripled while clicks dropped. The root cause has been confirmed via the Google Ads change_event API:
- Jan 29 — A new “Hairpin” ad group was added with generic keywords “hairpin” and “hairpin.com” (both EXACT, £10 CPC bid). Google ignores the “.com” punctuation, so both effectively match “hairpin” — a generic word with no brand intent. Under Maximize Conversion Value (tROAS 4x), Smart Bidding tested these aggressively.
- Jan 29 — The primary domain was switched from thehairpinlegcompany.co.uk to hairpin.com, and Google Merchant Centre was temporarily suspended (~24 hours).
- Feb 3 — In response to the elevated CPCs, the bidding strategy was switched from Maximize Conversion Value (tROAS 4x) to Target Spend with a £5 CPC ceiling. This stopped the worst blowouts but locked CPCs at ~£4.80.
The campaign was not on Target Spend when the spike began. The previous analysis incorrectly attributed the spike to a competitor entering brand auctions — the changelog shows it was the generic keyword addition combined with the domain migration.
Campaign Configuration
| Setting | Current Value | Before Jan 29 | Notes |
|---|---|---|---|
| Campaign ID | 66 | 66 | |
| Name | Brand Search - SC | Brand Search - SC | |
| Type | Search (SEARCH_STANDARD) | Search (SEARCH_STANDARD) | |
| Bidding strategy | TARGET_SPEND (£5 CPC ceiling) | MAXIMIZE_CONVERSION_VALUE (tROAS 4x) | Changed Feb 3 — reactive, not the cause |
| Daily budget | £200 | £200 | |
| Serving status | SERVING | SERVING |
Bidding Strategy Timeline (from change_event API)
| Date | Change | Detail |
|---|---|---|
| Pre Jan 29 | Maximize Conversion Value | tROAS target 4x |
| Feb 3 12:24 | tROAS raised | 4x → 5x (attempted fix) |
| Feb 3 12:38 | Strategy switched | Maximize Conversion Value → Target Spend with £5 CPC ceiling (damage control) |
Ad Groups
| ID | Name | Status | Max CPC Bid | First Data | Total Clicks | Revenue | Conversions |
|---|---|---|---|---|---|---|---|
| 298 | The Hair Pin Leg Company | ENABLED | £10.00 | Dec 12 (at least) | 2,085 | £14,377 | 136.1 |
| 513 | Hairpin | ENABLED | £10.00 | Jan 29 | 14 | £0 | 0 |
Hairpin Ad Group: The Problem
The Hairpin ad group was created Jan 29 at 12:54pm as a copy of the THLC ad group (315 keywords in common). It has 2 unique keywords:
- “hairpin” (EXACT) — a generic word meaning hair accessories, road bends, crochet stitches, etc. Not a brand term.
- “hairpin.com” (EXACT) — Google Ads ignores punctuation, so this is treated identically to “hairpin”. A navigational query that organic handles.
Under Maximize Conversion Value (tROAS 4x), Smart Bidding tested these generic keywords aggressively — bidding up to £10/click trying to find conversions from “hairpin” searchers who have no intent to buy table legs. The generic keywords also likely degraded campaign-level quality signals, raising CPCs on all keywords in the campaign.
Changelog (change_event API) for the Hairpin ad group:
- 12:54:08 — Created as “The Hair Pin Leg Company #2” (PAUSED), copied from THLC ad group, £10 CPC bid
- 12:54:10 — Hundreds of negative keywords and positive keywords copied in
- 12:54:21 — 7 responsive search ads created
- 12:55:12 — Renamed to “Hairpin”
- 12:58:00 — Status changed to ENABLED
The CPC Regime Change
Before/After January 29
| Metric | Dec 12 – Jan 28 (48 days) | Jan 29 – Feb 10 (13 days) | Change |
|---|---|---|---|
| Avg CPC | £1.47 | £6.05 | +312% |
| Avg daily spend | £55 | £158 | +187% |
| Budget utilisation | 28% of £200 | 79% of £200 | +183% |
| Avg daily clicks | 38 | 26 | -32% |
| Avg impression share | 93.5% | 74.7% | -20% |
| ROAS | 3.97x | 1.93x | -51% |
Weekly Progression
| Week | Impr | Clicks | Cost | CPC | Conv | ROAS | Avg IS |
|---|---|---|---|---|---|---|---|
| Dec 8–14 | 325 | 98 | £147 | £1.50 | 7.0 | 3.04x | 96.6% |
| Dec 15–21 | 692 | 200 | £350 | £1.75 | 14.0 | 4.08x | 95.1% |
| Dec 22–28 | 487 | 152 | £215 | £1.41 | 9.0 | 3.67x | 95.5% |
| Dec 29–Jan 4 | 925 | 286 | £354 | £1.24 | 21.0 | 3.97x | 93.9% |
| Jan 5–11 | 1,114 | 352 | £496 | £1.41 | 25.0 | 4.45x | 92.1% |
| Jan 12–18 | 1,050 | 312 | £491 | £1.57 | 18.0 | 4.20x | 92.0% |
| Jan 19–25 | 968 | 298 | £449 | £1.51 | 14.0 | 3.00x | 91.0% |
| Jan 26–Feb 1 | 754 | 215 | £1,231 | £5.73 | 16.2 | 1.66x | 84.2% |
| Feb 2–8 | 570 | 166 | £929 | £5.59 | 12.0 | 2.85x | 69.8% |
| Feb 9 (1 day) | 75 | 20 | £98 | £4.89 | 0.0 | 0.00x | 63.2% |
Extreme CPC Days
| Date | Clicks | Cost | CPC | Note |
|---|---|---|---|---|
| Jan 30 | 26 | £363 | £13.98 | Highest CPC day — 9.5x the Dec average |
| Jan 31 | 20 | £274 | £13.68 | Second highest |
| Feb 2 | 19 | £225 | £11.85 | |
| Feb 1 | 20 | £155 | £7.74 |
Root Cause Analysis
The Google Ads change_event API (29-day lookback) and domain migration records together confirm the full causal chain. The previous analysis incorrectly attributed the spike to competitor entry and TARGET_SPEND overbidding. Both were wrong.
1. Generic “hairpin” keyword added to brand campaign (primary cause)
On Jan 29 at 12:54pm, a new “Hairpin” ad group was created in Brand Search with two unique keywords: “hairpin” (EXACT) and “hairpin.com” (EXACT). Google Ads ignores punctuation, so both effectively match the generic term “hairpin.”
“Hairpin” is not a brand term — it’s a common English word meaning a hair accessory, a type of road bend, or a crochet stitch. Adding it to a brand campaign under Smart Bidding (Maximize Conversion Value, tROAS 4x) caused:
- Aggressive bid testing — Smart Bidding had no conversion history for the new keyword, so it tested aggressively with the £10 CPC bid ceiling, bidding up to £14/click trying to find conversions from people searching for hair pins
- Campaign-level quality signal degradation — low CTR and zero conversions on the generic keyword dragged down quality signals across the entire campaign, raising CPCs on established brand terms too
- Impression share loss — not from a competitor entering the auction, but from the campaign’s own degraded quality reducing ad rank
While the Hairpin ad group itself only accounts for ~3% of post-spike clicks directly, its indirect effect on campaign quality signals likely inflated CPCs on all 630+ keywords across both ad groups.
2. Ad final URLs pointed to the old domain during the spike (contributing factor)
The changelog confirms that ad final URLs were not updated as part of the domain migration. All 7 Hairpin ad group ads were created at 12:54pm on Jan 29 with https://www.thehairpinlegcompany.co.uk/ as the final URL. The existing THLC ad group ads also still had the old domain. New ads with https://www.hairpin.com/ URLs weren’t created in the THLC ad group until Feb 3 at 12:29pm (“We’re Now Hairpin.com!” ad).
During the entire Jan 29 – Feb 3 spike period, most ads were serving with the old domain as the final URL, which 301-redirected to hairpin.com. This would have gradually degraded Quality Score’s landing page experience component — Google sees a mismatch between the ad’s declared landing page and the actual destination, plus the redirect adds latency.
However, this was a slow-burn factor, not the spike trigger. Quality Score recalculation happens over days to weeks, not hours. The 301 redirect alone would not cause CPC to jump from £1.47 to £13.98 overnight. It compounded the damage from the generic keyword by making QS recovery slower, but the immediate spike was caused by Smart Bidding’s aggressive testing of the new “hairpin” keyword.
Ad URL migration timeline (from change_event API):
| Date/Time | Event | Detail |
|---|---|---|
| Pre Jan 29 | THLC ad group | 7 existing RSA ads with thehairpinlegcompany.co.uk final URLs |
| Jan 29 12:54 | Hairpin ad group created | 7 RSA ads copied with thehairpinlegcompany.co.uk final URLs |
| Feb 3 12:29 | 2 new THLC ads created | With hairpin.com final URLs (incl. “We’re Now Hairpin.com!“) |
| Feb 3 12:32 | New THLC ad enabled | ”We’re Now Hairpin.com!” switched from PAUSED to ENABLED |
| Feb 3 12:36 | Old THLC ad paused | One pre-existing ad switched from ENABLED to PAUSED |
| Unknown | Remaining ads updated | All 14 other ads now show hairpin.com — change not captured in changelog |
Current state (16 ads total):
- THLC ad group: 9 ads (2 ENABLED, 7 PAUSED) — all hairpin.com
- Hairpin ad group: 7 ads (2 ENABLED, 5 PAUSED) — all hairpin.com
3. Domain migration (background factor, same day)
At 12:15pm on Jan 29 — 40 minutes before the ad group was created — the primary domain was switched from thehairpinlegcompany.co.uk to hairpin.com. The new domain had no Google Ads quality history (no landing page experience scores, no conversion data). This meant Quality Score’s landing page component needed to be re-evaluated from scratch — a gradual process that would have dragged on quality signals over the following weeks.
Like the URL mismatch above, this is a background factor that slowed recovery rather than caused the spike.
GMC suspension did not affect Brand Search. Google Merchant Centre was suspended for ~24 hours after the domain switch. This impacted Shopping campaigns (which pull product data from GMC), but GMC and Google Ads Search are separate systems. There is no documented mechanism by which a GMC suspension degrades Search campaign quality scores or bidding. The earlier version of this analysis overstated the GMC impact on Brand Search.
4. Bidding strategy switch was reactive (Feb 3)
The switch from Maximize Conversion Value to Target Spend was not the cause — it was damage control. The changelog shows:
- Feb 3 12:24 — tROAS raised from 4x to 5x (attempted to make Smart Bidding more conservative)
- Feb 3 12:38 — 14 minutes later, abandoned Smart Bidding entirely and switched to Target Spend with £5 CPC ceiling
This stopped the £14/click blowouts (Jan 30–31) but locked CPCs at ~£4.80 — the ceiling acts as both a cap and a floor, since Google bids close to the maximum allowed under Target Spend.
5. Competitor entry was not confirmed
The previous analysis attributed the impression share drop to a competitor entering brand auctions. The changelog shows no evidence of this. The IS decline is more consistent with the campaign’s own quality degradation — lower Quality Score means lower ad rank, which means fewer auctions won, which looks like an impression share loss even without a new competitor.
Financial Impact
Estimated waste (Jan 27 – Feb 9, 14 days):
- Actual spend: £2,215 (at £6.05 avg CPC, 366 clicks)
- Expected spend at pre-change rates: ~£535 (at £1.47 CPC, 26 clicks/day)
- Excess cost: ~£1,680 (~£120/day)
This assumes clicks would have remained at the post-change level of 26/day. The actual waste may be higher if the inflated CPCs also suppressed click volume (impression share dropping suggests fewer total impressions to click on).
Device Breakdown (30 days, Jan 11 – Feb 9)
| Device | Spend | % Spend | Clicks | CPC | Conv | Revenue | ROAS |
|---|---|---|---|---|---|---|---|
| Mobile | £1,699 | 51.4% | 610 | £2.79 | 36.9 | £4,301 | 2.53x |
| Desktop | £1,530 | 46.3% | 423 | £3.62 | 28.2 | £4,260 | 2.78x |
| Tablet | £74 | 2.2% | 29 | £2.55 | 1.0 | £40 | 0.54x |
Key findings:
- Desktop CPC is 30% higher than mobile (£3.62 vs £2.79) but ROAS is only marginally better (2.78x vs 2.53x). Desktop is where the TARGET_SPEND overbidding hits hardest — brand searches on desktop are more competitive.
- Mobile accounts for more conversions (36.9 vs 28.2) at a lower cost per click. The campaign’s CPC inflation problem is amplified on desktop.
- Tablet is negligible — £74 spend, 1 conversion, not worth optimising for.
If switching to Target Impression Share (recommended above), consider setting a lower CPC cap on desktop than mobile, or applying a negative device bid adjustment on desktop to counteract the CPC premium.
Search Term Cannibalization with Brand Shopping
Search term data (30 days) shows Brand Search and Brand Shopping compete on the same queries:
| Search Term | Brand Search | Brand Shopping | ||
|---|---|---|---|---|
| Clicks / Cost / Conv | CPC | Clicks / Cost / Conv | CPC | |
| hairpin leg company | 605 / £1,797 / 40.2 | £2.97 | 53 / £60 / 2.0 | £1.14 |
| the hairpin leg company | 153 / £326 / 8.0 | £2.13 | 14 / £15 / 1.0 | £1.08 |
| the hairpin leg co | 35 / £112 / 1.0 | £3.20 | 2 / £1 / 0.0 | £0.25 |
| hairpin leg co | 27 / £71 / 1.0 | £2.62 | 2 / £1 / 0.0 | £0.42 |
| hairpin legs | 30 / £97 / 2.0 | £3.24 | 19 / £15 / 0.6 | £0.81 |
| hairpin | 10 / £49 / 0.0 | £4.93 | 1 / £1 / 0.0 | £0.97 |
Combined overlap spend: £413 (Search: £385 + Shopping: £28)
The pattern is stark: Brand Search pays 2–5x higher CPC than Brand Shopping for the same queries. Shopping ads show product images and prices, making them naturally more click-efficient for brand queries. The search text ads are overbidding due to TARGET_SPEND.
This reinforces the recommendation to switch away from TARGET_SPEND. A well-configured Brand Shopping campaign could capture most brand traffic at a fraction of the CPC, with Brand Search serving as a safety net at a capped CPC.
Data Gaps (Updated)
| Question | Status | Resolution |
|---|---|---|
| Closed | keyword_view synced. THLC: 321 keywords, Hairpin: 317 keywords (315 shared). Hairpin has 2 unique generic keywords: “hairpin” (EXACT) and “hairpin.com” (EXACT) | |
| Closed | change_event API confirmed: campaign was on Maximize Conversion Value (tROAS 4x) until Feb 3. Switch to Target Spend was reactive damage control | |
| Closed | Both ad groups use a mix of EXACT, PHRASE, and BROAD. The generic “hairpin” keywords are EXACT match, but Google’s close variant matching still expands these to “hair pin”, “hairpins”, etc. | |
| Which competitor started bidding on brand terms? | Likely not applicable | The impression share drop is better explained by campaign quality degradation from the generic keyword, not competitor entry. Auction insights data could confirm but may not be necessary |
Recommended Actions (for Google Ads manager)
Step 1: Immediate (do first)
- Remove “hairpin” and “hairpin.com” keywords — these are generic terms, not brand terms. “hairpin” matches hair accessories and road bends. “hairpin.com” is treated as “hairpin” by Google (punctuation ignored). Neither needs paid protection — organic handles navigational queries for the domain, and “hairpin” as a standalone word has no brand intent. This is the primary cause of the CPC spike.
- Consider removing the entire Hairpin ad group — after removing the 2 generic keywords, it has 315 keywords identical to the THLC ad group. Two near-identical ad groups create noise for any bidding strategy. If the Hairpin ad group has ad copy tailored to the new brand name, move those ads into the THLC ad group instead of keeping a duplicate ad group.
- Reduce daily budget to £60–80 — even at peak (early Jan), natural demand never exceeded £105/day. £200 gives automated bidding too much room.
Step 2: After keyword removal (stagger by a few days)
Stagger bidding strategy changes separately from keyword removal. Changing everything simultaneously makes it impossible to isolate the impact of each fix.
- Switch bidding strategy to Target Impression Share — set to 95% absolute top of page with a max CPC cap of £2.50. This directly optimises for the thing brand search exists to do: show up when someone searches your name. The £2.50 cap prevents overpaying while remaining above the pre-spike ~£1.50 average. Can tighten further once Quality Score recovers. Alternative: Manual CPC at £1.50–2.00 for full control.
Step 3: Investigate and monitor
- Clarify what “Branded Bid Test” campaign is doing — a separate enabled campaign with Manual CPC at £60/day budget. Zero performance data synced to our system. If it targets the same brand keywords, it could be duplicating spend or competing with Brand Search for the same auctions. Needs clarification on its purpose — if it’s a leftover test, consider pausing.
- Monitor Quality Score recovery over 2–4 weeks — after removing the generic keywords, campaign quality signals should gradually recover. CPCs should drift back toward the £1–2 range. Don’t make further bidding changes during this recovery period — let the signals stabilise before evaluating whether the new strategy is working.
Already resolved
Pull change_event to confirm whether config was modified— Done. Changelog confirms: tROAS 4x → 5x → Target Spend switch on Feb 3 was reactive. Hairpin ad group created Jan 29 12:54pm. No other campaign-level changes near the inflection point.Keyword data— Done. Both ad groups synced. Hairpin ad group has 2 unique generic keywords causing the issue.
Context
- Sync job:
app/Jobs/AdPlatforms/Google/SyncGoogleAdsDataJob.php - Campaign model:
app/Models/AdPlatforms/AdCampaign.php(ID 66) - Ad group model:
app/Models/AdPlatforms/AdGroup.php(IDs 298, 513) - Related:
shopify-app/docs/ad-platform/campaign-config-history.md(config tracking gap)