6 min read

Most businesses have adopted recurring based business models. There are multiple benefits for businesses that switch to a recurring business model, including steady cash flow, better inventory management, and reduced acquisition and retention costs.

Industry estimates suggest that recurring payments’ current market opportunity is between INR 20-25 billion (Source). There has been a 3X growth in recurring payments recently, and it is growing at a rate of 40% year on year.

Zwitch APIs provide virtual accounts for businesses to collect recurring payments like EMI for short loans, student fees, DTH/Electricity bills, and distributor payments and automatically reconcile them. 

This blog will show you how to create and use virtual accounts for recurring payments using Zwitch APIs.

Using Virtual Accounts for payment collections

If you were to collect recurring payments from your customers, what would you do? 

You might share your current account number with the customer, ask them to add your account details as beneficiary and then initiate bank transfer from their account to your account. In this case, you’ll have to rely on your bank account statement to reconcile the transactions at the end of every month. 

When you have a small set of customers, this process won’t take much time. But, imagine if you are doing the same way when you’ve lakhs and crores of customers. It would take a significant amount of effort and time for your accounts team to reconcile transactions against the customer payments. Most of the time, bank account statements don’t provide remitter information, making the reconciliation process more complicated.

Well, you don’t have to fuss over these things anymore. We have a solution for you – Virtual Accounts. With Zwitch, you can do seamless recurring payments collection and also embed reconciliation seamlessly into your workflow.

Streamline your payment collections with Virtual Accounts APIs

Using Zwitch Virtual Accounts APIs, you can create and use Virtual Accounts to collect payments. There are various instances where you can use our APIs for collecting payments such as:

  • SaaS subscriptions, 
  • EMIs from customers,
  • Loan instalments, 
  • Student fees,
  • DTH/Water/ Electricity bills, 
  • Distributor payments by retailers,
  • Mutual funds & insurance premium,
  • NGO donations and many more.

When you create virtual accounts as a collection_tool for your customers using Virtual Account APIs, they can then load money to their virtual account through NEFT/RTGS/IMPS/UPI. Zwitch then sends a webhook with the payment and remitter information to your configured webhook URL, notifying you about the incoming payment. You can automatically transfer the amount collected in different individual virtual accounts of customers to your or any merchant’s primary virtual account. This can also be then transferred to any bank account using the Transfers API.

Virtual Accounts for collections | Zwitch

Let’s understand in detail the Virtual Accounts APIs for creating virtual accounts as a collection tool. 

You need to pass the following mandatory parameters in request to our APIs:

  • Customer Name as name
  • Customer Email-id as email
  • Customer Mobile Number as mobile_number

Now, there are two more parameters, which will remain constant if you are creating a Virtual Account as a collection tool:

  • type with value as virtual
  • used_as with value as collection_tool

Now, if you want, you can create a Virtual Payment Address (VPA) for the virtual account in addition to the Virtual Account Number and IFSC code generated by the APIs. However, it is recommended that you should create one, to ensure a better consumer experience. 

If you chose to create VPA/UPI ID for your customer then, you need to add the following additional parameters in the request headers of our APIs:

  • state_code with value as KA for Karnataka, KL for Kerala, DL for Delhi, etc.
  • city
  • pan
  • postal_code
  • business_type with value as an individual for Individual, public-or-private-limited for Public/Private Limited
  • business_category with value as agri_business for Agri-Business, banking_or_financial_services for Banking / Financial Services, etc.

You can find the complete details for state_code, business_type and business_category here.

Here is a sample request header for creating a virtual account as a collection_tool with VPA/UPI ID:

curl --request POST \
     --url https://api.zwitch.io/v1/accounts \
     --header 'Accept: application/json' \
     --header 'Authorization: Bearer <access_key>:<secret_key>' \
     --header 'Content-Type: application/json' \
     --data '
{
     "type": "virtual",
     "kyc": {
          "state_code": "KA",
          "city": "Bengaluru",
          "pan": "ABCDE1234F",
          "postal_code": 560068,
          "business_type": "individual",
          "business_category": "agri_business"
     },
     "name": "John Doe",
     "email": "john.doe@email.com",
     "mobile_number": "9675196666",
     "used_as": "collection_tool",
     "create_vpa": true
}
'

Note: All Zwitch API calls require an Authorization header to be passed in the format ACCESS_KEY: SECRET_KEY. Make sure to replace <access_key> and <secret_key> with the actual access and secret key you will find in your Zwitch Sandbox Dashboard.

On successful completion of your request for creating a virtual account as a collection_tool with VPA/UPI ID, you will receive the following response from our APIs:

{
"id":"va_fBFs3yDUtDTTOhltAB2Z39axN"
"object":"account"
"type":"virtual"
"name":"John Doe"
"mobile_number":"9675196666"
"account_number":"36363651417845576"
"ifsc_code":"YESB0CMSNOC"
"used_as":"collection_tool"
"email":"john.doe@email.com"
"kyc":{
"state_code":"KA"
"city":"Bengaluru"
"postal_code":560068
"pan":"ABCDE1234F"
"business_type":"individual"
"business_category":"agri_business"
}
"bank_name":"yes_bank"
"vpa":"zwch182691254@yesbank"
"status":"active"
"is_sandbox":false
}

You can now parse information from the above response as per your need and display the virtual account number, IFSC code, and VPA handles to your customer to make payments. The money collected in the customer’s virtual account will automatically be transferred to your primary virtual account.

An alternate approach for you could be after creating a virtual account for your customers you can ask your customer to enter their UPI or VPA handle associated with any Payment Service Provider (PSP) app such as Google Pay, PhonePe, BHIM, etc. Once the customer gets a UPI collect request on their UPI app, they can make payment which gets collected in their virtual account and then transferred to the merchant’s virtual account seamlessly.

curl --request POST \
     --url https://api.zwitch.io/v1/accounts/va_fBFs3yDUtDTTOhltAB2Z39axN/payments/upi/collect \
     --header 'Accept: application/json' \
     --header 'Authorization: Bearer <access_key>:<secret_key>' \
     --header 'Content-Type: application/json' \
     --data '
{
     "remitter_vpa_handle": "9675196666@upi",
     "amount": 1,
     "expiry_in_minutes": 10,
     "remark": "John Doe Transfer"
}
'

Note: You would need to pass the Virtual Account ID created earlier in the endpoint URL, VPA handle of your customer, expiry time of the request in minutes and remarks. Also, ensure you have updated access and secret keys in the above API call.
For easy auto-reconciliation, you can retrieve details of all incoming payments under your primary virtual account by passing your/customer’s Virtual Account id in the endpoint URL: https://api.zwitch.io/v1/accounts/id/payments

{
"object":"list"
"has_more":false
"data":[
{
"id":"tx_I13NjJnH8fdRelDdjux3ZYrBo"
"object":"payment"
"amount":1
"transacted_at":1628675007
"created_at":1628674981
"currency":"inr"
"bank_reference_number":"122315752283"
"status":"success"
"remitter_bank_account_number":"XXXXXX0660"
"remitter_bank_ifsc_code":"IBKL0002173"
"remitter_full_name":"JOHN DOE"
"remitter_note":"John"
"remitter_vpa_handle":"9675196666@upi"
"paid_mode":"upi"
"paid_to":"zwch182691254@yesbank"
"is_sandbox":false
"transaction_reference_id":"8d3ee23322404d1ebc96dd050d0cf57e"
}
{
"id":"tx_NSsNdk9HguyqerXvBev1BM6Au"
"object":"payment"
"amount":1000
"transacted_at":1628674905
"created_at":1628674850
"currency":"inr"
"bank_reference_number":"122315748847"
"status":"failed"
"remitter_bank_account_number":"NA"
"remitter_bank_ifsc_code":"NA"
"remitter_full_name":"null"
"remitter_note":"John"
"remitter_vpa_handle":"9675196666@upi"
"paid_mode":"upi"
"paid_to":"zwch182691254@yesbank"
"is_sandbox":false
"transaction_reference_id":"3820d2c1bfce429cb194261a002de241"
}
]
}

Once the amount is collected in your primary virtual account, you can transfer the amount to your current bank account or savings account or even split the amount and make automated vendor payouts. 

Companies have realised the importance of channelising collections and payments through a single account. On the collections side, customers use the Virtual Account number, which appears on the company’s remittance information. It brings a high degree of transparency and enhances the automatic reconciliation rates. And on the payments side, the virtual account number is used to indicate to suppliers the entity on whose behalf the payment is made. Read more on Virtual Accounts as a collection tool and UPI Collect APIs here.

What’s your Reaction?
+1
2
+1
1
+1
0
+1
0

Siddhant Agarwal

A design thinker at heart. Currently working as Developer Relations Lead @ Zwitch.io living in Bangalore, India. An avid public speaker and love helping startups scale in User Experience (UX).

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *