MM

MyMembers Editorial

•15 min read

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

PartIts jobWhat it cannot do
StripeTakes the first payment, renews it each period, retries failed cards, tells you when anything changesAdd or remove anyone in Telegram
Your private channel or groupHolds the content; only people with an invite link can joinCheck whether someone has paid
The botCreates invite links, approves join requests, removes membersTake card payments for the channel inside Telegram (more on that below)
The link between themListens to Stripe's events and turns them into bot actionsNothing 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 statusWhat it meansTelegram access
incompleteThe first payment has not gone through yet. Stripe gives the customer 23 hours to complete itNot yet
incomplete_expiredThe first payment never succeeded within those 23 hoursNo
trialingA free trial is running; Stripe says you can safely give accessYes
activeIn good standingYes
past_dueThe latest renewal failed and Stripe may be retryingYour choice: a grace period or out
unpaidRetries are over; only happens if you chose this outcome in settingsNo
canceledThe subscription has ended. This is finalNo
pausedA trial ended with no payment method, or a renewal failed, and your settings say to pauseNo

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.

  1. The subscriber opens your checkout. You create a Stripe Checkout Session in subscription mode. Stripe's API lets you attach a client_reference_id to 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.
  2. Stripe tells you the payment worked. Stripe sends events to a webhook endpoint you register. Its guidance is to wait for invoice.paid and confirm the subscription is active before giving access. Verify the webhook signature before you trust any event.
  3. The bot creates an invite for that one person. Telegram's Bot API lets an administrator bot create an invite link with an expire_date and a member_limit between 1 and 99,999. A link that expires in an hour and works for one person is useless if it gets shared.
  4. The subscriber joins. If the bot is set to receive chat_member updates, the update for the new member includes the invite link they used, so you can record which Telegram account belongs to which Stripe customer.
  5. Stripe renews each period. Each successful renewal sends invoice.paid again and the person stays.
  6. The subscription ends. When Stripe sends customer.subscription.deleted, or an update that moves the status to canceled or unpaid, 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. Calling unbanChatMember straight 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:

  1. Tell the subscriber. Stripe sends invoice.payment_failed on 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.
  2. 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:

  1. Subscribe and check you are invited right away.
  2. Forward your invite link to a second account and check it no longer works.
  3. Cancel and check you are removed when your access ends.
  4. 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.
  5. 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.