How refunds work
A refund occurs when a merchant agrees to return funds to a cardholder after a completed transaction. Unlike reversals, which cancel pending authorizations, refunds apply to transactions that have already settled. The refund process follows these steps:- The cardholder requests a refund from the merchant.
- The merchant settles the refund with Visa.
- Visa subtracts the refund amount from the merchant’s Net Settlement Balance.
- Rain receives the refund notification and issues a Credit Voucher.
- The Credit Voucher is applied to the appropriate ledger balance.
Refund timing
Refunds generally complete within 30 business days of the merchant processing them, and refunds for canceled orders can take up to 30 business days after the pending charge clears. A merchant refund that stays pending for more than 10 days may have failed; if a refund exceeds 30 business days, escalate to Rain support with the transaction ID and the card’s last 4 digits. Rain never credits a refund the merchant declined. The user must ask the merchant to retry the refund.Credit Voucher distribution
When we receive a refund from the card network, we issue a Credit Voucher to restore the funds. Where the credit is applied depends on your program type.Rain-managed programs
For Rain-managed programs, we handle the ledger on behalf of your users. When a refund is processed, we issue the Credit Voucher directly to the user’s ledger balance. The user’s available balance increases by the refund amount, and you receive atransaction.completed webhook with a negative amount indicating the credit.
For example, if a user receives a $50 refund, their ledger balance increases by $50 and you receive a webhook showing -5000 (in cents).
Partner-managed programs
For Partner-managed programs, you manage your own ledger and authorization decisions. When a refund is processed, we issue the Credit Voucher to your tenant’s ledger balance rather than to individual user balances. You are responsible for crediting the appropriate user on your own ledger after receiving thetransaction.completed webhook.
For example, if one of your users receives a $50 refund, your tenant balance increases by $50. You then post the refund to your internal ledger and credit the user accordingly.
Identifying refunds
Refunds appear as transactions with negative amounts. You can identify a refund by checking for:- A negative
amountvalue in the webhook payload. - The
spendtransaction type.
On-chain refunds
With onchain refunds enabled, in most cases your users receive refunds as on-chain stablecoin transfers instead of spending credit — the default, where an instant ledger credit grows a user’s spending power. Onchain refunds return stablecoins from a Rain-operated refund wallet to the user on-chain, so the refunded amount is withdrawable like their original funds.How on-chain refunds work
You don’t need to take any action once onchain refunds are enabled for your tenant — qualifying refunds settle on-chain automatically. Three events trigger an onchain refund:- Processor refunds — a merchant-initiated refund that settles after the original transaction.
- Real Time Funding reversals — an authorization reversal on a tenant using Real Time Funding, where the excess collateral must return to the user’s source wallet.
- Accepted dispute reimbursements — the reimbursement for an accepted dispute, returned to the user on-chain instead of the account credit Rain would otherwise issue.
Refund amount limits
An onchain refund can never exceed the amount of the original transaction it refunds. Rain caps each refund at the transaction’s remaining refundable amount — the original purchase amount minus any refunds already issued or still processing against that transaction. When a refund request would exceed the remaining refundable amount, Rain reduces it to that amount and settles the reduced amount on-chain. The refundamount shown on the transaction record and in the onchainRefund.created and onchainRefund.completed webhooks reflects this reduced amount, so it may be smaller than the amount originally requested. For example, on a 70, a later 30 refund — the amount still remaining.
When a transaction has already been fully refunded, it has no remaining refundable amount, and Rain does not issue an onchain refund for it. Because no refund is created, you receive no onchainRefund.created or onchainRefund.completed webhook for that request.
A reduced amount or a missing webhook is expected when a transaction is partially or fully refunded, not an error — see Webhook notifications or Identifying onchain refunds to confirm what settled.
Refund destinations
Where the funds land depends on how your tenant sources collateral:Enabling onchain refunds
You don’t toggle onchain refunds yourself — Rain enables them per tenant. If you use Real Time Funding, you get onchain refunds by default, since those users expect funds back in their own wallet.Contact your Rain representative to enable onchain refunds for your tenant.
Supported chains and assets
Onchain refunds are paid in USDC on every chain except Plasma, where they are paid in USDT0 (Plasma has no USDC deployment).Collateral refunds
Refunds to a collateral contract can settle on any of the chains below. The chain used for a given refund depends on the refund routing available to your tenant at the time.Real Time Funding refunds
Real Time Funding refunds return funds to the wallet they were pulled from, so they settle on the chains Real Time Funding supports and require the user to have a wallet address on that chain.
For USDC and USDT0 token addresses, see Real Time Funding → Supported Assets.
Identifying onchain refunds
When you fetch transactions, the response includes two fields that tell you how a refund was processed:referenceInfo appears only after the on-chain transfer settles. Until then, the transaction shows refundMethod: onchain_refund without a reference.Webhook notifications
To track a refund through its lifecycle, listen for the dedicatedonchainRefund webhooks. You receive these events if you have onchain refunds or Real Time Funding enabled.
Each event includes the refund
amount, asset, chainId, and destinationKind, along with the transactionId of the refund transaction. Use destinationKind to tell where the funds land: AUTHPULL_SOURCE returns funds to the cardholder’s source wallet, and COLLATERAL_CONTRACT returns them to the collateral contract.
You can also confirm a refund from the transaction record itself — see Identifying onchain refunds.
What’s next
Refund transaction
Sample webhook payload for a refund transaction.
Settlement (Rain-managed)
How refunds are settled in Rain-managed programs.
Settlement (Partner-managed)
How refunds are settled in Partner-managed programs.