App Downloads Without Paid Ads: A Free ASO Guide
Ads stop working the day you stop paying. Here is the free App Store Optimization I would do first, step by step, using Apple's and Google's own rules plus two small scripts.

10 min read · Last updated: October 24, 2026
You can get app downloads without paid ads by doing App Store Optimization (ASO): writing your app name, subtitle, keywords and screenshots so the store's own search shows your app to people already looking for it. Both Apple and Google rank apps on text relevance plus user behaviour like downloads and ratings. All of it is free.
Came here from Instagram, LinkedIn, X or YouTube? Here is the full source list you came for. Everything below is built from these, nothing else.
Apple's docs
- App Store: Creating your product page (accessed Oct 24, 2026)
- App Store: Search (accessed Oct 24, 2026)
- App Store: Custom product pages (accessed Oct 24, 2026)
- App Store: Product page optimization (accessed Oct 24, 2026)
- iTunes Search API (accessed Oct 24, 2026)
Google's docs
- Google Play: Store listing fields and limits (accessed Oct 24, 2026)
- Google Play: Metadata policy (accessed Oct 24, 2026)
- Google Play: Get discovered on Google Play search (accessed Oct 24, 2026)
- Google Play: Store listing experiments (accessed Oct 24, 2026)
- Android: In-app reviews and the Kotlin integration guide (accessed Oct 24, 2026)
What you'll build, and why ASO comes before ads
By the end of this guide you will have a store listing that is indexed for the right words, a script that shows who you are up against for any keyword, a script that catches wasted characters in your Apple keyword field, and a review prompt wired into your app on both iOS and Android.
Here is why I do this before spending a single dollar on ads.
An ad is rented attention. The day you stop paying, the installs stop. A store listing that ranks for the right search keeps working while you sleep, and every download it brings makes the next ranking a little easier, because both stores count downloads and ratings as ranking signals.
Apple says it plainly: search results are based on "text relevance (matches for your app's title, subtitle, keywords, and primary category), as well as user behavior (downloads, ratings and reviews, and more)." Google says Play apps "are ranked based on a combination of ratings, reviews, downloads, and other factors."
That gives you two levers. The words you control, and the behaviour you can encourage. This guide pulls both.
Key takeaways
- Apple gives you 30 characters for the name, 30 for the subtitle and 100 for a hidden keyword field. Google gives you 30 for the title, 80 for the short description and 4,000 for the full description.
- Apple's promotional text (170 characters) does not affect search ranking. Do not put keywords there.
- Never repeat a word across Apple's name, subtitle and keyword field. Apple says to skip duplicates, plurals, "app" and filler words.
- Apple lets you ask for a rating up to three times in a 365-day period. Google enforces a quota too and says not to put the review flow behind a button.
- Apple reports custom product pages convert at 1.6% plus 2.5 percentage points on average, a 156% increase over default pages.
Prerequisites
You need very little:
- A published app, or one about to ship, on the App Store, Google Play, or both.
- Access to App Store Connect and/or Google Play Console.
- Python 3.9 or newer for the two scripts (standard library only, nothing to install).
- 20 minutes per store for the first pass.
No paid ASO tool is required for anything below.
What are the App Store and Google Play metadata limits?
Apple allows a 30-character app name, a 30-character subtitle, a 100-character keyword field and 170 characters of promotional text. Google Play allows a 30-character title, an 80-character short description and a 4,000-character full description. Apple indexes the name, subtitle, keywords and category. Google has no keyword field.
| Field | Apple App Store | Google Play | Affects search? |
|---|---|---|---|
| App name / title | 30 characters | 30 characters | Yes, both stores |
| Subtitle | 30 characters | No equivalent | Yes (Apple) |
| Keyword field | 100 characters, hidden | No equivalent | Yes (Apple) |
| Short description | No equivalent | 80 characters | Shown at the top of the listing |
| Promotional text | 170 characters | No equivalent | No, per Apple |
| Full description | No limit stated on Apple's page | 4,000 characters | Google says use SEO best practices; Apple says don't stuff keywords |
| Screenshots | Up to 10 | Must reflect the real app | First 1 to 3 show in Apple search results |
| Video | Up to 3 previews, 30 seconds each | Allowed | Autoplays muted on Apple |
The big difference to remember: on Apple, the description is for humans. On Google, the description is also for search. Write them differently.
Step-by-step: free ASO for your app
Step 1: Find out who you are really up against
Before you pick a single keyword, look at who ranks for it today. Apple's iTunes Search API is free, needs no key, and returns up to 200 results per call. Apple puts its rate limit at "approximately 20 calls per minute."
Save this as serp.py:
import json
import sys
import urllib.parse
import urllib.request
term = sys.argv[1]
country = sys.argv[2] if len(sys.argv) > 2 else "us"
url = "https://itunes.apple.com/search?" + urllib.parse.urlencode(
{"term": term, "country": country, "entity": "software", "limit": 10}
)
with urllib.request.urlopen(url) as response:
results = json.load(response)["results"]
for rank, app in enumerate(results, start=1):
in_name = "yes" if term.lower() in app["trackName"].lower() else "no"
print(
f"{rank:>2}. {app['trackName'][:34]:<34} "
f"ratings={app.get('userRatingCount', 0):>7,} "
f"stars={app.get('averageUserRating', 0):.1f} "
f"in_name={in_name} "
f"updated={app['currentVersionReleaseDate'][:10]}"
)
Run it with any keyword and a two-letter country code:
python3 serp.py "habit tracker" us
I queried the same API for "habit tracker" in the US store on October 24, 2026. These are the top three results it returned:
| Rank | App | Ratings | Stars | Last update |
|---|---|---|---|---|
| 1 | Habit Tracker | 148,235 | 4.8 | Oct 22, 2026 |
| 2 | Habit Tracker - HabitKit | 2,504 | 4.8 | Oct 20, 2026 |
| 3 | Onrise: Habit Tracker & Focus | 2,596 | 4.8 | Aug 25, 2026 |
Look at ranks two and three. Both have around 2,500 ratings, not 148,000, and all three put the exact phrase in the app name. That tells you two things: the keyword in the name matters, and the bar for the top three is lower than the leader makes it look.
Do this for 10 to 20 candidate phrases. Apple's own advice on the trade-off: popular terms "may drive a lot of traffic, but are highly competitive – especially if you are a newer or smaller app," while "less common terms drive lower traffic, but are less competitive." If you are new, pick the phrases where the top results have hundreds or low thousands of ratings, not hundreds of thousands.
Step 2: Write a name that carries your best keyword
You get 30 characters on both stores. Use them for your brand plus the one phrase you most want to rank for, like Streaky: Habit Tracker.
Google adds two rules worth following everywhere. Your title "should be unique and accessible, avoid common terms, and reinforce what your app is about," and you should avoid "subtle misspellings of general terms." Google's metadata policy also bans emojis, all caps (unless it is your brand), and anything that signals ranking or price, like "#1" or "free", in the title, icon or developer name.
Step 3: Use the subtitle and keyword field without wasting a character
On Apple, the subtitle (30 characters) and keyword field (100 characters) are where most indie apps leak value. Apple's rules are specific:
- Separate terms with commas and no spaces. Spaces inside a phrase are fine, as in
Property,House,Real Estate. - Don't repeat words already in your name, subtitle or category.
- Skip plurals of words you already have, generic words like "app" or "game", and filler like "the" and "to".
- Never use competitor names, trademarks or celebrity names. Apple calls improper keywords "a common reason for App Store rejections."
These rules are easy to break by accident, so I check them with a script. Save this as check_keywords.py:
import re
NAME = "Streaky: Habit Tracker"
SUBTITLE = "Build daily routines"
KEYWORDS = "streak, routine,planner,goal,reminder,self care,habit app,goals"
FILLER = {"app", "game", "the", "to", "and", "a"}
def words(text):
return re.findall(r"[a-z0-9]+", text.lower())
def check(name, subtitle, keywords):
problems = []
for label, value, limit in [("Name", name, 30), ("Subtitle", subtitle, 30), ("Keywords", keywords, 100)]:
if len(value) > limit:
problems.append(f"{label} is {len(value)} chars, limit is {limit}")
if ", " in keywords:
problems.append("Space after a comma wastes a character")
used = set(words(name) + words(subtitle))
seen = set()
for word in words(keywords):
if word in used:
problems.append(f"'{word}' is already in your name or subtitle")
elif word in seen:
problems.append(f"'{word}' appears twice")
elif word in FILLER:
problems.append(f"'{word}' is a filler or generic word")
elif word.removesuffix("s") in used | seen or word + "s" in used | seen:
problems.append(f"'{word}' is a plural or singular of a word you already have")
seen.add(word)
print(f"Keywords: {len(keywords)}/100 characters")
print("\n".join(problems) or "Clean")
check(NAME, SUBTITLE, KEYWORDS)
With the sample values above it prints:
Keywords: 63/100 characters
Space after a comma wastes a character
'routine' is a plural or singular of a word you already have
'habit' is already in your name or subtitle
'app' is a filler or generic word
'goals' is a plural or singular of a word you already have
Five mistakes in one short line. Fix them and you get back roughly 15 characters to spend on new words. The plural check is a rough one (it only looks at a trailing "s"), so read the output, don't trust it blindly.
Step 4: Write the Google Play description for search, and the Apple one for people
Google Play has no keyword field, so your 80-character short description and 4,000-character full description do the work. Google says to use "SEO best practices" and to keep "the most important text" near the top. It also bans repetitive keywords, deceptive claims like "best game ever", and anonymous user testimonials.
So: say what the app does in the first line, mention your main phrases naturally a few times, and stop.
On Apple, write for the reader. Apple says "the first sentence of your description is the most important," recommends "a concise, informative paragraph followed by a short list of main features," and warns against adding keywords to improve search.
Step 5: Make the first three screenshots do the selling
Ranking gets you seen. Screenshots get you tapped. Apple shows "the first one to three images" in search results when there is no app preview, so those three are your ad.
Put one benefit per screenshot, in large text, in the order people care about. You can use up to 10. If you add a preview video (up to 30 seconds, up to three of them), remember it autoplays muted, so the first few seconds must make sense without sound. If your app has Dark Mode, Apple suggests showing it in at least one screenshot.
Step 6: Ask for ratings at the right moment
Ratings are the behaviour lever. Apple says they "influence how your app ranks in search" and lets you prompt "up to three times in a 365-day period." Ask right after a win: a finished workout, a saved file, a seven-day streak.
On iOS with SwiftUI, StoreKit gives you an environment action:
import SwiftUI
import StoreKit
struct StreakDoneView: View {
@Environment(\.requestReview) private var requestReview
let streak: Int
var body: some View {
Text("\(streak) days in a row")
.onAppear {
if streak == 7 {
requestReview()
}
}
}
}
On Android, add Google's Play In-App Review library:
dependencies {
implementation("com.google.android.play:review:2.0.2")
implementation("com.google.android.play:review-ktx:2.0.2")
}
Then request and launch the flow:
val manager = ReviewManagerFactory.create(context)
val request = manager.requestReviewFlow()
request.addOnCompleteListener { task ->
if (task.isSuccessful) {
val reviewInfo = task.result
manager.launchReviewFlow(activity, reviewInfo).addOnCompleteListener {
// Continue the normal flow. The API never tells you if the user reviewed.
}
}
}
Google's rules here are strict. Don't ask "Do you like the app?" before the card. Don't modify or overlay the card. And because Play enforces a time-bound quota, Google says "you should not have a call-to-action option (such as a button) to trigger the API."
Also reply to reviews. Apple lets you respond in App Store Connect, and Google lists "responding to your users and addressing issues" as part of being discovered.
Step 7: Run free A/B tests on your listing
Both stores give you a free test lab. Use it once you have steady traffic.
| Apple product page optimization | Google Play store listing experiments | |
|---|---|---|
| What you can test | Icon, screenshots, app previews | Icon, feature graphic, screenshots, descriptions (localized) |
| How many at once | One test, up to 3 treatments | One default graphics experiment or up to 5 localized ones |
| How long | Up to 90 days | Stops automatically after 6 months |
| Review needed | Yes, for new metadata | Not stated |
Apple recommends waiting until a treatment reaches "at least 90% confidence" before you apply it. Its own case studies show why testing beats guessing: Peak Brain Training tested three icons over 44 days, and one won by 8% while the other two lost.
Step 8: Build custom product pages for every link you share
This one is Apple-only and underused. You can publish "up to 70 additional versions" of your product page, each with its own screenshots, promotional text and previews, and its own URL. You can even assign keywords so a custom page shows in search for those terms instead of your default page.
Apple's numbers: developers see "a 2.5 percentage point increase on average" when sending people to a custom page, "a 156% increase compared to the 1.6% average conversion rate on default product pages."
If you post on X, Reddit and YouTube, make one page per channel that shows exactly what that audience came for. It costs nothing.
How long does ASO take to show results?
Apple and Google don't publish a timeline, so treat any fixed number you read online with suspicion. What the docs do tell you: Apple updates the description only with a new app version, while promotional text can change any time. Ratings are counted per territory. Store tests can run for weeks. Plan to change one thing, measure for a few weeks in App Store Connect's App Analytics (filter by App Store search), then change the next.
Common mistakes
- Putting keywords in Apple's promotional text. Apple says it "doesn't affect your app's search ranking."
- Repeating words across Apple's name, subtitle and keyword field. Each repeat is wasted space.
- Adding spaces after commas in the keyword field. That is a character gone per term.
- Using competitor names as keywords. It is a rejection risk on Apple and a policy problem on Google.
- Chasing the biggest keyword first. If the top results have six-figure rating counts, pick a smaller phrase.
- A "Rate us" button wired to the review API. Google warns it can show nothing if the user hit their quota.
- Asking for a rating on first launch. Wait for a moment where the user just got value.
- Picking an irrelevant category for easier rankings. Apple calls it "grounds for rejection."
Next steps
- Run
serp.pyon 10 phrases and pick three where the top results are beatable. - Rewrite your name and subtitle, then clean your keyword field with
check_keywords.py. - Ship the review prompt in your next release.
- Once you have traffic, start one product page test and one custom product page.
If you are at the stage where every single user counts, I wrote about what my first app taught me at 40 users and how I got my first sale before launch. Both are about the same problem: getting seen without a budget.
FAQ
Can you really get app downloads without paid ads?
Yes. Both stores rank apps on text relevance and user behaviour, and neither charges for either. ASO won't beat a big brand on a huge keyword overnight, but it can put a small app in the top results for specific phrases where the competition is thin.
Does the app description affect App Store ranking?
Apple lists the title, subtitle, keywords and primary category as the text it matches, and advises against adding keywords to the description. Google Play is different: it has no keyword field, and Google recommends SEO best practices in the description.
How many keywords can I add on the App Store?
You get a 100-character keyword field, with terms separated by commas and no spaces. There is no word count limit, only the character limit, so short terms and no duplicates let you fit more in.
How often can I ask users for a rating?
On Apple, up to three times in a 365-day period. On Google Play, there is a time-bound quota whose exact value Google does not publish and can change without notice, so call the flow only at a genuine high point.
Pick one keyword phrase today, run the script, and rewrite your title tonight. When you need help with the rest of the launch, the free tools on Art of Code are there, and if you are building your first app with AI, start with our vibe coding guide.
Written by Adithya Guttha, Founder of Art of Code.
Sign in to like and save posts.
Keep reading



Discussion
Comments (0)
Want to join the conversation?
Sign in to commentNo comments yet. Be the first to comment!