Telegram has over 900 million users and its private channel feature is one of the cleanest setups for paid content delivery — no algorithm, no feed, just your content directly to your members. But Telegram has no native payment system. Connecting Stripe to Telegram requires an automation layer, and most guides either skip the details or stop at a toy example.

Here's exactly how to set up a paid Telegram channel with Stripe — including the parts that break if you do them wrong.

How paid Telegram channels work technically

A private Telegram channel can only be joined via an invite link. The link can be set to expire after one use or after a set time period. Your job is to generate a unique invite link the moment a Stripe payment is confirmed and deliver it to the paying member before they lose patience and request a refund.

The automation chain: Stripe payment confirmed → webhook to n8n → Telegram Bot API generates unique invite link → invite link emailed and/or messaged to the paying member → member joins channel → access tracked in your member database.

The harder problem is removal on cancellation — Telegram doesn't natively know which users were added via which invite link, and its admin tools for removing specific members are manual. We'll cover how to solve that properly.

What you need before you start

  • A Telegram Bot — created via @BotFather in Telegram. Free. Takes 2 minutes. Your bot needs to be an administrator of your private channel with the ability to create invite links and ban members.
  • A private Telegram channel — not a group. Channels are one-way content delivery (only admins post). Groups allow member interaction. Either works for paid access, but the invite link mechanism is cleaner on channels.
  • Stripe — set up with a subscription product and webhook endpoint.
  • n8n — your automation layer connecting Stripe and the Telegram Bot API.
  • Airtable — your member database. This is what makes automated removal possible.

Setting up the Telegram bot

Open Telegram and message @BotFather. Send /newbot, follow the prompts, and copy your bot token. This token is how n8n authenticates with the Telegram API.

Add the bot to your private channel as an administrator. Give it these specific permissions: Invite Users via Link, Ban Users. It needs both — one for granting access, one for removing it.

Get your channel ID. The easiest way: forward a message from your channel to @userinfobot, which returns the channel ID. It'll be a negative number starting with -100. Store it — you'll use it in every API call.

Building the Stripe-to-Telegram workflow in n8n

Step 1: Stripe webhook trigger

Create a Webhook node in n8n. Copy the URL and add it as a Stripe webhook endpoint listening for checkout.session.completed, customer.subscription.deleted, and invoice.payment_failed.

Verify the Stripe signature in n8n using your webhook signing secret. Required — don't skip this.

Step 2: Switch on event type

A Switch node routes based on $json.body.type. Payment confirmed goes to the onboarding branch. Subscription deleted goes to the removal branch. Payment failed goes to the dunning branch.

Step 3: Generate a unique Telegram invite link

For the onboarding branch, add an HTTP Request node:

  • Method: POST
  • URL: https://api.telegram.org/bot{YOUR_BOT_TOKEN}/createChatInviteLink
  • Body: {"chat_id": "YOUR_CHANNEL_ID", "member_limit": 1, "expire_date": null, "creates_join_request": false}

Setting member_limit: 1 means the link can only be used once. This is important — a shared invite link lets anyone join, not just the person who paid. One-use links are how you gate access properly.

The API response includes the invite link URL. Extract it from result.invite_link.

Step 4: Store member data and invite link in Airtable

Before delivering the invite link, create the member record in Airtable: customer email, Stripe customer ID, invite link, link creation date, subscription status. This record is what you'll use for removal — store the invite link here because Telegram's API lets you revoke a specific invite link later, which is your mechanism for preventing sharing.

Step 5: Send the invite link to the member

Two channels simultaneously:

Email — via Gmail or your email platform. Subject: "Your access to [Channel Name]". Body: a welcome message, the invite link prominently displayed, and clear instructions on what to do next. The link should be a large, obvious button or link — members who have to hunt for it will bounce.

Telegram message — if the member already uses Telegram and you know their username or chat ID (from a previous interaction or a pre-payment form), send them a direct message via your bot. More immediate than email.

Handling cancellations and removal

This is where most Telegram paid channel setups fail. You can't revoke a specific member's access directly once they've joined, because Telegram doesn't natively link a member's account to the invite link they used. You have to build this link yourself.

The approach: ask members for their Telegram username as part of the onboarding flow. A simple form (Typeform or a Telegram bot command) captures their @username or user ID immediately after payment. Store this in Airtable linked to their Stripe customer ID.

When customer.subscription.deleted fires in Stripe, n8n looks up the Telegram user ID from Airtable and calls the Telegram Bot API to ban (kick) the member from the channel:

  • Method: POST
  • URL: https://api.telegram.org/bot{TOKEN}/banChatMember
  • Body: {"chat_id": "CHANNEL_ID", "user_id": "TELEGRAM_USER_ID", "revoke_messages": false}

Set revoke_messages: false so you're only removing future access, not deleting their message history. After removing them, immediately unban (to allow potential rejoining later): call unbanChatMember with the same user ID.

The Telegram username capture problem

Getting Telegram usernames from paying members is the biggest friction point in this setup. The cleanest approaches:

Post-payment redirect to a form. After Stripe checkout, redirect to a Typeform asking for their Telegram username. The form submission fires a webhook to n8n, which stores the username and then triggers the invite link generation. The member gets their invite link only after submitting their username.

Bot-based verification. Send members a link to start a conversation with your Telegram bot. When they send /start, the bot captures their Telegram user ID automatically and triggers the invite link delivery. More seamless — the member doesn't have to fill in a form.

The bot-based approach is cleaner but requires a slightly more involved n8n setup. For communities where a frictionless experience matters, it's worth the extra build time.

What a properly built Telegram paid channel looks like

Member pays via Stripe. Within 30 seconds: a unique one-use invite link is generated, emailed to them, and a direct Telegram message is sent if their username was captured. They join the channel. Their record in Airtable is updated to Active.

When they cancel, their Telegram account is removed from the channel automatically. No manual admin. No ex-members reading new content. No access leakage.

Compared to Discord, Telegram has less native tooling for community features but offers a simpler, cleaner content delivery experience. For creators whose audience is already active on Telegram, it's a strong choice — especially combined with a proper automation layer.

If you want a paid Telegram channel setup with Stripe built for you, book a free strategy call. Most setups are live within a week.