How to Accept Crypto Payments in a Telegram Bot (USDT Step by Step)
Telegram bots and paid communities live on instant delivery. Here is how to wire a crypto payment gateway into your bot so users pay in USDT and get access automatically.

To accept crypto payments in a Telegram bot, have your bot's backend create an invoice through a crypto payment gateway API when a user taps "Buy", send the returned checkout link as an inline button, and listen for the gateway's signed webhook. When the payment is confirmed, the bot delivers the product, key or channel invite automatically.
Telegram bots and paid communities are among the most natural fits for crypto checkout: users are international, many already hold USDT, and they expect delivery in seconds. This guide shows the architecture, the message flow and the details that keep it reliable.
Why crypto works so well for Telegram bots
- Global audience: bot users come from everywhere; a single USDT price works for all of them.
- Mobile-first payment: the hosted checkout opens inside Telegram's browser, and a wallet app can scan the QR code or copy the address.
- Instant automation: a signed webhook lets the bot deliver without anyone checking a block explorer.
- Fast networks: on TRON and BNB Smart Chain, payments usually confirm in about a minute.
Telegram bots and paid communities are one of the core use cases mistKET is built for, alongside SaaS, hosting and digital goods.
Architecture: three components
| Component | Role |
|---|---|
| Telegram bot (via the Bot API) | Talks to the user: menus, buttons, delivery messages |
| Your backend | Stores orders, calls the gateway API, receives webhooks, holds secrets |
| mistKET gateway | Hosted checkout, chain monitoring, confirmations, settlement |
Whatever framework you use, the pattern to accept crypto payments in a Telegram bot is the same. The bot and backend are usually the same small service. What matters is that API and webhook secrets live on the server — never inside messages or client-side code. Telegram's own documentation for bots is at core.telegram.org.
Step by step: accept crypto payments in a Telegram bot
- User picks a product — e.g. "1-month access" via an inline keyboard. Your backend creates an order with the Telegram user ID.
- Backend creates an invoice — one signed
POST /api/v1/invoiceswith amount, currency, your order ID and a callback URL. - Bot sends a pay button — an inline URL button pointing to the returned
checkout_url, plus a short note: "Send the exact amount on the network you choose." - User pays — on the hosted page they choose USDT on TRON, BSC, Ethereum or Arbitrum (or TRX, BNB, ETH) and pay from their wallet or exchange.
- Webhook arrives — after confirmations, your callback receives a signed
invoice.confirmedevent containing your order ID. - Bot delivers — verify the signature, mark the order paid, then send the licence key, file or a one-time channel invite link to the user's chat.
A minimal data model
You do not need a complex database to run a paid bot. Three tables cover most cases:
| Table | Key fields | Purpose |
|---|---|---|
| users | telegram_id, username, access_until | Who has access and until when |
| orders | order_id, telegram_id, product, amount, status | One row per purchase attempt |
| invoices | order_id, invoice_uuid, checkout_url, network, paid_amount | Link between your order and the gateway invoice |
When the webhook arrives, look up the order by order_id, check that it is not already delivered, update the status and message the user by telegram_id. That is the entire delivery loop.
Example message copy
Clear wording inside the chat reduces support questions. A sequence that works well:
- Invoice message: "Your order: 1-month access, 15 USD. Tap Pay to open the secure payment page. Send the exact amount on the network you choose."
- Paid: "Payment detected. Waiting for network confirmations — this usually takes a minute or two."
- Confirmed: "Payment confirmed. Here is your invite link — it works once."
- Underpaid: "We received less than the invoice amount. Open the same payment page to send the remaining amount."
- Expired: "This invoice has expired. Tap below for a new one."
Support without screenshots
When a user asks about a payment, ask only for their order number. Opening the invoice in the merchant dashboard shows the expected amount, the received amount, the network and the transaction hash, so you never need screenshots or wallet addresses from the user. A "Support" button in the bot can pass the order number along automatically, which turns most payment questions into a ten-second lookup instead of a long conversation.
Good UX patterns inside the chat
- Send status updates. On
invoice.paid, reply "Payment seen, waiting for confirmations"; oninvoice.confirmed, deliver. - Show the price in dollars and let the gateway convert. The rate is locked for the invoice lifetime.
- Explain the countdown once, so users do not panic when they see a timer.
- Offer a "Check status" button that queries the invoice through the API — useful if a user returns later.
- Handle short payments politely. On
invoice.underpaid, tell the user how much is missing; partial payments add up to the total. - Handle expiry. On
invoice.expired, offer a fresh invoice with one tap.
Subscriptions and paid communities
For monthly access, create a new invoice when each period ends and send it as a renewal message a few days in advance. When invoice.confirmed arrives, extend the user's access date in your database. If no payment arrives before the period ends, remove access. Crypto transfers are pushed by the payer, so renewals are always an invoice the user pays — there is no automatic card-style debit.
Reliability checklist
- Idempotency: webhooks are retried with back-off for hours, so the same event may arrive twice. Check whether the order is already delivered before sending anything.
- Signature checks: verify
X-Mistket-Signature(HMAC-SHA256 of timestamp and raw body with your webhook secret) before trusting any event. - Do not trust chat messages as proof. A user saying "I paid" or sending a screenshot is never a substitute for the webhook.
- IP allow-list: restrict API access to your bot server in the merchant panel.
- Logs: the dashboard shows webhook delivery logs, expected vs. received amounts and transaction hashes for support cases.
For full code samples of signing and verification, see crypto payment API integration.
No developer yet? Start with payment links
If you run a small paid group manually, you can create invoices in the merchant panel and send the link in a private message. Once you confirm payment in the dashboard, add the member by hand. It does not scale, but it lets you validate pricing before building a bot. See crypto payment links and invoices.
Get started
Ready to accept crypto payments in a Telegram bot of your own? Apply as a merchant via Telegram @mistnetwork with your bot or community link and expected volume. Once approved, you receive API keys the same day. Review the request and webhook samples in the developer section and manage your keys from the merchant login.


