Telegram Stars are the in-app currency that lets a bot or a Mini App charge for something digital without you setting up a card acquirer, a merchant account, or a legal entity in the buyer's country. From your side of the screen it looks like an invoice. You name a price in Stars, Telegram draws its own payment sheet, the user confirms with a payment method they already have, and your bot receives a payment update it can act on.
Two properties of that arrangement shape every decision you make afterwards. The first is that Stars are not your money yet — they sit with Telegram until you withdraw, so your revenue is real but not spendable. The second is that you price in Stars, not in rupiah. Your revenue per sale is fixed in Stars, while what a Star is worth in local money moves with the exchange rate.
The mechanics are ordinary Bot API payments with a different currency code. If you have shipped an invoice bot before, the flow will look familiar.
XTR — the code Telegram uses for Stars — and a price expressed in whole Stars. Fractional prices do not exist here.Four patterns cover most of the money in this space. One-off unlocks are the simplest: the user pays once and a menu item, a file, or a section of your Mini App opens permanently. Consumables fit anything with a natural unit — extra attempts in a game, a fresh generation in an image tool, one more export. Cosmetics work when your product has any kind of identity layer: badges, themes, name styling. Gated content suits bots that publish something worth paying for, from private channels to structured data the user cannot get elsewhere.
What tends to flop is worth naming too. A single small action priced at 500⭐ asks the user to spend real money on something they cannot evaluate yet, and the sheet gets closed. Hiding the price until the last tap does the same thing more slowly. So does selling "support the project" with nothing concrete attached — Stars are a payment rail, not a donation jar with a receipt.
Stars are meant for digital goods and services delivered inside Telegram. Physical shipping, real-world services, and anything on Telegram's prohibited list are out of scope, and a bot that quietly drifts across that line loses the payment capability rather than a single order. Keep the description of what the Stars buy honest and specific, because refund requests and reports both begin with a user who did not understand the purchase.
Two smaller rules save a lot of pain. Do not ask for the user's phone number or login as part of fulfilment — the payment update already tells you who paid. And do not promise delivery times you cannot control; if your own fulfilment job is queued behind a rate limit, say so in the product text instead of letting the user guess.
Telegram keeps a platform fee before Stars reach you. The number most developers quote is around 30%, and it can vary by region and change over time, so treat any figure you read — including this one — as a starting assumption to confirm in the current terms. What matters for planning is the shape of it: your gross is denominated in Stars, the fee comes off the top, and what remains is what you can eventually withdraw.
Withdrawal is Telegram's process, not yours. Earned Stars convert to TON, subject to eligibility conditions and a minimum threshold, and the rate is whatever the market gives at that moment. Build your unit economics on the net figure rather than the gross and you will not be surprised by the first payout.
If your users think in rupiah — and in Indonesia most of them do — it helps to show the equivalent before they tap confirm. At the flat rate used by warungstar, one Star is Rp 288, and the same rate applies to any custom amount between 50 and 1,000 Stars.
| Stars | Rupiah at Rp 288/⭐ | Typical use in a bot |
|---|---|---|
| 13⭐ | Rp 4,320 | Smallest gift pack, useful for testing a gift flow |
| 21⭐ | Rp 7,200 | Second gift pack, a common demo amount |
| 50⭐ | Rp 14,400 | Entry-level unlock or a week of a small feature |
| 100⭐ | Rp 28,800 | Mid-tier unlock, the most common test price |
| 500⭐ | Rp 144,000 | Premium tier or a bundle of consumables |
| 1,000⭐ | Rp 288,000 | Top package, lifetime unlock or a giveaway prize |
Those numbers work in two directions. They tell a user what a 250⭐ unlock actually costs in money they recognise, and they give you a sanity check when a price feels either too cheap to cover the support load or too expensive for the audience you have.
Start from the value of the thing, then convert. A permanent unlock that saves a user ten minutes a day can carry a much higher Star price than a consumable they will use once and forget. A consumable has to be cheap enough that a failed purchase is not a crisis, because some of those purchases will fail.
Change one variable at a time. Round numbers — 50, 100, 250, 500 — read better on the payment sheet than 347⭐, and the cleaner number also makes the rupiah equivalent easy for the user to hold in their head. Run a price for a week, look at how many sheets opened versus how many were confirmed, and only then move it. Two price changes at once teach you nothing.
Keep the price in one place in your code, ideally a table keyed by product id, and read it from there when you build the invoice. Hard-coded prices in three handlers is how a live bot ends up charging two different amounts for the same item.
The Bot API lets you refund a Star payment by charge id, which is the second reason to store that string the moment it arrives. Decide your policy before launch rather than during the first complaint: what counts as a bad purchase, who answers the message, and how fast. A refund you grant in ten minutes costs you one sale; a refund argument that runs for two days costs you the user as well.
Keep one table with charge id, user id, product id, Star amount, and timestamp. When someone writes "I paid and nothing happened", you can answer in one query instead of a conversation. If you fulfil through a queue or a worker, log the grant attempt too, so you can tell a delivery failure apart from a payment that never landed.
Run the whole loop on more than one client: Android, iOS, and the desktop app. Buy the cheapest item, confirm the goods arrive, then repeat the same update twice by hand and check that nothing is granted twice. Cancel a payment at the sheet and confirm your bot does not treat it as a sale. Refund one purchase and make sure access is actually removed. Finally, open the invoice from an account with a zero Star balance and see what the top-up prompt looks like, because that is the screen most of your new users will meet first.
Write down the answers. A launch checklist that lives in a text file beats a mental list, especially when you come back to the bot four months later to add a product.
You will want Stars on a test account long before you have revenue, and paying for them through an app store in another currency is a nuisance. warungstar sells Stars at a flat Rp 288 each, including the small gift packs at 13⭐ for Rp 4,320 and 21⭐ for Rp 7,200, which are the right size for a demo. Order through @warungstarbot, check the current list with /prices, pay by QRIS from DANA, OVO, GoPay, ShopeePay, or mobile banking, and the Stars usually land in one to five minutes. /orders and /status let you follow an order, /riwayat shows your history, and /contact reaches the team if something looks wrong.
Yes. Bots and Mini Apps can set Star prices for digital goods, and Telegram handles the checkout inside the app.
A platform fee is taken before the Stars reach you. The figure most often quoted is around 30%, and it can change, so confirm it in the current terms.
Yes, through Telegram's withdrawal flow, which converts Stars to TON once you meet the eligibility conditions and the minimum threshold.
No. Telegram bills the purchase itself, which is why the flow works for solo developers and small teams without a merchant account.
Nothing, if your grant handler is idempotent. Key the grant on the charge id so a repeated update cannot deliver the same goods twice.
Buy Telegram Stars / Premium cheap — QRIS, instant delivery ⚡
Message @warungstarbot now · or see the price list on our website