Bulk Discount Codes for Shopify
Generate large sets of unique, one-per-customer discount codes, export them for your campaign, and create sets from your own systems through the API.
Installing the app
Install from the Shopify App Store. The app asks for permission to manage discounts and nothing else, and it works immediately after install — there is no setup wizard, no configuration, and nothing to connect. You'll find it under Apps in your Shopify admin.
Creating your first code set
- Open the app from your Shopify admin.
- Choose how many codes you need and what the discount does — a percentage off, a fixed amount off, or free shipping.
- Set the options you care about: an expiry date, a prefix so the codes are recognisable, and whether each code may be used once per customer.
- Click Generate codes.
The codes are created as a real Shopify discount, so they work at checkout exactly like codes you'd create by hand — and they appear in your admin's own Discounts section too. Small sets are ready in seconds.
Code and discount options
| Option | What it does |
|---|---|
| Discount type | Percentage off, a fixed amount off the order, or free shipping. |
| Number of codes | How many unique codes to generate in this set. |
| Prefix or suffix | Puts a recognisable marker on every code in the set — useful for telling an influencer batch apart from a print-insert batch at a glance. |
| Expiry date | The codes stop working after this date. |
| One use per customer | Stops a single code being shared and reused across many orders. |
| Usage limit | A total cap on how many times a code can be redeemed. |
Every code in a set is unique and randomly generated, so codes can't be guessed from one another the way sequential codes can.
Large batches and progress
Very large sets are created by a background job rather than while you wait, and the app shows live progress as it goes. If Shopify rejects an individual request — a rate limit, a brief outage — the job retries it rather than dropping the code, and anything that still fails is reported to you. A batch never quietly comes out short.
You can close the page while a large set is running and come back to it; progress carries on server-side.
Exporting codes
Open a set and download it as CSV or XLSX. CSV suits email platforms and mail-merge tools; XLSX opens cleanly in Excel and Google Sheets without a text-import dialog and without long codes being mangled into scientific notation.
The export contains the codes for that set, so you can hand a file straight to a print supplier or upload it to your email tool.
Importing your own codes
If your codes are decided elsewhere — a printed batch, a partner's numbering scheme, a list you already hold — paste them in instead of generating them, and the app creates the discount with exactly those codes. Duplicates and codes that already exist in your store are reported rather than silently skipped.
API and webhooks
The API exists so that another system can create and read code sets without anyone opening the admin — a membership site issuing a code on signup, a warehouse tool pulling the next unused code onto a packing slip, a loyalty platform rewarding a milestone.
- Open the API page in the app and generate a key.
- Send the key with your requests as documented on that page, which lists the endpoints, their parameters and example requests.
- Optionally register a webhook so your system is notified when a set finishes generating, rather than polling for it.
Plans
| Free | Unlimited | |
|---|---|---|
| Codes per month | 500 | Unlimited |
| Export CSV and XLSX | Included | Included |
| Import your own codes | Included | Included |
| API and webhooks | Included | Included |
Every feature is available on the free plan; the difference is volume. The paid plan is a flat monthly price with a free trial, billed by Shopify on your normal Shopify invoice, and you can cancel it from your admin at any time. Current prices are shown on the app's own plan page and on its App Store listing.
Permissions and data
The app requests permission to manage discounts, and no other scope. It does not read your customers, orders or products.
What it stores is the information needed to run and export your code sets: the sets you create, their codes and settings, your store's domain, and your plan status. It does not sell data, does not share it with advertisers, and does not use it to train anything. Full details, including retention and how to request deletion, are in the privacy policy.
Troubleshooting
A code isn't accepted at checkout
Check the set's expiry date and usage limit, and whether the code has already been redeemed once when one-use-per-customer is on. Discount combination rules in Shopify can also block a code when another discount is already on the cart.
My batch finished with some codes missing
The app reports failures rather than hiding them, and the usual cause is a code colliding with one that already exists in the store. Generate a top-up set with a different prefix to make up the numbers.
The export opens as one long column in Excel
That's Excel's CSV import behaviour. Download the XLSX version instead and it opens correctly with no import step.
An API request is rejected
Confirm the key hasn't been revoked and that it's being sent in the header exactly as shown on the API page. The response body says which field it objected to.
Support
Email support@stonewren.dev. Replies come from the person who built the app, normally within one working day (UK time). Including your store's domain and what you clicked makes a fix much faster.