Search inside the platform, not only in Google
What we are solving
Section titled “What we are solving”Your product lives inside Telegram, an app store or a marketplace, which means that platform runs its own search over its own index, and your website has no influence on that index whatsoever.
The fields it matches are few and short. Put the wrong words in them and the demand walks straight past you.
Nothing breaks while that happens, and nothing is logged, which is what makes this failure so expensive to find.
Each platform matches a different set of fields. Learn the set before writing anything.
| Platform | What search matches | What it does not match |
|---|---|---|
| Telegram | Bot name and @username | Description and About, read after you are found |
| App Store | Title, subtitle, keywords field, primary category | Description and promotional text |
| Google Play | Title, plus other store listing metadata | — |
The name carries the search, so write it in their words
Section titled “The name carries the search, so write it in their words”Put the function in the name, not only the brand, and write it in the script your audience types in, because everything else on the profile is read after somebody has found you.
The budgets are small, which is the whole difficulty:
| Field | Limit |
|---|---|
| Telegram bot name | 0-64 characters |
| App Store title | 30 characters |
| Google Play title | 30 characters |
| Telegram short description | 120 characters |
| Telegram description | 512 characters |
| App Store keywords | 100 bytes |
You do not have to choose one script, either. setMyName and setMyDescription take a language_code, so you show speakers of each language a separate name, and that is the cheapest fix on this page.
The two description fields have different jobs. The short description sits on the profile and travels with the link when somebody shares it, and the long description answers “should I press start”.
Spending the keyword budget without repeating yourself
Section titled “Spending the keyword budget without repeating yourself”Apple’s keyword field holds 100 bytes, comma-separated. Bytes, not characters. ASCII spends one byte a letter and Cyrillic in UTF-8 spends two, so for a Russian list that is about 50 letters.
Apple’s own product-page guide says 100 characters, but the App Store Connect reference says bytes, and bytes are what the submission enforces.
Words already in the title or subtitle do not need repeating there, and competitor names in that field are a common rejection reason.
The field is version metadata, not app-wide information. That is why people cannot find it.
Open Apps, pick the app, then the version under its platform in the sidebar: Keywords sits there with Description and Promotional Text, localizable per language.
Name and Subtitle are app-wide. They live under App Information, on a different screen entirely.
Reading the metadata back off the platform
Section titled “Reading the metadata back off the platform”Ask the platform what is actually set, because your memory is not evidence here and neither is the console you typed the values into.
getMe returns a User object with id, username and first_name, which is the bot’s name, and it carries no description at all, so the description fields need their own calls.
getMyName, getMyDescription and getMyShortDescription each read back one field, and each takes language_code. Pass the audience’s language. Otherwise you read the default and conclude you set nothing.
Searching for yourself as a stranger
Section titled “Searching for yourself as a stranger”A fresh account, the audience’s language, the phrases they would actually type. Write down who comes up.
Their names are a free list of the exact words the demand uses, and the people who already rank for those words assembled that list for you.
Tagging every link that goes into the platform
Section titled “Tagging every link that goes into the platform”One start parameter per venue. Write it to the user record on first contact only.
A repeat start overwrites the original source with whatever they clicked last, so a venue that worked and a venue that did nothing end up looking identical.
What did not work
Section titled “What did not work”- An English-only name while the demand was in another script. Global search matches the name, so queries in the audience’s alphabet could not reach the bot at all — nothing broke, and nothing was logged.
- Reading the user base as a market signal. The geography of signups matched the Latin spelling of the name, not the market I was building for. I spent weeks on product theories about an audience one metadata field had created.
- Assuming the description would carry it. It had been in the right language the whole time, but search does not match that field, so it changed nothing.
- Comparing the products instead of the names. Competitors with the function spelled out in the audience’s script were far larger, and they ran on the same public APIs. What they had was a name, not technology.
- Counting characters against a byte limit. The keyword field takes 100 bytes and Cyrillic spends two bytes a letter, so half my budget was gone before I typed anything. Apple’s marketing page says characters, and that is the page I read.
- Trusting my memory of the name. Reading it back over the API disagreed with what I believed I had set, and every diagnosis before that check rested on a wrong fact.
- Publishing links with no start parameter. The code did not read the parameter either, so attribution was zero rather than approximate, and months of distribution work could not be evaluated at all.
- Treating the website as the main door. No signup carried a source, so the share attributable to the site is unknown: where the user came from. Ranking it was real work aimed at a channel I never showed the audience was using.
Verify
Section titled “Verify”-
Search from an account that has never used the product, in the audience’s language, and note whether you appear at all and who is above you.
-
Read the name, description and short description back over the API and compare them to what you meant to set.
Terminal window curl -s "https://api.telegram.org/bot$TOKEN/getMyName?language_code=ru" -
Count the characters against the platform’s limits before submitting, not after a rejection.
-
After a rename, watch the language and locale mix of new signups, because it should move toward the script you added.
-
Send yourself a tagged link and confirm the parameter is stored on first contact, then start again and confirm it is not overwritten.
Off the platform, the first external links come from somewhere else entirely: where the first external links come from.
