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