Bank Transfer Timing

Says when an Indian bank transfer will actually arrive on IMPS, NEFT, RTGS or UPI, and catches amounts the chosen rail will refuse.

StopsTransfer refused or credited a day late

Installation

pnpm dlx shadcn@latest add https://bollard-ui.vercel.app/r/bank-transfer-timing.json

The files land in your project. They're yours to edit.

Usage

bank-transfer-timing-usage.tsx
import { BankTransferTiming, type Rail } from "@/components/ui/bank-transfer-timing"

<BankTransferTiming
  amount={amount}
  rail={rail}
  onRailChange={setRail}
  payee="Meera Iyer"
  now={NOW}
  newPayee={{ addedAt: new Date("2026-10-14T13:20:00+05:30"), coolingMinutes: 30, firstDayLimit: 500000 }}
  onContinue={() => new Promise((resolve) => setTimeout(resolve, 600))}
/>

What it catches

  • RTGS below the ₹2 lakh minimum and IMPS above ₹5 lakh per transaction
  • UPI amounts above the per-transaction or 24-hour cap for the category
  • Your bank's own daily limit, and a new payee's cooling period or first-day cap
  • Late arrival: the next NEFT batch, the last batch landing at 00:00, branch hours and holidays
  • Offers the rail that would work, and spells the amount in lakh and crore

Props

BankTransferTiming props
PropTypeDefault
amount* (required)

Amount in rupees.

number—
rail

Controlled rail.

Rail—
defaultRail

Initial rail when uncontrolled. Defaults to IMPS.

Rail"IMPS"
onRailChange

Called when the user picks another rail.

(rail: Rail) => void—
rails

Rails your app offers, in display order.

Rail[]RAILS
payee

Payee's name, shown in the readback.

string—
now

"Now", for tests and server-rendered previews. Otherwise the clock is read after mount and every 30 s.

Date—
upiCategory

UPI merchant category, which sets the UPI cap. Defaults to P2P.

UpiCategory"p2p"
upiLimits

Override the built-in UPI caps.

TransferInput["upiLimits"]—
bankLimits

Your bank's per-day limit for each rail, if lower than the network's.

TransferInput["bankLimits"]—
newPayee

Your bank's cooling period and first-day cap for a newly added payee.

NewPayeeRule—
holidays

Bank holidays (YYYY-MM-DD, India time). Sundays and 2nd/4th Saturdays are built in.

string[]—
channel

`branch` NEFT and RTGS only leave in branch hours on working days.

"online" | "branch""online"
branchHours

Branch opening hours, for transfers made at a branch.

TransferInput["branchHours"]—
onContinue

Continue to authorisation. Not reachable while a limit would make the bank refuse. May return a Promise.

(transfer: { amount: number; rail: Rail }) => void | Promise<void>—
locale

BCP 47 locale for dates and numbers. Defaults to en-IN.

string"en-IN"
messages

Any visible string.

Partial<Omit<BankTransferMessages, "rails" | "issues" | "categories">> & { rails?: Partial<BankTransferMessages["rails"]> issues?: Partia…—

* required. Also accepts the native props of <div> (className, aria-*, data-*…), passed through to it.

Accessibility

  • Rails are a role="radiogroup" of role="radio" buttons with roving tabIndex and arrow-key navigation
  • The continue button uses aria-disabled rather than disabled while blocked
  • Status is announced in a role="status" region
  • Issues use text and icons, not colour alone

Only what the source does. Test with your own screen reader and content before shipping.

Limitations

This is a UX guard rail. Enforce on the server: The bank or payment provider enforces the real limits; validate the amount, rail and payee on the server and use idempotency for the transfer.

  • Rail limits are built in as of the verification date; banks may set lower caps, and NPCI/RBI can change them
  • Bank limits, new-payee rules and holidays come only from the props you pass
  • Arrival times are the regulator's expected timelines, not a guarantee for a specific transfer

Rules

Rules last verified:

Informational; check the official source. NEFT (half-hourly batches, credit within 2 hours), RTGS (₹2 lakh minimum, credit within 30 minutes) and IMPS (₹5 lakh) were checked against RBI/NPCI pages. The UPI category caps were not re-checked: the NPCI circular is a scanned PDF with no readable text. Copied components don't update themselves, so re-check after rule changes (see updating a component).

What it stops

Transfer refused or credited a day late

Also known as

neft · rtgs · imps · upi · bank transfer · fund transfer · payee · cooling period

Dependencies

Pairs well with