Rozo Intent Pay enables seamless crypto payments for your app. Onboard users from any chain, any coin into your app with one click and maximize your conversion.
Every payment takes a required appId. You do not need to email anyone or wait for approval to get one — appId is a namespace string you choose to group your transactions in the Rozo dashboard.
There are two ways to get going:
Use the shared sandbox appId rozoSandbox to run the SDK end-to-end immediately, no signup required:
"use client";
import { RozoPayButton } from "@rozoai/intent-pay";
<RozoPayButton
appId="rozoSandbox" // public shared sandbox — testing only
toChain={8453} // Base
toAddress="0xRecipient..." // your receiving address
toToken="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" // USDC on Base
toUnits="1" // display amount, in USDC (string, not base units)
intent="Pay"
preferredSymbol={["USDC", "USDT"]}
onPaymentCompleted={(e) => console.log("done", e.paymentId)}
/>
rozoSandboxis a shared, public sandbox namespace meant only for trying the SDK out. Do not use it in production — transactions under it are co-mingled with everyone else's test traffic and the namespace may be cleared at any time. Switch to your ownappId(below) before you ship.
When you're ready for production — your own namespace, webhook events, branded checkout, and API-key auth — self-register through the Rozo merchant portal. It's a 2-minute, fully self-serve flow (email OTP → pick a slug → done). No human approval step:
- Open the Rozo Partners portal and enter your email; you'll get a 6-digit code.
- Choose "Wallet (Dapp developer)" as the account type (developers don't need to provide a settlement wallet — that's only for merchants).
- Pick a slug (e.g.
coffee-studio). The portal derives yourappIdautomatically:wallet_<slug>(ormerchant_<slug>for merchant accounts). - You're dropped into Settings → API Keys, where you issue your first
rz_live_...API key (shown once — copy it). Pass it as theX-API-Keyheader when yourappIduses a portal-issued prefix.
That's the whole loop — no email to support, no domain whitelisting request.
npm install @rozoai/intent-pay @rozoai/intent-common \
@tanstack/react-query wagmi viem \
@creit.tech/stellar-wallets-kit @stellar/stellar-sdk// providers.tsx — wrap your app once (see docs/PROVIDER_SETUP.md for SSR details)
"use client";
import { getDefaultConfig, RozoPayProvider } from "@rozoai/intent-pay";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { useState } from "react";
import { createConfig, WagmiProvider } from "wagmi";
export function Providers({ children }: { children: React.ReactNode }) {
const [config] = useState(() =>
createConfig(getDefaultConfig({
appName: "Your App",
ssr: true,
// Optional: Base builder code attribution (https://docs.base.org/apps/builder-codes)
// dataSuffix: Attribution.toDataSuffix({ codes: [process.env.NEXT_PUBLIC_BASE_BUILDER_CODE] }),
})));
const [qc] = useState(() => new QueryClient());
return (
<WagmiProvider config={config}>
<QueryClientProvider client={qc}>
<RozoPayProvider>{children}</RozoPayProvider>
</QueryClientProvider>
</WagmiProvider>
);
}Then drop a <RozoPayButton appId="rozoSandbox" ... /> (snippet above) anywhere inside the provider and read the result from onPaymentCompleted, or poll with the useRozoPayStatus() hook / getPayment(id) on your backend.
Embedding inside a wallet's in-app browser (Base App, MetaMask, Phantom)?
ssr: truealone does not eliminate the auto-connect flash on first load — you also need cookie-persistedinitialState. See PROVIDER_SETUP.md § Minimizing the Wallet Reconnect Flash (required, not optional, for this use case).
Result truth lives on the backend. Treat
onPaymentCompletedas a UI hint and confirm settlement server-side (webhook orgetPayment) before fulfilling.
Native gas tokens are payment sources, not native destination payouts. Your merchant appId must have that source chain's native asset enabled by Rozo (ETH@8453, BNB@56, POL@137, SOL@900); an unsupported or unavailable route stays hidden. XLM uses a separate backend policy. A native option also needs a nonzero wallet balance and a usable price. The deposit-address picker asks for the same merchant appId independently of wallet options.
preferredTokens is a hard allowlist: if you supply only USDC/USDT, native sources will not show even when available. Omit it to use SDK defaults, or include native source tokens explicitly:
import { baseETH, baseUSDC, solanaSOL } from "@rozoai/intent-common";
<RozoPayButton
appId="your-opted-in-app-id"
toChain={8453}
toToken={baseUSDC.token}
toAddress="0xRecipient..."
toUnits="1"
preferredTokens={[baseUSDC, baseETH, solanaSOL]}
/>baseETH.token is common's zero-address native marker; the SDK matches it against the proxy's EVM 0xEeee… source sentinel. solanaSOL.token is the System Program (11111111111111111111111111111111), not wrapped SOL (So111…12). Token options remain subject to merchant opt-in and backend quote support; showing an option does not guarantee a route can settle. See native-token rollout plan for staging checks.
- 🌱 Cross-chain payments from 1000+ tokens in under 1 minute.
- 💡 Single transaction — no multiple wallet steps.
- ⚡️ Permissionless — we never hold funds.
- 💱 Works with major wallets and exchanges.
- 💨 Integrate in minutes, minimal code required.
EVM Wallets: MetaMask, Coinbase Wallet, Trust Wallet, Rainbow Wallet, Family Wallet, Zerion, OKX, Bitget
Solana Wallets: Phantom, Backpack, Solflare
Stellar Wallets: Albedo, Freighter, Hot Wallet, etc. (Refer to: https://stellarwalletskit.dev/#compatible-wallets)
Mobile Wallets: All above wallets with mobile app support and deep-linking
For a complete list of supported tokens and chains, see the Supported Tokens and Chains documentation.
You can find the full Rozo Pay documentation at docs.rozo.ai.
For in-repo SDK prop reference, see RozoPayButton Props.
For correct provider setup (Next.js App Router, Vite, SSR patterns), see Provider Setup Guide.
For analytics, telemetry opt-out, and what data is tracked, see Analytics & Telemetry.
Check out complete examples and code snippets at Complete Examples, including:
- Framework-specific examples (Next.js, Vite/CRA)
- Use case examples (E-commerce checkout, Donation component, Stellar payout)
- Complete code examples ready to copy-paste
You can also check out the Next.js example app in this repository.
Check out our Demo Page at demo.rozo.ai
You can also try the intent-based bridge built with this SDK at intents.rozo.ai/bridge.
Clone the repository and build the SDK in dev mode:
git clone https://github.com/RozoAI/intent-pay.git
cd intent-pay/packages/connectkit
pnpm i
pnpm run devThe rollup bundler will now watch file changes in the background. Try using one of the examples for testing:
cd examples/nextjs-app
pnpm i
pnpm run devAny changes will be reflected on the Pay button in the example app.
Daimo Pay is noncustodial and runs on open-source, audited contracts. See packages/contract.
Audits:
Contact us if you'd like to integrate Rozo Pay.
See LICENSE for more information.
Rozo Intent Pay SDK is a fork of Daimo developed by Daimo. We're grateful to them for making cross chain payment fast, simple and open-source.
Daimo Pay SDK is a fork of Connectkit developed by Family. We're grateful to them for making Connectkit fast, beatiful and open-source.
Prepare releases on a clean branch containing current origin/master, then merge the generated release commit through a pull request. Script runs lint/tests and updates version; stable releases also add a CHANGELOG.md entry. CI is sole npm publisher after a tag on merged master.
# Validate Git state, npm version, and release plan without changing files.
pnpm run publish:latest -- --dry-run
# Prepare latest release files for a release PR.
pnpm run publish:latest
# Prepare next beta (patch bump plus beta prerelease) for a release PR.
pnpm run publish:beta
# After release PR merges, update local master and tag it. CI publishes with latest or beta tag.
git switch master
git pull --ff-only origin master
git tag v<version>
git push --atomic origin v<version>--dry-run performs only preflight. Script never commits, tags, pushes, or publishes. CI verifies tag matches package version and targets master before publishing; prereleases publish with npm beta tag. intent-common is published separately when its source/API changes; publish it before intent-pay and update intent-pay's dependency pin.