EN

Accepting USDT in BILLmanager: crypto payments for hosting step by step

Accepting USDT in BILLmanager

Hosting and VPS clients often want to pay in crypto, most of all in USDT. This guide shows how to add crypto as a payment method in BILLmanager 6: the client picks SnapEX Pay (crypto) when topping up the balance or paying an order, pays in USDT on TRON, Ethereum or BSC or in another coin, and the payment is credited in BILLmanager automatically. You don't run a wallet or a blockchain node — the money lands in your SnapEX Pay merchant balance in USDT.

How a payment goes

client → top-up or order → SnapEX Pay (crypto)
BILLmanager → SnapEX Pay: invoice in USD
client → pays on the SnapEX Pay page
SnapEX Pay → signed webhook → BILLmanager
module → GET invoice from the API → paid?
BILLmanager: payment credited
  1. The client picks SnapEX Pay (crypto) among the payment methods. The module creates a SnapEX Pay invoice for the payment amount in USD and sends the client to the payment page.
  2. The client chooses a coin and network and pays. When the invoice is paid, SnapEX Pay sends a signed webhook to your billing.
  3. The module re-reads the invoice from the SnapEX Pay API and credits the payment only if the invoice is paid for the right amount. The webhook body alone never credits anything.

A payment is credited three independent ways, whichever comes first: the signed webhook, the client returning from the payment page, and the periodic check (checkpay, every 5 minutes). A lost webhook never leaves a paid payment uncredited, and a payment is never credited twice.

What you need

  • BILLmanager 6, any edition, and root access to its server.
  • python3 3.6+ on that server. The module uses only the standard library: no extra packages, no billmanager-plugin-python-libs.
  • A payment method in USD: SnapEX Pay invoices are in dollars.
  • A SnapEX Pay merchant account: sign up at pay.snapex.pro.

Step 1. Install the module

Download snapexpay-billmanager-1.1.0.tar.gz (free) and run on the BILLmanager server as root:

curl -fsSLO https://pay.snapex.pro/downloads/billmanager/snapexpay-billmanager-1.1.0.tar.gz
tar xzf snapexpay-billmanager-1.1.0.tar.gz
cd snapexpay-billmanager-1.1.0
sh install.sh

The script copies the module into /usr/local/mgr5, adds a 5-minute checkpay cron job (/etc/cron.d/snapexpay) as a safety net and restarts BILLmanager. It stops with a message if it doesn't find BILLmanager or python3 3.6+.

Step 2. Get an API key

In the SnapEX Pay merchant cabinet open Developers and create an API key. The module needs the invoices.read and invoices.write scopes; a key created in the cabinet gets all Merchant API permissions, these included. The key is shown once — copy it right away. Reissuing the key revokes the old one at once, so update the payment method at the same moment.

Step 3. Add the payment method

In BILLmanager open Provider → Payment methods → Add and choose SnapEX Pay (crypto) (in the Russian interface the module is called «SnapEX Pay (криптовалюта)»). Set the currency to USD and paste the API key.

Saving checks the key against SnapEX Pay: a wrong or revoked key, or a currency other than USD, will not save.

The other settings:

  • Client pays the network fee — off: the client pays exactly the payment amount, and the fees are taken from what you receive; on: the SnapEX Pay fee and the network fee are added on top for the client. More: Who pays the fees on a crypto invoice.
  • Payment window, minutes — how long the SnapEX Pay payment page stays valid: 1 to 1440, 60 by default. If the client opens the payment again later, a fresh page is created.
  • Test mode — see step 6.
  • Partner ID — see step 5.
  • API URL — leave it empty.

Your clients pay in roubles or another currency? BILLmanager converts the amount into the payment method currency (USD) at its own exchange rates, so keep the USD rate up to date.

Step 4. Set up the webhook

The webhook is optional but recommended: with it, the balance is credited as soon as the payment is confirmed.

  1. In the cabinet, on the Developers page, set the webhook URL to https://<your billing domain>/mancgi/snapexpayresult and save.
  2. The whsec_… signing secret is shown once, right after the first save. Paste it into Webhook secret in the payment method settings.

How the module checks a notification:

  • the Webhook-Signature header: HMAC-SHA256 of {Webhook-Timestamp}.{raw request body} with your secret; unsigned or tampered requests get 401;
  • Webhook-Timestamp within 5 minutes of the server clock — keep NTP on;
  • the invoice itself, re-read from the SnapEX Pay API with your key.

If the API can't be reached at that moment, the module answers 502, and SnapEX Pay retries the delivery. The cabinet has one webhook URL per account; the module ignores events for invoices it didn't create. Without a webhook, payments are still credited when the client returns from the payment page and by the check every 5 minutes. More about signatures and retries: Crypto payment webhooks.

Step 5. Partner ID: who set up the module

The Partner ID field is optional. If you set up BILLmanager for your own hosting company, leave it empty.

If you are an integrator and set up billing for clients, paste your Partner ID: the client's merchant account is bound to you, and you get 35% of our fee on that client's payments. The client creates their own SnapEX Pay account and API key, and the money goes to their balance. Terms: SnapEX Pay partner program.

Step 6. A test payment without real money

  1. Create a separate payment method with Test mode on and make it available only to a test client (Payment methods → restrictions by client group).
  2. Log in as the test client, start a top-up and choose this payment method.
  3. The SnapEX Pay page has a Test label. Pick any coin and network: the page shows a test address, and in about 10 seconds the payment confirms by itself. You don't send anything.
  4. The payment should become credited in BILLmanager. If it doesn't, look at /usr/local/mgr5/var/pmsnapexpay.log and at the delivery log on the Developers page.
  5. Turn test mode off or delete the test payment method.

Test payments are never credited once test mode is off, so test money can't pay for real services. More: How to test crypto payments without real money.

What the client sees

  • Among the payment methods for a top-up or an order — SnapEX Pay (crypto).
  • The SnapEX Pay payment page: USDT on TRC20, ERC20 and BEP20 and other coins (50+ in total), if SnapEX Pay offers them for the invoice amount.
  • After paying, the client returns to the billing. If the payment is already confirmed, BILLmanager shows its usual success page; if not, the client sees "Thank you! Your payment is being confirmed on the blockchain" and a link back to payments — the balance is credited automatically.
  • If the client leaves and opens the payment again within the payment window, it is the same page, not a second invoice.

What lands in BILLmanager

  • The client opens the payment → the payment becomes In payment, with the SnapEX Pay invoice ID (INV-…) as its external ID.
  • Paid in full → the payment is credited; the info field shows the coin, network and amount received.
  • Paid partly (the client sent less and didn't top up in time) → nothing is credited, and the log has closed with a PARTIAL payment (…) - review in SnapEX Pay and credit manually. What you received is in your SnapEX Pay balance. How underpayments work: The customer sent less than the invoice.
  • Not paid in time → the payment stays In payment so the client can try again; a day after the last SnapEX Pay invoice expired, it is canceled.
  • Paid twice, paid after the payment was canceled, or an extra payment after the invoice closed → a log entry; the money is in your SnapEX Pay balance.

If something doesn't work

  • The payment method won't save. Check the API key (wrong or revoked) and the currency: only USD is accepted.
  • The client sees "Crypto payments are not available for this currency". The payment method currency isn't USD.
  • The client sees "Could not start the crypto payment". SnapEX Pay rejected the invoice; the reason is in pmsnapexpay.log.
  • The webhook gets 401. The webhook secret doesn't match, or the server clock is off.
  • The webhook gets 503 "webhook secret is not configured". The webhook URL is set in the cabinet, but Webhook secret is empty in the payment method.
  • The client paid but the balance wasn't credited. Look for the payment in /usr/local/mgr5/var/pmsnapexpay.log: partial payments and money paid after the payment was canceled are not credited automatically.

To remove the module, run sh install.sh --uninstall from the unpacked archive. Payment history stays in /usr/local/mgr5/var/snapexpay.sqlite.

Cost

1% per payment, no setup fee and no monthly fee. The module is free.

Module page: BILLmanager. Choosing a gateway for hosting: How to choose a crypto payment gateway for a hosting company. Overview for hosting providers: Crypto payments for hosting. Sign-up: pay.snapex.pro.

More guides

Selling VPN subscriptions through a Telegram bot for USDT: setup step by step How to launch the SnapEX Pay Telegram VPN bot: plans, API key, Marzban, 3x-ui or Remnawave connection, HTTPS webhook and a test purchase without real money. The customer pays in USDT and gets the subscription link in the same chat. VPN subscription renewals paid in crypto: extend users without duplicates or lost days How the SnapEX Pay modules for Marzban, 3x-ui, Remnawave and the Telegram VPN bot handle a returning customer: which expiry the new days count from, what happens to traffic, configs and repeated webhooks. Crypto payments in Xboard and V2Board: accept USDT for VPN subscriptions step by step How to connect SnapEX Pay to an Xboard or V2Board panel: install the plugin, add the payment method, set up the webhook, convert CNY or other prices to USD and run a test order without real money. Crypto payment webhooks: verify the signature, handle retries and duplicates How SnapEX Pay webhooks are signed and delivered, how to verify them in PHP and Node.js, and how to make your handler safe against retries, duplicates and out-of-order events. The customer sent less than the invoice: how crypto underpayments work Exchanges often deduct their withdrawal fee from the amount, so a crypto invoice arrives short. What SnapEX Pay does with an underpayment, which webhooks you get and what to do with the order. How to choose a crypto payment gateway for a hosting company: 8 questions to ask A checklist for hosting and VPS providers choosing a crypto payment gateway: billing module, how paid invoices get marked paid, underpayments, fees, settlement, coins, test mode and multi-currency billing. SnapEX Pay vs NOWPayments, Cryptomus and CoinGate: fees and ready-made modules compared How SnapEX Pay compares with NOWPayments, Cryptomus and CoinGate on the published fee, monthly fees and ready-made modules for hosting billing, VPN panels and stores. Competitor data from their own websites, 11 October 2026. How to test crypto payments without real money Test invoices in SnapEX Pay go through the same statuses and send the same webhooks as live ones, but confirm by themselves and never touch your balance. Here is how to use them. Who pays the fees on a crypto invoice: you or your customer SnapEX Pay lets you choose per invoice who covers the service fee and the network allowance. What fee_on does, how it changes the amount the customer pays and the amount you receive.

Ready to accept crypto?

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