Running a promotion
Launching a discount code without surprises: creating it in the right environment, setting limits, testing it before you announce it, and pausing it.
A promotion code is easy to create and easy to get subtly wrong — the wrong environment, a missing limit, a code nobody tested. This playbook walks the dashboard from idea to launch. For how codes behave at the edges, see Discounts.
Before you start
- Pick the environment. Codes belong to one environment, so
SUMMER25in a test environment is a different code fromSUMMER25in production. Switch the top-bar environment selector to production before creating the real one. - One code per cart. Codes don’t stack; applying a second replaces the first.
- You’ll need a role that can change application settings — the finance and viewer roles don’t see Discounts.
Create the code
Open Discounts and click Create discount:
| Field | Notes |
|---|---|
| Code | What buyers type. Saved in upper case. |
| Type | Percentage off or Fixed amount off |
| Value | 1–100 for a percentage, or an amount |
| Minimum order total | Optional — the subtotal a cart must reach |
| Usage limit | Optional total cap across everyone. Blank means unlimited. |
| Uses per customer | Defaults to 1. Use 0 for unlimited. |
| Expires at | Optional, e.g. 2026-12-31T23:59:59Z |
| Description | Your internal name for it |
Then Create.
Set a usage limit on anything you’ll post publicly. A code without one keeps working for anyone who finds it until it expires or you disable it.
A start date and product scoping (limiting a code to certain SKUs) are set through the API rather than the dashboard — see Discounts for developers.
Test it before you announce it
Use the Validate preview card on the same page. Enter the code, a test order total, and optionally a customer, then Validate. You’ll see whether it’s valid, how much it takes off, and the total — or the exact reason it would be rejected (inactive, not started, expired, used up, customer already used it, below the minimum).
Test the edges you care about: an order just under the minimum, a customer who has already used it.
Edit or pause
Edit changes the value, limits, and expiry, and has an Active at checkout switch. Disable pauses a code instantly and Enable brings it back — reversible, and recorded in the audit log. Prefer disabling to deleting.
Delete removes a code permanently, and any checkout that hasn’t finished can no longer apply it.
See how it did
The Uses column shows how many times each code has been redeemed against its limit. Below the codes, the Performance panel shows the last 7, 30, or 90 days: orders that used a code, the revenue on those orders, and the discount given — in total and for your top ten codes. It counts paid orders and doesn’t deduct refunds.
You can also ask an AI assistant — “how did SUMMER25 do?” — which reads the same figures.
Related
- Discounts — limits, scoping, and the reasons a code is rejected
- Discounts feature overview
- Running your store day to day