---
name: google-ads-spend-on-slow-pages
description: "Every Monday: Google Ads spend per landing page joined with mobile LCP from PageSpeed Insights and GA4 bounce rate, and a question on what to do first. Use when the user asks for this, or when it runs on a schedule."
---

# Ad spend on slow landing pages: Google Ads, PageSpeed Insights and GA4

Every Monday: Google Ads spend per landing page joined with mobile LCP from PageSpeed Insights and GA4 bounce rate, and a question on what to do first.

Paid search sends a click to a page, and the page takes five seconds to show anything on a phone. Google Ads reports the click and its cost, PageSpeed Insights reports the slow load, GA4 reports the bounce, and nobody sees the three facts on the same row.

Every Monday the agent takes last week's spend per landing page, tests each page on mobile, and joins in how paid visitors behaved once they got there. The card puts a dollar figure on slow pages and asks whether to draft fixes or point the ads somewhere faster.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- Read only access to the Google Ads account (the Google Ads MCP server or the API), and Viewer on the GA4 property that the landing pages report to.
- A PageSpeed Insights API key in `PAGESPEED_API_KEY` (free; a run makes about 20 to 60 requests), and the GA4 tag on every landing page with auto-tagging intact through redirects.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Get spend per landing page** (Google Ads): Run `SELECT expanded_landing_page_view.expanded_final_url, metrics.cost_micros, metrics.clicks, metrics.conversions FROM expanded_landing_page_view WHERE segments.date DURING LAST_7_DAYS AND metrics.cost_micros > 0`. Normalize each URL (lowercase host, drop `www.`, the query string, the fragment and a trailing slash), sum by the result, and keep pages with $100 or more of spend, at most 20.
2. **Test each page on mobile** (PageSpeed Insights): Call `runPagespeed?url=<normalized URL>&strategy=mobile&category=performance`. Use `loadingExperience.metrics.LARGEST_CONTENTFUL_PAINT_MS.percentile` (p75 over 28 days) unless `loadingExperience.origin_fallback` is true; then run the lab test 3 times and take the median `audits["largest-contentful-paint"].numericValue`, marked as lab.
3. **Get paid visitors' behavior per page** (Google Analytics): Call `runReport` for the same 7 days with `dimensions: ["landingPage", "hostName"]`, metrics `sessions`, `bounceRate`, `engagementRate` and `keyEvents`, and a filter `sessionSourceMedium == "google / cpc"`.
4. **Join on the landing page path**: Match each Ads URL to GA4 on host and path (`landingPage` has no query string; strip a trailing slash on both sides). An Ads page with no GA4 cpc sessions is a tracking gap (a redirect dropping `gclid` or a missing tag) and gets its own line; GA4 cpc pages with no Ads row and under 20 sessions are ignored. A page is slow when LCP is over 4.0 seconds, Google's "poor" line.
5. **Ask what to do**: Total the spend on slow pages, their session-weighted bounce rate and cost per key event against the fast pages. Read last week's card with `GET https://briefkin.dev/v1/cards/insight-google-ads-spend-on-slow-pages` to say which pages are new to the list. Then ask whether to draft fix tickets, draft new final URLs, or leave it; the agent changes nothing in Google Ads.

## Route B: the browser

### What you need

- Signed in to Google Ads with Read only access or higher, and to GA4 with Viewer access on the property; PageSpeed Insights needs no sign-in.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://ads.google.com/. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Read spend per landing page**: Pick the account, then open **Campaigns > Insights and reports > Landing pages** (or type "Landing pages" in the search bar at the top). Set the date to **Last 7 days**, switch to **Expanded landing pages**, sort by **Cost**, and note the pages with $100 or more.
2. **Test each page**: Open `https://pagespeed.web.dev/`, enter each URL without its query string, and read the **Mobile** tab. Use the Largest Contentful Paint from **Discover what your real users are experiencing** when it is shown for this URL; when only the origin is shown, use the lab LCP under **Diagnose performance issues**.
3. **Read paid visitors in GA4**: In `https://analytics.google.com/`, open **Explore > Free form** with the dimensions **Landing page** and **Session source / medium**, the metrics **Sessions**, **Bounce rate** and **Key events**, a filter on Session source / medium exactly `google / cpc`, and the last 7 days.
4. **Join and ask**: Match the pages on their path. List those with LCP over 4 seconds with spend, LCP, bounce rate and key events, total their spend, and note any Ads page with no paid sessions in GA4. Ask before changing anything.

Note: The Landing pages report sits in a different spot in older Google Ads layouts; the search bar always finds it. Each PageSpeed test takes about half a minute, so 20 pages is a slow run, and lab numbers vary between runs. GA4 explorations can sample on large properties.

## The report

- **Spend on slow pages** last week and how many pages.
- **Per page**: spend, clicks, mobile LCP (field or lab), bounce rate, key events.
- **Slow vs fast**: cost per key event on each.
- **Tracking gaps**: pages with ad clicks but no GA4 paid sessions.
- The ask: fix tickets, new final URLs, or leave it.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "google-ads-spend-on-slow-pages/<date of this run, e.g. 2026-10-16>",
  "item_key": "google-ads-spend-on-slow-pages",
  "project": "example.com",
  "source": "Ad spend on slow landing pages: Google Ads, PageSpeed Insights and GA4 skill",
  "kind": "action",
  "title": "$1.2k a week lands on 3 slow pages",
  "summary": "**$1,200** of last week's Google Ads spend landed on **3 pages with mobile LCP over 4 seconds**, where paid visitors bounced **71%** of the time. A key event costs $80 there and $28 on /lp/invoice-template.",
  "action": {
    "request": "What should I do about these three pages?",
    "options": [
      "Draft a fix ticket per page",
      "Draft new final URLs",
      "Both",
      "Leave them this week"
    ]
  },
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Landing page",
          "Spend",
          "Mobile LCP",
          "Bounce",
          "Key events"
        ],
        "align": [
          "left",
          "right",
          "right",
          "right",
          "right"
        ],
        "rows": [
          [
            "/pricing-lp-b",
            "$540",
            "4.8 s",
            "74%",
            6
          ],
          [
            "/features/invoicing",
            "$410",
            "4.3 s",
            "69%",
            5
          ],
          [
            "/lp/free-trial",
            "$250",
            "4.1 s (lab)",
            "68%",
            4
          ],
          [
            "/lp/invoice-template",
            "$860",
            "2.1 s",
            "44%",
            31
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "/lp/free-trial is new on the list. /lp/spring-promo took $140 of clicks but no GA4 paid sessions: a redirect may be dropping gclid.",
        "tone": "warn"
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Mondays at 9:00 (`0 9 * * 1`). From cron, with the agent signed in on that machine:

```bash
0 9 * * 1 claude -p "Run the google-ads-spend-on-slow-pages skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/google-ads-spend-on-slow-pages#schedule

Source: https://briefkin.dev/skills/google-ads-spend-on-slow-pages
