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
Bank Transfer
Bank Transfer
Use
bank_transfer for NEFT, RTGS, IMPS, and wire transfers identified manually. Always include the reference_number (UTR number) for audit trails.Cash
Cash
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.Cheque
Cheque
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
Invoice Linking
When you provide aninvoice_id to either a virtual account or an offline payment, Recurso handles the downstream effects automatically:
- The invoice
amount_dueis reduced by the payment amount - If the invoice is fully paid, its status transitions to
paid - The subscription associated with the invoice (if any) is updated accordingly
- An
invoice.paidwebhook event is fired
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.