Skip to content

Crypto-to-fiat payout

TL;DR - Generate a single-use deposit address. The customer sends stablecoin to it within 24 hours. The provider converts it to USD and wires the recipient. The customer's balance is not affected - this is a pass-through flow.

How this differs from a fiat payout

Fiat payout Crypto-to-fiat payout
Source of funds Customer's USD balance Customer's external crypto wallet
Affects balance? Yes (debited) No (pass-through)
Recipient receives Wire / SWIFT / ACH Wire / SWIFT (USD)
TOTP confirmation? Yes Operator confirms in UI; no separate OTP
Settlement window Immediate to 5 BD 24 h deposit window + provider conversion + wire

Before you start

  • A customer in active status.
  • A fiat recipient - the destination is a bank account, not a wallet. The crypto only enters at the deposit step.
  • A supporting document (invoice or other) - required for crypto-to-fiat to satisfy compliance.

Step 1 - Pick the customer and recipient

From the customer dashboard click Send crypto-to-fiat payout, or open the global payout menu and pick Crypto-to-fiat.

Field Notes
Customer Searchable list of active customers.
Recipient Same searchable fiat recipient picker as on a fiat payout.

Step 2 - Amount, network, and documents

A warning banner reminds you of the deposit rules:

Single-use deposit address

Magma generates a unique deposit address for this transaction. The customer must send the exact amount in the chosen token within 24 hours. After that the address expires and any deposit will be rejected. The address is not reusable.

Field Notes
Network Dropdown - polygon, solana, tron, ethereum, arbitrum, base.
Token Filtered by network: USDC or USDT.
Amount (USD) Minimum $1.00. The wizard converts to the equivalent in the chosen token at preview time.
Memo Optional.
Invoice number Optional.
Supporting document Required. PDF, PNG, or JPG, up to 10 MB. Multiple uploads supported.

Step 3 - Preview

The fee breakdown card has the same three-tier shape as a fiat payout (see Fee breakdown). The recap row shows the chosen network and token as tags so it's easy to spot mistakes.

Step 4 - Generate the deposit address

Click Confirm & get deposit address. Magma asks the upstream provider to mint a fresh address for this transaction.

Step 5 - Hand the address to the customer

The result screen shows everything the customer needs to make the deposit:

Field Notes
Payout ID Internal identifier.
Deposit address Single-use. Copyable.
QR code Encodes the payment URI (chain + address + amount) so the customer can scan from their wallet.
Network What chain to send on.
Token to send USDC or USDT.
Amount to send Exact amount in the chosen token - must match precisely.
Recipient gets What the recipient's bank account will receive in USD.
Expires Timestamp 24 hours from creation. After this the deposit address rejects.
Status Starts as awaiting_deposit (amber pulse).

You can copy the address, copy the URI, or scan the QR code from the customer's wallet. Magma can also email the same details directly to the customer's contact email if your fintech has that template enabled.

After the customer deposits

  1. Provider detects the deposit on-chain.
  2. Status moves through processing as the conversion clears.
  3. Provider executes the wire to the recipient.
  4. Status moves to completed.

You can track all of this on the transactions page. The same row will show the on-chain txHash once the deposit is detected.

Why the customer balance isn't affected

This flow is end-to-end pass-through: the customer's USD balance never moves. The crypto enters at the deposit step, the upstream provider converts and wires the recipient. If your customer wants to fund the balance instead, that's the Get Crypto flow - a separate operation where they top up the USD balance first and then pay from it.

What happens behind the scenes

UI action Endpoint
Generate deposit address POST /api/v1/payouts/crypto
Upload extra docs after the fact POST /api/v1/payouts/crypto/upload-doc
Read networks / tokens supported GET /api/v1/crypto/networks

Response fields: depositAddress, amountCrypto, recipientGets, fees, expiresAt (ISO 8601), status, network, token.

What's next