Stablecoin payment rails built on Base, with intent-based cross-chain deposits and a social P2P layer (request, send, memo). Daimo Pay is the developer product — a prebuilt React deposit UI plus a REST API for accepting USDC/stablecoins from any chain, any token, any wallet in one click.
- 01stablecoin checkout / deposits
- 02cross-chain pay-in (any token, any chain) settled to Base
- 03social P2P payments with memos
- 04Hyperliquid / venue deposit flows
- 05World Mini App and farcaster Frame payments
- pnpm add @daimo/pay @daimo/pay-common viem wagmi
- pnpm add @daimo/contract # optional onchain helpers
| Variable | Scope | Description |
|---|---|---|
| NEXT_PUBLIC_DAIMO_PAY_APP_ID | Client | Daimo Pay app id (public) issued in the Daimo dashboard. Used to scope sessions to your project. |
| DAIMO_PAY_API_KEY | Server | Server-only API key for creating payment sessions and verifying webhooks against the Daimo REST API. |
| DAIMO_PAY_WEBHOOK_SECRET | Server | Shared secret used to verify Daimo Pay webhook signatures on incoming payment events. |
Use Daimo Pay for stablecoin deposits/checkout on Base. Server-side, create a payment session: `POST https://pay.daimo.com/api/payments` with `Authorization: Bearer ${DAIMO_PAY_API_KEY}` and `{ destination: { chainId: 8453, token: USDC, address, amount }, externalId }` — store the returned session id and `payUrl`. On the client, render `<DaimoPayButton appId={NEXT_PUBLIC_DAIMO_PAY_APP_ID} payId={sessionId} onPaymentCompleted={...} />` from `@daimo/pay`, or redirect to `payUrl` for hosted checkout. Verify completion via the webhook (HMAC with `DAIMO_PAY_WEBHOOK_SECRET`) and your `externalId` rather than trusting `onPaymentCompleted` alone.
- ⚑Daimo settles to Base by default — accepting payment from other chains uses an intent/bridge under the hood, so the on-receipt asset and chain may differ from what the payer sent. Always reconcile by `externalId` + webhook, not by tx hash.
- ⚑Onchain vs offchain content: payment metadata (memos, externalId, status) is hosted in Daimo's API, not on Base — losing your API key or app id means losing the lookup index even though the underlying transfers are onchain.
- ⚑Message delivery semantics: webhooks are at-least-once and can arrive before or after `onPaymentCompleted` fires; treat your handler as idempotent and gate fulfilment on the webhook with HMAC verification.
- ⚑EVM-only — Solana, Bitcoin, and other non-EVM chains as payment sources are routed through bridges; expect higher latency and per-route minimums versus a native Base USDC pay.
- ⚑The legacy Daimo cash app (`daimo-eth/daimo`) is archived — for current product work use Daimo Pay (`@daimo/pay`), not the old `daimo-mobile` packages.
- ⚑Content moderation surface: payment memos are user-supplied strings displayed in Daimo's social UI — sanitise/escape them in any frontend that surfaces them, or you risk XSS / abusive content.