RugWard Pay
Statuses, confirmations and payment proofs
The invoice lifecycle in detail: when an invoice counts as paid, what underpaid, overpaid, late and expired mean, how refunds work, and how to share a payment proof.
On this page
Lifecycle at a glance#
open ──(payment seen)──▶ pending ──(enough confirmations, full amount)──▶ paid / overpaid
│ │
│ └─(quote expired + 10 min grace, still short)──▶ underpaid
├─(nothing arrives before expiry)──▶ expired
├─(payment seen only after quote expiry + 10 min)──▶ late
└─(merchant cancels, no payment yet)──▶ canceledStatus reference#
| Status | Dashboard label | Meaning | What to do | Final? |
|---|---|---|---|---|
open | Awaiting payment | Created; no payment seen yet. | Wait. | no |
pending | Payment detected, confirming | A payment was seen but is not confirmed yet, or only part of the amount arrived while the rate lock is still running (the buyer can send the rest). | Wait. Do not ship yet. | no |
paid | Paid | Confirmed payments cover the quoted amount (see tolerance below). | Ship. | yes |
overpaid | Paid (more than requested) | Paid, and more than 1% above the quoted amount. | Ship; refund the extra from your wallet if you want to. | yes |
underpaid | Underpaid | The rate lock (plus 10 minutes grace) ended with less than the amount confirmed. | Contact the buyer: ask for the difference or refund. | yes |
late | Paid after expiry | Payment arrived only after the quote expired plus 10 minutes. | Check the amount and today's rate, then decide: accept, ask for the difference, or refund. | yes |
expired | Expired | Nothing arrived in time. | Create a new invoice if the buyer still wants to pay. | yes |
canceled | Canceled | You canceled it before any payment. | — | yes |
Every change of status creates one webhook event (invoice.pending, invoice.paid, …). See Webhooks.
When does an invoice count as paid?#
For the coin the buyer chose, RugWard adds up the confirmed payments that were seen before the quote expired plus 10 minutes of grace (so a transaction broadcast just before the deadline still counts). The invoice is:
- paid when that total is at least the quoted amount minus a small tolerance: the unique-amount offset plus 0.1% (covers wallets that round the last digits);
- overpaid when it is more than 1% above the quoted amount.
Amounts in different coins are never added together. On Base, where the 0.5% is split on-chain, the check is made on the 99.5% that reaches you.
Confirmations#
| Network | Required |
|---|---|
| Bitcoin | 1 |
| Monero | 10 |
| Ethereum | 12 blocks |
| Base | 30 blocks |
| Arbitrum | 60 blocks |
| BNB Chain | 15 blocks |
| Polygon | 32 blocks |
| Solana | finalized commitment |
How RugWard detects payments#
| Coin | Detected automatically by | Buyer can also paste |
|---|---|---|
| Bitcoin | scanning your address for the exact unique amount | transaction id |
| USDC / USDT on EVM chains (no splitter) | token Transfer events with the exact unique amount | transaction hash |
| ETH / BNB (no splitter) | the transaction hash (sent automatically by the wallet button) | transaction hash |
| ETH / USDC on Base (splitter) | the splitter's Paid event carrying this quote's reference, your address, the token and a fee of exactly 0.5% | transaction hash |
| SOL / USDC / USDT on Solana | the Solana Pay reference key | transaction signature |
| Monero | the transaction id plus the tx key, or your view key (two public nodes must agree) | transaction id (+ tx key) |
Protections built into detection:
- One transaction pays one invoice. A transaction can be credited only once per network and recipient address.
- No front-running. A transaction hash pasted by someone else is only accepted if it matches this quote's exact unique amount or carries this quote's reference.
- No old transactions. A transaction mined before the quote was created cannot pay it.
- A pasted transaction with a different amount is refused with "Contact the merchant with the transaction id"; the merchant settles it by hand.
- The rate is computed only on the server; the buyer's browser never supplies a price.
Refunds#
RugWard Pay is non-custodial: the money is already in your wallet, so RugWard cannot refund, reverse or charge back anything. To refund a buyer, send the coins back yourself from your wallet, ideally to an address the buyer gives you (not automatically to the sending address: it can belong to an exchange). Keep the invoice id and the transaction links for your records.
Payment proofs#
Every paid or overpaid invoice has a public, shareable proof page at https://rugward.com/pay/proof/<invoice id> (also as JSON at /api/pay/proof/<invoice id>). It shows the amount in USD, the merchant, when it was confirmed, the quoted coin amount and rate with its price sources, the receiving address, and every confirmed transaction with an explorer link. Anyone can re-check those transactions on the public blockchain.

Proof pages are not indexed by search engines. For unpaid invoices there is no proof (404).
Expiry in detail#
- Invoice expiry (15 minutes to 7 days): after it, no new rate can be locked.
- Quote (rate lock) expiry: 30 minutes after the buyer picks a coin. If fewer than 5 minutes remain, picking the same coin again locks a new rate.
- Grace: payments seen up to 10 minutes after the quote expired still count normally.
- An invoice turns expired only after both the invoice and its last quote (plus grace) have ended without a payment.
Last updated: October 30, 2026