Skip to main content
RTILA Marketplace

Turn a keyword list into dated search positions for any domain you track

Check where a domain ranks in web search results for a list of keywords and export the positions to CSV.

SEO Beginner Experimental v1.0.0 Updated Updated 2026-09-20 8 min read
Download
  • Windows x86_64

    BOT_seo-rank-tracker.exe

    98.9 MB

    Download
  • macOS Apple Silicon chmod +x

    BOT_seo-rank-tracker.sh

    87.5 MB

    Download
  • macOS Intel chmod +x

    BOT_seo-rank-tracker.sh

    99.4 MB

    Download
  • Linux x86_64 chmod +x

    BOT_seo-rank-tracker.sh

    122.5 MB

    Download

Do not rename the downloaded file - the filename carries the bot's configuration id.

This tab summarises what the bot does, what it costs, the technical requirements it places on your machine, and how the author is credited - the starting point before you download anything.

Key facts

What it does
Check where a domain ranks in web search results for a list of keywords and export the positions to CSV.
What it outputs
BOT_seo-rank-tracker.exe
Difficulty
beginner
Platforms
windows, macos, macos_intel, linux
Estimated run time
1-10 minutes depending on keyword count
Internet at launch
Required
On this page

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:

DomainKeywordURLRank
amazon.comstainless steel water bottlewww.amazon.com3

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.

#rank-tracking#keyword-ranks#seo-audit#serp-data#google-search

Sample output

The first rows a finished run produces. The Output tab documents every dataset and field.

DomainKeywordURLRank
amazon.comstainless steel water bottlewww.amazon.com3

Related resources

Technical details

Launcher version
1.0.0
Minimum runtime version
1.0.0
Internet required at launch
Yes
Update channel
live
Config encoding
plain

Requirements

  • Minimum launcher runtime version: 1.0.0.
  • Supported operating systems: Windows x86_64, macOS Apple Silicon, macOS Intel, Linux x86_64.
  • On macOS Apple Silicon and macOS Intel and Linux x86_64 the launcher is a shell script: if your system flags it as quarantined or strips the executable bit, grant execute permission with chmod +x BOT_seo-rank-tracker.sh and approve the launcher in Gatekeeper (macOS security settings) before the first run.
  • First launch requires an internet connection to fetch the bot's configuration by id.

Responsible use

See our acceptable use policy and takedown process.

Commands this bot uses

These are the commands the published configuration actually uses.

The count is how many times each command appears in the published configuration; it is derived from the project, not hand-authored.

Frequently asked questions

How do I check my Google ranking for multiple keywords?
Paste one domain into the domain field and one keyword per line into the keywords list. The bot loops the list, runs a live search for each term, and records every result card whose display URL contains your domain, with its position on the page. The run ends with a CSV you can open in Excel or Sheets.
How do I track keyword positions in bulk for free?
The keywords variable is a list, so one run walks the entire list sequentially. The launcher is free and there is no per-run or per-keyword fee - the only cost is your own bandwidth and a few seconds per keyword. The practical bound is politeness: lists of 50 to 100 terms per run are reasonable, and huge daily volumes from one IP will trigger challenges.
How does the bot find my domain in the search results?
It reads the display URL of each organic result card, keeps the text before the first space, and applies the filter condition item.URL.includes(item.Domain). Only cards whose display URL contains the domain you configured survive into the dataset, so the output is your positions, not a copy of the whole results page.
What does the Rank column mean?
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 - a 7 means the card was the seventh organic result, not the seventh row in your file.
Why does a keyword return no rows?
Two very different causes. For a single keyword, no rows is usually the honest answer: the domain does not appear on the first page, and the filter dropped every card. For every keyword at once, the run itself failed - a consent interstitial, a verification challenge (no solver is configured), or a results-page redesign the selectors no longer match. Watch the visible browser window to tell them apart.
How do I export keyword rankings to CSV?
The consolidated Default dataset is written to a local CSV file by the launcher after the loop finishes, with one row per appearance of your domain: Domain, Keyword, URL and Rank. Rename the file with the run date and diff successive files in your spreadsheet to see movement over time.
Can I track a competitor domain instead of my own?
The domain field accepts any string, and the positions recorded are public facts visible to any logged-out visitor. But the platform terms and your local laws still govern how you collect and use the snapshot, and the bot offers no permission system of its own - that judgement is yours.
How often should I re-run the rank tracker?
As often as your volume budget allows; weekly is typical for client reporting and daily is aggressive from a single IP. The bot stores no history, so the workflow is: run, date the CSV, and diff against the previous file. Schedule it with your operating system scheduler if you want unattended weekly runs.
Does the bot use a search API?
No. It loads live results pages in a real browser session, exactly what a logged-out visitor sees. There are no API keys, no request credits and no per-query fees. The trade-off: first page only, web results only, and positions reflect your own IP and region at run time.
Is automated rank checking allowed by search engines?
Automated querying may conflict with the search engine terms of service. This bot keeps volumes human-scale and hands no challenge to a solver - it simply stops - but the decision to run it, and how often, is yours to own under the platform terms and your jurisdiction.
Does the bot need an internet connection to run?
Yes on first run: the launcher fetches its configuration by id from the backend at launch, so an internet connection is required at least the first time it starts.
Can I rename the downloaded file?
No. The downloaded file must keep its exact name - the filename carries the per-bot configuration id, and renaming it breaks the configuration fetch at launch.