Publishing is the beginning. The next question is: are people finding my listing, and are enough of them installing? Guessing does not answer that. Play Console gives you data about how many people see your page, where they came from, how many install, how many stay, and it lets you run experiments to test which icon, screenshots or text works better.
This lesson is Module 2: Analyze and explore opportunities of the Google Play Store Listing Certificate (https://playacademy.withgoogle.com/certificate). As in lesson 50, we teach the skills in our own words and with our own examples; the official course and its exam remain the authoritative source, and we cannot reproduce them.
Honesty note. Report names, metrics and menus in Play Console are renamed and rearranged from time to time. We describe the ideas; use the Console's own help (the ? icon on each report) for the current wording. Nothing here promises installs, rankings or revenue. Data from a small number of users is noisy, and a good analyst says so.
By the end you will be able to:
- Explain the acquisition funnel: store listing visitors → installers → retained users.
- Read the store listing acquisition and user acquisition reports and filter by country, traffic source and date.
- Calculate and interpret store listing conversion rate (CVR).
- Use benchmarks (peer-group comparisons) sensibly.
- Understand how Google Play search and Explore surface apps, and what you can influence.
- Run a sound store listing experiment (A/B test): pick a hypothesis, one change, a sensible audience, a duration, and read the result with its confidence interval.
- Decide what to do next, and what not to conclude.
Big idea: measure, change one thing, measure again. A confident-sounding opinion about "what users like" is not evidence.
- Play Console and the main store listing (lesson 50).
- Percentages and ratios (a conversion rate is
installers ÷ visitors). - Basic idea of an average and a sample size.
- Light Kotlin or Python for the small calculators in this lesson (lessons 6–14).
Imagine a shop in Dugbe market. A hundred people walk past (impressions), thirty step in to look (store listing visitors), and ten buy something (installers). A month later, four of them are still using what they bought (retained users). The shopkeeper can improve the sign (to attract people in), the display (to convince them), or the product (to keep them). Different problems need different fixes.
Impressions (your icon/title in search, Explore, ads) 100,000
| click-through rate (CTR) = visitors / impressions
v
Store listing visitors (opened your listing page) 8,000
| store listing conversion rate (CVR) = installers / visitors
v
Installers (first-time installs) 1,600 (CVR = 20%)
| retention = still active after day 1, 7, 30
v
Retained users 480 (D30 = 30%)
| Stage | What drives it | Where you can act |
|---|---|---|
| Impressions | Search terms, ranking, ads, featuring, links | Title, short description, keywords (lesson 52) |
| Visitors | Icon, title, rating, short description in the result list | Icon, title, ratings |
| Installers (CVR) | Everything on the listing page | Screenshots, graphics, description, video, reviews |
| Retention | The app itself | Onboarding, quality, notifications (careful), updates |
Notice that a better listing cannot fix a bad app. If installers leave on day 1, improving the screenshots will bring more people to a disappointing experience, and ratings will suffer.
In Play Console you find these under Statistics, Reports (names vary) and the Grow users section.
Store listing acquisition report
This report is about people who visited your listing page and what they did. Typical metrics:
| Metric | Meaning |
|---|---|
| Store listing visitors | Users who visited your listing (not counting people who only saw you in a list) |
| Store listing acquisitions (installers) | Users who installed your app for the first time, having visited the listing |
| Store listing conversion rate | Acquisitions ÷ visitors |
| Traffic source | Google Play search, Google Play explore, third-party referrals, Google Ads and others |
| Search terms | The actual queries that led to your listing (where available), with volumes |
| Country, language | Where your visitors come from |
Use filters and comparisons (date ranges, country, traffic source) to see patterns, for example "conversion in Nigeria from Play search" versus "conversion in the UK from referrals".
User acquisition report
This report is about new users over time, including installs that did not come through the listing page (updates, installs from other surfaces) and what they do afterwards: retained installers after 1, 7 or 30 days, cost per install if you advertise, and similar. It helps you see which channels bring users who stay.
Other reports that guide decisions
| Report | Question it answers |
|---|---|
| Statistics (installs, uninstalls, ratings) | How are installs and uninstalls trending, per device and Android version? |
| Android vitals | What are my crash rate and ANR rate? Do they put my visibility at risk? |
| Ratings and reviews | What do users complain about or love? |
| Financial reports | Revenue, if you sell |
| Buyers or subscription reports | For paid products |
Privacy thresholds
Console hides data when the numbers are very small (to protect users' privacy), and some figures are modelled or delayed. A new app with 30 visitors will not give clear answers. Be patient.
Let us compute conversion by hand, then in code. Suppose last month's data for Class Register:
Traffic source Visitors Installers CVR
Google Play search 4,200 756 18.0%
Google Play explore 1,100 143 13.0%
Third-party referrals 1,500 420 28.0%
Google Ads 600 42 7.0%
TOTAL 7,400 1,361 18.4%
The total CVR is 1,361 ÷ 7,400 = 18.4%. Notice how the weighted total does not equal the plain average of the four rates (which would be 16.5%). Always compute totals from totals. A tiny script that does it for you, in Kotlin:
data class SourceRow(val name: String, val visitors: Int, val installers: Int) {
val cvr: Double get() = if (visitors == 0) 0.0 else installers * 100.0 / visitors
}
fun main() {
val rows = listOf(
SourceRow("Google Play search", 4200, 756),
SourceRow("Google Play explore", 1100, 143),
SourceRow("Third-party referrals", 1500, 420),
SourceRow("Google Ads", 600, 42)
)
for (r in rows) println("%-24s %6d %6d %5.1f%%".format(r.name, r.visitors, r.installers, r.cvr))
val visitors = rows.sumOf { it.visitors }
val installers = rows.sumOf { it.installers }
println("%-24s %6d %6d %5.1f%%".format("TOTAL", visitors, installers, installers * 100.0 / visitors))
}
Output:
Google Play search 4200 756 18.0%
Google Play explore 1100 143 13.0%
Third-party referrals 1500 420 28.0%
Google Ads 600 42 7.0%
TOTAL 7400 1361 18.4%
What the table tells you
- Third-party referrals convert best (28%): people sent by a friend, a school website or a WhatsApp group already trust the app. This shows the power of recommendation.
- Explore converts lower (13%) than search (18%): Explore visitors are browsing, search visitors have a need. That is normal.
- Google Ads convert worst (7%): either the ad promise does not match the listing, or the audience is wrong. Do not stop there: ask "why?", and test.
- Volume matters too: referrals convert well but have only 1,500 visitors. A small improvement in search conversion affects far more installs.
Benchmarks
The Console can show a peer set comparison: for example, your conversion rate against the median and top quartile of similar apps in your category and country. Use benchmarks as a direction, not a target. A "lower than peers" rate for a niche school tool is not a failure if the app is intended for a narrow audience. The peer set is chosen by Google and may change.
Seasonality and context
Compare the same weekday patterns and the same season. In Nigeria, installs for an education app will rise when a new school term begins and drop in holidays; an exam-results app will spike in results season. A week-on-week comparison across a public holiday proves nothing. Annotate your own charts with launch dates, app updates and campaigns.
Users reach your listing through:
| Surface | How it works | What you influence |
|---|---|---|
| Search | Matching queries to titles, descriptions and signals such as quality and engagement | Title, short and full description wording, localisation, quality |
| Explore / Home / Categories | Google editorial and algorithmic recommendations | Quality, ratings, relevance, being a good fit for a category; editorial features come from Google's selection, and you cannot buy them |
| Top charts | Based on install and engagement trends | Growth and quality |
| Referrals | Links from websites, social media, QR codes, other apps | The URL and a campaign tracking parameter |
| Ads | Paid campaigns (Google Ads) | Budget, creatives, targeting |
Tracking your own campaigns
When you share a link to your listing, add UTM parameters so the acquisition report can tell you which campaign worked:
https://play.google.com/store/apps/details?id=com.techbase.classregister&referrer=utm_source%3Dschool_newsletter%26utm_medium%3Demail%26utm_campaign%3Dterm2_launch
The referrer value is URL-encoded (%3D is =, %26 is &). Check Google's current documentation for the Play referrer format before relying on it; the Play Console's campaign URL builder produces correct links.
Quality signals
Google Play considers technical quality (crashes, ANRs, battery, slow start-up measured as Android vitals), ratings and reviews, and engagement and retention. A listing with the best screenshots but a 6% crash rate will not do well. This is why lesson 49's pre-launch report and lesson 57's performance work matter for store success.
A store listing experiment (also called an A/B test) shows different versions of part of your listing to different groups of users at the same time, and measures which version gets more installers. It replaces opinions with evidence.
What you can test
| Element | Why it matters |
|---|---|
| App icon | The first thing seen in lists |
| Feature graphic | Prominent at the top of the page |
| Screenshots | Heavily influential for conversion |
| Promo video | Optional; test with and without |
| Short description | Seen in search results and at the top of the page |
| Full description | Mostly for search and detail seekers |
Two kinds of experiments exist in the Console (the names may change):
- Default graphics experiments: test icon, feature graphic, screenshots and video in your default listing (for all users who see the default).
- Localised experiments: test text and graphics in one language, up to a number of variants.
You choose a variant count (for example, up to three variants against the current "control"), an audience percentage (how much of your traffic goes to the experiment, split evenly among versions), and the metric to optimise (first-time installers or retained installers).
Designing a good experiment
Step 1: Write a hypothesis. Not "let's try green". Write:
Because user reviews say "I can't see what it does", we believe that adding a caption
to each screenshot explaining the benefit will increase the first-time installer rate
for Play search visitors in Nigeria by at least 1 percentage point.
Step 2: Change one thing. If you change icon, screenshots and text at once and the result improves, you will not know why. If you must test two, run them one after another.
Step 3: Choose the audience and variants. More variants mean fewer visitors per variant, which means longer experiments. With modest traffic, test one variant against the control.
Step 4: Decide the duration in advance. Run long enough to cover at least one full weekly cycle (weekdays and weekends behave differently), often two or more weeks, and until the Console shows a result with enough confidence. Do not stop on day two because one variant is ahead. Early leads often vanish (this is "peeking").
Step 5: Read the results correctly. The Console reports for each variant:
- The installer count (often scaled to the whole audience) and the performance relative to the control.
- A confidence interval (range) for the difference, and often a statement such as "the variant has an X% chance of performing better".
Interpret like this:
| Result | Meaning | Action |
|---|---|---|
| Interval is entirely above zero | Likely a real improvement | Apply the variant |
| Interval is entirely below zero | Likely worse | Keep the control |
| Interval straddles zero (e.g. -2% to +5%) | Inconclusive: not enough evidence either way | Keep running, or accept that the difference is small and pick on other grounds |
Step 6: Learn and record. Whether it won or lost, write it down: what you tried, why, the result, and what you learned. A decision log is one of the most valuable things a small team can keep.
A tiny significance helper
You do not need statistics software to understand the idea. This Python function uses a standard two-proportion z-test to estimate whether the difference between two conversion rates could just be luck:
from math import sqrt, erf
def ab_test(visitors_a, installs_a, visitors_b, installs_b):
p_a = installs_a / visitors_a
p_b = installs_b / visitors_b
pooled = (installs_a + installs_b) / (visitors_a + visitors_b)
se = sqrt(pooled * (1 - pooled) * (1 / visitors_a + 1 / visitors_b))
z = (p_b - p_a) / se
p_value = 2 * (1 - 0.5 * (1 + erf(abs(z) / sqrt(2)))) # two-sided
return p_a, p_b, z, p_value
p_a, p_b, z, p = ab_test(5000, 900, 5000, 960)
print(f"A: {p_a:.1%} B: {p_b:.1%} z={z:.2f} p={p:.3f}")
Output:
A: 18.0% B: 19.2% z=1.54 p=0.123
A p-value of 0.123 means that if there were truly no difference, we would still see a gap this large about 12% of the time. That is not strong evidence for variant B, even though it looks 1.2 points better. With more visitors the same gap could become convincing. (The Console uses its own methods and shows intervals; this helper only builds your intuition. Never claim certainty from one number.)
How many visitors do I need?
A rough rule of thumb: to detect a relative improvement of 5% on a conversion rate of about 20%, you need many thousands of visitors per variant. Small improvements need huge samples. If your traffic is small, test big, bold changes (a very different icon or screenshot style) that can produce large effects, and be patient.
Pitfalls
- Seasonality during the test. A holiday or a marketing push in the middle contaminates results.
- Novelty effect. A new icon may win simply because it is new; check again later.
- Testing the wrong audience. A test run on all countries may hide a result that is true only for Nigeria. Use localised experiments where relevant.
- Optimising installs while hurting quality. A click-bait screenshot can raise installs and lower retention and ratings. Consider optimising for retained installers where available.
- Policy. Variants must obey the same accuracy rules as any listing. You may not test misleading claims.
Put the analysis together as a repeatable monthly routine.
MONTHLY LISTING REVIEW (30 minutes)
1. Funnel: visitors, installers, CVR vs last month and vs same month last year.
2. Sources: which traffic source grew? which converts worst? why?
3. Search terms: new queries? terms with visitors but low conversion?
4. Countries/languages: any new market with traffic but no localised listing?
5. Vitals and reviews: crashes or complaints that explain a drop?
6. Experiments: any running? any finished? log the result.
7. One decision: choose ONE experiment or fix for next month.
A worked example of reasoning from data:
Observation: Google Play search visitors from Nigeria convert at 18%, visitors from Ghana at 9%. Both see the English default listing.
Possible causes: different price expectations, different payment methods, screenshots show naira only, offline use less relevant.
Next step: create a localised experiment for Ghana with screenshots in cedi and a sentence on mobile money, one change at a time.
Notice the language of caution: "possible causes". Data tells you what happened; only tests and user research tell you why.
Exercise 1: Compute and interpret
For the data below compute each source's conversion rate and the overall rate, and say which source deserves attention first and why.
| Source | Visitors | Installers |
|---|---|---|
| Search | 12,000 | 1,800 |
| Explore | 3,000 | 300 |
| Referrals | 500 | 200 |
| Ads | 2,500 | 125 |
CVR: Search 15.0%, Explore 10.0%, Referrals 40.0%, Ads 5.0%. Overall: 2,425 installers ÷ 18,000 visitors = 13.5%. Attention first: Search, because it is the largest source by far (12,000 visitors) so a small improvement gives the most extra installs; for example +1 point on search is 120 more installers, while +1 point on referrals is 5. Ads at 5% is the weakest and costs money, so investigate it second (ad promise versus listing mismatch). Referrals convert best, which suggests investing in word-of-mouth (share links with campaign parameters).
Exercise 2: Write a hypothesis and a plan
Your screenshots show a cluttered list screen. Write a hypothesis, the single change, the audience, the duration, and the metric for an experiment. Say what result would make you apply the change.
Hypothesis: Because the current first screenshot has no caption and shows 20 rows of small text, we believe that a first screenshot showing one student card with the caption "Mark attendance in one tap" will raise first-time installer conversion for Nigerian Play search visitors by at least one percentage point. Change: first screenshot only. Audience: 50% of default-listing traffic, one variant versus control. Duration: at least two full weeks, longer if the interval is still wide. Metric: first-time installers (and check retained installers afterwards). Apply the variant if the confidence interval for the difference is entirely above zero; keep control if it is below; if it straddles zero, extend once and then decide on other grounds. Record the result in the decision log.
Exercise 3: Spot the bad conclusion
A teammate writes: "After two days, Variant B has 22% vs the control's 19%, so B wins and we should apply it." Give three reasons this conclusion is risky.
(1) Peeking / too short: two days is less than one weekly cycle; weekday and weekend visitors differ, and early differences often vanish. (2) No significance: the sample may be small; without a confidence interval the gap could be luck (use the Console's interval or a test like the z-test helper). (3) Single metric: a higher install rate says nothing about retention or ratings; the better-converting listing might attract the wrong users. Also possible: novelty effect, a concurrent campaign, or a country mix that changed.
Mistake #1: Averaging percentages. Symptom: wrong overall conversion. Fix: divide total installers by total visitors.
Mistake #2: Judging an experiment after a day or two. Fix: decide the duration up front and cover at least a full week.
Mistake #3: Changing several things at once. Fix: one change per experiment.
Mistake #4: Ignoring traffic source. Symptom: confusion about "our conversion". Fix: segment by source and country.
Mistake #5: Chasing benchmarks. Fix: use them as direction; compare to your own history first.
Mistake #6: Optimising installs at the cost of quality. Fix: check retention and ratings after a change.
Mistake #7: No decision log. Fix: record each hypothesis and result.
Mistake #8: Not tagging campaign links. Symptom: every referral appears as "third-party referrals". Fix: use campaign parameters.
Mistake #9: Reading noise as signal in small data. Fix: wait, widen the date range, or test bigger changes.
Mistake #10: Fixing the listing when the app is the problem. Fix: check Android vitals and reviews first.
Question 1. What is the store listing conversion rate?
The percentage of store listing visitors who become first-time installers: installers divided by visitors.
Question 2. Why is referral traffic often higher-converting than Explore?
Referred users usually arrive with trust and intent from a person or site they know, while Explore users are browsing without a specific need.
Question 3. Name three listing elements you can test with store listing experiments.
Any three of: icon, feature graphic, screenshots, promo video, short description, full description.
Question 4. What does a confidence interval that straddles zero mean?
The result is inconclusive: the true difference could be negative, zero or positive, so there is not enough evidence to prefer the variant.
Question 5. Why should an experiment run for at least one full week?
User behaviour differs between weekdays and weekends; a full weekly cycle prevents the result from reflecting only one part of the pattern.
Go deeper: official resources
- Google Play Store Listing Certificate
- Google Play Console Help
- Android Vitals and app quality (developer docs)
- Prepare your app for release
Project goal: Build a small analytics toolkit (Python or Kotlin) that turns exported report data into insights and an experiment decision, using sample data you invent.
Requirements:
- A CSV
acquisition.csvwith columnsdate,country,source,visitors,installersfor at least 60 rows. - A script that prints conversion by source, by country, and overall (weighted correctly).
- A function that flags any source with at least 500 visitors and a CVR more than 5 points below the overall rate.
- An
ab_testfunction and a script that readsexperiment.csv(variant, visitors, installers) and prints which variant would win and a plain-language conclusion ("inconclusive", "B likely better"). - A
DECISIONS.mdwith a hypothesis, plan, result and learning for one experiment. - A short paragraph explaining two reasons your sample data might mislead.
Stretch goal: plot weekly conversion with matplotlib and mark the dates of two app updates.
import csv
from collections import defaultdict
from math import sqrt, erf
def load(path):
with open(path, newline="", encoding="utf-8") as f:
return list(csv.DictReader(f))
def summarise(rows, key):
totals = defaultdict(lambda: [0, 0])
for r in rows:
totals[r[key]][0] += int(r["visitors"])
totals[r[key]][1] += int(r["installers"])
return {k: (v, i, i * 100.0 / v if v else 0.0) for k, (v, i) in totals.items()}
def overall(rows):
v = sum(int(r["visitors"]) for r in rows)
i = sum(int(r["installers"]) for r in rows)
return v, i, i * 100.0 / v
def flag_weak_sources(rows, min_visitors=500, gap=5.0):
_, _, overall_cvr = overall(rows)
for source, (v, i, cvr) in summarise(rows, "source").items():
if v >= min_visitors and cvr < overall_cvr - gap:
print(f"FLAG: {source} converts at {cvr:.1f}% vs overall {overall_cvr:.1f}%")
def ab_test(va, ia, vb, ib):
pa, pb = ia / va, ib / vb
pooled = (ia + ib) / (va + vb)
se = sqrt(pooled * (1 - pooled) * (1 / va + 1 / vb))
z = (pb - pa) / se
p = 2 * (1 - 0.5 * (1 + erf(abs(z) / sqrt(2))))
return pa, pb, z, p
def verdict(p, pa, pb):
if p < 0.05:
return "B likely better" if pb > pa else "B likely worse"
return "inconclusive: keep running or decide on other grounds"
if __name__ == "__main__":
rows = load("acquisition.csv")
v, i, cvr = overall(rows)
print(f"OVERALL {v} visitors, {i} installers, {cvr:.1f}%")
for key in ("source", "country"):
print(f"\nBy {key}:")
for name, (vv, ii, c) in sorted(summarise(rows, key).items()):
print(f" {name:<22} {vv:>7} {ii:>6} {c:5.1f}%")
print()
flag_weak_sources(rows)
exp = {r["variant"]: (int(r["visitors"]), int(r["installers"])) for r in load("experiment.csv")}
(va, ia), (vb, ib) = exp["control"], exp["variant_b"]
pa, pb, z, p = ab_test(va, ia, vb, ib)
print(f"\nControl {pa:.1%} vs B {pb:.1%} (z={z:.2f}, p={p:.3f}): {verdict(p, pa, pb)}")
Example experiment.csv:
variant,visitors,installers
control,5000,900
variant_b,5000,960Running it with that file prints a line like Control 18.0% vs B 19.2% (z=1.54, p=0.123): inconclusive: keep running or decide on other grounds.
Example DECISIONS.md entry:
## 2026-11-02: first screenshot caption (Nigeria, Play search)
Hypothesis: a one-card screenshot with the caption "Mark attendance in one tap" beats the
current dense list screenshot by at least 1 point of CVR.
Plan: 1 variant vs control, 50% audience, 14 days minimum, metric = first-time installers.
Result (after 18 days): control 18.0%, B 19.2%, interval straddles zero. Inconclusive.
Learning: effect, if any, is small. Next: test a bolder change (new first screenshot style
showing the weekly report), because small changes need more traffic than we have.
Two reasons sample data can mislead: it may contain a seasonal spike (term start) that makes one source look better than it is, and small-sample sources (a few hundred visitors) swing wildly from week to week, so a flagged "weak" source could be noise.
Open your finished project in Android Studio. Check that the .gitignore file the wizard created is in the project root. It keeps local.properties, build folders and keystores out of Git. Never commit passwords or signing keys.
Choose Git > Create Git Repository… (or VCS > Enable Version Control Integration in older versions), select the project folder, then open Git > Commit, tick every file, and write the message “Add Android lesson 51 project”.
On github.com click New repository, name it android-lesson-51-analyze-and-explore-opportunities-on-googl, set it to Public, leave Add a README unticked, and click Create repository.
Back in Android Studio choose Git > Manage Remotes…, add the repository URL as origin, then choose Git > Push… and push your main branch. Prefer the terminal? Run git remote add origin <your-url> then git push -u origin main.
Add a README.md with a screenshot of your app running and a short description. Employers and clients read READMEs first. Your project is now part of your public portfolio. 🎉
Lesson 51 complete! 🎉
You covered:
- Lesson Introduction
- Prerequisite Concepts
- Conceptual Understanding: The Funnel
- Step-by-Step Build 1: The Reports You Will Use
- Step-by-Step Build 2: Calculating and Reading Conversion
- Step-by-Step Build 3: How People Find Apps (and What You Control)
- Step-by-Step Build 4: Store Listing Experiments
- Step-by-Step Build 5: From Insight to Action
- Guided Practice Exercises
- Common Mistakes (and How to Fix Them)
- Knowledge Check