Most D2C founders overbuild the store and underbuild everything behind it. A Shopify store on a stock theme, with Razorpay live, three collections and honest product photography, can take its first sale on day four. The reason people stall isn't the platform. It's that they spend ten weeks and ₹4 lakh on a custom build before they know whether anyone wants the product. Shopify for D2C brands works best when you treat the first six months as a test rig and the next eighteen as an engineering problem.
Here's how the stages actually differ, and what we've seen break at each one.
Months 0-3: spend on inventory and creative, not the theme
Dawn, Refresh or any ₹27,000-odd premium theme from the Shopify Theme Store will carry you to ₹10 lakh a month without complaint. What you need in this window is a product page that answers the objection your WhatsApp enquiries keep raising, a size or usage guide if it applies, and shipping timelines that are true.
Skip: a custom homepage, a loyalty programme, a subscription flow, a mega-menu, a quiz. Every one of those adds a script and a support surface. We've inherited stores with fourteen apps installed and under 200 orders a month. The apps were not the problem, but they were a reliable sign that the founder was avoiding the harder work of finding a repeatable acquisition channel.
The one thing worth paying for early is GST plumbing. Shopify will not hand your customer a GST-compliant invoice with HSN codes and a place-of-supply split out of the box, so you'll add an invoicing app and configure tax overrides for the categories where the rate differs. If you sell food, get the FSSAI licence number onto the product page and the invoice before you scale ads, not after a marketplace or a payment partner asks for it.
COD is the real cost centre, and blanket prepaid discounts usually make it worse
Run the arithmetic on your own numbers rather than trusting a benchmark. Ours, for a mid-priced apparel or accessories brand, tends to look like this.
Take 1,000 orders in a month at an AOV of ₹1,200. Say 60% choose cash on delivery, so 600 COD orders. If a quarter of those come back as RTO, that's 150 parcels returned. Cost per RTO: ₹70 forward shipping, ₹70 reverse, ₹20 packaging that you can't reuse. So ₹160 × 150 = ₹24,000. Across all 1,000 orders that's ₹24 per order, or 2% of AOV, before you count the warehouse time spent opening and re-QC-ing the returns.
Now the trap. The instinct is a 5% prepaid discount. But if 400 orders were already prepaid, you've just handed ₹60 each to 400 customers who were never going to pick COD, which is ₹24,000 a month bought for nothing. Unless the discount shifts a lot of COD volume, you've spent the entire RTO saving on people who didn't need convincing.
What works better: a COD handling fee of ₹30-50 shown at checkout, partial COD where the customer prepays ₹100-200, and an order-confirmation step over WhatsApp for first-time COD buyers on high-value carts. The fee is the blunt one and it does cost you some orders. Measure the drop in COD conversion against the RTO saving for a month before you decide. We get the threshold wrong on the first pass fairly often; pin-code-level RTO data usually tells you to restrict COD in a handful of regions rather than raise the fee everywhere.
Checkout and payments: where the money leaks quietly
Razorpay, Cashfree and PayU all work fine on Shopify. What matters more than the choice is UPI intent behaving properly on mobile, because that's where most Indian D2C traffic sits. Test it on a real phone, on a real network, with a real ₹1 payment. Then test it again after every theme update.
Two things we check on every audit: whether the express payment buttons render above the fold on the cart drawer, and whether the address form is fighting the customer. A pin-code lookup that auto-fills city and state removes two fields and a source of failed deliveries. Small change, measurable in abandoned checkouts.
If you're on Shopify Payments in a market where it's available, don't run a second gateway in parallel out of nervousness. Two gateways means two reconciliation files and settlement dates that never quite line up.
Months 4-12: the catalogue outgrows the navigation
Somewhere around 250-300 SKUs, collection pages stop working. Customers land on a 400-product grid, scroll nine screens, and leave. Native Shopify filtering handles tags and a few standard fields, and that's genuinely enough for a small catalogue. Past a few hundred SKUs with real variant complexity, it isn't.
The symptom to look for in GA4: high entry, high exit, near-zero product clicks on collection pages, while your internal search results page converts two to three times the site average. That gap is telling you search is doing the work navigation should be doing. Fixing it means proper faceting on the attributes people actually shop by, plus a search box that tolerates misspellings and Hinglish. We built FilterPro because we kept rebuilding the same filter layer for clients and wanted it to stop being a theme customisation every time.
Also: put a searchandising rule on out-of-stock items so they sink instead of occupying the first row.
Speed stops being cosmetic once you're buying traffic
At ₹50,000 a month in ad spend, a 3-second LCP costs you a rounding error. At ₹8 lakh a month it's a line item. The stores we see arrive with a 2.4s mobile LCP usually have three causes in the same order: a hero image served at 2400px wide to a 390px viewport, four app scripts loading synchronously in the head, and a review widget that renders above the product title.
Getting that under 1.5s is mostly deletion. Lazy-load everything below the fold, move third-party scripts behind an interaction or into Shopify's web pixels where the app supports it, serve hero images as WebP at two breakpoints, and audit the apps you stopped using but never uninstalled — the script tags often survive the uninstall. If you'd rather see the numbers before committing engineering time, our Shopify speed work starts with a diagnosis of which specific requests are holding the render, not a generic checklist.
One unwelcome note: a 100 Lighthouse score is not a business goal. We've seen founders spend six weeks chasing 95+ while their product pages had no size chart. Get LCP under 2.5s, stop CLS from moving the buy button, then go back to merchandising.
Festive season: plan the warehouse, not the website
Shopify will hold up through a Diwali flash sale. Your 3PL might not, and your support inbox definitely won't. The failures we get called about in October are almost never platform failures: they're inventory oversells across two locations, a courier that stops picking up in Tier-2 cities for four days, and a discount stack that lets someone combine a 40% code with free shipping on a ₹499 order.
Freeze theme deployments two weeks before the peak. Test your discount combinations with real carts, including the edge case of a gift card plus an automatic discount. And set up a low-stock rule that hides rather than oversells, because a cancelled festive order costs you the customer, not just the margin.
Shopify Plus for D2C brands: run the number before you upgrade
Plus gets sold on features. It should be bought on arithmetic. Pull your last invoice, find your effective gateway or platform fee, and work out what the Plus rate would have saved on last month's GMV. If your fee drops by 0.3 percentage points and you're doing ₹2.5 crore a month, that's ₹75,000 saved monthly against the plan difference. Your percentages will differ by market and gateway, so use yours, not this example.
Beyond fees, the honest triggers are: you need checkout customisation that Functions can do and the standard checkout cannot, you're running B2B alongside D2C on one catalogue, you need more than the staff accounts and locations on Advanced, or you're launching a second market as an expansion store. Wholesale channels and a proper staging environment matter more than most feature lists admit.
If none of those are true, stay on Advanced and spend the difference on retention. We've talked more brands out of the upgrade than into it, and we'll say the same on a call about Plus if the numbers don't support it.
The retention gap nobody builds until it hurts
Repeat rate is where D2C economics either work or don't, and it's the last thing most brands instrument. Three flows cover the bulk of it: an abandoned-checkout sequence that references the actual product, a post-delivery flow timed to when the product would realistically be consumed or worn, and a winback at 1.5× your median repurchase gap. Not a monthly newsletter.
Get the median repurchase gap out of your order data first. If your customers reorder at day 52, a day-30 winback is annoying and a day-90 one is late. Segment by first-product-purchased, because a customer who entered on a ₹299 trial size behaves nothing like one who entered on the ₹1,499 kit.
What to build in-house and what to buy
Buy: reviews, invoicing, loyalty, subscriptions, search. These are solved problems and the apps are cheaper than your developer's week. Build: anything that encodes a rule specific to your business — a made-to-order lead time that varies by fabric, a pricing rule tied to a live commodity rate, a delivery-date promise driven by your own courier serviceability data. That's where a custom app or theme extension earns its cost, and where an off-the-shelf tool will force you to change your operations to suit its assumptions.
The rough cost picture: a clean theme customisation runs in the low lakhs, a custom section library more, a private app with real logic more again. We've broken the ranges down in detail on Shopify development cost if you're budgeting.
Where to start this week
Open your checkout on a mid-range Android phone over 4G and buy something. Note every second you wait and every field you type. Then pull your last 90 days of orders and calculate two numbers: RTO cost per order, and median days to second purchase. Those three inputs will tell you what to fix next more reliably than any growth playbook.
If you'd rather have someone else look, our free store audit covers speed, checkout and catalogue structure, and it comes back with specific requests and line numbers rather than a score out of 100.


