How do you find out when a competitor overtakes one of your pages?
You watch your own position rather than theirs. Search Console tells you where your pages sit and nothing about who is above you, so the practical alert is built on your own average position degrading for a query you used to own. Identifying the competitor is a separate, manual step afterwards.
That distinction matters because most people go looking for a tool that will tell them "competitor X passed you on query Y", spend money on it, and end up with a dashboard nobody opens. The alert that actually gets acted on is smaller and built from data you already have.
What follows is the version I would build. It uses the Search Console bulk export to BigQuery, it runs on a schedule, and it fires rarely enough that you will still read it in six months.
Why can you not just track rankings directly?
Because a ranking is not a fact about the world, it is a fact about a search, and searches differ by person, place, device, and moment. Any tool telling you that you are position four is telling you about one simulated search, which may or may not resemble what your buyers see.
Rank trackers are genuinely useful and I am not dismissing them. Tools like Ahrefs and Semrush exist for this and have their own alerting, and if you want that route, read their current documentation rather than trusting a summary, because that is exactly the kind of detail that changes.
What I would not do is build your early-warning system on someone else's simulation when Google will tell you about your own measured performance for free. Your real average position, across real searches by real people, is a better trigger than a synthetic check from one location.
What signal can you actually own?
Average position for a specific query and page pairing, compared against its own recent history. Google says the bulk export contains all the performance data available to Search Console for your property, with the exception of anonymized queries, which is far more than the interface will show you.
The export creates three tables. Searchdata_site_impression holds performance data aggregated by property, searchdata_url_impression holds it aggregated by URL, and ExportLog records each successful export. For this job you want the URL table, because you need the query and the page together.
If you have not set that up, do that first, because Google is explicit that historical data preceding setup requires the Search Console API or the reports. The export only accumulates forward, so the alert you build today starts being useful in a few weeks. I walked through the configuration in setting up the BigQuery bulk export.
How do you build the alert from Search Console data?
Write a scheduled query that compares two windows. Take the average position for each query and page pair over the last seven days, compare it against the same pair's average over the preceding twenty-eight days, and return the rows where the recent window is meaningfully worse.
Filter on the date partition in both halves of that query, always. The URL impression table is partitioned by date, and a comparison query that forgets the partition filter will scan your entire history twice, which is where cloud bills come from.
Then add an impressions floor before you look at anything else. A query with four impressions can swing from position three to position twenty because one person in one country searched once, and that is noise wearing the costume of a signal. I would not look at any pair below a few hundred impressions in the longer window.
What threshold should trigger it?
Something you can defend, not something that sounds precise. I would start with a degradation of three positions or more, on a pair that previously averaged inside the top ten, with the impressions floor applied. Those three conditions together produce a short list.
The reason to require a previously good position is that movement from twenty-two to twenty-six is meaningless, and movement from three to seven is a real loss of clicks. The alert should be about revenue-shaped changes rather than about the whole distribution shifting slightly.
Tune it once after a month of watching. If it fires every day, your threshold is too loose or your floor is too low. If it never fires, check that it would have caught something you know happened, because an alert you cannot falsify is not an alert.
How do you avoid alert fatigue?
Send it weekly, not daily, and send nothing when there is nothing. A scheduled message that says "no changes" every morning trains people to delete it unread, which means the one that matters gets deleted too.
Cap the output. If more than about ten pairs qualify, something systemic happened and you do not need a list, you need to go and look at the site. Sending a hundred rows guarantees nobody reads any of them.
Also monitor the pipeline separately from the findings. Google says failed exports are not recorded in ExportLog, so an empty result could mean nothing degraded or could mean no data arrived. Check that ExportLog has a fresh row before you trust a quiet week, which is the same silent-failure problem I wrote about in monitoring silent automation failures.
How do you find out who actually overtook you?
By hand, once the alert has narrowed it to a handful of queries. Open a clean browser session, run the query, and look at what is now above you. This takes two minutes per query and it is the only step that reliably tells you the truth.
What you are looking for is not just the identity of the competitor but the shape of what replaced you. Sometimes it is a rival page. Sometimes it is a forum thread, a video, or a different page on your own site, and each of those implies a completely different response.
Do not automate this part. The manual look is where you notice that the result type changed entirely, or that the query now returns something that suggests the intent behind it has shifted, and no alert would have told you either of those things.
What do you do when the alert fires?
Check whether the page changed before you check whether the competitor did. A surprising share of position losses trace to something on your side, including an edit that removed the passage that was doing the work, a template change, or a redirect somebody added.
If your page is unchanged, compare what is now ranking against what you published and ask what question it answers better. Usually the answer is specificity: the new page addresses a narrower situation, and yours addresses the category.
Then decide whether it is worth fighting for. Not every lost position should be contested, and spending three days recovering a query that sends fifteen visits a month is a bad trade. The alert exists to let you choose deliberately, not to make every drop into a task.
What does this approach miss?
Queries you never ranked for. If a competitor publishes something that captures demand you were never part of, nothing in your own data will show it, because your data only knows about searches where you appeared. That is a real blind spot and it needs a different method entirely.
It also misses rare queries by design. Google anonymizes rare ones, saying the query field will be null when it's true to protect the privacy of users making the query, and that under the threshold some other fields like URL and country may be missing. So the long tail is partly invisible here.
And it lags. You are comparing week-level averages, so a change that happened on Tuesday will surface the following week. That is an acceptable trade for a signal that reflects real searches, but you should know you are buying accuracy with time. It also says nothing about how you are doing in answer engines, which is a separate question I get into in why AI answer engines cite competitors and not you.
What should you do next?
If the bulk export is already running, write the two-window comparison query this week, put an impressions floor on it, and schedule it weekly into whatever inbox you actually read. That is the whole build and it is an afternoon.
If the export is not running, set it up today and do nothing else, because the data only accumulates forward and every week you wait is a week of baseline you will not have when you need it.
If you want a second opinion on the thresholds before you commit to them, reach out. Getting the floor and the window right is most of the difference between an alert somebody reads and one that quietly becomes noise.
Get found, cited and the back office automated
Let's make your site the source AI engines quote and wire up the systems behind it.
Read more blogs
Let's get your website found and cited by AI
Tell me what you're working on, whether AI search is skipping your product, your back office is buried in manual work, or you need a build that does both.