Skip to main content
Positions are 1 based, so position 1 is the top result. A null position means asobeast checked the keyword and did not find the app within the captured depth. It never means zero.

How is a position recorded?

Each check writes one row per app, keyword and UTC date, and stores the depth that check covered alongside the position. The default depth is 200. The row is written even when the app was not found. That is deliberate: an absent row and a null position mean different things, and only storing both lets you tell “we did not look” apart from “we looked and it was not there”.

What does null mean?

Checked, and not found within depth. It does not mean any of the following.

How is null displayed?

As a bound derived from that row’s own depth, never as 0. A row captured at depth 200 renders as >200, and a row captured at depth 100 renders as >100. Reading the bound from the row rather than from a constant matters, because historical rows may have been captured at a different depth than today’s.

How do I know a position is current?

Every tracked keyword reports latestCheckedOn, the UTC day of its newest check, whatever that check found. It is null for a keyword that has never been checked. The daily run checks every active keyword, so a newest check from today or yesterday UTC is current. An older one means the checks since that day did not finish, for example because the store refused the search. A failed check never writes a row, so it can never show up as a drop. The keywords table then shows a clock in place of the info button beside the position, opens the day of the last check from it, and hides the change since yesterday, because that change compares the last check with the day before it. A paused keyword is not checked on purpose and shows no day.

How many competitors are in the top 10?

The keyword monitor can count, for each keyword, the competitors of the app that appear in the newest stored top 10 for that keyword in its market. The count reads the same SERP snapshot as the top 10 sheet and the volatility column, so it never makes a store request. It is a number from 0 to 10 when the app tracks at least one competitor and the snapshot is from today or yesterday UTC, and a dash otherwise, because a paused keyword is not checked and an older snapshot would describe a day that has passed. A competitor counts once however many times it appears. Your own app is never counted. The comparison matrix on the competitors page reads positions beyond 10 as well, so it can show a competitor that this count leaves out.

How are positions charted?

Ranking charts use a reversed Y axis, so position 1 sits at the top and an improving line rises. A null breaks the series rather than dropping it to the bottom of the chart. Every UTC day from the first check in the range to yesterday, or to today once today has a check, sits on the chart’s axis. A day without a check therefore leaves a gap in the line with no marker, while a check that did not find the app leaves a gap with a hollow marker at the depth line. A ranked day between two gaps is drawn as a dot.
If you consume the API, treat null as absent rather than as 0. Coercing null to zero makes every unranked keyword look like the best possible result and inverts every trend, average and delta you compute.

How deep does the SERP snapshot go?

Position checks capture to depth 200. The stored SERP snapshot keeps the top 50 results for each keyword and date. The top 10 is kept for RETENTION_SERP_DAYS, positions 11 to 50 for RETENTION_SERP_DEEP_DAYS. Entrant alerts, SERP movers, volatility, competitors in the top 10 and competitor discovery read the top 10 only.
Last modified on October 31, 2026