Features
Opportunities
Opportunities are the prioritised to-do list of a Serpel project. Each one is a concrete page or keyword where more clicks are likely, found by 8 fixed rules and not by an AI model, and ranked by an impact score. Opportunities cost no credits.

How do SEO opportunities work in Serpel?
An opportunity is a task that Serpel derives from your data, for example a page that is almost on page 1 or a page that ranks well but gets too few clicks. Every opportunity names the keyword or page it concerns, shows its evidence, states the next action and lists the data sources behind it. Serpel evaluates the data of the last 28 days with 8 rules that are the same for every project. The same data therefore produces the same opportunities, and every number can be traced back to a rule.
- rules
- 8
- Fixed thresholds, no AI model
- of search and analytics data
- 28 days
- Per calculation
- between calculations at most
- 60 min
- For each project
- opportunities per project at most
- 200
- Ranked by impact
Collect data
Serpel loads 28 days of Search Console and analytics data, your tracked keywords, the latest crawl and the latest codebase snapshot.
Run the rules
Each rule looks for its pattern and returns findings.
Score
Every finding gets an impact score from its extra clicks, confidence and effort.
Reconcile
New findings are added, known ones refreshed, and findings that no longer apply become stale.
List
The best 200 by impact appear under Opportunities.
Result
Opportunities cost no credits. Serpel calculates them automatically, and reading them is free in the dashboard, the CLI, the REST API and over MCP. The engine needs data to work with. The more sources you connect, the more rules can fire and the higher the confidence of each finding.
Which rules find opportunities?
The rules read Google Search Console data, your tracked keywords and keyword research, the latest crawl, the latest codebase scan and the conversion events of your web analytics. Bing Webmaster data is not used. The table lists every rule with the thresholds it uses. Positions and impressions refer to the 28-day window.
| Rule | Fires when | Needs | Effort |
|---|---|---|---|
Almost on page 1 (strikingDistance) | A query ranks at an average position from 4 to 20 for one of your pages and has at least 100 impressions. The target is position 3. | Search data from Google Search Console. Search volume, a code route and conversion data add detail. | Medium |
Low click-through rate (lowCtr) | A query ranks at position 1 to 5 with at least 100 impressions, but its click-through rate is below 60% of what that position typically earns. | Google Search Console. A crawl and a codebase scan add the live and the in-code title and description. | Small |
Missing page (missingPage) | A tracked or researched keyword has a search volume of at least 200, no ranking and no Search Console impressions, and no route, page title or description fits it. At most 20 are listed per calculation. The target is position 3 below difficulty 40, position 5 below 70, position 10 from 70 upwards and position 5 when the difficulty is unknown. | Keywords from rank tracking or keyword research, plus at least one of Search Console, a crawl or a codebase scan. | Large |
Competing pages (cannibalization) | Two or more of your pages each get more than 20% of the impressions of the same query, and the query has at least 100 impressions. The target is one position better than the best of those pages. | Google Search Console. | Medium |
Visitors who don’t convert (conversionGap) | A page has at least 30 sessions and more sessions than the median page, but its conversion rate is below 50% of the project median. At least 3 pages need sessions. | Web analytics with conversion events. If Search Console is connected, the page also needs search clicks. | Medium |
Strong page with low reach (underusedConverter) | A page has at least 20 sessions and 2 conversions and converts at more than 2 times the project median, but gets fewer search impressions than the median page. At least 3 pages need search data. | Google Search Console and web analytics with conversion events. | Large |
Technical blocker (technicalBlocker) | The latest crawl found one of the issues listed below on a page that is visible: it has search impressions, or a tracked keyword ranks on it. | A site audit crawl, plus Search Console or tracked keywords. | Small |
Competitor ahead (competitorGap) | On a tracked keyword, a saved competitor ranks in the top 3 while you rank outside the top 10 or not at all, and the keyword has search volume or Search Console impressions. The target is position 5. | Tracked keywords with a stored result and at least one competitor. Search volume, or else Search Console impressions, sizes the estimate. | Large |
The technical blocker rule watches these crawl issues:
- Page is set to noindex (
noindex) - Canonical points to a different URL (
canonical_to_other) - Canonical target is unreachable or redirects (
canonical_target_error) - Internal URL returns a 4xx status code (
http_4xx) - Internal URL returns a server error (5xx) (
http_5xx) - Internally linked URL blocked by robots.txt (
blocked_by_robots) - URL can’t be fetched (timeout or connection error) (
request_failed) - Redirect loop (
redirect_loop)
The empty state of Opportunities shows which sources are still missing under How opportunities arise: Connect Search Console, Track keywords, Crawl your website and Scan your codebase. Conversion events come from your web analytics. The codebase scan maps every opportunity to the matching route in your code.
How is the impact score calculated?
The impact score sorts the list. It estimates how much a fix is worth, weighs how sure Serpel is and divides by how much work the fix is.
Impact score=Additional clicks per month×Conversion factor×Confidence factor÷Effort factor
- Additional clicks per month
- For ranking rules: monthly impressions or search volume times the click-through rate gained between the current and the target position. The other rules estimate it from sessions, impressions or clicks.
- Conversion factor
- 1 plus the page’s conversion rate divided by the project median, with that ratio capped at 5, so the factor is between 1 and 6. Pages without conversion data get 1.
- Confidence factor
- High 1, medium 0.7, low 0.4.
- Effort factor
- Small 1, medium 2, large 4, fixed per rule.
The click-through rates come from a fixed curve for organic results: 27.6% at position 1, 15.8% at position 2 and 11.0% at position 3, falling to 2.4% at position 10 and lower beyond. Serpel scales the 28-day impressions to 30 days. The additional clicks are an estimate, not a measurement, and they are no promise about rankings.
Confidence depends on how many different data sources back a finding and on its impressions. It is High from 3 sources and 500 impressions, Medium from 2 sources or 100 impressions and Low otherwise. Effort is not estimated per page. Each rule has a fixed effort, which the table above shows.
Take a query with 1,000 impressions in 28 days at an average position of 6. Scaled to 30 days that is 1,071 impressions. Moving to position 3 raises the click-through rate from 4.9% to 11.0%, which means about 65 extra clicks per month. With only Search Console behind it, confidence is medium (0.7), and “Almost on page 1” is medium effort (2). The impact score is 22.9.
When does Serpel recalculate opportunities?
Serpel recalculates the opportunities of a project after a crawl, a monitoring run, a search data sync, a web analytics sync, a Bing sync or a codebase scan. A Bing sync is only a trigger, because the rules don’t read Bing data. A calculation runs at most once every 60 minutes per project. If several of these events happen within the hour, Serpel combines them into one calculation when the hour is over. A manual rank check or AI check doesn’t start a calculation on its own, but the next one picks up its results.
The Last seen column shows when the latest calculation confirmed an opportunity. The monitoring and reports guide explains how to keep data fresh with a schedule.
What do the statuses and actions mean?
| Status | What it means | Actions |
|---|---|---|
| Open | New, or reopened. Nobody has reviewed it yet. | Accept, Done, Dismiss |
| Accepted | You plan to work on it. | Done, Dismiss, Reopen |
| Done | You have made the change. The next calculation checks whether the condition has gone. | Reopen |
| Dismissed | You don’t want to act on it. It stays dismissed even if the condition still applies. | Reopen |
| Stale | The latest calculation no longer finds the condition. You can only dismiss it. | Dismiss |
These actions only change the status in Serpel, not your website. The list view Active shows open and accepted opportunities, and the other views show one status each. After you mark an opportunity as done, the next calculation either confirms it, which the opportunity page shows as Confirmed by follow-up run, or finds the condition still present. If the condition still applies 28 days after you marked it as done, Serpel reopens the opportunity. A stale opportunity reopens by itself when its condition returns.
Serpel keeps the best 200 findings per calculation by impact score. An opportunity that drops out of that set becomes stale, like one whose condition has gone. If a stale or dismissed opportunity hasn’t come back for 180 days, Serpel deletes it, and a later return shows up as a new opportunity.
How do you work with opportunities?
Open Opportunities.
It is the second entry in the project sidebar. The number next to it counts your open and accepted opportunities.
Pick a view and sort by impact.
The views are Active, Open, Accepted, Done, Dismissed, Stale and All. The list is sorted by Impact. Use the search field Search title, keyword or page … or the filters for rule, confidence and effort.
Open an opportunity.
The page explains Why?, states the Next action, lists the Evidence with the numbers behind it and shows the Affected location, the Data sources and a Timeline.
Set the status.
Use Accept, Done, Dismiss or Reopen. To handle several at once, select rows in the list and use the bulk actions Accept or Dismiss. Viewers can read opportunities but can’t change their status.
How do you use opportunities from the CLI, API or MCP?
The CLI and the API call opportunities recommendations. The CLI command group serpel recommendations, also available as serpel recs, lists opportunities, shows one with its evidence and changes its status. The REST API offers the same, and over MCP the tool get_seo_recommendations lets an agent read the list, up to 25 entries per call. By default it returns open and accepted opportunities. Pair it with the Claude Code guide to let an agent work through the list.
| Task | CLI | API | MCP |
|---|---|---|---|
| List opportunities | serpel recommendations list --project <id> --status active | GET /projects/{id}/recommendations (recommendations:read) | get_seo_recommendations |
| Show one with evidence | serpel recommendations show <id> | GET /recommendations/{id} (recommendations:read) | Included in the list |
| Accept, dismiss, complete or reopen | serpel recommendations accept <id>, dismiss, done or reopen | PATCH /recommendations/{id} (recommendations:write) | Not available |
serpel recommendations list --project <id> --status active
serpel recommendations show <id>
serpel recommendations accept <id>
serpel recommendations done <id>The PATCH request takes one of the statuses open, accepted, dismissed or done. A stale opportunity accepts only dismissed; the API answers any other status with a conflict error.
{ "status": "done" }What can go wrong?
| What you see | Why | What to do |
|---|---|---|
| “No opportunities yet” | Serpel has no data to evaluate, or the data shows nothing noteworthy. A new calculation runs at most once an hour. | Work through How opportunities arise: connect Search Console, track keywords, crawl your website and scan your codebase. |
| An opportunity vanished from Active | It became stale because its condition no longer applies, or someone dismissed it. | Open the view Stale or All to find it. |
| A finished opportunity came back after 28 days | The condition still applied at the next calculation, so the fix may not be live or not yet visible in the data. | Check that the change is published and crawled. Dismiss the opportunity if you disagree with it. |
| A rule never produces anything | Some rules need specific data: conversion events for Visitors who don’t convert and Strong page with low reach, keywords with search volume for Missing page and a saved competitor for Competitor ahead. | Add the missing source. The table of rules above shows what each one needs. |
| The extra clicks don’t match my Search Console numbers | They are estimates from a click-through curve, scaled to a month, not measurements. | Use them to compare opportunities with each other, not as a forecast. |
Where to go next
Updated 5 Nov 2026
See also
- Search dataHow search data works in Serpel: connect Google Search Console and Bing Webmaster Tools, read clicks and impressions, check the index and export CSV.
- Site auditSite audit in Serpel: how a crawl runs, how to read issues and pages, how the audit score works and what a crawl costs in credits.
- Codebase scanHow the codebase scan works in Serpel: run serpel scan on a Next.js project, see what is sent, compare routes with live pages and fix mismatches.
- Competitors: see who ranks ahead of youSee which competitors rank ahead of you with Serpel’s competitor analysis: share of clicks, page 1 and top 3 counts and keyword-by-keyword positions.