Plug-and-play UPI · 0% MDR

Rent collection over UPI,
without the gateway tax.

A complete UPI-only payment engine you can lift into any project. Razorpay-style checkout, instant QR, webhook verification, UTR reconciliation and a hosted payment page — in one small, typed package.

  • One component drop-in
  • Webhook + polling
  • Zero-config sandbox
  • PhonePe or direct VPA

Try it now — the sandbox QR settles automatically in a few seconds. No credentials, no database.

Live checkoutSANDBOX

₹1,499.00

Monthly rent · Flat B-402

Amount

256-bit encrypted · No card details ever collected

Built to reuse

Everything a UPI checkout needs, nothing it doesn't

The core is framework-agnostic. The Next.js layer is a thin reference adapter you can copy into the next project.

Verified, not assumed

Server-side amount checks, idempotent webhooks, replay protection and a manual UTR path for direct-to-VPA credits. A “success” redirect never marks an order paid.

Provider adapters

Swap between mock, direct VPA (0% MDR) and PhonePe Standard Checkout with one environment variable. Add a new PSP by implementing a small interface.

Operable by default

Every order is an auditable event stream: created, webhook received, UTR claimed, verified, expired. The admin view lets ops settle a payment in seconds.

Integration

Three lines to a working checkout

  1. 1

    Create an order on the server

    Amounts are integer paise. The engine builds the UPI intent, stores the order and returns a reference.

  2. 2

    Render the drop-in checkout

    Pass a reference or use the button component. QR, countdown, UPI app deep link, UTR claim and success state are included.

  3. 3

    Listen for settlement

    Webhooks mark orders paid. Polling is the fallback. A paid order is terminal, idempotent and safe to retry.

app/api/pay/route.ts + checkout.tsx
// server — create an order (paise or rupees)
import { createOrder } from '@/server/upi';

const { order } = await createOrder({
  amountInRupees: 1499,
  note: 'June rent · Flat B-402',
  metadata: { tenantId: 't_204' },
});

// client — the whole checkout in one line
import { UpiCheckoutButton } from '@/components/upi-checkout';

<UpiCheckoutButton amountInRupees={1499} note="June rent" />