EN

Crypto payments for VPN services: Remnawave, Marzban, 3X‑UI, Xboard and a Telegram bot

8 min read

Crypto payments for VPN services: Remnawave, Marzban, 3X‑UI, Xboard and a Telegram bot

This guide is for VPN owners who sell subscriptions through a website, a panel or a Telegram bot and want to take crypto. Getting paid is only half of it: access should go out right away, with the user created or renewed in the panel and the subscription link sent to the customer, with no manual work.

Why crypto: the payment does not depend on which country issued the customer's card or which bank they use. SnapEX Pay asks for no KYC, from you or from your customers, and has no country restrictions. Rules on accepting crypto differ from country to country, so check with a lawyer how they apply to your service.

  • 1%fee per payment, taken from the amount or added on top for the customer
  • $0.50minimum invoice in USDT TRC20, ERC20 or BEP20, enough for a two-dollar plan
  • 70+coins on the payment page; you receive everything in USDT

How a VPN subscription gets paid

From picking a plan to the subscription link

Customerpicks a plan in the bot or on the site
Payment pageUSDT or another coin
WebhookHMAC-SHA256 signature
Paneluser created or renewed
Subscriptionlink goes to the customer

The module does not trust the webhook body. When a notification arrives, it reads the invoice again from the SnapEX Pay API and grants access only when the status is paid. The services for Remnawave, Marzban and 3X‑UI and the bot grant access once, even if the same webhook arrives twice or two copies arrive at the same moment.

Step 1. Pick the module for your panel

  • Docker service

    Remnawave

    Creates an active user with an expiry date, traffic limit and internal squads, or extends an existing one, and returns the subscription link.

    Remnawave 2.2+ and 3.x · download from pay.snapex.pro

  • Docker service

    Marzban

    A new user gets every protocol that has an inbound in your panel. An existing user is extended from the current expiry date.

    Version 1.1.0 · download from pay.snapex.pro or GitHub

  • Docker service

    3X‑UI

    3X‑UI has no billing of its own, so the service adds a client to your inbound or extends it. UUID and subId stay the same, so the customer's config keeps working.

    3X‑UI 2.x and 3.x · download from pay.snapex.pro

  • Plugin

    Xboard and V2Board

    Installs from the Xboard plugin manager (for V2Board, a class in app/Payments). The customer goes to the payment page and the order opens by itself.

    Version 1.3.0 · download from pay.snapex.pro or GitHub

  • Bot

    Telegram VPN bot

    Plans are buttons in the chat, a button leads to the payment page, and the subscription link arrives in the same chat. Works with Marzban, 3X‑UI and Remnawave.

    Runs on your server · download from pay.snapex.pro

  • API

    Your own panel or site

    One REST API request creates an invoice and returns the payment page link. A signed webhook reports the status.

    Same docs and test mode as the modules

The services for Remnawave, Marzban and 3X‑UI are a small container next to your panel. Your bot or site asks it for a payment link (POST /v1/checkout) and reads the order status and subscription link from GET /v1/orders/{invoice_id}. No bot yet? Use the ready Telegram VPN bot.

Step 2. Create a merchant account and an API key

  • Sign up at pay.snapex.pro. An account on the snapex.pro exchange works too: it is the same account. No documents are needed.
  • Create an API key with the invoices.read and invoices.write scopes.
  • Add a webhook URL. SnapEX Pay delivers webhooks only to a public https:// address, so put the container behind Caddy, nginx or Traefik. Save the signing secret in SNAPEX_WEBHOOK_SECRET.
  • Every notification is signed with HMAC-SHA256 and a timestamp. If your server does not answer, SnapEX Pay retries delivery, up to 5 attempts in total.

Step 3. Start the module and set your plans

For Remnawave, Marzban, 3X‑UI and the bot the order is the same: download the archive from the module page, fill in .env, run docker compose up -d and check /health. Plans live in one variable in the format id:days:usd_price:traffic_bytes, where 0 means unlimited:

PLANS=month:30:5.00:0,quarter:90:12.00:107374182400

Here a month costs $5 with no limit, and a quarter costs $12 with 100 GB of traffic.

  • Remnawave: take the token from Remnawave Settings → API Tokens, not the admin login JWT. Put the UUIDs of internal squads into REMNAWAVE_SQUADS: a user with no squad has no inbounds, so the subscription would be empty.
  • Xboard: Plugins → upload the ZIP → Install → Enable "SnapEX Pay". If your panel prices are not in US dollars, set the conversion rate. All settings are in the Xboard and V2Board guide.

Step 4. Test a purchase with a test invoice

Set SNAPEX_ENVIRONMENT=test (in Xboard, Environment = test in the payment method settings) and buy a plan yourself. A test invoice confirms itself about 10 seconds after a coin is chosen, and no real money moves. Check that the user appeared in the panel and the subscription link reached the customer. Then switch back to live: in Xboard a test invoice can't open an order while the payment method is live.

Step 5. Go live and set up payouts

  • 1% fee. SNAPEX_FEE_ON=merchant takes it from the amount, customer adds it on top for the customer.
  • Coins for cheap plans. USDT on TRC20, ERC20 and BEP20, plus LTC, ETH and TRX, work from $0.50 per invoice; BTC works on small amounts when the network fee allows. Other coins, and USDT on Solana and other networks, are offered on invoices from $8.
  • Full payment only. The module grants access for an invoice with the paid status. If the customer underpays, the invoice waits for a top-up to the same address; otherwise it closes as partially paid, and the amount received is credited to your balance.
  • Invoice lifetime is 30 minutes by default, adjustable from 1 minute to 24 hours.
  • Payouts. Your balance is in USDT; withdraw from the dashboard to a crypto address with no hold. There is no service fee on payouts, only the network fee; the minimum is $0.50 to $10 depending on the coin.

Minimum invoice by coin

  • USDT TRC20 / ERC20 / BEP20, LTC, ETH, TRXfrom $0.50
  • Other coins and networksfrom $8

Scale: $0 to $10. A $2–5 plan can be paid in the coins of the first row.

Renewals and an in-bot balance

A repeat payment does not create a second user: the days are added to the current expiry date, or counted from the moment of payment if the subscription has already run out. The traffic limit is set by the plan paid for, so the customer gets a fresh quota. More in the guide on VPN subscription renewals.

If your bot keeps an internal balance, you can give each customer a permanent top-up address through the API, keyed by your customer's customer_id. Networks: USDT on TRC20, ERC20, BEP20 and Polygon, USDC on Polygon, BTC, LTC, ETH and TRX. Top-ups are credited in USDT minus the usual fee, the minimum is $0.50, and each one triggers a webhook. The ready modules work with invoices; permanent addresses are connected through the API.

Checklist before launch

Before you offer crypto to customers

  • Module chosen for your panel: Remnawave, Marzban, 3X‑UI, Xboard or the Telegram bot.
  • API key with invoices.read and invoices.write created, webhook pointed to an https:// URL, signing secret saved.
  • Plans in PLANS (or prices in Xboard) match what the customer sees.
  • Remnawave: API token and squads set, so a new user's subscription is not empty.
  • Test purchase with environment=test passed: the user was created once and the link arrived.
  • Fee: decided who pays the 1%, you or the customer.
  • USDT payout address ready, and you know the payout minimum for your coin.

If you already have a payment method

You don't have to drop it: SnapEX Pay can sit next to it as a second option, and the customer chooses how to pay. An overview of all VPN modules is on the Crypto payments for VPN services page.

Ready to accept crypto?

Create a merchant account and get an API key. 1% per payment, no monthly fee.

← All articles

$200 giveaway

To a random member.

Ends in 12d 11h 01m 16s Subscribe @snapex_pay