7 schemes · 3 to avoid

A discount code is a label you will read six months from now.

Most advice here is about being catchy. The codes that earn their keep are the ones that encode where they came from — because that turns a discount report into an attribution report for free.

Seven schemes that do work for you.

Each one answers a question you would otherwise need analytics for.

Channel-stamped

POPUP15, EMAIL15, INSTA15

The same offer with a different code per channel turns your discount report into an attribution report. Costs nothing and answers 'which channel actually drove that' without any analytics work.

Campaign-and-year

BFCM26, SPRING26

Dated codes stop last year's campaign being redeemed forever after someone posts it on a deal forum. The year is also what makes the report readable in eighteen months.

Value-explicit

SAVE15, TAKE20, SHIP0

The code states the offer, so a shopper who copied it from a popup three days ago knows what it is worth without going back. Fewer support emails, fewer abandoned checkouts.

Welcome-tagged

HELLO10, FIRST10

Marks the code as an entry offer, which makes it easy to exclude from repeat-customer reporting and easy to justify internally as acquisition rather than margin loss.

Partner-named

SARAH20, PODCAST20

For affiliates and collaborations, where the code is both the offer and the tracking. The partner remembers their own name, which is more than can be said for a random string.

Threshold-stated

OVER50, SPEND100

When the discount has a minimum, putting it in the code stops the most common support question about discount codes and the checkout abandonment that follows it.

Seasonal-plain

SUMMER, HOLIDAY, RESTOCK

Short, memorable, easy to say out loud on a podcast or in a video. Pair with a date-based expiry rather than relying on the name to imply one.

Three to avoid.

Each one has a specific failure mode.

Anything sequential

SAVE1, SAVE2, SAVE3 invites guessing. Someone will try SAVE50, and if it exists you have just given away an offer you meant for a specific list.

Anything you cannot read aloud

Codes get shared by voice more than anyone expects — in videos, on calls, across a shop counter. Mixed case, zeroes against Os, and ones against Ls all cost you redemptions.

Anything that implies exclusivity you will not enforce

VIPONLY on a code that is not restricted teaches your best customers that the label means nothing. If it is not gated, do not say it is.

Where BetterPopup fits, and where it does not.

You create the code in Shopify or whichever platform runs your store, including its expiry and any minimum. BetterPopup attaches it to a campaign and hands it over at the moment someone opts in — a reward here is one shared code per campaign, or a custom message with no code, with no unique-per-subscriber generation. If your scheme depends on one-time codes, check the comparison before choosing us.

Discount code questions.

Naming, expiry and attribution.

Ones that encode something useful — the channel, the campaign, the year, the value or the threshold. A code is a label you will be reading in a report months from now, so a name like POPUP15 or BFCM26 is doing work that a random string is not. Short, upper case, unambiguous when spoken aloud.

Yes, even when the offer is identical. Different codes for the same 15% across your popup, your email footer and your Instagram bio turn one discount into three attribution signals at zero cost, and let you retire one channel's code without touching the others.

Almost always. Codes outlive campaigns — they get posted to deal aggregators and honoured for years. A date in the name helps you notice, but an actual expiry in your store platform is what stops it. That is set in Shopify or your ecommerce platform, not in the popup.

No, and this is worth being clear about. You create the code in your ecommerce platform, then attach it to a campaign — a reward here is one shared code per campaign, or a custom message with no code. There is no unique-per-subscriber generation, so a scheme that depends on one-time codes needs a different tool.

The limit is not technical, it is reporting. Once you cannot look at the list and say what each code was for, the naming scheme has failed — which is the argument for encoding the channel and the date rather than inventing something clever each time.