Rank your striking distance keywords by the clicks they would win at position 3

Once a month: your queries at positions 5 to 20, sized by real search volume, and the clicks each would add if it reached position 3.

Runs
1st of the month at 9:00
For
SEO
Posts
Report card

What lands on your board

example.comStriking distance keywords worth the most clicks: Search Console and DataForSEO · Claude Code

8 striking distance queries are worth 1,900 clicks a month

Moving these 8 queries to position 3 is worth about 1,900 clicks a month; the top one, "invoice software", alone 420. Your most-seen query in range, "invoice template" at 6.2, would add only 70.

QuerySearches/moPositionPageClicks at #3
invoice software8,1009.4/invoice-software+420
invoice generator free4,40016.2/invoice-generator+360
invoice template pdf3,60014.7/templates/pdf+290
billing software small business2,90017.3/small-business+240
recurring invoices2,40012.9/features/recurring+190
invoice reminder email1,90015.8/blog/reminder-email+160
invoice numbering1,60018.1/blog/invoice-numbers+130
invoice app2,9005.8/app+110
Queries at positions 5 to 20
214
Matched to a search volume
171 (43 with no Google Ads data)
CTR curve
Your own, last 90 days: 9.0% at position 3

Start with /invoice-software: 8,100 searches a month and already at 9.4, so a better title and two missing comparison sections are worth more than any new post.

Done
An example with made-up numbers. Your agent posts your real ones.

What it does

Most striking distance lists sort by impressions, and impressions mislead: a query at position 18 barely shows, so its impressions say little about how many people search for it. The usual result is a month spent on a query that was never going to pay. This skill asks a better question for SEO leads and content owners: if this query climbed to position 3, how many more clicks a month would it bring?

The agent takes your queries at positions 5 to 20 from Search Console, gets Google Ads search volume for them from DataForSEO in one request, and multiplies the volume by the gap between your click-through rate at position 3 and where you sit now. The card lists the eight or so queries worth the most, with the page to work on, and usually shows that the impressions leader is not the best bet.

How it works

  1. 1Pull queries in striking distance

    Call searchanalytics.query for the last 28 full days (data lags about 2 days) with dimensions: ["query"], rowLimit: 25000 and a country filter for the market you track (for example usa), then again with dimensions: ["query", "page"] to find the page with the most impressions for each query. Keep queries with an average position from 5.0 to 20.0 and at least 50 impressions.

  2. 2Build your own CTR curve

    From the last 90 days of the same property and country, take queries with at least 100 impressions, round their position to a whole number and take the median CTR at each position from 1 to 20. Leave out branded queries (they click far above the curve). Where a position has fewer than 20 queries, fall back to a published CTR study and say so on the card.

  3. 3Get search volume in one request

    Normalize each query (lowercase, trim, collapse double spaces), drop the ones Google Ads rejects (over 80 characters, over 10 words, emoji or symbols), keep the 1,000 with the most impressions, and send them as one task to POST /v3/keywords_data/google_ads/search_volume/live with location_code: 2840 and language_code: "en" (or your market). Keep keyword and search_volume; a null volume means Google Ads has too little data.

  4. 4

    4Join and score the clicks

    Join the two lists on the normalized query string. For each match, the gain is search_volume × (CTR at position 3 − CTR at the current rounded position). Google Ads groups close variants, so two of your queries can come back with the same volume: count it once, on the query with more impressions. GSC queries with no match or a null volume are not scored; report how many there were.

  5. 5

    5Post the ranked list

    Sort by gain, keep the top 8 with a gain of at least 50 clicks a month, and add up their total. Show each query's volume, position and page, and name the query with the most impressions if it is not in the top 3 by gain, since that is the one a by-impressions list would have picked.

  6. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

What you get

  • Total clicks a month the listed queries would add at position 3.
  • The list: query, monthly searches, current position, ranking page and the click gain, best first.
  • Not scored: how many striking distance queries had no volume data.
  • The impressions leader and where it lands by gain.
  • The page to improve first.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/dataforseo-striking-distance-by-volume/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the dataforseo-striking-distance-by-volume skill

    Or paste the prompt instead of installing:

    promptFrom my Google Search Console property, take the last 28 full days of queries for the United States with an average position from 5 to 20 and at least 50 impressions, with the page that gets most impressions for each. Build my own CTR curve from the last 90 days (median CTR by rounded position, queries with 100+ impressions, no brand terms). Lowercase and trim the queries, then send up to 1,000 of them in one DataForSEO request to /v3/keywords_data/google_ads/search_volume/live (location_code 2840, language_code en). Join on the query, and score each as search_volume times (my CTR at position 3 minus my CTR at its current position). Give me the top 8 by that gain with volume, position and page, the total, how many queries had no volume, and the page to improve first.
  3. Put it on a schedule

    1st of the month at 9:00, from cron on any machine where Claude Code is signed in:

    crontab0 9 1 * * claude -p "Run the dataforseo-striking-distance-by-volume skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a report card. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: dataforseo-striking-distance-by-volume
description: "Once a month: your queries at positions 5 to 20, sized by real search volume, and the clicks each would add if it reached position 3. Use when the user asks for this, or when it runs on a schedule."
---

# Striking distance keywords worth the most clicks: Search Console and DataForSEO

Once a month: your queries at positions 5 to 20, sized by real search volume, and the clicks each would add if it reached position 3.

Most striking distance lists sort by impressions, and impressions mislead: a query at position 18 barely shows, so its impressions say little about how many people search for it. The usual result is a month spent on a query that was never going to pay. This skill asks a better question for SEO leads and content owners: if this query climbed to position 3, how many more clicks a month would it bring?

The agent takes your queries at positions 5 to 20 from Search Console, gets Google Ads search volume for them from DataForSEO in one request, and multiplies the volume by the gap between your click-through rate at position 3 and where you sit now. The card lists the eight or so queries worth the most, with the page to work on, and usually shows that the impressions leader is not the best bet.

## 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 access to the Search Console property, through a Search Console MCP server or a service account added to the property with `GOOGLE_APPLICATION_CREDENTIALS` set.
- DataForSEO API login and password in `DATAFORSEO_LOGIN` and `DATAFORSEO_PASSWORD`, or the DataForSEO MCP server. One run is one Keywords Data task (under 10 cents at list price); test it on `https://sandbox.dataforseo.com/v3/` first.
- The same market on both sides: the Search Console `country` filter must match the DataForSEO `location_code` and `language_code`, or the volumes describe a different audience than your positions.

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

### Steps

1. **Pull queries in striking distance** (Google Search Console): Call `searchanalytics.query` for the last 28 full days (data lags about 2 days) with `dimensions: ["query"]`, `rowLimit: 25000` and a `country` filter for the market you track (for example `usa`), then again with `dimensions: ["query", "page"]` to find the page with the most impressions for each query. Keep queries with an average position from 5.0 to 20.0 and at least 50 impressions.
2. **Build your own CTR curve** (Google Search Console): From the last 90 days of the same property and country, take queries with at least 100 impressions, round their position to a whole number and take the median CTR at each position from 1 to 20. Leave out branded queries (they click far above the curve). Where a position has fewer than 20 queries, fall back to a published CTR study and say so on the card.
3. **Get search volume in one request** (DataForSEO): Normalize each query (lowercase, trim, collapse double spaces), drop the ones Google Ads rejects (over 80 characters, over 10 words, emoji or symbols), keep the 1,000 with the most impressions, and send them as one task to `POST /v3/keywords_data/google_ads/search_volume/live` with `location_code: 2840` and `language_code: "en"` (or your market). Keep `keyword` and `search_volume`; a `null` volume means Google Ads has too little data.
4. **Join and score the clicks**: Join the two lists on the normalized query string. For each match, the gain is `search_volume × (CTR at position 3 − CTR at the current rounded position)`. Google Ads groups close variants, so two of your queries can come back with the same volume: count it once, on the query with more impressions. GSC queries with no match or a `null` volume are not scored; report how many there were.
5. **Post the ranked list**: Sort by gain, keep the top 8 with a gain of at least 50 clicks a month, and add up their total. Show each query's volume, position and page, and name the query with the most impressions if it is not in the top 3 by gain, since that is the one a by-impressions list would have picked.

## Route B: the browser

### What you need

- Signed in to Google with at least Restricted access to the Search Console property, and to the DataForSEO dashboard with a funded balance (the API Playground runs real, paid requests).

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. **Open the Performance report**: Pick the property if a list appears. Set Date to `Last 28 days`, add a Country filter for your market, and turn on Average CTR and Average position so the Queries table shows them.
2. **Filter to positions 5 to 20**: Use the filter icon above the Queries table to keep rows with Position greater than `4.9` and less than `20.1`, and Impressions greater than `49`. Export > Download CSV, then switch to the Pages tab for the queries that matter and note the top page for each.
3. **Get search volume from DataForSEO**: Open `https://app.dataforseo.com/` in a new tab, go to API Playground, choose Keywords Data > Google Ads > Search Volume (Live), set the location and language to your market, paste the queries in lowercase (up to 1,000), and click Request. Read `search_volume` for each keyword from the JSON.
4. **Score each query**: For each query, gain = search volume × (your CTR at position 3 − your CTR at its current position). Read your CTR at position 3 off queries in the export that sit near position 3, leaving out brand terms. Queries with no volume are not scored.
5. **Report the top 8**: Sort by gain and keep the top 8 with at least 50 clicks a month, with volume, position, page and the total. Name the query with the most impressions if it does not make the top 3.

Note: The API Playground charges the same as the API, so send the keywords in one request. The Search Console export stops at 1,000 rows, which is enough for most sites in this position range. Keyword Planner in Google Ads shows the same volumes for free, but as ranges unless the account spends on ads.

## The report

- **Total clicks a month** the listed queries would add at position 3.
- **The list**: query, monthly searches, current position, ranking page and the click gain, best first.
- **Not scored**: how many striking distance queries had no volume data.
- **The impressions leader** and where it lands by gain.
- The page to improve first.

## 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": "dataforseo-striking-distance-by-volume/<date of this run, e.g. 2026-10-16>",
  "item_key": "dataforseo-striking-distance-by-volume",
  "project": "example.com",
  "source": "Striking distance keywords worth the most clicks: Search Console and DataForSEO skill",
  "kind": "update",
  "title": "8 striking distance queries are worth 1,900 clicks a month",
  "summary": "Moving these **8 queries** to position 3 is worth about **1,900 clicks a month**; the top one, \"invoice software\", alone **420**. Your most-seen query in range, \"invoice template\" at 6.2, would add only 70.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Query",
          "Searches/mo",
          "Position",
          "Page",
          "Clicks at #3"
        ],
        "align": [
          "left",
          "right",
          "right",
          "left",
          "right"
        ],
        "rows": [
          [
            "invoice software",
            8100,
            9.4,
            "/invoice-software",
            "+420"
          ],
          [
            "invoice generator free",
            4400,
            16.2,
            "/invoice-generator",
            "+360"
          ],
          [
            "invoice template pdf",
            3600,
            14.7,
            "/templates/pdf",
            "+290"
          ],
          [
            "billing software small business",
            2900,
            17.3,
            "/small-business",
            "+240"
          ],
          [
            "recurring invoices",
            2400,
            12.9,
            "/features/recurring",
            "+190"
          ],
          [
            "invoice reminder email",
            1900,
            15.8,
            "/blog/reminder-email",
            "+160"
          ],
          [
            "invoice numbering",
            1600,
            18.1,
            "/blog/invoice-numbers",
            "+130"
          ],
          [
            "invoice app",
            2900,
            5.8,
            "/app",
            "+110"
          ]
        ]
      }
    },
    {
      "type": "KeyValue",
      "props": {
        "items": [
          {
            "key": "Queries at positions 5 to 20",
            "value": "214"
          },
          {
            "key": "Matched to a search volume",
            "value": "171 (43 with no Google Ads data)"
          },
          {
            "key": "CTR curve",
            "value": "Your own, last 90 days: 9.0% at position 3"
          }
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "Start with /invoice-software: 8,100 searches a month and already at 9.4, so a better title and two missing comparison sections are worth more than any new post.",
        "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: 1st of the month at 9:00 (`0 9 1 * *`). From cron, with the agent signed in on that machine:

```bash
0 9 1 * * claude -p "Run the dataforseo-striking-distance-by-volume 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/dataforseo-striking-distance-by-volume#schedule

Source: https://briefkin.dev/skills/dataforseo-striking-distance-by-volume

What your agent needs

  • Read access to the Search Console property, through a Search Console MCP server or a service account added to the property with GOOGLE_APPLICATION_CREDENTIALS set.

  • DataForSEO API login and password in DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD, or the DataForSEO MCP server. One run is one Keywords Data task (under 10 cents at list price); test it on https://sandbox.dataforseo.com/v3/ first.

  • The same market on both sides: the Search Console country filter must match the DataForSEO location_code and language_code, or the volumes describe a different audience than your positions.

Connecting Google Search Console

  1. MCP server. Google doesn't publish one for Search Console. Community MCP servers exist; check which scopes one asks for before you sign in.
  2. API with a service account. Enable the Google Search Console API in a Google Cloud project, create a service account, and add its email under Settings > Users and permissions on the property. Point GOOGLE_APPLICATION_CREDENTIALS at the key and set GSC_SITE_URL to sc-domain:example.com or https://www.example.com/.
  3. OAuth as yourself. When you can't add users to the property, a desktop OAuth client with the webmasters.readonly scope and a stored refresh token works for scheduled runs.

Ask for webmasters.readonly and add the service account as a Restricted user; the reports only read.

Connecting DataForSEO

  1. DataForSEO MCP server, DataForSEO's own. Run it locally with npx dataforseo-mcp-server and set DATAFORSEO_USERNAME and DATAFORSEO_PASSWORD to your API login and API password (Dashboard > API Access); add http to the command for clients that want a local HTTP server. A hosted server runs at https://mcp.dataforseo.com/mcp for clients that can send a Basic authorization header. You can turn off the modules a skill doesn't use to keep the tool list short (setup guide).
  2. REST API with Basic auth. Store the same pair in DATAFORSEO_LOGIN and DATAFORSEO_PASSWORD and call the endpoints with curl -u "$DATAFORSEO_LOGIN:$DATAFORSEO_PASSWORD". The free sandbox at https://sandbox.dataforseo.com/v3/ returns sample data at no cost, which is the place to test a skill before it spends money.

The API password can spend your balance but cannot sign in to the dashboard or change billing. Set a low balance alert in the dashboard, and give each skill a fixed keyword list and depth so a run costs the same every time.

Questions

Why do some Search Console queries get no search volume?

Google Ads reports volume only for terms it has enough data on, and it rejects long or symbol-heavy queries. Long-tail queries with a few dozen impressions often come back as null. They are counted on the card, not guessed, and if one of them matters to you, check it in Keyword Planner by hand.

Search volume and my impressions disagree. Which is right?

Both, for different things. Search volume is a 12-month average of searches in the market, while impressions count only the times your page was on the results page you saw. At position 15 most searchers never load your result, so impressions sit far below volume; that gap is exactly what this skill sizes. The two only line up when the country filter matches the location you sent to DataForSEO.

Do I need Briefkin to use the Striking distance keywords worth the most clicks: Search Console and DataForSEO skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a report card, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Google Search Console and DataForSEO pages themselves: the agent opens search.google.com/search-console/performance/search-analytics in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Read this report on your board, not in a chat log

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.