Free Shopify store auditSpeed, SEO and conversion leaks — no cost, no obligation.
Claim it
Thriftizer Solutions LLPShopify Select Partner
Book a Growth Audit
Shopify Sep 17, 2026 8 min read

Shopify Promo Codes: How to Create, Share & Track Them

How to set up Shopify promo codes that don't leak, share them as one-click links, and read the reports properly — including the margin maths most discount campaigns fail.

Shopify Promo Codes: How to Create, Share & Track Them

A promo code is a bill you agree to pay later. Before you open Discounts in the Shopify admin, know three things: which customers you want to move, what the code costs you per order at your actual margin, and how you'll tell afterwards whether those orders would have happened anyway. Shopify promo codes are trivial to create and genuinely hard to run well, and the gap between those two facts is where most discounting money disappears.

Here's how we set them up, share them and read the numbers afterwards.

Pick the discount type before you pick the number

Shopify gives you four types in the admin, and the one you choose changes how the discount behaves at checkout more than founders expect.

  • Amount off products — percentage or fixed value applied to specific products or collections. This is what you want for clearing a category, because it prices the item, not the cart. It also means a customer who adds two eligible items gets the discount on both.
  • Amount off order — the classic ₹300 off ₹1,999. Use it to move average order value, not to clear stock. Watch the maths: a flat amount on a low minimum is a percentage discount in disguise.
  • Buy X get Y — the most under-used of the four. It protects your headline price, moves slow SKUs as the free or discounted item, and reads as generous. It's also the one that breaks most often in edge cases, so test it with a cart of four mixed items before it goes live.
  • Free shipping — cheap to give if your shipping cost is ₹70 and the perceived value is ₹99. On COD-heavy Indian catalogues, a free-shipping code on prepaid orders only is one of the few discounts that pays for itself.

If your offer needs logic Shopify doesn't have natively — tiered spend thresholds, a discount that varies by customer tag, a cap on how much a percentage code can take off — that's Shopify Functions territory, which means a small custom app. It's not expensive work, but it is developer work. We cover the shape of it on our Shopify app development page.

Create the code so it can't be guessed or scraped

Open Discounts → Create discount, choose the type, then spend your time on the fields below the amount. Those are the ones that matter.

The code itself. SAVE10, FIRST10 and WELCOME15 are all in use on thousands of stores, which means people try them on yours. They also end up on coupon aggregators within days. Add an unguessable suffix: WELCOME-K7QD. Ugly, and worth it.

Minimum purchase requirement. Set it above your current average order value, not at it. If your AOV is ₹2,400, a minimum of ₹2,499 is theatre. ₹2,999 actually changes cart behaviour.

Customer eligibility. Specific customer segments is the most ignored field in the discount editor. A win-back code that only works for customers whose last order was over 120 days ago cannot be used by someone who was going to buy this week anyway. That single restriction does more for incremental revenue than any headline number.

Usage limits. Always set a total usage cap, even one you think is absurdly high. It's your circuit breaker when a code leaks. "Limit to one use per customer" helps, but understand what it does: it's tied to the customer record, so a guest checkout with a fresh email address gets a fresh use. If the offer only makes sense once per person, require an account or accept some leakage.

Dates. Set an end date on everything. Codes with no expiry are still being redeemed two years later, usually by people who found them on a deals forum.

Combinations: what stacks and what doesn't

Shopify treats discounts as three classes — product, order, shipping — and a discount can be marked as combinable with the other classes. Two codes from the same class won't stack. So a product discount and a free-shipping code can apply together if you've ticked the boxes, but two order-level codes never will.

The practical failure we see most: an automatic sitewide sale discount is live, a newsletter code goes out, and the two are in the same class. Subscribers enter the code, see no extra saving, and email support. Before any campaign, check the combination settings on every active discount, not just the new one. It takes two minutes and it saves a day of tickets during a festive sale.

Sharing promo codes without making customers type anything

Every Shopify store supports a discount URL:

yourstore.com/discount/WELCOME-K7QD

That link applies the code and sends the visitor to the home page. Add a redirect to land them where the offer actually lives:

yourstore.com/discount/WELCOME-K7QD?redirect=/collections/new-arrivals

Use these everywhere. In email, on the influencer's link in bio, in the WhatsApp broadcast, on the QR code in the packaging insert. Typed codes fail on mobile keyboards, and every failed entry is a customer staring at an error in checkout.

Two things to keep in mind. The code sits in the cart, so if the visitor clears cookies or switches from Instagram's in-app browser to Chrome, it's gone. And you can stack UTM parameters onto the same URL, which is how you separate the creator who drove traffic from the creator whose code got shared onward in a Telegram group.

Bulk codes for creators, offline events and support

One shared code per influencer is fine for attribution and terrible for control. Unique codes are better wherever the code is going to a specific person: a refund gesture from support, a stall at a trade show, a partnership where you need to know which of 40 micro-creators actually sold anything.

The admin will generate a batch of codes under a single discount for you, and you export the list as CSV. Everything reports under the parent discount, so you get both the aggregate and the individual redemption. For large ongoing programmes — hundreds of creators, monthly refreshes — script it against the Admin API rather than clicking. And keep a naming convention that survives handover: CREATOR-RIYA-NOV, not a random string you can't trace in six months.

Tracking: what Shopify reports tell you, and what they hide

Two places to look. Analytics → Reports → Sales by discount gives you orders, discounted sales and gross sales per code. And your order export CSV carries the discount code column, which is what you want when you need to cross-tab codes against payment method, city or repeat status.

Neither answers the only question that matters: was the order incremental?

Work it through. Say your AOV is ₹2,400 and gross margin is 55%, so ₹1,320 of contribution per order. You run a 15% code, which takes ₹360 off. Discounted contribution is ₹960. The code gets used 500 times. Shopify's report shows ₹12,00,000 in gross sales attached to the code and it looks like a win.

Now assume 400 of those 500 buyers would have bought at full price. You handed 400 × ₹360 = ₹1,44,000 to people who needed nothing, and earned 100 × ₹960 = ₹96,000 from the genuinely new orders. Net contribution: minus ₹48,000. The campaign was profitable in the dashboard and loss-making in the bank.

You can't get the split from Shopify's reports, but you can approximate it. Hold back a segment from the email send and compare purchase rates. Run the offer in alternating weeks. Restrict the code to a customer segment that demonstrably wasn't going to buy. Any of these gets you closer to the real number than staring at redemption counts.

One more report to run after every sale: orders where a discount was applied and later refunded. Discount plus return is the signature of a customer who was bought, not won.

The India-specific traps with promo codes

COD turns discounts into RTO. A discount code raises intent-to-order faster than it raises intent-to-pay. On a store already running 30%+ returns on cash orders, a percentage code circulated widely will push that higher, and each undelivered parcel costs you forward and reverse freight on a discounted order. The clean fix is to gate the discount to prepaid, and this is the unwelcome part: Shopify doesn't let you restrict a discount code by payment method on a standard plan. Payment customization through Functions is a Shopify Plus capability — see our Shopify Plus notes on when that's worth the upgrade. Without Plus, your options are a COD fee app that offsets the discount, or making the prepaid incentive the offer itself (free shipping or extra 5% on prepaid, nothing on COD).

GST. A discount shown on the face of the invoice at the time of sale reduces the taxable value; a post-sale cashback settled outside the invoice generally doesn't work the same way. Shopify calculates tax on the discounted line value, so codes applied in checkout are fine. Wallet credits, cashback promises and "we'll refund ₹200 after delivery" schemes are where accounting gets messy. Ask your CA before you build the mechanic, not after the quarter closes.

Festive load. During Diwali and BFCM weeks, promo code errors spike because everything is live at once — an automatic sale, a code, a bundle app, a gateway offer from Razorpay or a bank cashback. Bank offers sit at the gateway, not in Shopify, so the price in your checkout and the amount debited will differ. Say so on the cart page. We write that line for clients every year and it still generates fewer tickets than leaving it out.

When an automatic discount is the better call

Codes exist to be entered, which means they exist to be searched for. A visitor who sees an empty discount field opens a new tab and looks for one. That behaviour costs you margin on customers who arrived ready to pay, and you don't get to remove the field.

So if the offer is available to everyone — sitewide sale, spend threshold, buy-two-get-one — make it an automatic discount. It applies in the cart, there's nothing to hunt for, and nothing to leak to a coupon site. Keep codes for cases where the code is doing a job only a code can do: attribution to a specific channel or creator, a gesture to one customer, a segment-restricted offer, an offline-to-online bridge.

Roughly the rule we work to: if you'd be happy for the offer to appear on a deals aggregator tomorrow, use an automatic discount. If you wouldn't, a code alone won't stop it, so restrict eligibility as well.

A practical first step

Pull your last 90 days of orders as CSV, pivot on the discount code column, and put contribution margin next to each code. Most stores find two or three codes that are quietly funding customers who never needed a reason to buy, and one expired-but-still-live code nobody remembered creating. Kill those, then rebuild the survivors with segment restrictions and real usage caps.

If you want a second pair of eyes on the discount stack, the checkout experience and what it's doing to your margin, our free store audit covers it.

Next post

Ready to scale your D2C brand profitably?

Let's build a growth engine that drives more traffic, more conversions and more profit.

Book a Growth Audit
📅 Free Audit💬 WhatsApp