Rival's pricing change won 12 shared keywords; you lost on 3
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.
Every Monday: competitor pages that changed, the shared keywords the competitor gained after the change, and where your own positions slipped from that day.
Reads
You get
The card on the right is a sample. Yours shows your own numbers and updates in place every run.
What lands on your board
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.
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.
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.
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.
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).
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.
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.
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.
Pick your agent, where the data comes from and how to schedule it; the commands below follow.
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/firecrawl-competitor-move-impact/install | shAsk Claude Code:
promptRun the firecrawl-competitor-move-impact skillOr paste the prompt instead of installing:
promptFor each competitor page in my list, scrape it with the Firecrawl API (v2 scrape, formats markdown plus changeTracking in git-diff mode, tag "impact") and note pages with changeStatus "changed" and the window between previousScrapeAt and now. For each competitor with a change, call DataForSEO Labs ranked_keywords (United States, English, organic, rank 20 or better, limit 1000) and compare with last week's saved list: keywords new in the top 20 or up 3+ places, updated after the change date. Keep those that match my Google Search Console queries (lowercase, at least 20 impressions in 28 days), and compare my average position in the 7 days before the change with the days after. Tell me each change in one line, the shared keywords the competitor gained, where I lost 1 or more positions, and the move to respond to first.Mondays at 9:30, from cron on any machine where Claude Code is signed in:
crontab30 9 * * 1 claude -p "Run the firecrawl-competitor-move-impact 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.
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
SKILL.md---
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
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.
https://mcp.firecrawl.dev/v2/mcp with your key in an Authorization: Bearer header, for example claude mcp add --transport http firecrawl https://mcp.firecrawl.dev/v2/mcp --header "Authorization: Bearer $FIRECRAWL_API_KEY" in Claude Code, or at https://mcp.firecrawl.dev/v2/mcp-oauth to sign in with OAuth instead. Without a key, the hosted server offers only scrape, search and parse, rate-limited. It also runs locally with env FIRECRAWL_API_KEY=fc-... npx -y firecrawl-mcp, which fits Cursor's and Codex's command-based config. Tools include firecrawl_scrape, firecrawl_map, firecrawl_crawl, firecrawl_search and the firecrawl_monitor_* set (docs).FIRECRAWL_API_KEY, and call https://api.firecrawl.dev/v2/... with the same Bearer header.Keep the key in the client's header or secret settings, never in the URL. Keys aren't scoped, so the thing to limit is spend: set limit on crawls, keep the URL list short, and check firecrawl_credit_usage now and then.
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).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.
GOOGLE_APPLICATION_CREDENTIALS at the key and set GSC_SITE_URL to sc-domain:example.com or https://www.example.com/.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.
As exact as the scrape schedule. Firecrawl reports the previous scrape time, so a weekly check dates a change to a 7-day window and a daily check to one day. Changelog entries carry their own date, which the skill uses when the diff contains one. With a weekly window, compare your positions in the week before the window with the days after it.
No. DataForSEO Labs refreshes rankings on its own cycle, and Google updates move many sites at once. The skill only counts gains seen after the change date, flags the ones on the changed page itself, and notes when a known Google update fell in the same week. Treat a gain on the changed URL with your loss on the same days as a strong hint, and anything else as context.
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.
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.
Yes. Switch the data source to "Your browser" and the steps change to the Firecrawl, DataForSEO and Google Search Console pages themselves: the agent opens web.archive.org 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.
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.