> ## Documentation Index
> Fetch the complete documentation index at: https://docs.polygon.technology/llms.txt
> Use this file to discover all available pages before exploring further.

# Stablecoin rewards and loyalty

> Drop USDC rewards, cashback, and loyalty balances directly into user wallets on Polygon. Programmable stablecoin rewards with no card networks, no breakage, and no expiry.

A platform wants to reward users with something they can actually spend. Instead of points that expire or card-network cashback that takes a billing cycle to post, OMS drops USDC straight into each user's wallet. Recipients hold a real balance they can spend, hold, or withdraw. No breakage, no float, no expiry.

A reward drop is a `cryptoToCrypto` transfer: USDC moves from your treasury wallet to each recipient's wallet on Polygon, settling in seconds. Because the asset matches on both sides, there is no exchange-rate spread, and the quote returns the exact fees before you commit.

**Who this is for:**

* Consumer apps and loyalty programs issuing rewards as spendable balances
* Fintech card issuers and debit programs paying stablecoin cashback
* Gaming and promotion platforms running incentive drops
* Creator platforms distributing bonuses or tips to many recipients at once

***

## How it works

<div style={{border:"1px solid #C8CFE1",borderRadius:"12px",overflow:"hidden",marginBottom:"24px"}}>
  <div style={{background:"linear-gradient(180deg,#EAE4F5 0%,#F6F3FB 100%)",borderBottom:"1px solid #D5C4F2",padding:"10px 16px",fontSize:"11px",fontWeight:"700",color:"#670DE5",letterSpacing:"0.06em",textTransform:"uppercase"}}>Reward drop flow</div>

  <div style={{borderBottom:"1px solid #EEF0F9",padding:"9px 16px",display:"flex",alignItems:"center",gap:"10px"}}>
    <span style={{color:"#929EBA",fontSize:"11px",fontWeight:"700",minWidth:"16px",textAlign:"right"}}>1</span>
    <span style={{background:"#EEF0F9",color:"#48526F",padding:"2px 8px",borderRadius:"4px",fontSize:"11px",fontWeight:"600",whiteSpace:"nowrap"}}>App</span>
    <span style={{color:"#670DE5",fontWeight:"700"}}>→</span>
    <span style={{background:"#EAE4F5",color:"#670DE5",padding:"2px 8px",borderRadius:"4px",fontSize:"11px",fontWeight:"700",whiteSpace:"nowrap"}}>OMS</span>
    <span style={{fontFamily:"'Geist Mono',ui-monospace,monospace",fontSize:"12px",color:"#141635"}}>POST /quotes (treasury wallet → recipient wallet, USDC → USDC)</span>
  </div>

  <div style={{borderBottom:"1px solid #EEF0F9",padding:"9px 16px",display:"flex",alignItems:"center",gap:"10px"}}>
    <span style={{color:"#929EBA",fontSize:"11px",fontWeight:"700",minWidth:"16px",textAlign:"right"}}>2</span>
    <span style={{background:"#EAE4F5",color:"#670DE5",padding:"2px 8px",borderRadius:"4px",fontSize:"11px",fontWeight:"700",whiteSpace:"nowrap"}}>OMS</span>
    <span style={{color:"#670DE5",fontWeight:"700"}}>→</span>
    <span style={{background:"#EEF0F9",color:"#48526F",padding:"2px 8px",borderRadius:"4px",fontSize:"11px",fontWeight:"600",whiteSpace:"nowrap"}}>App</span>
    <span style={{fontSize:"13px",color:"#141635"}}>Rate locked, full fee breakdown returned</span>
  </div>

  <div style={{borderBottom:"1px solid #EEF0F9",padding:"9px 16px",display:"flex",alignItems:"center",gap:"10px"}}>
    <span style={{color:"#929EBA",fontSize:"11px",fontWeight:"700",minWidth:"16px",textAlign:"right"}}>3</span>
    <span style={{background:"#EEF0F9",color:"#48526F",padding:"2px 8px",borderRadius:"4px",fontSize:"11px",fontWeight:"600",whiteSpace:"nowrap"}}>App</span>
    <span style={{color:"#670DE5",fontWeight:"700"}}>→</span>
    <span style={{background:"#EAE4F5",color:"#670DE5",padding:"2px 8px",borderRadius:"4px",fontSize:"11px",fontWeight:"700",whiteSpace:"nowrap"}}>OMS</span>
    <span style={{fontFamily:"'Geist Mono',ui-monospace,monospace",fontSize:"12px",color:"#141635"}}>POST /transactions (execute the drop)</span>
  </div>

  <div style={{borderBottom:"1px solid #EEF0F9",padding:"9px 16px",display:"flex",alignItems:"center",gap:"10px"}}>
    <span style={{color:"#929EBA",fontSize:"11px",fontWeight:"700",minWidth:"16px",textAlign:"right"}}>4</span>
    <span style={{background:"#EAE4F5",color:"#670DE5",padding:"2px 8px",borderRadius:"4px",fontSize:"11px",fontWeight:"700",whiteSpace:"nowrap"}}>OMS</span>
    <span style={{fontSize:"13px",color:"#141635",marginLeft:"4px"}}>Pulls USDC from treasury, settles to recipient wallet on Polygon</span>
  </div>

  <div style={{padding:"9px 16px",display:"flex",alignItems:"center",gap:"10px"}}>
    <span style={{color:"#929EBA",fontSize:"11px",fontWeight:"700",minWidth:"16px",textAlign:"right"}}>5</span>
    <span style={{background:"#EAE4F5",color:"#670DE5",padding:"2px 8px",borderRadius:"4px",fontSize:"11px",fontWeight:"700",whiteSpace:"nowrap"}}>OMS</span>
    <span style={{color:"#670DE5",fontWeight:"700"}}>→</span>
    <span style={{background:"#EEF0F9",color:"#48526F",padding:"2px 8px",borderRadius:"4px",fontSize:"11px",fontWeight:"600",whiteSpace:"nowrap"}}>App</span>
    <span style={{fontFamily:"'Geist Mono',ui-monospace,monospace",fontSize:"12px",color:"#141635"}}>Webhook: transaction.cryptoToCrypto.completed</span>
  </div>
</div>

Each drop is a single quote-and-execute pair. For a campaign, create the quotes in parallel and execute each as it confirms. Idempotency keys on every transaction make a reward run safe to retry without paying anyone twice. The destination can be a recipient's OMS wallet or any external on-chain address.

***

## OMS resources

| Resource                     | Role                                                     |
| ---------------------------- | -------------------------------------------------------- |
| Treasury wallet              | Central USDC wallet the rewards are funded from          |
| Customer (per recipient)     | Identity record that owns each recipient wallet          |
| Recipient wallet             | Destination USDC wallet, or an external on-chain address |
| Quote                        | Locked fee breakdown for one drop                        |
| `cryptoToCrypto` transaction | Executes one reward drop                                 |

***

## Beyond reward drops

**Cashback** is a reward drop on a trigger. Fire a drop for each qualifying purchase or event, and the recipient's balance updates as they spend. The flow is identical: quote, then execute a `cryptoToCrypto` transfer.

**Streaming pay** and **tokenized loyalty points** go beyond the Payments API. Per-second streaming uses onchain payment channels, and programmable points are token contracts you deploy and redeem across merchants. Both run on [Polygon Chain](/pos/get-started/building-on-polygon) rather than through OMS quotes and transactions.

<Note>
  Reward drops run on the same quote-and-execute flow available today. Bulk drop tooling for large campaigns is on the roadmap alongside [bulk payouts](/payments/use-cases/payroll-disbursements).
</Note>

***

## Build it

<CardGroup cols={2}>
  <Card title="Send from a wallet" icon="paper-plane" href="/payments/guides/crypto-to-fiat">
    Quote and execute a USDC transfer between wallets.
  </Card>

  <Card title="Customer onboarding" icon="user-check" href="/payments/guides/customer-onboarding">
    Create the customer and wallet each recipient needs.
  </Card>

  <Card title="Transactions" icon="bolt" href="/payments/transactions">
    The quote-then-execute reference for cryptoToCrypto.
  </Card>

  <Card title="Wallets" icon="wallet" href="/payments/wallets">
    Provision and fund the treasury and recipient wallets.
  </Card>
</CardGroup>
