One-time deposit instructions suit occasional payers and local rails. Virtual accounts suit repeat US payers. How each matches deposits and when to switch.
Use one-time deposit instructions when a payer sends money occasionally, for a specific amount, or over a local rail like Pix or SPEI. Use a virtual account when the same payer sends US bank transfers again and again. Instructions need no setup but depend on a reference code. A virtual account's number identifies the customer by itself.
Key takeaways
One-time deposit instructions are payment details generated for a single pay-in, used once, for one amount.
The flow on a typical stablecoin on-ramp looks like this:
What "instructions" means depends on the rail. For a US transfer into a shared collection account, it's the account details plus a reference code the payer must include. For Pix, it's a payment code. For SPEI, it's a CLABE. For bank redirect rails such as PSE in Colombia, it's a payment link.
The crypto on-ramp API integration guide walks through the quote and pay-in calls in detail.
A virtual account is a bank account number assigned to one customer that receives every deposit for that customer, with no reference needed.
The payer sends money to it like any other bank account. Each deposit creates its own pay-in record, gets converted, and lands in the wallet linked to the account. The account number is the matching key, so the payer can leave the memo blank, pay from a parent company, or send an unexpected amount, and the money still reaches the right customer.
The trade-off is setup. A virtual account belongs to a verified customer, goes through compliance and bank review, and usually carries a monthly fee. The full lifecycle is in stablecoin virtual accounts explained.
One-time instructions win on setup and flexibility. Virtual accounts win on matching and repeat payments.
| One-time deposit instructions | Virtual account | |
|---|---|---|
| Reusable | No, one pay-in each | Yes, every deposit |
| Matching key | Reference code or rail payment code | The receiving account number |
| Setup before first payment | A quote and a pay-in, seconds | KYC or KYB, then compliance and bank review |
| Ongoing cost | Per-transaction fees only | Per-transaction fees plus a monthly account fee |
| Amount | Fixed by the quote | Any amount the payer sends |
| Payer experience | New details each time | Same details forever, saved as a payee |
| Main failure mode | Missing or wrong reference | Payer sends to an old or closed account |
| Rails | US transfers and local rails (Pix, SPEI, and others) | Usually one country's rails |
| Best for | Occasional payers, quoted amounts, local rails | Repeat payers, B2B invoices, foreign senders |
Read the "Main failure mode" row twice. It's the reason most teams start with instructions and move their busiest payers to accounts.
Reference codes travel through fields that were never built to carry them reliably.
On ACH, free text rides in the addenda record's Payment Related Information field. Nacha's ACH file details describe it as an optional freeform field of 80 characters. Optional is the problem. Many bank apps hide it, shorten it, or put it on a second screen.
Wires got better structure when the Fedwire Funds Service moved to ISO 20022 on July 14, 2025. Better message formats don't help when a person types the code into the beneficiary name field.
The patterns repeat:
A deposit without its code lands in the right bank account with nothing tying it to a pay-in. Someone then has to work out who paid. Why crypto on-ramp deposits fail covers that failure and six others.
Instant rails like Pix and SPEI are built around unique payment identifiers, so the reference problem mostly disappears.
Pix is the clearest case. The Central Bank of Brazil's Pix initiation standards manual defines a transaction identifier, the txid, of 26 to 35 characters for dynamic QR codes. It exists so the receiver can reconcile each payment against the charge it belongs to. The payer scans or pastes the code. Nobody types a reference.
That's why per-payment instructions are the default for collections in Latin America. The payer's bank carries the identifier for you. How to on-ramp BRL, MXN, ARS, and COP covers the four local rails.
Pick by payer behavior first, then by rail.
Use one-time deposit instructions when:
Use a virtual account when:
Many products run both. New customers start on instructions on day one, then get a virtual account once review clears.
Run this checklist against your payers and your provider before you commit to either model. It's what decides how much manual matching you'll do.
| Check | One-time instructions | Virtual account |
|---|---|---|
| How does the payer see the matching key? | Shown with every payment. Is it hard to miss? | Saved once as a payee |
| What happens to a deposit with no reference? | Ask the provider for the exact path: hold, manual match, or return | Not applicable, the account number matches it |
| How long does a pay-in wait for money? | Minutes on instant rails, days on ACH and wire | No quote window, deposits create pay-ins as they arrive |
| Is there a per-transaction cap? | Ask. Shared collection accounts can carry their own cap on top of customer limits | Customer limits from the verification tier apply |
| Which rails are covered? | Check each local rail separately | Usually domestic rails plus wire and SWIFT |
| What's the setup time? | None beyond the quote | Hours to business days for review |
| What's the monthly cost? | None | A fixed fee per account |
| Which webhook confirms the deposit? | The pay-in completion event | The same event, one per deposit |
The ledger side, from webhooks to partial payments, is in how virtual accounts automate reconciliation.
BlindPay supports both, and picks automatically for US transfers. A pay-in quote locks the method, amount, fee split, and destination for 5 minutes, and the pay-in created from it returns the instructions for that rail: a memo_code with bank details for ACH and wire, a pix_code for Pix, a CLABE for SPEI, an account number for Transfers 3.0, or a payment link for PSE.
When a customer has an approved virtual account, BlindPay shows that account's own details for ACH and wire and ignores the memo code. Two exceptions: RTP pay-ins always use the memo-code path, and SWIFT pay-ins require an approved virtual account. Pay-ins without a virtual account on ACH or wire are also capped at $500,000 per transaction. BlindPay's US virtual accounts cost $1.50 per month per account. The payins docs and cut-off times have the details.
For how pay-in APIs sit next to issuer, wallet, and payout APIs, see the types of stablecoin APIs.
Pull last quarter's deposits and count how many arrived without a usable reference, by payer. Move the top repeat payers to virtual accounts first, and keep one-time instructions for everyone else and for every local rail.
Seven places blockchain payments beat bank rails: contractor payroll, remittances, B2B suppliers, marketplaces, 24/7 treasury, bill pay, and PSP payouts.
AP2, ACP, and x402 each verify that an AI agent had permission to spend. Here is what every protocol covers, who backs it, and the reconciliation gap none of them close.
Seven stablecoin payment platforms compared for US fintechs in 2026: what makes an API production-ready, how each provider handles compliance, settlement speed against ACH, and how to run the evaluation.