Shopify sets expiration at the discount level — every code in a batch shares one fixed end date. The Bulk Discount Code Tool changes this. Enable per-code expiry and each code gets its own expiration window, calculated from the day it was created.
The problem with shared expiration dates
When you generate 10,000 codes for a mail campaign that ships in three monthly drops, a single endsAt date on the discount creates an unfair situation. Customers who receive codes in the first drop have three months to redeem. Customers who receive codes in the final drop might have only weeks.
The same problem appears everywhere codes are pre-generated and distributed over time:
- Physical mailers: codes printed for a January drop should not expire on the same date as codes printed for a March drop.
- Affiliate programs: each affiliate activates their codes on different days. A shared expiry means early activators have more time than late ones.
- Loyalty rewards: codes generated in bulk and distributed over months — fair treatment requires equal active windows for every recipient.
- Event handouts: codes distributed across multiple events should expire relative to each event, not a single shared date.
Shopify’s own forums confirm this is a known limitation with no native solution. The workaround — creating a separate discount object per expiration window — is expensive to manage at scale.
How per-code expiry works in the Bulk Discount Code Tool
When creating a discount set, enable “Expire individual codes” and set the number of days. Each code created under that discount set will have its own expiration date: creation date + N days.

The setting is straightforward:
- Check Expire individual codes
- Enter the number of days in Expire codes after (days)
- Create the discount set
From that point, every code generated — whether from a bulk batch or from a Shopify Flow trigger — expires that many days after it was created.
What this enables
Rolling batch campaigns: generate codes for a physical mailer drop. Codes in that batch expire 60 days after generation. Generate a second batch two months later — those codes also get 60 days from their creation date. Each cohort has the same redemption window regardless of when the batch was produced.
Fair affiliate programs: each affiliate receives a batch of codes. Their 90-day window starts from when their codes were created, not from some shared campaign start date.
Automated expiry in Shopify Flow: combine per-code expiry with the Flow integration. When a customer signs up for email marketing, Flow triggers, generates a unique code, and sends it. That code expires 7 days after it was created — giving each subscriber a fair 7-day window from the moment they signed up, not from when you set up the campaign.
Urgency without a shared countdown: abandoned cart flows, win-back sequences, birthday rewards — all benefit from a code that expires relative to when it was issued, not a fixed date. A “expires in 48 hours” message only has teeth when the code actually expires 48 hours after delivery.
Compared to other approaches
Most bulk discount apps set one expiration date for all codes in a batch. Event-triggered apps (Klaviyo flows, Discounteo) support rolling expiry but cannot pre-generate a batch — they only create codes at send time.
The Bulk Discount Code Tool is the only app that combines:
- Pre-generate a large exportable batch (CSV export for physical mailers, printing, CSV imports)
- Each code expires individually based on its creation date
This means you can produce 50,000 codes today, export to CSV, and hand batches to different distributors. Each sub-batch gets its own fair window without any extra setup.
Use cases
Print and mail campaigns: generate codes before your print deadline. Set expiry to 60 or 90 days. Codes distributed with early drops and late drops all get equal time, even though they were created at the same moment.
Influencer programs: generate a unique code per creator. Each code expires 30 days after you create it — forcing influencers to promote within their window.
Partner and reseller distribution: a reseller receives a batch to distribute to their customers. Codes expire 90 days from creation, giving resellers a fixed distribution window.
Shopify Flow + per-code expiry: set up a welcome email flow. When a customer subscribes, Flow generates a unique code that expires 7 days later. Every subscriber gets a 7-day window from the moment they subscribed — not from the month you launched the campaign.
Get started
Install Bulk Discount Code Tool from the Shopify App Store.
Create a discount set, enable per-code expiry, set the number of days, and generate your batch. Export to CSV for distribution or connect to Shopify Flow for automated delivery.
Questions about per-code expiry or rolling batch campaigns? Contact us.