---
name: google-search-console-pages-that-earn-signups
description: "Every Monday: organic clicks, GA4 sessions and real sign-ups for each landing page, joined on the URL, with the pages to push and the pages to fix. Use when the user asks for this, or when it runs on a schedule."
---

# Pages that earn sign-ups: Search Console, GA4 and your sign-ups

Every Monday: organic clicks, GA4 sessions and real sign-ups for each landing page, joined on the URL, with the pages to push and the pages to fix.

Search Console ranks pages by clicks, GA4 by sessions, and your database knows who actually signed up. None of them tells you that the glossary page with 1,900 clicks a month has produced one account, while a comparison page with 18 clicks produced four. That only shows when the three are joined on the landing page URL.

The agent pulls 28 days from each source, normalizes the URLs so they match, and counts sign-ups per 100 organic clicks for every page. You get two short lists: pages that convert well and deserve more traffic, and high-traffic pages that need a better path to sign-up.

## 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

- Sign-ups must record where the person first landed: a column such as `first_landing_page` in your database, or a Stripe customer metadata key, filled from the landing URL or a `from` or `utm_content` value at sign-up.
- Read access to the Search Console property and Viewer access to the GA4 property, through MCP servers or a service account with `GOOGLE_APPLICATION_CREDENTIALS`.
- Read-only access to the sign-up store: the Supabase MCP server with `read_only=true`, a read-only Postgres role in `DATABASE_URL`, or a restricted Stripe key with Read on Customers.

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

### Steps

1. **Pull organic clicks by page** (Google Search Console): Call `searchanalytics.query` with `dimensions: ["page"]`, `type: "web"`, `rowLimit: 25000` and the 28 full days ending 2 days ago. Keep clicks, impressions and position for every page.
2. **Pull organic sessions by landing page** (Google Analytics): Call `runReport` for the same dates with `dimensions: [{ name: "landingPagePlusQueryString" }]`, the metrics `sessions` and `keyEvents` (or `keyEvents:sign_up` for the sign-up event alone), and a `dimensionFilter` on `sessionDefaultChannelGroup` with an `EXACT` match on `Organic Search`.
3. **Count sign-ups by first landing page** (Supabase): From whichever store you use, read the table and column (or Stripe metadata key) named in settings. In Supabase or Postgres: `SELECT first_landing_page, count(*) FROM public.profiles WHERE created_at >= '<start>' AND created_at < '<end>' GROUP BY 1` over the same 28 days, limited, when a referrer or `utm_medium` column exists, to rows that came from a search engine. In Stripe: list `GET /v1/customers?created[gte]=<unix start>` and read `metadata[<key>]`. A stored `from` slug or `utm_content` value is mapped to its page with the table in settings.
4. **Join the three on the URL**: Reduce every URL to a path: drop scheme and host, the query string and fragment, a trailing slash (keep `/` for the home page), and lowercase it. Full-join Search Console pages, GA4 landing pages and sign-up pages on that path. Sign-ups with an empty landing page count in the total as unattributed; sign-ups whose page has no organic clicks are listed apart, because they most likely arrived by another channel.
5. **Rank and reconcile**: Work out sign-ups per 100 clicks for every page and for the site. Double down on pages with 3 or more sign-ups at three times the site rate or better; fix pages with 300 or more clicks at under a third of it. Where GA4 key events and database sign-ups for one page differ by more than 30%, say so: consent banners and events firing on the wrong page both show up here.
6. **Post the table**: Post an update card: the summary names how much of the click volume the top pages hold against their sign-ups, then a table of the best converters and the biggest underperformers, and one callout with the first link or page change to make.

## Route B: the browser

### What you need

- Signed in to Search Console, GA4 and your database console (or Stripe) with read access to each.

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

### Steps

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

1. **Export clicks by page**: Pick the property, set Date to `Last 28 days`, open the Pages tab and click Export > Download CSV. Read clicks per page from the file.
2. **Read organic sessions by landing page**: Open `https://analytics.google.com/`, choose the property, go to Reports > Engagement > Landing page and set the same 28 days. Click Add filter, choose Session default channel group, exactly matches `Organic Search`, and apply. Note Sessions and Key events per landing page, and export the table if it runs past one screen.
3. **Count sign-ups by landing page**: In your database console (for Supabase, the SQL Editor at `https://supabase.com/dashboard`), run the count of sign-ups by first landing page for the same dates. If sign-ups live only in Stripe, use Customers > Export with the created date range and check that the metadata key is among the exported columns.
4. **Match the pages**: Reduce every URL to a lowercase path with no query string, fragment or trailing slash, and line the three lists up on it. Count sign-ups without a page as unattributed.
5. **Rank and report**: Work out sign-ups per 100 clicks. Pages with 3 or more sign-ups at three times the site rate are the ones to push; pages with 300 or more clicks under a third of the site rate are the ones to fix.

Note: GA4 report tables and Search Console exports both stop at a limit (Search Console at 1,000 rows), so on large sites the browser route covers the top pages only. A Stripe export depends on the metadata key being offered as a column; the database route is more reliable.

## The report

- **Click share against sign-ups**: how much organic traffic the top pages hold and how many sign-ups they produced.
- **Pages to double down on**: clicks, sessions, sign-ups and sign-ups per 100 clicks.
- **Pages to fix**: high-traffic pages that rarely lead to a sign-up.
- **Unattributed sign-ups** and any page where GA4 and the database disagree.
- The first move, usually a link from a busy page to a page that converts.

## 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-search-console-pages-that-earn-signups/<date of this run, e.g. 2026-10-16>",
  "item_key": "google-search-console-pages-that-earn-signups",
  "project": "example.com",
  "source": "Pages that earn sign-ups: Search Console, GA4 and your sign-ups skill",
  "kind": "update",
  "title": "3 pages with 40 clicks brought 9 sign-ups; the top 12 brought 2",
  "summary": "**12 pages** hold 60% of organic clicks (5,640 of 9,400) and produced **2 sign-ups** in 28 days. **3 pages** with 40 clicks between them produced **9**.\n\n31 organic sign-ups in total; 6 had no stored landing page.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Landing page",
          "Clicks",
          "Sessions",
          "Sign-ups",
          "Per 100 clicks"
        ],
        "align": [
          "left",
          "right",
          "right",
          "right",
          "right"
        ],
        "rows": [
          [
            "/compare/acme-vs-ledgerly",
            18,
            21,
            4,
            22.2
          ],
          [
            "/integrations/quickbooks",
            14,
            16,
            3,
            21.4
          ],
          [
            "/templates/net-30-invoice",
            8,
            11,
            2,
            25
          ],
          [
            "/blog/invoice-template",
            1920,
            2110,
            1,
            0.05
          ],
          [
            "/blog/what-is-net-30",
            1180,
            1240,
            1,
            0.08
          ],
          [
            "/glossary/proforma-invoice",
            640,
            702,
            0,
            0
          ],
          [
            "9 more top-12 pages",
            1900,
            2050,
            0,
            0
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "First: link /blog/invoice-template (1,920 clicks, 1 sign-up) to /compare/acme-vs-ledgerly, which converts 22 of every 100 clicks.",
        "tone": "info"
      }
    }
  ]
}
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-search-console-pages-that-earn-signups 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-search-console-pages-that-earn-signups#schedule

Source: https://briefkin.dev/skills/google-search-console-pages-that-earn-signups
