EN
VPN panels

Crypto payments for Remnawave

Accept USDT for your Remnawave VPN panel. This small service creates a SnapEX Pay invoice for a plan and sends your customer to the hosted payment page. When SnapEX Pay confirms the payment, it creates the Remnawave user, or extends an existing one, and gives you the subscription URL. It runs next to your panel in Docker, and your shop backend or Telegram bot drives it through a two-endpoint HTTP API.

Download the module

Free. Version 1.0.0.

What it does

  • Payment page hosted by SnapEX Pay: USDT on TRON (TRC20), Ethereum (ERC20) or BNB Chain (BEP20); other coins appear when a swap route is available for the amount.
  • After payment it creates a Remnawave user (ACTIVE, with expiry, traffic limit, optional Telegram ID and internal squads) or extends an existing one. Renewals add the plan's days to whichever is later: now or the current expiry.
  • Webhooks are checked with HMAC-SHA256 and a 5-minute window; the invoice status is then read back from the SnapEX Pay API, and only a paid invoice provisions the user.
  • Idempotent: if the same webhook arrives twice, even at the same moment, the user is provisioned only once.
  • Plans in one environment variable; data is one SQLite file, no external database.

Install

  1. In Remnawave go to Remnawave Settings โ†’ API Tokens and create a token (not the admin login JWT โ€” the panel rejects it for API calls). Copy the UUIDs of the internal squads new users should get.
  2. In the SnapEX Pay merchant cabinet create an API key with the invoices.read and invoices.write scopes.
  3. Download and unpack the archive, run cp .env.example .env and set SNAPEX_API_KEY, REMNAWAVE_URL, REMNAWAVE_TOKEN, REMNAWAVE_SQUADS and a long random API_TOKEN.
  4. Start it: docker compose up -d, check curl -s http://127.0.0.1:8080/health, and put it behind your HTTPS reverse proxy.
  5. In the cabinet add a webhook endpoint https://<your service>/webhook, put its whsec_โ€ฆ secret into SNAPEX_WEBHOOK_SECRET and restart.
  6. From your backend or bot call POST /v1/checkout with Authorization: Bearer <API_TOKEN>, send pay_url to the customer and check GET /v1/orders/{invoice_id} for the subscription URL.

Settings

SNAPEX_API_KEY, SNAPEX_WEBHOOK_SECRETMerchant API key (invoices.read, invoices.write) and the webhook signing secret (whsec_โ€ฆ).
SNAPEX_ENVIRONMENT, SNAPEX_FEE_ONlive or test (test invoices confirm without real funds); who pays the service fee โ€” merchant or customer.
REMNAWAVE_URL, REMNAWAVE_TOKENPanel URL (or http://remnawave:3000 on a shared Docker network) and the Remnawave API token.
REMNAWAVE_SQUADSInternal squad UUIDs for new users. A user with no squad has no inbounds, so their subscription would be empty.
API_TOKENBearer token your shop or bot sends to /v1/checkout and /v1/orders/โ€ฆ.
PLANSid:days:usd:traffic_bytes, comma-separated; 0 bytes = unlimited.

Questions

Which Remnawave versions are supported?

Remnawave 2.2 or newer; tested against 3.4.5.

Why is the new user's subscription empty?

A user with no internal squad has no inbounds. Put the squad UUIDs for new users into REMNAWAVE_SQUADS; existing users keep their squads.

How do renewals work?

Payment for an existing username adds the plan's days to whichever is later: now or the user's current expiry. The traffic limit is set to the new plan's value.

Can one payment create a user twice?

No. Even if the same webhook arrives twice at the same moment, the user is provisioned only once.

Is there a ready Telegram bot?

Yes, a separate SnapEX Pay Telegram bot for Marzban, 3x-ui and Remnawave. This service fits when you already have your own bot or shop.

Ready to accept crypto?

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