> ## Documentation Index
> Fetch the complete documentation index at: https://rain-sandbox-trial.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# How Money Movement Works

> Learn how Rain money movement works and the two ways to move funds: payment routes and quotes and transfers.

Rain money movement converts and settles funds between fiat and crypto. You
register a funding source and set up a pathway once, then Rain handles every
conversion after that, delivering funds automatically to the destination you
specified. To your users it can be fiat in and fiat out: the stablecoin layer
in the middle never has to surface in your product.

## Key concepts

Money movement involves three concepts:

* **Payment accounts** are the external funding sources you register with
  Rain, like a customer's bank account. Register one once and reuse it across
  any payment route or transfer.
* **Payment routes** are persistent pathways for fiat-to-crypto (onramp) or
  crypto-to-fiat (offramp) transfers. Creating a route returns a virtual
  account (onramp) or a deposit address (offramp) for a sender to fund.
* **Rain orchestration** is everything that happens after a sender funds a
  route: Rain converts the funds, settles them, and delivers them to the
  destination. You don't manage any of these steps yourself.

<Info>
  Registering a payment account or creating a payment route never moves money by
  itself: both only define a pathway. Money moves only when a sender funds the
  route.
</Info>

The sender or receiver does not have to be the customer. Anyone can fund a
route on the customer's behalf.

## Onramp

Onramp moves fiat into crypto. A sender funds the virtual account a payment
route created, and Rain converts the funds to stablecoin and delivers them to
the destination the route specifies.

<div className="wf-diagram">
  <div className="diagram-shell borderless">
    <svg id="onramp-flow" role="img" aria-label="Onramp: fiat sent from an external bank credits the virtual account, Rain converts it to stablecoin, and it is delivered to the wallet or contract." viewBox="0 0 1080 200" width="1080" height="200" style={{width: "100%", height: "auto"}}><defs><marker id="arrow-onramp" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" className="marker-fill-default" /></marker></defs><path d="M 304 130 L 344 130" fill="none" className="conn-default" stroke-width="1.7" marker-end="url(#arrow-onramp)" opacity="0.92" /><path d="M 520 130 L 560 130" fill="none" className="conn-default" stroke-width="1.7" marker-end="url(#arrow-onramp)" opacity="0.92" /><path d="M 736 130 L 776 130" fill="none" className="conn-default" stroke-width="1.7" marker-end="url(#arrow-onramp)" opacity="0.92" /><foreignObject x="128" y="96" width="176" height="68"><div className="card ext"><span className="bn">1</span><span className="ct"><span className="tag">External bank</span><span className="lab">Fiat (ACH or wire)</span></span></div></foreignObject><foreignObject x="344" y="96" width="176" height="68"><div className="card api"><span className="bn">2</span><span className="ct"><span className="tag">Virtual account</span><span className="lab">Routing + account number</span></span></div></foreignObject><foreignObject x="560" y="96" width="176" height="68"><div className="card action"><span className="bn">3</span><span className="ct"><span className="tag rain">Rain</span><span className="lab">Converts to stablecoin</span></span></div></foreignObject><foreignObject x="776" y="96" width="176" height="68"><div className="card ext"><span className="bn">4</span><span className="ct"><span className="tag">Wallet / contract</span><span className="lab">Stablecoin</span></span></div></foreignObject></svg>
  </div>
</div>

<Steps>
  <Step title="Sends fiat">
    Funds arrive via ACH or wire from an external bank account into the virtual account.
  </Step>

  <Step title="Credits the virtual account">
    The virtual account was created when the payment route was set up.
  </Step>

  <Step title="Converts to stablecoin">
    Rain converts the fiat to stablecoin.
  </Step>

  <Step title="Destination">
    The converted stablecoin is delivered to whichever destination the payment route specifies: an external wallet or a Rain collateral contract.
  </Step>
</Steps>

## Offramp

Offramp moves crypto into fiat. A sender funds the deposit address a payment
route created, and Rain converts the funds to fiat and delivers them to the
external bank account.

<div className="wf-diagram">
  <div className="diagram-shell borderless">
    <svg id="offramp-flow" role="img" aria-label="Offramp: stablecoin sent from a wallet or contract credits the deposit address, Rain converts it to fiat, and it is delivered to the external bank account." viewBox="0 0 1080 200" width="1080" height="200" style={{width: "100%", height: "auto"}}><defs><marker id="arrow-offramp" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" className="marker-fill-default" /></marker></defs><path d="M 304 130 L 344 130" fill="none" className="conn-default" stroke-width="1.7" marker-end="url(#arrow-offramp)" opacity="0.92" /><path d="M 520 130 L 560 130" fill="none" className="conn-default" stroke-width="1.7" marker-end="url(#arrow-offramp)" opacity="0.92" /><path d="M 736 130 L 776 130" fill="none" className="conn-default" stroke-width="1.7" marker-end="url(#arrow-offramp)" opacity="0.92" /><foreignObject x="128" y="96" width="176" height="68"><div className="card ext"><span className="bn">1</span><span className="ct"><span className="tag">Wallet / contract</span><span className="lab">Stablecoin</span></span></div></foreignObject><foreignObject x="344" y="96" width="176" height="68"><div className="card api"><span className="bn">2</span><span className="ct"><span className="tag">Deposit address</span><span className="lab">Address for this route</span></span></div></foreignObject><foreignObject x="560" y="96" width="176" height="68"><div className="card action"><span className="bn">3</span><span className="ct"><span className="tag rain">Rain</span><span className="lab">Converts to fiat</span></span></div></foreignObject><foreignObject x="776" y="96" width="176" height="68"><div className="card ext"><span className="bn">4</span><span className="ct"><span className="tag">External bank</span><span className="lab">Fiat (ACH or wire)</span></span></div></foreignObject></svg>
  </div>
</div>

<Steps>
  <Step title="Source">
    Stablecoin is sent from either an external wallet or a Rain collateral contract.
  </Step>

  <Step title="Credits the deposit address">
    The deposit address was created when the payment route was set up.
  </Step>

  <Step title="Converts to fiat">
    Rain converts the stablecoin to fiat.
  </Step>

  <Step title="Receives fiat">
    The converted fiat is delivered via ACH or wire to the external bank account.
  </Step>
</Steps>

## Two ways to move money

Rain supports two distinct flows: a quoteless flow built on payment routes,
and a quoted flow built on quotes and transfers. Which one you use depends
on whether you need a standing pathway or a one-time payment:

* **Payment routes:** Register a payment account, then create a
  payment route. Rain returns a virtual account (onramp) or a deposit address
  (offramp) that a sender can fund repeatedly. Rain determines the exchange
  rate at conversion time. There's no rate locked in advance.
* **Quotes and transfers:** Register a payment account, request a
  quote, then create a transfer against that quote. Each quote locks an
  exchange rate and fees for a short window before it expires. This is a
  one-time operation, built for cross-border payouts to fiat currencies like
  COP, MXN, and BRL. Preview rates before requesting a quote with
  [exchange rates](/docs/exchange-rates).

The following table compares the two flows side by side:

|               | Payment routes                                          | Quotes and transfers                               |
| ------------- | ------------------------------------------------------- | -------------------------------------------------- |
| Setup         | Payment account + payment route                         | Payment account + quote                            |
| Reusable      | Yes, funds the same route repeatedly                    | No, one quote per transfer                         |
| Exchange rate | Determined at conversion time                           | Locked by the quote until it expires               |
| Destinations  | US fiat (ACH, wire), MXN (SPEI), or any supported chain | COP, MXN, BRL (via international payment accounts) |

<Info>
  Payment accounts are shared by both flows. Payment routes are not part of the
  quotes-and-transfers flow, and quotes are not part of the payment-route flow.
</Info>

## What's next

<Card title="Register a payment account" href="/docs/payment-accounts">
  Register the funding source both flows use.
</Card>

<Card title="Create a payment route" href="/docs/payment-routes">
  Set up a persistent onramp or offramp pathway.
</Card>

<Card title="Set up onramps" href="/docs/onramps">
  See the full onramp implementation: request format, error handling, and settlement times.
</Card>

<Card title="Set up offramps" href="/docs/offramps">
  See the full offramp implementation: request format, error handling, and settlement times.
</Card>

<Card title="Preview exchange rates" href="/docs/exchange-rates">
  See rates and estimated destination amounts before creating a quote.
</Card>

<Card title="Send international payouts" href="/docs/transfers">
  Make one-time, quote-based payouts to international fiat currencies.
</Card>
