Skip to main content
RTILA Marketplace

SEO Rank Tracker - project configuration

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 presents the complete project configuration exactly as published - the same JSON the launcher fetches at launch - ready to read, copy, or import into the desktop product. Back to the overview tab.

Project configuration

Full project JSON for seo-rank-tracker

Canonical byte length: 2,064 - the length of the canonical form the digest covers.

Canonical digest: 6f92423c15f457fc31353b7ebea71b3636bd406d232e800fe81fa520a033b487

About the delivered configuration encoding

At launch the backend delivers this configuration to the launcher as plain JSON. The block below is the complete project definition the launcher receives.

What you are reading has machine-readable equivalents, and the JSON at those routes is the same document as the JSON rendered on this page: the listing overview, the per-listing detail document and the configuration document. The digest and byte count shown in the panel header are computed over that document's canonical JSON form - recursively sorted keys, two-space indentation, no trailing newline - which is the form the provisioning pipeline signs and the reconcile control re-digests; it differs from the highlighted block above in key order and by that trailing newline, so hashing the visible text will not reproduce the digest.

Download this JSON
{
  "name": "SEO Rank Tracker",
  "settings": {
    "urls": [
      "https://www.google.com/"
    ],
    "headless": false,
    "humanoidEnabled": false,
    "proxyEnabled": false,
    "captchaEnabled": false,
    "matchTimezoneAndLocale": false,
    "block_resources": false,
    "get_urls_from_sitemap": false,
    "respect_robots_txt": false,
    "skip_initial_navigation": false,
    "variables": [
      {
        "name": "domain",
        "value": "amazon.com",
        "required": true,
        "is_list": false
      },
      {
        "name": "keywords",
        "value": "stainless steel water bottle\nergonomic office chair\nnoise cancelling headphones",
        "required": true,
        "is_list": true
      }
    ]
  },
  "datasets": {
    "Default": {
      "item_selector": "xpath=//div[@id='rso']//a[h3]/ancestor::div[contains(@class, 'g')]",
      "properties": [
        {
          "name": "Domain",
          "type": "text",
          "selector": "variable=domain"
        },
        {
          "name": "Keyword",
          "type": "text",
          "selector": "variable=keyword"
        },
        {
          "name": "URL",
          "type": "text",
          "selector": "css=#rso cite",
          "transformations": [
            {
              "type": "script",
              "code": "return value.split(\" \")[0];"
            }
          ]
        },
        {
          "name": "Rank",
          "type": "index"
        }
      ]
    }
  },
  "commands": [
    {
      "command": "for_each",
      "params": {
        "as": "keyword",
        "source_type": "variable",
        "variable": "keywords",
        "do": [
          {
            "command": "goto",
            "params": {
              "url": "https://google.com/search?q=${keyword}&udm=14"
            }
          },
          {
            "command": "extract_data",
            "params": {
              "dataset": "Default",
              "filter_condition": "item.URL.includes(item.Domain)"
            }
          }
        ]
      }
    }
  ],
  "authors": []
}

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.