PeekPanda docs
Honest unknowns
What PeekPanda does not know about an app, why the limit exists, and why a null is more useful to you than a confident guess.
Download Markdown ↓PeekPanda only knows what a public store surface will tell it. That boundary is the product's main constraint, and it is worth understanding precisely, because it explains both what you can trust and what you should never ask this tool for.
The rule underneath everything on this page:
A number PeekPanda does not hold is
null, and it is shown as Not collected with a reason. It is never rendered as zero, never filled with a fallback, and never quietly replaced by a modelled value that looks like an observation.
Zero and unknown are different facts. Conflating them is how competitive tools become untrustworthy, because you stop being able to tell which of the two you are reading.
Not known: what an app spends on advertising
PeekPanda observes public ad libraries. Those libraries publish what an advertiser is running: the creative, the copy, the call to action, the destination, and the window it has been live. They do not publish budgets.
So there is no spend number here, and there will not be one:
- No daily or lifetime spend
- No budget
- No cost per install, cost per click, or CPM
- No return on ad spend
- No impressions
The one performance figure that exists is narrow and worth naming exactly. Some ads carry a reach number that the platform itself is legally required to disclose in the EU and the UK. Where it exists, PeekPanda stores it with everything needed to read it correctly: the metric, that it came by regulatory disclosure, which platform reported it, and the geographic scope it covers.
That figure is a platform-reported regulatory disclosure for the EU and UK only. It is not global reach, not impressions, and not a PeekPanda estimate. When an ad has no such disclosure, the evidence is recorded as unavailable rather than as zero.
Contract: paidAdPerformanceEvidenceSchema in packages/libraries/src/domain/paid-ad-library/paid-ad-library.contract.ts.
Why the limit is real. Ad spend is private. Any tool showing you a competitor's ad budget is modelling it, usually from impression-share guesses layered on more guesses. PeekPanda would rather show you what an advertiser is actually saying, dated, than a spend figure nobody can check.
Not known: what happens inside the app
PeekPanda sees the store listing and the store's public feeds. It does not see anything behind the download button:
- Onboarding flows, paywall placement, or trial design
- Conversion from install to trial, or trial to paid
- Retention, churn, or session behaviour
- Pricing experiments and who saw which variant
- Which subscription tiers actually sell
None of this is observable from a public store surface. It can only be obtained by installing the app and going through it yourself, or by buying it from a panel-based vendor. PeekPanda does neither.
Not known: measured downloads or reported revenue
Apple publishes neither. Both numbers in PeekPanda are models, and how estimates are computed shows the whole derivation of each.
The important consequences, restated here because they are easy to skip:
- Installs are derived from rating counts. They are never a measured download count. An app that changes how often it asks for ratings will move this estimate without a single extra install.
- Revenue is derived from a grossing chart position. An app that is not on a grossing chart has
nullrevenue, not zero. Most apps in the catalogue are in exactly that position, because charts are the top slice of the store. - Only four charts are calibrated. Every other category's revenue model uses an uncalibrated placeholder for the number-one app.
Both estimates carry their method name in the response, ratings_delta_proxy and grossing_rank_power_law, so a number can never arrive without the label of how it was made.
Not known: real App Store keyword rank
Every keyword position PeekPanda holds is a position observed in the store's public search response. It carries the label observed_search_api_position through the entire contract precisely so it can never be silently relabelled as something stronger.
What that means in practice:
- It is not the rank a user sees in the App Store app, which is personalised and can differ.
- An empty keyword list on a profile means the app was not in the collected query set. It does not mean the app ranks for nothing.
- Nothing past the store's own 200-result cap is known.
Not known: search volume
There is no public search-volume figure for the App Store. PeekPanda does not model one, and the Demand score is deliberately named after its source rather than after volume. It is the store's own autocomplete ordering, turned into a 0–100 score. See keyword metrics explained.
The store's advertising platform publishes a 5–100 search popularity score to advertisers. PeekPanda is not connected to it, so that number does not appear anywhere in the product. Where the contract has a slot for it, the slot is empty.
Not known: Android, or anything outside iOS
The catalogue is iOS only. There is no Google Play coverage, no Android listings, and no cross-platform comparison. An app that exists on both platforms is here as its iOS listing and nothing else.
Not known: every country
Coverage is deliberate and narrow, and differs by data kind:
| Data | Countries |
|---|---|
| Ranking feeds | United States, United Kingdom, France, Germany, Brazil, Belgium |
| Rating tape and install estimates | United States |
| Keyword collection | United States, in English |
| Revenue estimates | The six chart countries, each with a flat scale factor |
There is no 152-country ratings dashboard and no per-country keyword data. A country outside these lists returns null, not a scaled guess.
Not known: who owns a social account
Organic social results are matched to apps by name. A name match is a suggestion, not a verified ownership claim, and PeekPanda never presents it as one. An account with a similar name may belong to the company, a fan, a reseller, or someone unrelated.
What you can do about a gap
Every profile carries a data request control. Pressing it records deduplicated demand for one kind of intelligence on that listing: revenue, downloads, paid ads, organic, ASO, or history.
Be clear about what that does and does not do. It records that you want it. For iOS ASO it also queues title-discovery collection, so a request there turns into real work. For the other kinds it registers demand and nothing more. It does not promise the data will appear, and it never conjures a placeholder in the meantime.
Kinds: APP_CATALOG_INTELLIGENCE_REQUEST_KINDS in packages/libraries/src/domain/app-catalog/intelligence-request.contract.ts.
Why this reads as rigour rather than as a gap
A competitive intelligence tool has one failure mode that matters: you make a decision on a number that was invented. Every limit on this page is a place where PeekPanda could have shipped a plausible figure and chose not to.
The trade is straightforward. You get fewer numbers. The ones you get, you can audit: the formula is published, the constants are named, the anchors are dated, and the observations carry the moment they were taken. When PeekPanda does not know something, it says so, in the same place it would have shown you the number.
That is what makes the numbers it does show worth using.