Skip to main content
This page explains the concepts. To turn it on step by step, follow the virtual-accounts setup guide.

Beyond Card Payments

Not every customer pays by card. Recurso supports offline payment methods — bank transfers, cash, and cheques — through two complementary features:
  • Virtual Accounts — Unique bank accounts generated per customer or invoice via Razorpay, enabling automatic reconciliation of incoming bank transfers
  • Offline Payments — Manual recording of payments received outside your payment gateway (cash, cheques, NEFT/RTGS transfers)

Virtual Accounts

A virtual account is a unique bank account number assigned to a specific customer or invoice. When the customer transfers funds to that account, Razorpay notifies Recurso, and the payment is automatically matched and reconciled.

Create a Virtual Account

Virtual Account Parameters

Virtual Account Object

List Virtual Accounts

Virtual Account Lifecycle

When a virtual account receives the full expected amount, Recurso automatically marks the linked invoice as paid and fires a virtual_account.paid webhook event.

Reconciliation Flow

1

Create virtual account

Generate a virtual account for the customer or invoice. Share the account number, IFSC code, and beneficiary name with the customer.
2

Customer initiates transfer

The customer sends funds via NEFT, RTGS, IMPS, or UPI to the virtual account number.
3

Razorpay notifies Recurso

When the transfer settles, Razorpay sends a callback. Recurso updates amount_received on the virtual account.
4

Automatic matching

If amount_received >= amount_expected, Recurso marks the virtual account as paid, updates the linked invoice, and fires webhook events.

Offline Payments

For payments received outside your payment gateway — cash at a counter, a mailed cheque, or a bank transfer you identified manually — use the offline payments API to record them in Recurso.

Record an Offline Payment

Offline Payment Parameters

Payment Types

Use bank_transfer for NEFT, RTGS, IMPS, and wire transfers identified manually. Always include the reference_number (UTR number) for audit trails.
Use cash for in-person payments. Include the recorded_by field to track which team member accepted the payment. Consider requiring a notes field describing the receipt issued.
Use cheque for cheque payments. Set the reference_number to the cheque number. Record the payment only after the cheque has cleared to avoid bounced-cheque scenarios.

List Offline Payments

Webhook Events

When recording offline payments linked to an invoice, Recurso automatically updates the invoice status. Do not manually update the invoice status separately, as this may cause inconsistencies.

Invoice Linking

When you provide an invoice_id to either a virtual account or an offline payment, Recurso handles the downstream effects automatically:
  1. The invoice amount_due is reduced by the payment amount
  2. If the invoice is fully paid, its status transitions to paid
  3. The subscription associated with the invoice (if any) is updated accordingly
  4. An invoice.paid webhook event is fired
For partial payments, you can record multiple offline payments against the same invoice. Recurso tracks the running total and only marks the invoice as paid when the full amount is covered.

Best Practices

Always Include References

Use reference_number for every offline payment to maintain a clear audit trail linking your records to bank statements.

Record Who Entered It

Populate recorded_by so you can trace which team member recorded each payment during audits.

Wait for Cheque Clearance

Only record cheque payments after they clear. Recording a bounced cheque as paid creates reconciliation headaches.

Use VAs for Recurring Transfers

For customers who always pay by bank transfer, create a long-lived virtual account tied to the customer rather than individual invoices.

Monitor VA Expiry

Virtual accounts can expire if unused. Set up alerts on the virtual_account.closed webhook to follow up with customers.

Reconcile Daily

Review unmatched virtual account payments and pending offline entries daily to keep your ledger accurate.