Overview
The SEO Rank Tracker is an seo rank tracker: a standalone desktop bot that runs every keyword on your list as a live web search, finds where a chosen domain appears in the organic results, and records the position in the Default dataset, which the launcher saves as a local CSV.
What does the SEO Rank Tracker do?
You give it two things before a run: a domain (the shipped configuration defaults to amazon.com) and a list of keywords, one per line. For each keyword the bot opens a visible browser window - headless mode is off in this configuration - loads the search engine results page for that keyword, and scans the organic result cards. Any card whose displayed URL contains your domain becomes a row: the domain, the keyword, the display URL and the position on the page. Rows for everyone else are discarded by the filter, so the output is a clean “where do I rank” table rather than a copy of the whole results page.
One honesty note up front: this bot is not affiliated with, endorsed by, or connected to any search engine. It reads the same public results a logged-out visitor sees. The selectors in its configuration match the results container structure at the time of release; search engines redesign their markup regularly, and the diagnostics section below explains what a mismatch looks like.
Because everything runs on your own machine, your keyword strategy - which terms you track, which domains you monitor, how often you check - never passes through a third-party service. That is the point of a local-first tracker: the artifact and the workflow both belong to you.
Who uses an SEO rank tracker?
The in-house SEO lead asks “did the redesign move our category pages up or down?” and needs a dated position table before and after. The e-commerce founder asks “do we actually rank for the ten terms we are optimizing?” and needs a quick check without signing up for a subscription. The freelance consultant asks “what is the current position snapshot for this client report?” and needs a CSV to paste into their own template and date-stamp. All three want the same artifact: a small table of keyword, domain, URL and position, produced on demand, comparable across weeks by diffing files.
How does a Google rank checker run work, step by step?
Every command in the run is linked to its reference page. The configuration first seeds the browser session at the search home page declared in the project settings. Then for_each iterates the keywords list variable, binding each line to the loop variable keyword. Inside the loop, goto loads https://google.com/search?q=${keyword}&udm=14 - the udm=14 parameter pins the engine to its web-results view. Next, extract_data reads the Default dataset: the item selector matches each organic result card in the results container, and four properties are captured - Domain (from the domain variable), Keyword (from the loop variable), URL (the display URL text, with a script transformation keeping everything before the first space) and Rank (the index of the card among the rendered results). The extraction carries the filter condition item.URL.includes(item.Domain), so only cards whose display URL contains your domain survive into the dataset. After the loop finishes, the consolidated dataset is written out.
There is no deduplication key and no scroll or pagination step: one search page per keyword, first page only, one row per appearance of your domain.
What does a keyword position tracker output look like?
The sample row below is the listing’s published sample output, so the table and the field notes agree by construction:
| Domain | Keyword | URL | Rank |
|---|---|---|---|
| amazon.com | stainless steel water bottle | www.amazon.com | 3 |
Domain echoes the domain variable you set for the run, on every row, so files from several runs can be stacked without losing track of whose positions they are.
Keyword is the exact search string from your list. Because it is stored per row, the CSV is already in tidy form: one keyword-position pair per line, ready for a pivot.
URL is the display URL of the matching result card, truncated at the first space by the transformation. It tells you which page of the site holds the position - often more useful than the position itself.
Rank is the 1-based index of the result card among the organic results rendered at run time. The index is computed before the domain filter is applied, so it is the true on-page position, not a renumbering of only your hits. No row for a keyword means no card matched the domain - see the diagnostics section.
Can it serve as a SERP rank tracker for client reporting?
Yes, with honest boundaries. A SERP rank tracker for reporting ultimately answers “which terms moved, on which pages, since when?” - and a dated CSV per run answers the first two directly; “since when” comes from diffing this week’s file against last week’s in your spreadsheet. What the bot does not do is store history, draw trend charts, or send alerts. Those are features of subscription products, and the comparison below sets out the trade. For a monthly client report built from a snapshot, the CSV-plus-spreadsheet workflow is complete; for continuous monitoring with dashboards, this is deliberately not that tool.
How do I do bulk rank checking without an API budget?
Bulk rank checking normally costs either subscription seats or per-request API fees. This bot costs neither: the keywords variable is a list, so one run walks the entire list sequentially, and the only resources consumed are your own bandwidth and a few seconds per keyword. The practical bound is politeness, not price - a list of 50 to 100 terms in one run is reasonable; thousands of terms per day from one residential IP is the kind of volume that triggers challenges and, honestly, deserves to. Split large lists across runs and days.
How does it compare to subscription trackers and manual checking?
Manual checking works for five keywords and produces no record; by the twentieth keyword, personalization and fatigue make the numbers unreliable and nobody keeps the history. Subscription trackers add daily re-checks, location grids, competitor sets and dashboards, and their published plans typically bill by tracked keywords or seats - treat any vendor pricing page as that vendor’s own current claim. SERP data APIs sold per thousand requests give raw positions but leave you to build and host the pipeline. This bot sits at the simplest corner of that map: on-demand snapshots, first page only, one domain per run, output as a local CSV, zero marginal cost per run. You trade automation and history for ownership and simplicity.
How do you set it up on Windows, macOS and Linux?
Download the launcher for your operating system from this page. On Windows, run the executable; SmartScreen may ask for confirmation on first launch, and “More info” then “Run anyway” proceeds if you trust the published checksum. On macOS, Gatekeeper may quarantine the download; right-click and “Open”, or clear the flag with xattr -d com.apple.quarantine /path/to/SEORankTracker, then launch. On Linux, the launcher is a shell script: chmod +x ./seo-rank-tracker then ./seo-rank-tracker. At run time the bot prompts for the two required variables - domain and keywords (one keyword per line) - and both must be supplied before the loop starts. The browser window stays visible during the run because headless mode is off; this is intentional, since a visible session is less likely to meet challenges. To run it on a schedule, point your operating system scheduler (Task Scheduler, cron, or launchd) at the launcher - the bot has no internal timer.
What do I check when a run returns zero rows?
First separate “no rows for one keyword” from “no rows at all”. Zero rows for a single keyword is often the true answer: the domain simply does not appear on the first page for that term, and the filter dropped every card. Zero rows for every keyword means the run itself failed, so check in order: did a consent or cookie interstitial cover the results page (watch the visible browser window)? Did the engine serve a verification challenge - this configuration has no solver, so a challenge ends the collection honestly rather than working around it? Did the engine redesign its results markup so the card selector no longer matches? Is the domain string an exact substring of the display URLs - a short domain will not match rows showing a different host unless it is genuinely contained in them? The contract is that failure is loud: empty output means “not found or not read”, never invented positions.
What are the limits of the bot?
First page only - there is no scroll or pagination, so a domain sitting on page two is recorded as absent. One domain per run; a competitor comparison is two runs and a spreadsheet join. Web results only - the udm=14 parameter excludes images, news, video and local-pack presentations. No history, no diffing, no alerts, no internal scheduling. Positions are what one logged-out browser on your IP saw at run time; another region or device can legitimately see a different order. It does not bypass anti-bot measures and does not sign in anywhere. And the output records display URLs, not the final resolved link behind each card.
What is responsible rank tracking?
Automated querying may conflict with the search engine’s terms of service, and every request leaves from your own machine and IP - there is no shared infrastructure to absorb the volume. Keep lists modest and runs occasional, at a pace a patient human could sustain. Track domains you own or have a legitimate reason to monitor; the positions themselves are public facts, but how you use a competitor snapshot is your responsibility under the platform’s terms and your local laws. Do not resell raw results pages. The acceptable-use policy applies in full before your first run.