{"id":328,"date":"2021-08-17T13:29:50","date_gmt":"2021-08-17T13:29:50","guid":{"rendered":"https:\/\/zwitch.io\/blog\/?p=328"},"modified":"2025-05-27T02:47:55","modified_gmt":"2025-05-27T08:17:55","slug":"collect-and-reconcile-payments-using-virtual-accounts","status":"publish","type":"post","link":"https:\/\/www.zwitch.io\/blog\/collect-and-reconcile-payments-using-virtual-accounts\/","title":{"rendered":"Virtual Accounts for collection &#038; reconciliation of payments"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">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.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Industry estimates suggest that recurring payments\u2019 current market opportunity is between INR 20-25 billion (<a href=\"https:\/\/www.financialexpress.com\/industry\/banking-finance\/razorpay-mastercard-launch-soln-for-recurring-payments-aims-to-integrate-with-over-50-banks\/2285155\/\" target=\"_blank\" rel=\"noopener\">Source<\/a>). There has been a 3X growth in recurring payments recently, and it is growing at a rate of 40% year on year.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This blog will show you how to create and use virtual accounts for recurring payments using Zwitch APIs.<\/p>\n\n\n\n<h2 id=\"using-virtual-accounts-for-payment-collections\" class=\"wp-block-heading\"><strong>Using Virtual Accounts for payment collections<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you were to collect recurring payments from your customers, what would you do?&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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\u2019ll have to rely on your bank account statement to reconcile the transactions at the end of every month.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When you have a small set of customers, this process won\u2019t take much time. But, imagine if you are doing the same way when you\u2019ve 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&#8217;t provide remitter information, making the reconciliation process more complicated.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Well, you don\u2019t have to fuss over these things anymore. We have a solution for you &#8211; Virtual Accounts. With Zwitch, you can do seamless recurring payments collection and also <a href=\"https:\/\/zwitch.io\/blog\/collect-and-auto-reconcile-your-payments-using-collect-apis-from-zwitch\/\" target=\"_blank\" rel=\"noopener\">embed reconciliation seamlessly<\/a> into your workflow.<\/p>\n\n\n\n<h2 id=\"streamline-your-payment-collections-with-virtual-accounts-apis\" class=\"wp-block-heading\"><strong>Streamline your payment collections with Virtual Accounts APIs<\/strong><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Using <a href=\"https:\/\/zwitch.io\/blog\/virtual-accounts-apis-and-how-to-get-started-with-it\/\" target=\"_blank\" rel=\"noopener\">Zwitch Virtual Accounts APIs<\/a>, 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:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SaaS subscriptions,\u00a0<\/li>\n\n\n\n<li>EMIs from customers,<\/li>\n\n\n\n<li>Loan instalments,\u00a0<\/li>\n\n\n\n<li>Student fees,<\/li>\n\n\n\n<li>DTH\/Water\/ Electricity bills,\u00a0<\/li>\n\n\n\n<li>Distributor payments by retailers,<\/li>\n\n\n\n<li>Mutual funds &amp; insurance premium,<\/li>\n\n\n\n<li>NGO donations and many more.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">When you create virtual accounts as a <strong><code>collection_tool<\/code><\/strong> 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\u2019s primary virtual account. This can also be then transferred to any bank account using the <a href=\"https:\/\/zwitch.io\/blog\/automate-payouts-for-our-business-needs-using-zwitch-apis\/\" target=\"_blank\" rel=\"noopener\"><strong>Transfers API<\/strong><\/a>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/zwitch.io\/blog\/wp-content\/uploads\/2021\/07\/Blog-post_8_4-1-1024x427.jpg\" alt=\"Virtual Accounts for collections | Zwitch\" class=\"wp-image-285\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Let\u2019s understand in detail the Virtual Accounts APIs for creating virtual accounts as a collection tool.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You need to pass the following mandatory parameters in request to our APIs:<\/p>\n\n\n\n<ul class=\"wp-block-list has-normal-font-size\">\n<li>Customer Name as <strong><code>name<\/code><\/strong><\/li>\n\n\n\n<li>Customer Email-id as <strong><span class=\"has-inline-color has-accent-color\"><code>email<\/code><\/span><\/strong><\/li>\n\n\n\n<li>Customer Mobile Number as <strong><span class=\"has-inline-color has-accent-color\"><code>mobile_number<\/code><\/span><\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Now, there are two more parameters, which will remain constant if you are creating a Virtual Account as a collection tool:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>type<\/code><\/strong> with value as <strong><code>virtual<\/code><\/strong><\/li>\n\n\n\n<li><strong><code>used_as<\/code><\/strong><em> <\/em>with value as <strong><code>collection_tool<\/code><\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">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.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>state_code<\/code><\/strong> with value as <strong><code>KA<\/code><\/strong> for Karnataka, <strong><code>KL<\/code><\/strong> for Kerala, <strong>DL<\/strong> for Delhi, etc.<\/li>\n\n\n\n<li><strong><code>city<\/code><\/strong><\/li>\n\n\n\n<li><strong><code>pan<\/code><\/strong><\/li>\n\n\n\n<li><strong><code>postal_code<\/code><\/strong><\/li>\n\n\n\n<li><strong><code>business_type<\/code><\/strong> with value as an <strong><code>individual<\/code><\/strong> for Individual, <strong><code>public-or-private-limited<\/code><\/strong> for Public\/Private Limited<\/li>\n\n\n\n<li><strong><code>business_category<\/code><\/strong> with value as <strong><code>agri_business<\/code><\/strong> for Agri-Business, <strong><code>banking_or_financial_services<\/code><\/strong> for Banking \/ Financial Services, etc.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">You can find the complete details for <strong><code>state_code<\/code><\/strong>, <strong><code>business_type<\/code><\/strong> and <strong><code>business_category<\/code><\/strong> <a href=\"https:\/\/docs.zwitch.io\/reference#kyc\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here is a sample request header for creating a virtual account as a collection_tool with VPA\/UPI ID:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl --request POST \\\n     --url https:\/\/api.zwitch.io\/v1\/accounts \\\n     --header 'Accept: application\/json' \\\n     --header 'Authorization: Bearer <span class=\"highlight\">&lt;access_key&gt;:&lt;secret_key&gt;<\/span>' \\\n     --header 'Content-Type: application\/json' \\\n     --data '\n{\n     \"type\": \"virtual\",\n     \"kyc\": {\n          \"state_code\": \"KA\",\n          \"city\": \"Bengaluru\",\n          \"pan\": \"ABCDE1234F\",\n          \"postal_code\": 560068,\n          \"business_type\": \"individual\",\n          \"business_category\": \"agri_business\"\n     },\n     \"name\": \"John Doe\",\n     \"email\": \"john.doe@email.com\",\n     \"mobile_number\": \"9675196666\",\n     \"used_as\": \"collection_tool\",\n     \"create_vpa\": true\n}\n'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note: <\/strong>All Zwitch API calls require an Authorization header to be passed in the format ACCESS_KEY: SECRET_KEY. Make sure to replace <span class=\"highlight\">&lt;access_key&gt;<\/span> and <span class=\"highlight\">&lt;secret_key&gt;<\/span> with the actual access and secret key you will find in your <a href=\"https:\/\/dashboard.zwitch.io\/\" target=\"_blank\" rel=\"noopener\">Zwitch Sandbox Dashboard<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n\"id\":\"<span class=\"highlight\">va_fBFs3yDUtDTTOhltAB2Z39axN<\/span>\"\n\"object\":\"account\"\n\"type\":\"virtual\"\n\"name\":\"John Doe\"\n\"mobile_number\":\"9675196666\"\n\"account_number\":\"36363651417845576\"\n\"ifsc_code\":\"YESB0CMSNOC\"\n\"used_as\":\"collection_tool\"\n\"email\":\"john.doe@email.com\"\n\"kyc\":{\n\"state_code\":\"KA\"\n\"city\":\"Bengaluru\"\n\"postal_code\":560068\n\"pan\":\"ABCDE1234F\"\n\"business_type\":\"individual\"\n\"business_category\":\"agri_business\"\n}\n\"bank_name\":\"yes_bank\"\n\"vpa\":\"zwch182691254@yesbank\"\n\"status\":\"active\"\n\"is_sandbox\":false\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">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\u2019s virtual account will automatically be transferred to your primary virtual account.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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\u2019s virtual account seamlessly.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>curl --request POST \\\n     --url https:\/\/api.zwitch.io\/v1\/accounts\/<span class=\"highlight\">va_fBFs3yDUtDTTOhltAB2Z39axN<\/span>\/payments\/upi\/collect \\\n     --header 'Accept: application\/json' \\\n     --header 'Authorization: Bearer <span class=\"highlight\">&lt;access_key&gt;:&lt;secret_key&gt;<\/span>' \\\n     --header 'Content-Type: application\/json' \\\n     --data '\n{\n     \"remitter_vpa_handle\": \"<span class=\"highlight\">9675196666@upi<\/span>\",\n     \"amount\": <span class=\"highlight\">1<\/span>,\n     \"expiry_in_minutes\": <span class=\"highlight\">10<\/span>,\n     \"remark\": \"<span class=\"highlight\">John Doe Transfer<\/span>\"\n}\n'<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Note:<\/strong> 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.<br>For easy auto-reconciliation, you can retrieve details of all incoming payments under your primary virtual account by passing your\/customer\u2019s Virtual Account id in the endpoint URL: <strong>https:\/\/api.zwitch.io\/v1\/accounts\/<span class=\"highlight\">id<\/span>\/payments<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n\"object\":\"list\"\n\"has_more\":false\n\"data\":&#91;\n{\n\"id\":\"tx_I13NjJnH8fdRelDdjux3ZYrBo\"\n\"object\":\"payment\"\n\"amount\":1\n\"transacted_at\":1628675007\n\"created_at\":1628674981\n\"currency\":\"inr\"\n\"bank_reference_number\":\"122315752283\"\n\"status\":\"success\"\n\"remitter_bank_account_number\":\"XXXXXX0660\"\n\"remitter_bank_ifsc_code\":\"IBKL0002173\"\n\"remitter_full_name\":\"JOHN DOE\"\n\"remitter_note\":\"John\"\n\"remitter_vpa_handle\":\"9675196666@upi\"\n\"paid_mode\":\"upi\"\n\"paid_to\":\"zwch182691254@yesbank\"\n\"is_sandbox\":false\n\"transaction_reference_id\":\"8d3ee23322404d1ebc96dd050d0cf57e\"\n}\n{\n\"id\":\"tx_NSsNdk9HguyqerXvBev1BM6Au\"\n\"object\":\"payment\"\n\"amount\":1000\n\"transacted_at\":1628674905\n\"created_at\":1628674850\n\"currency\":\"inr\"\n\"bank_reference_number\":\"122315748847\"\n\"status\":\"failed\"\n\"remitter_bank_account_number\":\"NA\"\n\"remitter_bank_ifsc_code\":\"NA\"\n\"remitter_full_name\":\"null\"\n\"remitter_note\":\"John\"\n\"remitter_vpa_handle\":\"9675196666@upi\"\n\"paid_mode\":\"upi\"\n\"paid_to\":\"<meta charset=\"utf-8\">zwch182691254@yesbank\"\n\"is_sandbox\":false\n\"transaction_reference_id\":\"3820d2c1bfce429cb194261a002de241\"\n}\n]\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">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.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">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\u2019s 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 <a href=\"https:\/\/developers.zwitch.io\/reference#create-account-1\" target=\"_blank\" rel=\"noopener\">here<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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&hellip;<\/p>\n","protected":false},"author":4,"featured_media":335,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[11],"tags":[12,48,49],"powerkit_post_featured":[],"class_list":["post-328","post","type-post","status-publish","format-standard","has-post-thumbnail","category-technology","tag-api-banking","tag-upi-collect","tag-virtual-account-api"],"_links":{"self":[{"href":"https:\/\/www.zwitch.io\/blog\/wp-json\/wp\/v2\/posts\/328","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zwitch.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.zwitch.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.zwitch.io\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.zwitch.io\/blog\/wp-json\/wp\/v2\/comments?post=328"}],"version-history":[{"count":1,"href":"https:\/\/www.zwitch.io\/blog\/wp-json\/wp\/v2\/posts\/328\/revisions"}],"predecessor-version":[{"id":2106,"href":"https:\/\/www.zwitch.io\/blog\/wp-json\/wp\/v2\/posts\/328\/revisions\/2106"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.zwitch.io\/blog\/wp-json\/wp\/v2\/media\/335"}],"wp:attachment":[{"href":"https:\/\/www.zwitch.io\/blog\/wp-json\/wp\/v2\/media?parent=328"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.zwitch.io\/blog\/wp-json\/wp\/v2\/categories?post=328"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zwitch.io\/blog\/wp-json\/wp\/v2\/tags?post=328"},{"taxonomy":"powerkit_post_featured","embeddable":true,"href":"https:\/\/www.zwitch.io\/blog\/wp-json\/wp\/v2\/powerkit_post_featured?post=328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}