MyMembers Editorial
Telegram Channel Subscriptions with Stripe: How the Pieces Fit
How a Stripe subscription turns into access to a private Telegram channel or group: which Stripe status means in or out, how a payer is matched to a Telegram account, what happens when a card fails, and where Telegram's own payment rules come in.
To charge for a Telegram channel with Stripe, you need three things working together around a private channel. Stripe runs the subscription on a checkout page outside Telegram and bills the card each period. A bot that is an administrator in your private channel or group lets people in when they pay and removes them when the subscription ends. Something in the middle listens to Stripe and tells the bot what to do. Telegram has no setting that connects a channel to Stripe, so you either build that middle part yourself or use a subscription bot that already does it.
Everything about Stripe below is from Stripe's documentation and everything about Telegram from Telegram's own documentation, both as they read on 9 November 2026.
What each part does
| Part | Its job | What it cannot do |
|---|---|---|
| Stripe | Takes the first payment, renews it each period, retries failed cards, tells you when anything changes | Add or remove anyone in Telegram |
| Your private channel or group | Holds the content; only people with an invite link can join | Check whether someone has paid |
| The bot | Creates invite links, approves join requests, removes members | Take card payments for the channel inside Telegram (more on that below) |
| The link between them | Listens to Stripe's events and turns them into bot actions | Nothing on its own; this is the part you build or buy |
The channel must be private. Telegram's FAQ puts it plainly: private channels are closed and you need to be added by the owner or get an invite link to join.
If you have not set up the channel yet, start with how to create a paid Telegram channel.
How a Stripe subscription maps to channel access
Every Stripe subscription has a status, and the status is what should decide whether a person is in your channel. Stripe's subscription overview lists them. Here is what each one should mean for Telegram access.
| Stripe status | What it means | Telegram access |
|---|---|---|
incomplete | The first payment has not gone through yet. Stripe gives the customer 23 hours to complete it | Not yet |
incomplete_expired | The first payment never succeeded within those 23 hours | No |
trialing | A free trial is running; Stripe says you can safely give access | Yes |
active | In good standing | Yes |
past_due | The latest renewal failed and Stripe may be retrying | Your choice: a grace period or out |
unpaid | Retries are over; only happens if you chose this outcome in settings | No |
canceled | The subscription has ended. This is final | No |
paused | A trial ended with no payment method, or a renewal failed, and your settings say to pause | No |
Stripe's own advice matches the table: when a subscription changes to canceled or unpaid, revoke access. The only real decision is past_due. Keeping people in while Stripe retries is kinder to a subscriber whose card simply expired. Removing them at once protects your content from people who never meant to pay again.
The flow, step by step
Any Stripe and Telegram setup follows this sequence, whether you code it or a bot does it.
- The subscriber opens your checkout. You create a Stripe Checkout Session in subscription mode. Stripe's API lets you attach a
client_reference_idto it, a string you can use to reconcile the session with your own systems. Put something here that will later tell you which Telegram account paid. - Stripe tells you the payment worked. Stripe sends events to a webhook endpoint you register. Its guidance is to wait for
invoice.paidand confirm the subscription isactivebefore giving access. Verify the webhook signature before you trust any event. - The bot creates an invite for that one person. Telegram's Bot API lets an administrator bot create an invite link with an
expire_dateand amember_limitbetween 1 and 99,999. A link that expires in an hour and works for one person is useless if it gets shared. - The subscriber joins. If the bot is set to receive
chat_memberupdates, the update for the new member includes the invite link they used, so you can record which Telegram account belongs to which Stripe customer. - Stripe renews each period. Each successful renewal sends
invoice.paidagain and the person stays. - The subscription ends. When Stripe sends
customer.subscription.deleted, or an update that moves the status tocanceledorunpaid, the bot removes the person. The Bot API's banChatMember removes a user, and in channels and supergroups they cannot come back through an invite link until unbanned. CallingunbanChatMemberstraight after lifts the ban without re-adding them, so they can buy again later.
For the bot to do steps 3 and 6, make it an administrator with the right to invite users and the right to ban or restrict members. Without both, it can let people in but not take them out, or the reverse.
The hard part: knowing which Telegram account paid
Stripe knows an email address and a card. Telegram knows a user ID. Nothing connects the two unless you build the connection, and it is the part that is easiest to get wrong. There are three common ways.
Start with the bot, then pay
Send buyers to your bot first. Telegram bots support deep links: a link like t.me/your_bot?start=abc opens the bot and passes abc to it, up to 64 characters. The bot now knows the buyer's Telegram user ID before they pay, and can hand them a checkout link with that ID in client_reference_id. When the payment lands, you know exactly who to let in.
Pay first, then a one-person link
Take payment on a web page, then show or email a single-use invite link. The chat_member update tells you which account used it. The weakness: whoever clicks the link first gets in, so keep the expiry short.
Join requests
Create a link with creates_join_request turned on. Anyone who uses it sends a request instead of joining, and the bot approves or declines it after checking that this Telegram account has paid. This is the tightest option, because a leaked link only produces requests the bot will decline.
When a renewal fails
A failed card can remove a subscriber who never meant to leave.
Stripe handles the retrying. Its Smart Retries feature picks the times to try again, and new Stripe accounts get up to 8 retries within 2 weeks by default. Stripe will not retry when there is no payment method or the bank returns a hard decline, such as a lost or stolen card; those only recover when the subscriber adds a new card. After the last retry, the subscription moves to canceled, unpaid, stays past_due, or pauses, depending on what you chose in your Stripe settings.
Two things help more than anything else:
- Tell the subscriber. Stripe sends
invoice.payment_failedon each failure. A message in Telegram saying the card failed and where to fix it reaches them in the app where they already read your content. - Give them a way to update the card. Stripe's customer portal lets customers update their payment method, cancel, and view invoices without contacting you. Link to it from your failure message.
What about Telegram Stars?
Telegram has its own way to sell channel access, and its own payment rules.
The built-in option is a subscription invite link. It works for channels only, the period must be 30 days, and the price is 1 to 10,000 Telegram Stars. No bot, no Stripe, no code. If monthly billing in Stars suits your audience, it is the simplest route. If you want a group, a yearly plan, a free trial or card payments in your own currency, it does not cover you.
The rule is in Telegram's payments documentation for digital goods: payments for digital goods and services made through bots and mini apps inside Telegram apps must be in Telegram Stars. Its FAQ adds that this applies to sales inside Telegram even if you also sell through your own website. Physical goods may use other payment providers. Channel access is a digital service. So if you build your own bot, do not have it send a Telegram invoice with a Stripe provider token to sell channel access. That is what the page rules out. Read the page yourself before you design the flow, because Telegram's terms are what apply to your bot.
Build it yourself or use a bot
Building it means a webhook endpoint, signature checks, a database that maps Stripe customers to Telegram user IDs, invite and removal logic, a job that catches anyone the webhooks missed, failure messages, and testing for every status in the table above. It is a real project.
A subscription bot does that part for you. With MyMembers, you connect your Telegram channel or group and your own Stripe account, set a monthly, yearly, one-time or free plan, and share a page at mymembers.io/yourname. The bot invites people the moment they pay, sends payment reminders, recovers failed cards automatically, and removes lapsed members. Your subscribers pay you directly: the money goes to your Stripe account, and Stripe pays out to your bank on the schedule set there. MyMembers charges 5% per sale with no monthly fee, so a month without sales costs nothing.
It is not the only option. Our comparison of Telegram subscription bots sets out the fees and payment methods of seven of them, including ones that support PayPal or crypto if your audience prefers those. For the Stripe side on its own, see the guide to Stripe recurring payments.
Test it before you announce it
Whichever route you take, run these checks with a real card or Stripe's test mode before anyone else pays:
- Subscribe and check you are invited right away.
- Forward your invite link to a second account and check it no longer works.
- Cancel and check you are removed when your access ends.
- Use a card that fails on renewal and check you get a message, keep or lose access as you decided, and can fix the card.
- Subscribe again after being removed and check you can get back in.
If all five pass, your Stripe subscriptions and your Telegram channel are telling the same story, and you can stop checking the member list by hand.