Raksha Bandhan falls on 9 August 2025, and for rakhi-and-gift D2C brands the demand does not spread across the day. It lands in a 6-hour window — roughly 6pm the night before to midnight, when buyers remember the courier cut-off. A Jaipur rakhi-and-sweets seller we work with did 41% of its three-day festival revenue between 7pm and 11pm on the eve. That compression is where oversells, double-charges and stuck COD orders happen. This post is the pre-spike checklist we run: inventory locking, race-condition guards, a COD throttle, and the post-festival reconciliation that catches what slipped.
6 hrs
Window that carries most rakhi-eve orders
~58%
Festive COD return-to-origin rate (Unicommerce)
₹180–350
Lost per COD order that comes back as RTO
5 checks
In the pre-spike kit below
## The Answer in 60 Words
Before the spike: cap each SKU with an atomic stock counter (Redis
DECR or a row-level
SELECT ... FOR UPDATE), not a read-then-write. Hold inventory for 10 minutes at add-to-cart, release on timeout. Throttle COD above a value threshold and on risky pin codes. After the festival, reconcile Razorpay settlements against orders against Tally within 72 hours, before returns muddy the books.
## Why This Matters Now (August 2025)
Festive COD returns ran near 58% during the festive quarter, against under 15% for prepaid, per the
Unicommerce India D2C Report. Each returned COD order costs a brand ₹180–₹350 in forward and reverse logistics, repackaging and locked capital. A rakhi has a hard expiry — it is worthless on 10 August — so an oversell or a failed payment during the spike is not a delayed sale, it is a refund plus an angry review. The fixes below are cheap. The failures are not.
## What You'll Need Before the Spike (Prerequisites)
- A single source of truth for stock — one database table or one Redis key per SKU, never a spreadsheet a human edits during the sale.
- Redis (managed or self-hosted) for atomic counters and short locks. A ₹740/month Hetzner CX22 runs this comfortably for an SMB.
- Razorpay (or your PSP) webhooks wired to a verified endpoint, with signature checking on.
- A COD risk rule: an order-value ceiling and a pin-code blocklist or prepaid-nudge list.
- Tally Prime (or your accounting tool) with the GST-ready sales ledger your accountant already uses.
## How Do You Stop Overselling the Last Rakhi? (The Core Framework)
The bug that kills festive D2C is the read-then-write race. Two buyers see "1 in stock", both pass the check, both orders go through, one rakhi exists. Under normal traffic this is rare. During a 6-hour spike, thousands of requests hit the same SKU row at once and the conflict is not rare — it is guaranteed. The fix is to make the stock deduction itself atomic, so the decision and the write are one indivisible step.
🔢
Atomic Counter
Keep stock in a Redis integer key. Decrement with DECR and check the returned value in one round-trip. If it drops below zero, you oversold — so increment back and reject. No separate read.
🔒
Row Lock
If stock lives in Postgres or MySQL, use SELECT ... FOR UPDATE inside a transaction. The row is locked until you commit, so the second buyer waits for the first to finish.
⏳
Reservation Hold
On add-to-cart, move stock into a "held" bucket for 10 minutes. Release on timeout or payment failure. Stops a full cart from selling out while a buyer hunts for their UPI PIN.
📨
Event Queue
Decouple "order placed" from "payment confirmed" with a queue. The web tier stays fast; a worker reconciles payment state. The database is no longer your bottleneck under the spike.
A warning on the popular alternative. Optimistic locking — read a version number, write only if it has not changed — is fine for low-contention pages. In a flash spike it backfires: almost every write fails the version check, every failure retries, and the retries pile into a storm that takes the database down. The Redis atomic counter avoids this because the decrement never "fails and retries"; it succeeds and returns a number you act on. The trade-off is documented well in this
Redis inventory-reservation guide.
## The DIY Walkthrough: 5 Guards to Ship Before 9 August
1
Seed the stock counters. The night before, push every SKU's real, physically-countable stock into Redis as an integer. Run SET sku:RAKHI-GOLD-01 120 per SKU. Verify: sum your Redis counters and match the total against your warehouse count. If they differ, fix it now, not at 9pm tomorrow.
2
Make the deduction atomic. At checkout, run DECRBY sku:RAKHI-GOLD-01 2 for a quantity of two and read the returned value. If it is below zero, run INCRBY to undo and show "out of stock". Verify: fire 200 concurrent test orders against a 100-unit SKU with a script. You must end at exactly zero stock and exactly 100 successful orders — never 101.
3
Add the 10-minute hold. On add-to-cart, decrement into a held bucket and set a key like SET hold:ORDER-7781 1 EX 600. A small worker watches for expiry and returns held stock to the live counter. Verify: add to cart, abandon, wait 11 minutes, confirm the unit is buyable again.
4
Throttle COD. Block COD above a value ceiling (a ₹2,500 hamper is a different RTO risk than a ₹299 rakhi) and on your worst pin codes. Offer a 5% prepaid discount instead. Verify: place a test COD order above the ceiling — it should be refused with a prepaid nudge, not silently accepted.
5
Verify the payment webhook. Confirm your Razorpay webhook checks the X-Razorpay-Signature header and only marks an order paid on a verified payment.captured event. Verify: replay a webhook with a tampered body — your endpoint must reject it. Never mark paid from the browser redirect alone.
The double-charge trap. During a spike, a buyer who sees a spinner taps "Pay" again. Without an idempotency key on the order, you capture twice and refund Monday — minus the payment-gateway fee you eat both ways. Generate one idempotency key per cart and pass it to Razorpay on every capture attempt for that order.
If you would rather we wire the counter, hold and webhook checks into your stack directly,
we ship it as a fixed-scope engagement ahead of your next festival.
## When Not To Build This Yourself
If you do under ~150 orders across the whole festival on Shopify with a single warehouse, Shopify's native inventory already prevents most oversells — skip the custom Redis layer and just turn on the COD rules through an app. The kit here earns its keep when you run a custom storefront, sell across two or more channels (your own site plus Amazon or a marketplace), or push a timed drop. Below that volume, a distributed lock is complexity you will maintain and never need.
## A Real Example: A Jaipur Rakhi-and-Sweets Seller
A Jaipur D2C brand selling rakhi sets and packaged sweets came to us after the 2024 festival, where they oversold a limited gold-thread rakhi by 60 units and refunded ₹54,000 the next morning. For 2025 we moved stock to Redis atomic counters, added a 10-minute cart hold, and set a COD ceiling at ₹1,500 with a prepaid nudge. During the 9 August eve spike they processed 2,300 orders in four hours with zero oversells. COD share fell from 71% to 52% on the nudge alone, which cut their post-festival RTO bill by roughly ₹1.1 lakh. The pattern is the same one we used building the order pipeline for
Radiant Finance's high-volume transaction flow — separate the fast write from the slow confirmation.
The number that surprised them: the prepaid nudge did more for the bottom line than the oversell fix. The oversell fix saved one bad morning; the COD throttle quietly saved ₹1.1 lakh in returns across the festival.
## How We'd Sequence It (Process)
🗂️
Seed counters from real stock
🔒
Atomic deduct + 10-min hold
🚦
COD throttle + prepaid nudge
📊
72-hr settlement reconciliation
## The Post-Festival Reconciliation (Within 72 Hours)
The spike is half the job. The other half is reconciling three ledgers before returns start flowing: your order records, your Razorpay settlements, and your Tally books. Match settlement payouts to captured payments to booked sales. Festive RTO at ~58% on COD means a large slice of "revenue" on 9 August reverses by month-end, and if you have already booked it as sales your GST output liability is overstated. We cover the daily mechanics of this in our guide to
n8n + Razorpay + Tally daily reconciliation, and the broader festive stack in our
Q4 festive order-spike survival kit.
| Locking approach | Behaviour under a 6-hour spike | Use it when |
| Read-then-write (no lock) | Oversells. Guaranteed conflicts on hot SKUs. | Never, for limited stock. |
| Optimistic (version check) | Retry storm — most writes fail and re-queue, load amplifies. | Low-contention pages, not flash drops. |
| Redis atomic counter (DECR) | Stable. Decrement succeeds or rejects in one step. | Hot SKUs, timed drops, multi-channel. |
| DB row lock (FOR UPDATE) | Correct but serialises buyers; watch connection pool. | Single-DB stack, moderate volume. |
As
Hrishikesh, our CTO, puts it: the goal during a spike is not maximum throughput, it is correct throughput. A site that serves 2,000 right orders beats one that serves 2,100 with 80 oversells. Our
web development team tunes this per client, because the right answer depends on whether your stock lives in Shopify, a custom Postgres schema, or both.
## Frequently Asked Questions
### Why does overselling happen only during festive spikes?
Under normal load, two buyers rarely hit the same stock row in the same millisecond, so a read-then-write check usually wins. During a 6-hour Raksha Bandhan surge, thousands of requests target the same hot SKU at once, so the conflict moves from rare to near-certain. The fix is an atomic deduction, not more servers.
### Is Redis or a database row lock better for inventory?
Redis atomic counters scale better for hot SKUs because a
DECR resolves in one round-trip with no retry. A database
SELECT ... FOR UPDATE is correct and simpler if your stock already lives in Postgres or MySQL and your order volume is moderate. Match the tool to your existing stack rather than adding Redis only for this.
### How much should I throttle COD during the festival?
Set a value ceiling where RTO risk turns the order unprofitable — often ₹1,500–₹2,500 for gift hampers — and block your historically worst pin codes. Offer a 5% prepaid discount as the nudge. Brands that do this convert 20–30% of COD intenders to prepaid, where returns fall under 15%.
### What is the idempotency key and why does it matter?
It is a unique token tied to one cart that you pass to your payment gateway on every capture attempt. If an anxious buyer taps "Pay" twice during a spike, the gateway recognises the repeat and charges once. Without it, you capture twice, refund later, and absorb the gateway fee both ways.
### When should I reconcile orders against Razorpay and Tally?
Within 72 hours of the festival, before the ~58% festive COD RTO wave reverses orders you may have already booked as sales. Match settlement payouts to captured payments to booked invoices. This keeps your GST output liability from being overstated on revenue that never lands.
### Do small Shopify stores need this whole kit?
No. Under roughly 150 festival orders on a single Shopify warehouse, the native inventory engine prevents most oversells — just enable COD rules through an app. The custom Redis layer pays off for custom storefronts, multi-channel sellers, or timed drops where contention on one SKU is the failure mode.
Want a festive-ready e-comm stack audit?
We audit your inventory locking, payment webhooks and COD rules, then ship the fixes for Indian D2C sellers in 7 working days. Typical project: ₹55,000–₹95,000. Suitable if you run a custom or multi-channel store and have a festival on the calendar. No slides — just your order flow and our honest take.
Book a 20-min Call
Community pulse: D2C sellers swap RTO and COD-throttle numbers on r/IndiaTax and the e-commerce subs every festive season — worth reading before you set your own ceilings.
Questions on your specific setup? Email contact@softechinfra.com.