---
name: firecrawl-competitor-move-impact
description: "Every Monday: competitor pages that changed, the shared keywords the competitor gained after the change, and where your own positions slipped from that day. Use when the user asks for this, or when it runs on a schedule."
---

# Competitor moves and what they did to your rankings: Firecrawl, DataForSEO and Search Console

Every Monday: competitor pages that changed, the shared keywords the competitor gained after the change, and where your own positions slipped from that day.

Knowing that a rival rewrote its pricing page is half the story. The other half is whether it worked: did they start ranking for keywords you both chase, and did you lose ground in the days after? Answering that by hand means lining up a diff, a rank tracker and Search Console on one calendar, which nobody does every week.

This skill puts the three on one clock. Firecrawl says which competitor pages changed and between which dates, DataForSEO Labs says which keywords the competitor gained since, and your Search Console data says what your position did on those same keywords before and after the change. Founders and marketers get the moves that cost them something, not a list of every edit.

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

- A Firecrawl API key in `FIRECRAWL_API_KEY` or the Firecrawl MCP server, and a list of 5 to 20 competitor URLs; each check is one scrape credit per page.
- DataForSEO API login and password, or the DataForSEO MCP server. A run is one Labs request per changed competitor (usually 1 to 3, around 10 to 15 cents each at 1,000 rows); try them on `https://sandbox.dataforseo.com/v3/` first.
- Read access to the Search Console property, and a folder for `moves.json` and `rivals-ranked.json` between runs.

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

### Steps

1. **Date each competitor change** (Firecrawl): For each watched page (pricing, features, changelog), `POST https://api.firecrawl.dev/v2/scrape` with `formats: ["markdown", { "type": "changeTracking", "modes": ["git-diff"], "tag": "impact" }]`. A `changeStatus` of `changed` dates the change between `previousScrapeAt` and now; a dated changelog entry pins the day. For day-level dates, run this step daily and log each change to `moves.json`.
2. **Get the competitor's rankings now** (DataForSEO): For each competitor with a change, call `POST /v3/dataforseo_labs/google/ranked_keywords/live` with `target` set to its domain, your `location_code` and `language_code`, `item_types: ["organic"]`, `filters: [["ranked_serp_element.serp_item.rank_group", "<=", 20]]` and `limit: 1000`. Keep `keyword_data.keyword`, `rank_group`, `relative_url`, `rank_changes` and `last_updated_time`, and save the list to `rivals-ranked.json`.
3. **Find what they gained after the change**: Compare with last week's `rivals-ranked.json`: a keyword gained is new in the top 20 or up 3 or more places. On the first run use `rank_changes` (`is_new`, `previous_rank_absolute`) instead. Count a gain only if its `last_updated_time` is after the change date, and flag it when its `relative_url` matches the changed page path (no query string, no trailing slash).
4. **Line your positions up on the same dates** (Google Search Console): Keep the gained keywords you share: those that match one of your Search Console queries (lowercase, trimmed) with at least 20 impressions in the last 28 days. For them, call `searchanalytics.query` with `dimensions: ["query", "date"]` from 7 days before the change to the latest day with data, and compare your average position in the 7 days before with the days after. A drop of 1.0 or more is a loss.
5. **Post the moves that cost you**: For each changed page: the change in one line, the shared keywords the competitor gained after it, and those where you lost position, with before and after for both. Note any Google update in the same week, since it moves everyone at once.

## Route B: the browser

### What you need

- Signed in to the DataForSEO dashboard with a funded balance and to Google with access to the Search Console property. Competitor pages are public. The agent needs a folder for last week's copies.

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

### Steps

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

1. **Check the competitor pages**: Open each watched competitor page, read the main content and diff it against the text the agent saved last week. If last week's copy is missing, use the Wayback Machine (`https://web.archive.org/web/*/<url>`) snapshot nearest to a week ago. Note what changed and the date window.
2. **Get the competitor's rankings**: Open `https://app.dataforseo.com/`, API Playground, DataForSEO Labs > Google > Ranked Keywords, enter the competitor's domain with your location and language, limit `1000`, and click Request. Compare with last week's saved result: keywords new in the top 20 or up 3 or more places.
3. **Check your positions on the same dates**: Open `https://search.google.com/search-console/performance/search-analytics`, set Date to Compare, Custom: the 7 days before the change against the days since, and turn on Average position. Look up each gained keyword on the Queries tab and note your position in both periods.
4. **Report the moves that cost you**: For each change: one line on what changed, the shared keywords the competitor gained, and those where your position dropped by 1.0 or more. Save this week's page text and rankings for next time.

Note: A browser cannot read Firecrawl's change history, so the agent keeps its own page copies, and the archive often lacks a recent capture of smaller competitors. Search Console's date comparison averages each period, so day-by-day positions and change dates finer than a week need the API route.

## The report

- **Competitor changes** this week, one line each, with the date or date window.
- **Keywords the competitor gained** after the change that you also rank for, with their position before and after.
- **Your losses** on those keywords: your position the week before the change and since.
- **Unaffected**: shared keywords where your position held.
- The move to respond to 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": "firecrawl-competitor-move-impact/<date of this run, e.g. 2026-10-16>",
  "item_key": "firecrawl-competitor-move-impact",
  "project": "Acme",
  "source": "Competitor moves and what they did to your rankings: Firecrawl, DataForSEO and Search Console skill",
  "kind": "update",
  "title": "Rival's pricing change won 12 shared keywords; you lost on 3",
  "summary": "**Rival** changed its pricing page on **Tuesday, Oct 20** and gained **12 keywords you share** since. You lost positions on **3** of them in the days after; the other 9 held.",
  "widget": [
    {
      "type": "KeyValue",
      "props": {
        "items": [
          {
            "key": "Change",
            "value": "rival.com/pricing: free plan added, \"Compare with Acme\" table added"
          },
          {
            "key": "Changed between",
            "value": "Oct 19 and Oct 20 (daily check)"
          },
          {
            "key": "Rival keywords gained",
            "value": "12 shared with you, 7 of them on /pricing"
          }
        ]
      }
    },
    {
      "type": "Table",
      "props": {
        "columns": [
          "Keyword",
          "Rival page",
          "Rival before > now",
          "You before > after"
        ],
        "align": [
          "left",
          "left",
          "left",
          "left"
        ],
        "rows": [
          [
            "free invoicing software",
            "/pricing",
            "14 > 4",
            "5.1 > 7.3"
          ],
          [
            "acme alternative",
            "/pricing",
            "new > 3",
            "1.0 > 2.0"
          ],
          [
            "invoice software pricing",
            "/pricing",
            "9 > 2",
            "3.8 > 5.0"
          ],
          [
            "invoicing app free plan",
            "/pricing",
            "18 > 6",
            "4.2 > 4.4"
          ],
          [
            "cheap invoice software",
            "/pricing",
            "new > 8",
            "6.3 > 6.1"
          ]
        ]
      }
    },
    {
      "type": "Callout",
      "props": {
        "text": "Respond to \"free invoicing software\" first: rival jumped 10 places with its new free plan and you slipped from 5.1 to 7.3.",
        "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:30 (`30 9 * * 1`). From cron, with the agent signed in on that machine:

```bash
30 9 * * 1 claude -p "Run the firecrawl-competitor-move-impact 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/firecrawl-competitor-move-impact#schedule

Source: https://briefkin.dev/skills/firecrawl-competitor-move-impact
