{"id":28378,"date":"2026-11-13T17:16:28","date_gmt":"2026-11-13T11:46:28","guid":{"rendered":"https:\/\/razorpay.com\/blog\/?p=28378"},"modified":"2026-11-13T17:16:28","modified_gmt":"2026-11-13T11:46:28","slug":"hyperlocal-delivery-payments-india","status":"publish","type":"post","link":"https:\/\/razorpay.com\/blog\/hyperlocal-delivery-payments-india\/","title":{"rendered":"Hyperlocal Delivery Payments in India: Mobile Checkout, QR on Delivery and Reconciliation"},"content":{"rendered":"<p>Hyperlocal delivery payments are the collection and tracking of customer payments for orders fulfilled by nearby stores or delivery teams. A rider sees a successful-payment screenshot, hands over the parcel, and the order screen still says unpaid. Days later, finance finds a payment with no shipment reference.<\/p>\n<p>An app checkout, a doorstep collection and a bank statement can each be correct while your order ledger stays incomplete. The gap usually appears when you add delivery agents, offer pay-at-doorstep or introduce new payment methods. So how do you let customers pay quickly while proving which order was collected and what will reach your bank?<\/p>\n<p>This guide explains mobile checkout, order-linked QR collection and reconciliation through one illustrative delivery workflow.<\/p>\n<div style=\"border-left: 4px solid #007BFF; background: #f0f8ff; padding: 25px; margin: 30px 0; font-family: Arial, sans-serif; text-align: left;\">\n<h2 style=\"margin-top: 0; color: #007bff; font-size: 22px;\">Key Takeaways<\/h2>\n<ul style=\"margin: 15px 0; padding-left: 20px; color: #333; line-height: 1.6;\">\n<li>Choose the collection flow around when payment is due: before dispatch, before arrival or at the doorstep.<\/li>\n<li>Razorpay supports mobile checkout and supported wallets. Check the methods enabled for your account and verify the required payment state before fulfilment.<\/li>\n<li>For doorstep UPI collection, generate a fixed-amount, single-use QR and map its identifier to your shipment.<\/li>\n<li>Cash COD selected at checkout does not itself process a digital payment or create a bank settlement.<\/li>\n<li>Confirm payments from trusted backend status and authenticated events. A screenshot or delivered parcel does not prove payment.<\/li>\n<li>Reconcile the order, QR or payment identifiers, refunds and settlement records. Your delivery software owns rider, hub and shipment mapping.<\/li>\n<\/ul>\n<\/div>\n<h2>One Delivery, Three Collection Choices: Mobile Checkout, QR or Payment Link?<\/h2>\n<p>A hyperlocal business can collect payment in its mobile checkout before fulfilment, share a Payment Link before the rider arrives, or display an order-linked UPI QR at the doorstep. The right choice depends on when payment becomes due and how your backend matches the collection to the delivery order.<\/p>\n<h3>Pay Before Dispatch in the Customer App<\/h3>\n<p>Your customer app checkout is a collection surface, not an order system. Tie every payment success back to your own order record. An SDK is not a dispatch platform or a merchant ledger.<\/p>\n<h3>Send a Payment Link Before Arrival<\/h3>\n<p><a href=\"https:\/\/razorpay.com\/payment-links\/\">Razorpay Payment Links<\/a> give you a hosted collection path while the rider is en route. Check the existing payment status before offering another collection attempt.<\/p>\n<h3>Display a QR When Payment Is Due at the Doorstep<\/h3>\n<p>A printed reusable shop QR is different from a transaction-specific QR whose identifier your system maps to one order. This guide&#8217;s worked example uses the second type.<\/p>\n<div class=\"aeo-table-scroll\" style=\"overflow-x: auto; max-width: 100%; margin: 20px 0;\">\n<table style=\"width: 100%; border-collapse: collapse;\">\n<thead>\n<tr>\n<th scope=\"col\">Collection moment<\/th>\n<th scope=\"col\">Customer action<\/th>\n<th scope=\"col\">Merchant record to preserve<\/th>\n<th scope=\"col\">Integration responsibility<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>In-app checkout, before dispatch<\/td>\n<td>Pays inside your app<\/td>\n<td>Order ID, verified payment state<\/td>\n<td>SDK integration plus backend verification<\/td>\n<\/tr>\n<tr>\n<td>Payment Link, before arrival<\/td>\n<td>Opens a hosted link<\/td>\n<td>Link reference against the open collection<\/td>\n<td>Link creation, status checks, duplicate control<\/td>\n<\/tr>\n<tr>\n<td>Order-linked QR, at the doorstep<\/td>\n<td>Scans with a UPI app<\/td>\n<td>QR identifier mapped to shipment and attempt<\/td>\n<td>QR creation, storage, event verification<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h2>How Razorpay Supports Mobile Checkout and Wallet Payments for Hyperlocal Delivery<\/h2>\n<p>Our Android Standard Checkout supports UPI, cards, netbanking and wallets for mobile payment collection, with <a href=\"https:\/\/razorpay.com\/docs\/payments\/payment-gateway\/android-integration\/standard\/integration-steps?preferred-country=IN\">documented checkout options covering card, netbanking, wallet, UPI and EMI<\/a>. A delivery business can integrate checkout with its customer app and verify payment against its order backend. Wallet availability varies by provider and account approval, so confirm the methods enabled for your live checkout.<\/p>\n<p>You can use Razorpay for the customer-payment stage, then connect verified payment results to your own order system. Use the supported mobile integration for your platform, show the payment methods enabled for your account, and keep the order unpaid until your backend verifies the required payment state. For doorstep collections, add a separate QR or Payment Link flow tied to that order. The <a href=\"https:\/\/razorpay.com\/payment-gateway\/\">Payment Gateway<\/a> product pages cover the commercial side of that decision.<\/p>\n<h3>UPI App Payments and Wallet Payments Are Different Methods<\/h3>\n<p>A UPI app used to authorise a bank-account payment does not make that payment a stored-value wallet payment. Treat the selected payment method and its funding source separately. App-switching behaviour and genuinely embedded flows also differ, so confirm the current integration behaviour rather than assuming the customer never leaves your app.<\/p>\n<h3>Accepting an Existing Wallet Is Different From Running Your Own Wallet<\/h3>\n<p>Accepting a supported wallet through checkout is different from maintaining a customer balance, top-ups, cashback or store credit inside your delivery app. Define that balance&#8217;s permitted use and ownership separately. Payment-method acceptance alone does not establish that Razorpay supplies your app&#8217;s complete stored-value wallet system.<\/p>\n<p><strong>DID YOU KNOW:<\/strong> The <a href=\"https:\/\/razorpay.com\/docs\/payments\/payment-methods\/wallets?preferred-country=IN\">India wallet documentation<\/a> lets you view the wallets enabled for your account, and <a href=\"https:\/\/razorpay.com\/docs\/payments\/payment-methods\">some payment methods are available by default while others require approval<\/a>.<\/p>\n<h2>How to Collect Digital Payments With QR on Delivery Using Razorpay<\/h2>\n<p>Razorpay QR Codes can support doorstep UPI collection once enabled for your account. Your server creates a QR, retains its identifier against the shipment and passes the image to the rider app. The backend verifies payment before updating the order. The QR API supplies payment functionality; your delivery application supplies shipment and rider orchestration. See the <a href=\"https:\/\/razorpay.com\/qr-code\/\">QR Codes<\/a> product overview for the commercial view.<\/p>\n<h3>Create a Fixed-Amount, Single-Use QR for the Delivery Attempt<\/h3>\n<p>For an order due at delivery, your backend can create a Razorpay UPI QR with <code>usage<\/code> set to <code>single_use<\/code>, <code>fixed_amount<\/code> set to <code>true<\/code> and the required <code>payment_amount<\/code>. Save the returned QR identifier against the shipment before displaying its image to the rider. This mapping lets your system identify the delivery when a payment arrives; it is an integration you implement, not an order-matching guarantee from the QR image alone. The <a href=\"https:\/\/razorpay.com\/docs\/api\/qr-codes\/create?preferred-country=IN\">create a QR Code reference<\/a> also warns that <code>fixed_amount<\/code> must be true for a single-use code to generate successfully.<\/p>\n<div class=\"aeo-table-scroll\" style=\"overflow-x: auto; max-width: 100%; margin: 20px 0;\">\n<table style=\"width: 100%; border-collapse: collapse;\">\n<thead>\n<tr>\n<th scope=\"col\">Field<\/th>\n<th scope=\"col\">Owner<\/th>\n<th scope=\"col\">Purpose<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>merchant_order_id<\/code><\/td>\n<td>Your backend<\/td>\n<td>Business order context<\/td>\n<\/tr>\n<tr>\n<td><code>shipment_id<\/code><\/td>\n<td>Your backend<\/td>\n<td>Physical delivery record<\/td>\n<\/tr>\n<tr>\n<td><code>collection_attempt_id<\/code><\/td>\n<td>Your backend<\/td>\n<td>One attempt at collecting the amount due<\/td>\n<\/tr>\n<tr>\n<td>QR response <code>id<\/code>, stored as your <code>qr_id<\/code><\/td>\n<td>Razorpay API response; your stored alias<\/td>\n<td>Payment surface you map to the collection attempt<\/td>\n<\/tr>\n<tr>\n<td>Amount due<\/td>\n<td>Your backend; <code>payment_amount<\/code> uses minor units<\/td>\n<td>For an illustrative Rs 650 collection, send 65000 paise<\/td>\n<\/tr>\n<tr>\n<td>Currency<\/td>\n<td>Your business ledger, INR for this example<\/td>\n<td>Currency context is not another value in <code>payment_amount<\/code><\/td>\n<\/tr>\n<tr>\n<td>Expiry<\/td>\n<td>Returned <code>close_by<\/code> value<\/td>\n<td>Attempt validity window<\/td>\n<\/tr>\n<tr>\n<td>Assigned rider<\/td>\n<td>Your backend<\/td>\n<td>Attribution and escalation<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Your order, shipment, attempt and rider identifiers are your own fields. They are not native create-QR request parameters, and the QR API does not accept a Razorpay <code>order_id<\/code> parameter.<\/p>\n<h3>Account for Activation and QR Expiry<\/h3>\n<p>The <a href=\"https:\/\/razorpay.com\/docs\/payments\/qr-codes?preferred-country=IN\">QR Codes overview<\/a> requires a request through your point of contact or the Dashboard to enable QR Codes. The current <a href=\"https:\/\/razorpay.com\/docs\/api\/qr-codes\/create?preferred-country=IN\">create-QR reference<\/a> gives a single-use expiry window of two minutes to two hours. Use the returned <code>close_by<\/code> value, generate the QR close to collection, and regenerate it after expiry. Do not use this configuration as an all-day shipping-label QR.<\/p>\n<p><strong>PRO-TIP:<\/strong> Preserve the order reference when you replace an expired QR, but create a new collection-attempt record. Check the previous attempt&#8217;s payment status first.<\/p>\n<h3>Keep Cash COD and Digital QR Collection Separate<\/h3>\n<p>Razorpay&#8217;s standard <a href=\"https:\/\/razorpay.com\/docs\/payments\/payment-gateway\/web-integration\/standard\/cod?preferred-country=IN\">cash-on-delivery checkout<\/a> records a COD order, while you or your logistics partner collect the cash. That cash order does not process a Razorpay payment or generate a Razorpay settlement. To collect digitally at the doorstep, use the enabled QR product or a suitable Payment Link integration and update your order from the verified digital payment result.<\/p>\n<h2>How to Reconcile Delivery Payments Against Orders, Riders and Settlements<\/h2>\n<p>Reconcile delivery payments by linking the merchant order and shipment to each collection attempt, then linking that attempt to the QR or link identifier and the verified payment. Track delivery status, refunds and bank settlement separately. <a href=\"https:\/\/razorpay.com\/docs\/payments\/qr-codes\/view-reports?preferred-country=IN\">QR reports<\/a> support payment review, while your backend supplies the business-specific rider, hub and shipment joins.<\/p>\n<h3>Use a Payment Ledger Instead of a Rider Screenshot<\/h3>\n<p>Keep one business-order record and a separate record for every payment attempt. Match the trusted payment result to the QR or link identifier, verify the expected amount, and update the paid state only once. A rider&#8217;s screenshot can help investigate a problem, but it does not replace backend payment verification or settlement reconciliation.<\/p>\n<p>The <a href=\"https:\/\/razorpay.com\/docs\/webhooks\/qr-codes?preferred-country=IN\">QR webhook events<\/a> include <code>qr_code.created<\/code>, <code>qr_code.credited<\/code> and <code>qr_code.closed<\/code>. Verify the current event contract and payment details before updating the order. Validate the raw request body signature and identify repeated events using the <a href=\"https:\/\/razorpay.com\/docs\/webhooks\/validate-test?preferred-country=IN\">webhook validation guidance<\/a>. A scan alone does not prove payment.<\/p>\n<h3>Worked Example: A Rs 650 Grocery Delivery<\/h3>\n<p>This is an illustrative hypothetical, not a customer story or performance result.<\/p>\n<div class=\"aeo-table-scroll\" style=\"overflow-x: auto; max-width: 100%; margin: 20px 0;\">\n<table style=\"width: 100%; border-collapse: collapse;\">\n<thead>\n<tr>\n<th scope=\"col\">Record<\/th>\n<th scope=\"col\">Illustrative value<\/th>\n<th scope=\"col\">What it proves<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Merchant order \/ shipment<\/td>\n<td>HL-1042 \/ SH-1042<\/td>\n<td>Business context, merchant-owned identifiers<\/td>\n<\/tr>\n<tr>\n<td>Collection attempt 1<\/td>\n<td>ATT-01, QR expired before arrival<\/td>\n<td>Attempt history is preserved, not overwritten<\/td>\n<\/tr>\n<tr>\n<td>Collection attempt 2<\/td>\n<td>ATT-02<\/td>\n<td>Second attempt at collecting Rs 650<\/td>\n<\/tr>\n<tr>\n<td>QR reference<\/td>\n<td>Illustrative returned QR ID<\/td>\n<td>Payment surface mapped to ATT-02 in your database<\/td>\n<\/tr>\n<tr>\n<td>Payment reference<\/td>\n<td>Illustrative returned payment ID<\/td>\n<td>Verified payment record for that attempt<\/td>\n<\/tr>\n<tr>\n<td>Collection status<\/td>\n<td>Paid after backend verification<\/td>\n<td>The Rs 650 collection is confirmed<\/td>\n<\/tr>\n<tr>\n<td>Delivery status<\/td>\n<td>Awaiting handover, then delivered<\/td>\n<td>Fulfilment recorded independently<\/td>\n<\/tr>\n<tr>\n<td>Settlement reference<\/td>\n<td>Pending, later matched<\/td>\n<td>Payment confirmation has not proved bank credit<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>Read the join in words: order to shipment, shipment to collection attempt, attempt to QR and payment reference, then on to refund and settlement records where they apply. You create the first relationships. Do not assume every identifier appears automatically in a report.<\/p>\n<p><strong>DID YOU KNOW:<\/strong> A delivery can be completed while a bank settlement is still pending. Your collection, delivery and settlement columns answer different questions.<\/p>\n<h2>Payment Confirmation, Bank Settlement and Rider Payouts: What Happens When?<\/h2>\n<p>Payment confirmation establishes whether the customer paid. Settlement concerns when captured funds reach your bank account. Rider or vendor disbursements are another workflow. Our <a href=\"https:\/\/razorpay.com\/docs\/payments\/settlements?preferred-country=IN\">settlement documentation<\/a> describes a standard domestic cycle of T+2 working days, subject to bank approval, business vertical and risk factors.<\/p>\n<p>A successful doorstep payment does not mean the money has reached your bank account or the rider has been paid. Reconcile the customer payment first, then check your approved settlement schedule. If your business needs faster access or vendor disbursements, confirm the relevant product, eligibility, fees and configuration with Razorpay rather than treating those services as automatic consequences of QR collection.<\/p>\n<h3>Match the Product to the Money Movement<\/h3>\n<p>Customer collection, marketplace splitting and business payouts have separate requirements. If you collect for independent sellers or need rider disbursements, confirm the approved funds flow, account setup and relevant product separately. A customer QR payment does not automatically fund or complete a payout.<\/p>\n<h2>What Should Happen When a Delivery Payment Is Pending, Repeated or Refunded?<\/h2>\n<p>When a delivery payment is uncertain, keep the collection pending while your backend checks its status. Separate a repeated notification from a genuinely additional payment. Only start another collection after checking earlier attempts, and reconcile any approved refund to the original payment.<\/p>\n<h3>Customer Says Paid, Rider Still Sees Pending<\/h3>\n<p>Preserve the attempt. Show an honest pending screen instead of a guess. Query the payment status from your backend, then follow your documented escalation path. Never instruct a rider to collect cash immediately after an uncertain digital result, and never treat an offline rider screen as evidence that an offline payment succeeded.<\/p>\n<p>For example, a customer may have authorised a payment while the rider app still shows a network error. Keep the shipment and attempt references visible to support, check the provider payment record, and record the decision before offering another payment method. For the mobile checkout flow, <a href=\"https:\/\/razorpay.com\/docs\/payments\/payment-gateway\/android-integration\/standard\/integration-steps?preferred-country=IN\">Razorpay advises fulfilment only after capture<\/a>; an authorised but uncaptured payment is not sufficient. For each collection product, technical review should define the successful payment state your backend must verify before handover.<\/p>\n<h3>A Webhook Is Delayed, Repeated or Arrives Out of Order<\/h3>\n<p>Use authenticated events and reconcile status from the backend. The webhook guide documents signature verification and <a href=\"https:\/\/razorpay.com\/docs\/webhooks\/validate-test?preferred-country=IN\">duplicate-event identification using the <code>x-razorpay-event-id<\/code> header<\/a>. In plain language, the same event must never credit the order twice. A repeated event is not the same thing as two successful customer payments, and your ledger must tell them apart.<\/p>\n<p>Suppose ATT-02 has one successful payment and the same event reaches your endpoint twice. Store the event-processing result so a repeat does not create another credit or another handover instruction. If two different successful payment IDs exist, retain both records and investigate overcollection instead of discarding one as a duplicate event. A delayed notification should trigger reconciliation of the attempt, not a guess that the customer needs to pay again.<\/p>\n<h3>A QR Expires or the Rider Makes Another Attempt<\/h3>\n<p>Use the returned expiry value, check the earlier attempt&#8217;s status, then create a new attempt. The QR webhook reference states that the closed webhook fires on manual closure and is not triggered when a QR auto-expires, so build a timer or polling sweep rather than relying on that event alone.<\/p>\n<h3>The Order Is Cancelled, Partially Delivered or Returned<\/h3>\n<p>Recalculate the amount due under your policy before any new collection. A prepaid cancelled order may need an approved refund, and <a href=\"https:\/\/razorpay.com\/docs\/payments\/refunds?preferred-country=IN\">refund timing<\/a> is separate from the delivery decision. An unpaid cash COD order has no digital payment to refund. Partial delivery, partial payment and partial refund are three different states. An RTO does not automatically trigger a refund.<\/p>\n<p>Consider an illustrative Rs 650 order with Rs 150 of goods unavailable. If nothing has been paid, confirm the revised Rs 500 amount in the order system and resolve the earlier collection attempt before requesting payment. If Rs 650 has already been successfully paid, preserve that payment and route any Rs 150 adjustment through the applicable refund policy. Do not edit the historical payment to make it look like Rs 500 was collected. Keep the refund request, provider reference and eventual status linked to the original payment; approval of a refund does not prove that the customer has received it.<\/p>\n<div class=\"aeo-table-scroll\" style=\"overflow-x: auto; max-width: 100%; margin: 20px 0;\">\n<table style=\"width: 100%; border-collapse: collapse;\">\n<thead>\n<tr>\n<th scope=\"col\">Exception<\/th>\n<th scope=\"col\">Status to retain<\/th>\n<th scope=\"col\">Verification required<\/th>\n<th scope=\"col\">Merchant action<\/th>\n<th scope=\"col\">Ledger outcome<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Payment pending<\/td>\n<td>Attempt open<\/td>\n<td>Backend status fetch<\/td>\n<td>Hold handover, inform customer<\/td>\n<td>Unpaid until verified<\/td>\n<\/tr>\n<tr>\n<td>Duplicate event<\/td>\n<td>Existing paid state<\/td>\n<td>Event ID comparison<\/td>\n<td>Ignore repeat<\/td>\n<td>No second credit<\/td>\n<\/tr>\n<tr>\n<td>Extra successful payment<\/td>\n<td>Both payments visible<\/td>\n<td>Amount and attempt check<\/td>\n<td>Investigate, consider refund<\/td>\n<td>Overcollection queue<\/td>\n<\/tr>\n<tr>\n<td>QR expired<\/td>\n<td>Attempt expired; payment reconciliation pending if uncertain<\/td>\n<td>Returned expiry and provider payment status<\/td>\n<td>Check the earlier attempt before creating another<\/td>\n<td>Attempt history preserved; no duplicate collection<\/td>\n<\/tr>\n<tr>\n<td>Cancelled after payment<\/td>\n<td>Paid, delivery cancelled<\/td>\n<td>Payment and policy check<\/td>\n<td>Approve refund if due<\/td>\n<td>Refund linked to payment<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><strong>PRO-TIP:<\/strong> Review unmatched payments, amount mismatches and extra successful payments as separate exception queues. One &#8220;payment failed&#8221; bucket hides the action finance needs to take.<\/p>\n<h2>How to Implement a Hyperlocal Delivery Payment Workflow<\/h2>\n<p>These are design instructions, not a claimed tested integration. Keep credentials and production calls out of documentation.<\/p>\n<ol>\n<li><strong>Map the funds flow.<\/strong> State who sells, who collects, when payment is due and who receives the bank settlement. Identify whether you are a single merchant or a multi-seller platform, because the second case needs a separate review.<\/li>\n<li><strong>Confirm account and method availability.<\/strong> Check live account activation, QR enablement and any wallet approvals. Record the settlement schedule that applies to your account.<\/li>\n<li><strong>Create the business ledger.<\/strong> Define order, shipment and collection-attempt identifiers, amount due, payment state and assigned rider. Allow one order to hold many attempts.<\/li>\n<li><strong>Integrate the customer checkout.<\/strong> Follow the current platform-specific SDK instructions, verify every payment server-side, and run test-mode checks. Keep secret material on the server only.<\/li>\n<li><strong>Add doorstep collection.<\/strong> Create and store an enabled QR or Payment Link for the outstanding amount. Display the amount due and the current attempt status in the rider app.<\/li>\n<li><strong>Verify and update once.<\/strong> Authenticate events, check the payment state and the amount, and protect against duplicate processing before marking the order paid.<\/li>\n<li><strong>Reconcile finance separately.<\/strong> Match collections, approved refunds and actual settlements. Add rider and hub filters through your own delivery system records.<\/li>\n<li><strong>Test the exceptions before launch.<\/strong> Walk through success, pending, delayed notification, expired QR, a second attempt, a duplicate event, cancellation and refund reconciliation.<\/li>\n<\/ol>\n<p>Before launch, keep one approved workflow diagram, an order ledger and an exception-test record. Technical review must confirm the actual event payloads and payment-state rules.<\/p>\n<p>For each test, record the starting order and attempt state, expected amount, observed payment result, event-processing result, delivery decision and final ledger state. Include an interrupted customer app, delayed rider connectivity, repeated events, QR expiry, two successful payment attempts, partial delivery and cancellation after payment. The test passes only when the customer, rider and finance views agree on what happened. A successful checkout screen alone does not establish that the full delivery workflow is ready.<\/p>\n<h2>What Costs and Commercial Conditions Should a Delivery Business Check?<\/h2>\n<p>Evaluate the price of your specific payment workflow, not only a headline rate. Confirm collection charges, separate product charges, applicable taxes, settlement options and third-party delivery-software costs. Ask which payment methods and products are approved for your account.<\/p>\n<h3>Ask for a Workflow-Specific Quote<\/h3>\n<p>Bring a checklist: collection methods, average order value, expected volume, QR or link usage, any marketplace splitting, payout requirements, refund handling, settlement terms and OMS, TMS or delivery-app integration fees. Ask for a written quote for the actual product combination, with applicable taxes and optional services identified separately. These are evaluation questions, not claims that every charge applies.<\/p>\n<h3>Compare Confirmation, Settlement and Refund Timing Separately<\/h3>\n<p>Do not equate an instant payment notification with instant settlement or an instant customer refund. Verify exact current terms for your proposed product combination before relying on any published figure.<\/p>\n<h2>How Razorpay Fits a Hyperlocal Delivery Payment Architecture<\/h2>\n<h3>Match Each Product to One Merchant Task<\/h3>\n<div class=\"aeo-table-scroll\" style=\"overflow-x: auto; max-width: 100%; margin: 20px 0;\">\n<table style=\"width: 100%; border-collapse: collapse;\">\n<thead>\n<tr>\n<th scope=\"col\">Merchant task<\/th>\n<th scope=\"col\">Relevant Razorpay surface<\/th>\n<th scope=\"col\">Boundary to state<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Customer pays in the mobile checkout<\/td>\n<td>Payment Gateway and supported mobile integration<\/td>\n<td>Integrate and verify against your backend; methods depend on support and approval<\/td>\n<\/tr>\n<tr>\n<td>Customer pays from a hosted link<\/td>\n<td>Payment Links<\/td>\n<td>Track the correct collection attempt and prevent duplicate collection across surfaces<\/td>\n<\/tr>\n<tr>\n<td>Customer pays by UPI at delivery<\/td>\n<td>Enabled QR Codes product and APIs<\/td>\n<td>Your backend maps the QR ID to order and shipment, and respects single-use expiry<\/td>\n<\/tr>\n<tr>\n<td>Finance reviews QR activity<\/td>\n<td>QR reports, payment information and authenticated events<\/td>\n<td>Rider, hub and order joins remain your system&#8217;s responsibility<\/td>\n<\/tr>\n<tr>\n<td>Business needs splitting or disbursements<\/td>\n<td>Scope for a separate approved funds-flow review<\/td>\n<td>These are not bundled into every QR collection<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<h3>What the Merchant Still Builds<\/h3>\n<p>Rider assignment, proof of delivery, inventory updates, TMS or ERP joins, escalation rules and exception queues belong to you or your delivery platform. We supply documented payment functions, not the logistics application. For a broader evaluation of providers and criteria, read our <a href=\"https:\/\/razorpay.com\/blog\/payment-gateway-support-for-logistics-and-delivery-businesses\">payment gateway support guide for logistics and delivery businesses<\/a>. High-value doorstep collections should also be checked against current <a href=\"https:\/\/razorpay.com\/blog\/upi-transaction-limit-per-day\/\">UPI transaction limits<\/a>.<\/p>\n<h2>Which Payment Workflow Fits Your Delivery Operation?<\/h2>\n<p>Pick the workflow that matches when payment becomes due, then verify the conditions before launch.<\/p>\n<div class=\"aeo-table-scroll\" style=\"overflow-x: auto; max-width: 100%; margin: 20px 0;\">\n<table style=\"width: 100%; border-collapse: collapse;\">\n<thead>\n<tr>\n<th scope=\"col\">Your operating model<\/th>\n<th scope=\"col\">Start with<\/th>\n<th scope=\"col\">Verify before launch<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Your own customer app, prepaid orders<\/td>\n<td>Mobile checkout connected to the order backend<\/td>\n<td>Supported methods, verification and capture rules<\/td>\n<\/tr>\n<tr>\n<td>Payment requested before rider arrival<\/td>\n<td>A Payment Link attached to the outstanding collection<\/td>\n<td>Prior payment state, link status, duplicate-collection controls<\/td>\n<\/tr>\n<tr>\n<td>Your own rider app, pay at doorstep<\/td>\n<td>Enabled transaction-specific UPI QR integration<\/td>\n<td>Fixed amount, expiry, trusted confirmation, shipment mapping<\/td>\n<\/tr>\n<tr>\n<td>Existing delivery, OMS or TMS platform<\/td>\n<td>Its verified payment integration<\/td>\n<td>Which product is used, who owns the collection, how records sync<\/td>\n<\/tr>\n<tr>\n<td>Cash COD retained as a fallback<\/td>\n<td>Your cash-handling and reconciliation process<\/td>\n<td>Previous digital attempt status, cash receipt, remittance responsibility<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p><strong>DID YOU KNOW:<\/strong> A generic QR-image generator and a managed payment integration solve different tasks. Automated order reconciliation needs a trustworthy payment record and an explicit join to the business order.<\/p>\n<h2>Frequently Asked Questions<\/h2>\n<h3>Can Razorpay collect QR payments at a customer&#8217;s doorstep?<\/h3>\n<p>Yes. An enabled <a href=\"https:\/\/razorpay.com\/docs\/payments\/qr-codes?preferred-country=IN\">QR Codes integration<\/a> can support doorstep UPI collection. You create the QR through the <a href=\"https:\/\/razorpay.com\/docs\/api\/qr-codes\/create?preferred-country=IN\">create API<\/a>, map its identifier to the shipment and verify the payment in your backend. Rider assignment and delivery-state controls come from your own delivery software.<\/p>\n<h3>Is QR on delivery the same as choosing cash on delivery at checkout?<\/h3>\n<p>No. Standard cash COD records the order while you or your logistics partner collect the cash, and no Razorpay digital settlement is generated for that cash. QR on delivery collects digitally through a separate enabled payment flow. Both paths still need correct entries in your order ledger.<\/p>\n<h3>How do I match a QR payment to an order or delivery agent?<\/h3>\n<p>Store the order, shipment and rider against the collection attempt and the returned QR identifier in your own system. Match trusted payment information to that relationship, verify the amount, and update the order once. Reports support review, but the business-specific joins come from your integration.<\/p>\n<h3>Does wallet integration mean my delivery app gets its own customer wallet?<\/h3>\n<p>No. Accepting supported third-party wallets is different from operating a balance, top-up or cashback ledger inside your app. Confirm wallet acceptance and any required approvals for checkout first, then review a stored-value design separately with product and regulatory input.<\/p>\n<h3>Does a successful doorstep UPI payment settle to my bank instantly?<\/h3>\n<p>No. Payment confirmation and bank settlement are different states. We document a <a href=\"https:\/\/razorpay.com\/docs\/payments\/settlements?preferred-country=IN\">standard domestic settlement cycle of T+2 working days<\/a>, subject to account conditions. Confirm your approved schedule and the terms of any separately enabled faster-settlement option.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to collect hyperlocal delivery payments in India with mobile checkout, order-linked QR codes, verified payment status and practical reconciliation.<\/p>\n","protected":false},"author":180,"featured_media":28385,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[906],"tags":[],"class_list":{"0":"post-28378","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-payment-gateway"},"_links":{"self":[{"href":"https:\/\/razorpay.com\/blog\/wp-json\/wp\/v2\/posts\/28378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/razorpay.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/razorpay.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/razorpay.com\/blog\/wp-json\/wp\/v2\/users\/180"}],"replies":[{"embeddable":true,"href":"https:\/\/razorpay.com\/blog\/wp-json\/wp\/v2\/comments?post=28378"}],"version-history":[{"count":3,"href":"https:\/\/razorpay.com\/blog\/wp-json\/wp\/v2\/posts\/28378\/revisions"}],"predecessor-version":[{"id":28383,"href":"https:\/\/razorpay.com\/blog\/wp-json\/wp\/v2\/posts\/28378\/revisions\/28383"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/razorpay.com\/blog\/wp-json\/wp\/v2\/media\/28385"}],"wp:attachment":[{"href":"https:\/\/razorpay.com\/blog\/wp-json\/wp\/v2\/media?parent=28378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/razorpay.com\/blog\/wp-json\/wp\/v2\/categories?post=28378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/razorpay.com\/blog\/wp-json\/wp\/v2\/tags?post=28378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}