Help · Content

Discounts

You make your discounts in Shopify. This app takes one of them, puts a code from it into an email you send or a form on your store, and then tells you what came back — who was given a code, who used it, and on what order.

Three words are used precisely here, because they are three different things. A discount is the thing you made in Shopify: 20% off, free shipping, buy one get one. A discount code is the string a person types or clicks. An offer is one discount attached to one message — this campaign, or this form.

Shopify, always. There is no discount editor in this app and there never will be one. Your pricing rules belong in the place where the rest of your store's pricing lives, and a second editor over the top of them is a second place for them to be wrong.

This app holds a copy, never the original. It mirrors the code discounts in your store — value, dates, status — and keeps that copy current as you edit in Shopify, so a discount you attach to a message is the one your store already has.

Automatic discounts are not listed. They apply themselves at checkout and there is no code to send anybody, so there is nothing to attach to a message.

Your own code is the one you typed into Shopify — SPRING20. Everybody gets the same string. It is short, it is yours, and every limit you set on the discount applies exactly as you set it. What it cannot tell you is who used it: one string shared by everyone is one string, so a redemption belongs to the discount rather than to a person.

A code for each person is minted for one profile and nobody else. It is longer — something like MM-K7QDX3MW-7K4X9Q3T — and it buys you three things a shared code cannot: it stops working once it is used, it can carry a deadline of its own, and the order it turns up on is matched back to the person you sent it to.

Use your own code for a public sale you are also putting on a banner. Use a code for each person when the offer is the point of the message — a welcome gift, a win-back, a thank you — and you want to know what it did.

Codes are made ahead of the people who will need them, and the supply grows with your store's own activity. A signup form that gives a code to thirty people an hour keeps enough ready for thirty people an hour, and it does that by watching what actually happens rather than by a number anybody sets. Nothing here has to be topped up by hand.

A campaign is simpler still: it makes one code for every single person in its audience before it sends the first email, so a big send cannot run short halfway through.

If a rush is bigger than what is ready at that moment, the app makes a code on the spot for the person in front of it, and they get it in the same breath as everybody else. The words you wrote on the discount code block — the ones under If no code can be given — are what somebody sees when there is no code to give at all: when that panel's block names no discount, when the discount has ended, been deleted, or has not started yet, when the code you chose has been deleted in your store, or when your store cannot be reached at that moment. Running out is not on that list and never will be. Your codes live at Shopify, so when there is nothing honest to hand over those words are what you would want said in your own. Their signup is saved either way.

One person, one code. There is no per-campaign limit to plan around: your audience is the limit. Send to eight hundred people and eight hundred codes are made.

There is a ceiling far above any ordinary send, and it is there to catch a runaway rather than to ration you — a segment that accidentally names everyone who has ever touched your store. A campaign above it is refused rather than quietly trimmed, and the refusal asks you to get in touch so it can be raised. In normal use you will never meet it.

A total usage limit on the discount does not apply to the codes you email. If you set your discount to be used 500 times in all, that limit belongs to the discount's own code. The codes you email are one per person, so the number of people you send to is the real limit. You are told this where you set the offer up rather than stopped by it, because it is your discount and your call.

Wherever you set an offer up you say how long the code is good for: a number of days, or until the discount itself ends. On a campaign that is a setting in the email's discount block, beside the discount itself; on a form it is the same thing in the form's own discount block.

The count starts when the person receives the code, never when you saved or published anything. A code handed out on September 6 with a 3-day window is good through September 9, for that person and nobody else.

For each day your codes have to last until, the app creates a discount in your Shopify dashboard — a copy of yours, in every term that matters — that ends at the end of that day in your store's time. The codes for that day are made under it. So the date printed in the email is the date Shopify itself enforces. At 23:59 that day the code stops working at checkout, whether or not anything in this app is running.

That is why you may see discounts in your Shopify list you did not make, named after yours with the day on the end — Spring Sale · use by September 8. They are where the codes for that day live. They clean themselves up: once a day has passed, its discount is deleted and your list settles back to the discounts you made.

Content → Discounts lists every code discount your store has: what it is, when it runs, whether it is running now, and — for each one — how many codes this app has made and where each of them stands. Ready is waiting to go out, Set aside for a campaign is spoken for, With a person is in somebody's hands, and then Redeemed, Expired and Withdrawn. A discount that gives everybody the same code has no codes of ours to count and says so rather than showing a row of noughts.

The numbers are this app's own record of every code it made. They are exact and they change the moment something happens. Shopify keeps a count of its own that settles at its own pace, and it is not what you are reading here.

Create a discount in Shopify offers the four kinds of discount Shopify makes — Amount off products, Buy X get Y, Amount off order and Free shipping — and each one opens that discount's own form in your admin, in a new tab. Pick the kind you want and you land on the form itself rather than on a list. Refresh reads your discounts again straight away — the app is told when they change, but the button is there for the moment you do not want to wait. Under the controls is when your discounts were last read.

Search by name. Type more than one word and every one of them has to match, wherever each of them falls and in any order. Searching for a % finds a %; nothing you type is treated as a wildcard.

Paging. Under the table you choose how many to show at a time — 25, 50 or 100 per page — and step through with Previous and Next. The line beside them says where you are: Page 3 of 5. Type a number in the box to jump straight to a page. The page you are on is part of the address, so opening a discount and coming back puts you back where you were, and the size you choose is remembered the next time you open this screen. Searching or changing the filter takes you back to the first page. When your discounts were last read is about the whole store, not about the page you are on.

Whether a discount combines with others is set in Shopify, in the discount's Combinations section. A discount set not to combine is refused at checkout beside another one — so if a code this app handed out was turned down at checkout on an order that already had a discount on it, that is the setting to look at.

Each row tells you where it stands. A discount that combines with product, order and shipping discounts says nothing, because that is the ordinary case. A discount that combines with none of them says Doesn't combine, and one that refuses some of them names which — Doesn't combine with shipping discounts, or Doesn't combine with product or shipping discounts. It sits with the discount's other descriptors, under its name. It is a fact about how you set the discount up, not a problem to fix; change it in Shopify's Combinations section and Refresh to see it here.

A discount that was read into this app before it started mirroring that setting shows nothing either way, and refreshing your discounts fills it in.

Give each person a code of their own is on this screen, on each row, and it is the one setting here that is this app's rather than Shopify's. Turning it on means the next campaign or form that gives this discount away hands out codes only one person can use. Turning it off withdraws the codes still waiting to go out; codes already in somebody's hands keep working until their own deadline, and from then on everybody shares the code you made in Shopify.

It is refused while a campaign that is ready to send is using this discount. Those codes are a promise, some of them already in an inbox. Cancel or send the campaign, then change it.

Open a discount's name and you get the whole of what this app knows about it:

A form's numbers say Not recorded, and that is not zero. Codes handed out by a form come from this discount's shared pool, and the pool does not record which form gave out which code. The line under the table counts all of them together.

On a form, the offer is part of the form. You add a Discount code block to a panel people reach after signing up — never the first one — open it, and choose the discount, whether each person gets their own code or everybody gets your shared one, and how long a code is good for. A form may carry a different discount on each thank-you panel, and a person only ever reaches one of them.

It waits for the publish, like everything else in a form. Nothing goes out from a working copy, and taking the block out and publishing is how you stop giving it away — codes already handed out keep working either way.

Anyone on the team but a viewer may say what a form gives away. The block only ever names a discount that already exists in your store; making the discount is done in Shopify, and turning unique codes on for one is done from the discount itself, by a marketer, manager or owner.

On a campaign, the offer is part of the email. You add a discount block where the code should appear, open it, and choose the discount there — with the heading, the terms line, the expiry label and how long the code is good for all settings on that block. There is no separate step attaching a discount to the campaign: the email is what says what the campaign gives away, so an email you clone or reuse carries its offer with it, and taking the block out takes the offer away.

What the block's panel asks, in order. Which discount, from the code discounts you have made in Shopify — a discount that has not started, or has ended, is still listed and says so, rather than quietly missing. Then, if that discount gives away its own code rather than one per person, which code. Then a heading in your own words, with its own size, alignment, color and typeface. Then the code's own size, alignment and color. Everything else is one card, Discount details. Where the terms line comes from: the Shopify default, Your description starting from that wording, or Do not show it. That store wording is written from the discount's own settings in Shopify — the amount off, what it comes off, and any minimum to spend — so it reads the way you set the discount up rather than the way Shopify happens to label it in a list, and the card shows it to you beside the menu. Then Show the expiration date, which writes the promise out as one sentence you fill in — Use by the date, good for 3 days after they receive it. The words in front of the date are yours — Use by to begin with. How long each person has is the tail of that sentence: until the discount ends, or a number of days from the day they receive it. Last, one size, alignment, color and typeface for the terms line and the date together.

The code you send is a link, and so is the button beside it. Either one opens your store with the discount already applied — to the reader's next checkout, and to any cart they already have open — so nobody has to copy anything. Shopify counts a code arriving that way like any other, against the five one order may carry. And only a discount that is running can carry a link like this, which is one more reason a discount that has ended is refused where you choose it.

Three things are refused where you set them rather than at the end.

A discount that has already ended. You are told when it ran until, and asked to choose another or give this one a new end date in Shopify. It is asked before the window question, because the discount is the thing to fix.

A window that would outlive the discount. If the discount ends on Monday, a code cannot be good for seven days. You are told how long the offer is good for and the day the discount ends, and asked to:

A promise you wrote is never quietly shortened to fit.

A code good until the discount ends, over a discount with no end date. Nothing in that combination decides when the code stops, so it is refused — whether each person gets their own code or everybody shares yours: choose how many days the code is good for, or give the discount an end date in Shopify.

An email built from a template. A template has no blocks, so it can carry no discount block — which means a campaign built from a template gives nothing away.

Build the email in the editor if you want the app to hand out codes. Otherwise type the discount's own code into the template yourself, exactly as you would any other line of it — a shared code is a string, and nothing has to mint it.

An offered campaign does one thing before it sends anything: it makes a code for every person in its audience. Nothing goes out until every one of them exists, so nobody is ever sent an email with a blank where a code should be.

If it stalls, the campaign stops and is marked Needs attention, with the reason. It has sent nothing at that point. Some reasons clear themselves — Shopify limits how fast anybody can ask it for codes, and waiting is the whole fix — and the campaign carries on when they do.

If you cancel while codes are being prepared, it stops there. Nothing is sent, the codes made for it are taken back out of your store, and the campaign does not return to being ready to send; you would set it up again.

The deadline is fixed when you make the campaign ready to send, not when each email leaves. Everyone in one send gets the same date, however long the sending takes, and a change you make to the discount afterwards never extends or shortens a code somebody already holds.

End it or delete it and its codes stop working, because Shopify is what checks them at the counter. Here the offer is marked unavailable, and a campaign that was ready to send is stood down with the reason rather than mailing a code that would be refused. A draft keeps its offer and says the discount has ended.

Shorten it under a campaign that is already sending and the people who have not been mailed yet are held back, rather than sent a date that is no longer true.

Somebody who gets a code from one of your forms does not have to type it. As soon as the code appears on the form's thank-you panel, it is put on that person's cart: the cart page shows the discount line and the total comes down, before they have pressed anything. It survives closing the form, and it is remembered in their browser, so it is still there on a later visit.

A line under the code tells them so, in whatever words you put on the block — Applied to your cart automatically. until you write your own. It is drawn only once the cart has answered that it really has the code, which is what makes it safe to say at all.

The code itself is not a link. It is there to be read. The way on into your store is a button on the panel, and the Forms help page says how to set one up.

If your store will not honor the code — it ended, it ran out, the cart does not meet its conditions — it is taken straight back off the cart, and no line is drawn at all: nothing on the panel ever said it was applied, so there is nothing to take back. The code is still on screen for them to try.

An order that used one of your codes is matched back to it within a few moments of the order being placed. The redemption is recorded against the profile you sent that code to, and the email address on the order is recorded beside it — so a code that was forwarded to a friend is visible as one, rather than quietly counted as somebody it was not.

An order counts once, however many of your codes were on it. Each code is recorded separately, because each one is its own fact about who was sent what — but every count of redemptions counts orders, so one order that used two of your codes is one redemption, not two.

The money recorded is the order's value, unadjusted for payment, cancellation and refunds. It is what was ordered, not what was banked, and a refund later does not move it. It is honest about being an early number rather than an accountant's one.

A code of your own attributes to the discount, not to the message. Everybody has the same string, so there is nothing in it to tell one person from another. A code of your own is never withdrawn when somebody uses it, either — many people are meant to use it, which is the whole point of having one.

Redeemed a discount code joins the Metrics page like anything else your store records. You can chart redemptions over time, open the metric to read each one as it was recorded — the order, the code, the order's value and the discount taken off it — or write a segment about the people in it.

Received a discount code appears in a person's activity the moment a code becomes theirs, whether it came from a campaign or from a form. A Discount codes section then appears at the foot of that person's page, under Activity, and lists the 25 most recent codes they hold: the code, the discount it came from, the date it runs out — or No deadline, where the discount has no end — and where the code stands. Ready means it still works, Redeemed means it has been used, Expired means the date has passed, and Retired means the code is being withdrawn from your store — a withdrawal is asked for the moment it is due and Shopify takes a little while to finish it. A code that came from a campaign names the campaign; a code that came from a form says so, without naming which form.

Somebody who holds more than 25 is told so under the table. Only the section is capped, never the store — the older codes are still good and still work at checkout.

Somebody who has never been given one has no section. There is nothing to say, so the page does not say it: the codes appear the day a code does.

Holding a code says nothing about who somebody is. It never marks them as a buyer, and it never changes whether their identity is confirmed.

Each person gets their own code, and a code stops working once it is used. Shopify tells us about an order a few moments after it happens, so there is a short window right after someone checks out where the same code could be used a second time. The discount's own "one use per customer" setting is a second guard, and we turn it on for you.

Codes are printed in capitals, and they are meant to be typed as printed. The characters that are easy to confuse are left out of them — no capital O against a zero, no one against a capital I — so a code read off one screen and typed on another still works.

No discount editor, ever. Shopify's is the editor, and this app mirrors what you make there.

One offer per email. A message carries one discount. Several named offers in one email is a later thing.

No text messages. The engine does not care which channel a code goes out on, but email is the channel this app sends today.

No automation can give a discount away yet. An automation's email is refused at publish if it carries a discount block: Automations cannot give away discount codes yet — take the discount block out, or send this email as a campaign. Campaigns can, and an automation that needs to hand out a code is the thing to tell us about.

No separate discounts report. A discount's own page answers what that discount has done; redemptions across the whole store are read in Metrics, which is where the same rows are already answering the question.