MercanPay Blog

Paid Discord and Telegram Memberships with Crypto Payments

Run paid Discord and Telegram memberships with crypto: USDT invoices, automatic access via webhooks, period renewals and expiry handling, step by step.

Published: November 4, 20266 min readTürkçe oku
Paid Discord and Telegram Memberships with Crypto Payments

Paid memberships with crypto are an increasingly common model for Discord servers and Telegram groups. Education communities, research channels, private content groups and gaming clans can take USDT from members and manage access automatically. This guide shows how to set up paid Discord and Telegram memberships with crypto, by hand for a small community and automatically as you grow.

Why communities charge in crypto

Members are often spread across many countries. Card billing can get awkward, with declined payments in some regions and high provider fees. Crypto has some clear advantages here:

  • No borders. It doesn't matter where the member lives; a wallet or exchange account that supports TRON (TRC20) is enough.
  • Stable pricing. USDT aims to hold a dollar peg, so the membership price doesn't move during the month.
  • No clawbacks. A confirmed payment can't be reversed months later the way card disputes can. See what no chargebacks means.
  • Low network fees. Transfers on TRC20 are cheap.

Important: no built-in subscriptions or bot

Let's set expectations first. MercanPay has no auto-renewing subscription feature and doesn't ship a Discord or Telegram bot. Crypto transfers are pushed by the payer, not pulled by the merchant, so you can't debit a member's wallet each month.

Instead, you create an invoice for each membership period. The member pays it and you grant access for that period. The general approach is covered in crypto subscription payments.

Method 1: panel invoices for small communities

With a handful of members, no code is needed:

  1. A member messages you to join.
  2. In the panel, create a New invoice: a USD price with "Customer chooses", or USDT with "Fixed coin".
  3. Put the period in the description, e.g. "VIP membership · November".
  4. Set the order ID to something identifying the member and period, e.g. tg-alex-2026-11.
  5. Send the payment link to the member.
  6. When the invoice turns Paid, add the member to the group or role.

The minimum invoice is $10. The panel walkthrough is in create your first crypto invoice, and DM selling tips are in crypto payment links for Telegram and Instagram.

Don't grant access based on a screenshot the member sends. Always verify the payment in the panel or via webhook. Why this matters is explained in fake crypto payment screenshot scams.

Method 2: an automated flow for growing communities

As membership grows, manual tracking breaks down. If you run your own bot or a small server app, you can automate everything:

  1. The member runs a "join" command in your bot.
  2. Your bot creates an invoice through the MercanPay API and sends the link.
  3. Once the payment is final after 20 confirmations, MercanPay sends a signed webhook to your server.
  4. Your server verifies it and your bot grants access.

Creating the invoice (Python)

This example uses the official Python library (pip install mercanpay). It carries the member ID in metadata and uses order_id so each member and period gets exactly one invoice:

import os
from mercanpay import MercanPay

zp = MercanPay("https://mercanpay.com", os.environ["MERCANPAY_API_KEY"])

def membership_invoice(platform: str, member_id: str, period: str) -> str:
    invoice = zp.create_invoice(
        price_usd="15.00",
        tokens=["USDT"],
        order_id=f"{platform}-{member_id}-{period}",   # e.g. discord-123456-2026-11
        description=f"VIP membership · {period}",
        expires_in_minutes=1440,
        metadata={"platform": platform, "member_id": member_id, "period": period},
    )
    return invoice["payment_url"]

Calling it again with the same order_id returns the existing invoice instead of creating a new one, so a member running the command twice never gets a duplicate. More in order_id idempotency for invoices.

Granting access from the webhook

import json
import os
from flask import Flask, request, abort
from mercanpay import verify_webhook

app = Flask(__name__)

@app.post("/mercanpay/webhook")
def webhook():
    body = request.get_data()
    if not verify_webhook(os.environ["MERCANPAY_WEBHOOK_SECRET"], body,
                          request.headers.get("X-MercanPay-Signature", "")):
        abort(401)
    event = json.loads(body)
    if event["type"] in ("invoice.paid", "invoice.overpaid"):
        meta = event["data"]["invoice"]["metadata"]
        grant_access_once(event["id"], meta["platform"], meta["member_id"], meta["period"])
    return "", 200

grant_access_once is your own code: it records the event ID, extends the membership end date and tells your bot to assign the role or create an invite link. The same event can arrive more than once, so de-duplicate by event ID. See webhook retries and idempotent handling, and for the signature basics, how to verify webhook signatures.

Renewals and expiry

Without automatic billing, renewals run on reminders:

  • Store each member's end date in your database.
  • A few days before it, have your bot send the next period's payment link.
  • When payment arrives, move the end date forward one period.
  • If the date passes with no payment, allow a short grace period, then remove access.

Some practical tips:

  • Offer longer periods. Three or six months instead of monthly means fewer reminders and less churn.
  • Keep invoices open longer. Members may not open the link right away; a 24-hour validity usually works. See crypto invoice expiry time.
  • Accept late payments. A payment to an expired invoice is still credited and flagged late: true in the webhook. Granting access anyway is usually the best experience.

How to explain payment to members

Some members may be paying with crypto for the first time. A short note in a pinned message or your bot's welcome text noticeably cuts your support load. Tell them:

  • payment is only on the TRON (TRC20) network, in USDT or, if you allow it, TRX,
  • anyone paying from an exchange should account for the withdrawal fee and send the full amount,
  • each payment link is personal and shouldn't be shared,
  • access opens automatically once the payment is final.

The customer checklist in crypto sent to the wrong network is a good starting point for that note.

Underpayments

Members paying from an exchange sometimes send slightly less because of withdrawal fees. The invoice then turns partial and the payment page shows the remainder. For tiny gaps you can set an underpayment tolerance in the panel. See underpayments, overpayments and late payments.

Mind the platform rules

Discord and Telegram have their own terms, including rules on paid content. Read them before launching and make sure what you offer is legitimate. When you apply to MercanPay as a merchant, you'll also need to describe your business clearly and accurately.

FAQ

Can members pay automatically every month?

No. Crypto transfers are sent by the member. You create a new invoice each period and send it to them.

Is there a ready-made Discord or Telegram bot?

No. For automation, you connect your own bot to MercanPay via the REST API or the Python/PHP libraries.

Can members pay in TRX?

Yes. Add TRX to tokens and members can pick the coin on the payment page. The price stays in USD and the rate locks when the coin is chosen.

What are the fees?

Commission starts from 0.4% and varies by merchant. Network fees are included in the amount the customer pays. Withdrawing your balance costs $1–3.

Get started with MercanPay

Set up paid Discord and Telegram memberships with crypto: apply as a merchant and check the documentation for API details.

#Discord#Telegram#Membership#USDT

Related posts

Start accepting crypto payments in minutes

Accept USDT and TRX (TRC20). Fees from 0.4%, a hosted payment page, API and webhooks.