B2B Invoicing with USDT: Collecting Business Payments
How to set up B2B invoicing with USDT: fixed-coin invoices, matching payments to your document numbers, the 24-hour window and clean reconciliation exports.

B2B invoicing with USDT is becoming a practical option for companies that bill overseas partners or corporate clients who already work with stablecoins. Business payments have their own needs, though: exact amounts, a match to your document number, payment terms and a clean audit trail. Here is how to shape MercanPay invoices around those needs.
Why USDT comes up in B2B
- Speed across borders: international bank transfers can take days, while a USDT transfer on TRON is final in about a minute.
- Dollar contracts: when the contract is in USD, the USDT amount stays close to the contract amount.
- Counterparty preference: some partners already hold stablecoins and prefer to pay that way.
The broader pros and cons of stablecoins are in Stablecoin payments for ecommerce. This post focuses on the business-to-business flow.
Why a bare wallet address doesn't scale
Many companies start by emailing a wallet address. At low volume that works. As volume grows:
- you have to ask which invoice each incoming transfer belongs to,
- spotting short payments takes manual checks,
- someone copies dates, amounts and transaction ids into a spreadsheet by hand.
MercanPay creates a dedicated payment address per invoice. Each payment is matched to its invoice automatically and gets a status (paid, partial, overpaid). See What is a crypto payment gateway? for the full flow.
A recommended B2B invoice setup
Use a fixed-coin USDT invoice
The amount is usually set by contract, so the payer doesn't need a coin choice. A fixed-coin USDT invoice is the cleanest option. Network fees are included in the invoice total, and nothing is deducted from the amount you agreed.
Make order_id your document number
Put your invoice or pro-forma number in order_id. Webhooks and API responses carry it, you can search for it in the panel and in exports, and sending the same order_id again returns the existing invoice instead of a duplicate. We cover this in Matching invoices to orders with order_id.
Write a clear description
description is shown on the payment page, so something like "Consulting · November 2026 · PRF-2026-114" reassures the person paying that they are on the right link.
Keep internal data in metadata
metadata is never shown to the payer and returns unchanged in webhooks, which makes it a good place for customer codes and contract references.
<?php
require 'vendor/autoload.php';
use MercanPay\MercanPay;
$zp = new MercanPay('https://mercanpay.com', getenv('MERCANPAY_API_KEY'));
$invoice = $zp->createInvoice('USDT', '2500', [
'order_id' => 'PRF-2026-114',
'description' => 'Consulting · November 2026 · PRF-2026-114',
'expires_in_minutes' => 1440,
'metadata' => ['customer_code' => 'ACME-07', 'contract' => 'CTR-2026-03'],
]);
echo $invoice['payment_url'];
Payment terms and the 24-hour rule
Traditional B2B invoices often run on 15, 30 or 60-day terms. A MercanPay invoice is valid for at most 24 hours, because each one has its own payment address and tracking window. In practice, create the payment link close to the day of payment:
- Issue your formal invoice in your own system with its usual terms.
- When the due date approaches, or the payer says they're ready, create the MercanPay invoice.
- Send the link to whoever makes the transfer.
- Close the record when the webhook or panel notification confirms payment.
A payment that arrives after expiry is still credited to your balance and flagged with late in the webhook. More in Crypto invoice expiry time.
Brief the payer before they pay
In business payments, the person sending the transfer is often not the person who signed the contract; it's someone in finance or accounting. A short note alongside the link saves back-and-forth later:
- payment must be in USDT on the TRON (TRC20) network only,
- the amount must match the payment page exactly,
- the date and time the link stays valid until,
- the page will show "Payment received" once the payment is final.
Those four points head off the most common B2B problems: wrong network, short amount and an expired link.
Care points for large amounts
- Let the payer take the address from the payment page. Don't retype it into emails; see Address poisoning attacks.
- Watch for exchange fees. Some exchanges deduct their fee from the amount sent. The invoice then becomes
partial, and the rest can go to the same address; see Handling underpayments and overpayments. - Test with a separate small invoice when working with a new partner. The minimum invoice is $10.
Reconciliation and reporting
The panel's export gives your finance team what it needs at month end:
| Report | Contents |
|---|---|
| Invoices | Date, invoice ID, order ID, status, USD amount, coin, amount, paid, payment date |
| Balance ledger | Invoice payments, platform commission, withdrawals, withdrawal fees |
| Withdrawals | Amount, fee, address, transaction ID |
Download them as CSV, Excel (XLSX) or PDF with a date range and status filter. See Export crypto payment reports and Crypto payment bookkeeping.
How crypto B2B receipts are documented, taxed and reported depends on your country and business type. This article is not legal or tax advice. Talk to your legal and tax advisers before you start.
FAQ
Can I create a payment link for a 30-day invoice?
No. A MercanPay invoice lasts up to 24 hours. Issue your formal invoice with its terms and create the payment link near the payment date.
Can the payer split the amount?
Yes. After the first part, the invoice becomes partial and gets at least 30 more minutes. Once the rest arrives at the same address, it becomes paid.
What happens to an overpayment?
The full amount received is credited to your balance and the invoice is marked overpaid. Refunding or offsetting the excess is up to you.
Can I receive the payment in fiat?
No. MercanPay works with TRX and USDT on TRON only and does not pay out in fiat.
Get started with MercanPay
Track business USDT payments invoice by invoice: apply as a merchant and see the API documentation for details.


