#334·open-seo

Rank Tracking: scheduled checks complete but silently return no position for a large, structured subset of keywords (self-hosted, v0.1.8)

Author: kyo-1219Created Sep 14, 2026Updated Sep 14, 2026

Rank Tracking: scheduled checks complete but silently return no position for a large, structured subset of keywords (self-hosted, v0.1.8)

Summary

On a self-hosted Cloudflare deployment running v0.1.8, daily scheduled rank checks fire and complete, but roughly two thirds of the tracked keywords come back with no position at all. The blank set is identical on consecutive days and is structured, not random — whole area blocks and whole head terms are blank while their neighbours update normally.

This is not #198. There, the cron never fired. Here the cron fires on time every day and some keywords do update.

The blanks are indistinguishable in the UI from "not ranking in the top 100", so the tracker silently reports keywords as unranked when they are in fact ranking on page 1.

Setup

  • Version: v0.1.8 (self-hosted, Cloudflare Workers)
  • Tracker: 270 keywords, single domain, mobile only, depth 100 (10 pages)
  • Location 2392 (Japan), language Japanese, National targeting
  • Schedule: daily
  • DataForSEO: own API key, funded

Observed behaviour

Two consecutive runs, both completing:

  • 2026-09-13 04:34:39
  • 2026-09-14 04:34:39

Some keywords update normally between the two runs (positions moving 15 → 22, 7 → 5, 10 → 9), so the workflow, billing and snapshot writes are healthy for those.

Pattern 1 — an entire area block is blank for every head term

The keyword set is head term × area. One contiguous group of areas returns no position for all ten head terms, on both days (~125 keywords):

丸の内 / 京都 / 兵庫 / 天神 / 新宿 / 新橋 / 東京 / 浜松町 / 神田 / 福岡 / 西宮 / 赤坂

For comparison, within the same run:

keyword | result -- | -- コワーキングスペース 渋谷 | 1 コワーキングスペース 市ヶ谷 | 3 コワーキングスペース 日本橋 | 7 コワーキングスペース 新橋 | (blank) コワーキングスペース 新宿 | (blank) コワーキングスペース 東京 | (blank)

Per day this is 24 (Sep 13) and 23 (Sep 14) errors — far fewer than the ~180 keywords with no position. So most of the missing keywords are not failing loudly; they produce no error at all.

40602 on task_get is "task in queue / not ready". That suggests results are being polled before DataForSEO has them and then abandoned rather than retried, but I have not been able to verify that from outside.

Why this matters beyond the bug

Even setting the root cause aside: a keyword that could not be fetched is displayed exactly like a keyword that genuinely does not rank in the top 100. There is no per-keyword error state, no partial-run warning, and no indication that only a fraction of the tracker was actually checked. A user reading this tracker would reasonably conclude the site lost 180 rankings overnight.

Requests

  1. Distinguish "fetch failed / not checked" from "not in top 100" in storage and in the UI.
  2. Retry or poll 40602 responses instead of recording an empty result.
  3. Surface a run summary (requested / succeeded / failed) so partial runs are visible.
  4. If keywords are processed in batches, check whether a batch can be dropped without raising — the failures here fall on contiguous ranges of the keyword list, which suggests batch-level rather than keyword-level loss.

Happy to provide the full 270-row output from get_rank_tracker for both days, or the tracker ID, if that helps.