When refunds happen
Refunds always move the same asset that was received: SPL tokens for stablecoin payments on Solana (e.g. USDC), the same coin type on Sui, or the native SOL/SUI for native payments.
How it works, step by step
1
Mismatch detected
The detection engine matches the deposit against the expected amount. If it doesn’t match exactly, the payment is flagged and a
payment.underpaid or payment.overpaid webhook fires with both the received and expected amounts.2
Refund queued
Tribridge records the refund on the payment (
refund_status: pending, plus the reason and amount) and fires it from the one-time deposit wallet back to the payer’s address.3
Gas covered by the relayer
You and your customer never think about gas. For token refunds the deposit wallet’s native balance covers fees; for native SOL/SUI refunds a tiny gas buffer is kept back (5,000 lamports on Solana, ~0.003 SUI on Sui) and the rest is refunded. If the amount is too small to cover its own gas, the refund is marked
failed rather than burning the funds.4
Completion recorded
On success the payment stores
refund_status: completed with the refund transaction hash. Failures are retried automatically (up to 5 attempts) — a stuck refund recovers on its own once the wallet can pay gas.Tracking refund status
Each payment carries refund fields you can inspect from the dashboard, activity log (refund.requested, refund.completed, refund.failed events), and your webhooks:
What you should build
- Handle
payment.underpaidandpayment.overpaidin your order logic — never assume the received amount equals the invoiced amount. - Treat a mismatch as “not paid”: don’t fulfill the order on an underpaid event; on an overpaid event, fulfill for the invoiced amount and let the surplus refund run.
- Show customers their refund transaction hash from the dashboard if they ask where their money went.

