5X AOV | 2X Conversions | $30M+ Additional Revenue
Shopify discount codes are alphanumeric strings customers enter at checkout to redeem a discount, and they sit at the center of nearly every promotional, retention, and partnership campaign a Shopify store runs. Shopify supports four discount types (percentage off products, percentage off order, free shipping, and Buy X Get Y), and within each of those, a Shopify store can create either a single shared code (one code used by many customers) or a batch of bulk unique codes (many codes, each used by one customer). Setting up a single code takes 11 steps in the Shopify admin. Generating bulk unique codes natively uses Shopify's built-in Generate codes feature, but importing a pre-existing list of codes via CSV is not supported natively, a gap filled by a discount app like Kite Discount and Free Gift, which adds CSV bulk upload, custom code formatting, and per-code usage limits on top. Shopify caps each store at 20,000,000 cumulative codes, and a single discount can apply to up to 100 specific customers, products, or variants. This guide covers:
To create a discount code in Shopify, go to Discounts then Create discount, select the discount type, choose Discount code as the method, set the value, configure customer and product restrictions, set usage limits and combinations, set active dates, then save and test. The full flow takes 11 steps in the admin. The walkthrough below uses Amount off products as the example, with the verified UI labels from the current Shopify admin documentation on discount codes.
In the Shopify admin, click Discounts in the left sidebar, then click Create discount in the top-right.
Choose Amount off products (or Amount off order, Free shipping, Buy X get Y depending on the campaign).
Under Method, select Discount code. In the Discount code field, type the code customers will use (for example, WELCOME10) or click Generate code for a random alphanumeric string.
Under Value, select Percentage or Fixed amount and enter the discount amount.
Under Applies to, choose All products, Specific products, or Specific collections. A single discount code can apply to up to 100 specific customers, products, and variants combined before Shopify returns an error[2].
Under Minimum requirements, choose None, Minimum purchase amount, or Minimum quantity of items. This sets a purchase floor for the discount to apply.
Under Eligibility, choose All customers, Specific customers, Customer segments, or Markets. Customer segments let operators limit codes to VIPs, lapsed customers, or other tagged groups.
Under Usage limits (labeled Maximum discount uses on mobile), two separate checkboxes are available:
• "Limit number of times this discount can be used in total", sets a store-wide cap on total redemptions
• "Limit to one per customer", tracks redemption by the customer's email or phone
Both can be checked simultaneously. By default, codes have unlimited uses.
Under Combinations (or Combines with on mobile), check which discount classes the code can stack with: Product discounts, Order discounts, or Shipping discounts. By default, codes do not combine. Customers can apply a maximum of 5 product or order discount codes plus 1 shipping discount code on the same order[2].
Under Active dates, set the start date in the calendar. To set an expiry, click Set end date and choose the end date. Without an end date, the code never expires. For a same-day code, use the same calendar day for both start and end.
Click Save. Before distributing the code, place a test order and apply the code at checkout to confirm the discount value, product scope, and expiry behavior. Once verified, the code is ready to share.
To generate unique discount codes on Shopify in bulk, a Shopify store has two paths. The first is Shopify's native Generate codes feature, which creates a batch of unique single-use codes tied to one parent discount. The second is a third-party discount app like Kite Discount and Free Gift, which adds CSV upload, advanced code formatting (custom prefixes, suffixes, controlled character length), and per-code usage limits on top of native generation. Native bulk generation works for simple campaigns where the store only needs random single-use codes under one parent discount. An app becomes necessary the moment the campaign requires CSV import of pre-existing codes, per-code expiry, branded code prefixes, or richer per-code attribution analytics. The decision is straightforward: creating new codes from scratch with no format control, native is fine; importing existing codes, branding the format, or tracking redemption per code, an app is the only path.
Shopify has a built-in bulk generator for stores that only need random single-use codes under one parent discount and do not need to import a pre-existing list. The native Shopify generate discount codes flow:
• Go to Discounts and click Create discount.
• Choose the discount type (Amount off products, Amount off order, Free shipping, or Buy X Get Y).
• Under Method, select Discount code.
• A Generate codes option appears next to the discount code field. Click it to generate a batch of unique single-use codes tied to the parent discount.
• Specify the quantity (Shopify allows up to 20,000,000 cumulative codes per store).
• Save the discount. Shopify generates the codes in the background and makes them available for export.
All bulk discount codes generated this way inherit the same discount value, product scope, customer eligibility, usage limits, and expiry from the parent discount. Each code is unique and single-use by default, which is the correct setup for most attribution-driven campaigns. Codes can be exported as CSV from the Shopify admin and distributed via email, SMS, or any other channel. This is the simplest method for generating bulk discount codes on Shopify without a third-party tool.
Native generation works for straightforward campaigns but has six real constraints worth knowing about before a Shopify store leans on it for anything complex:
• No CSV import. Shopify does not support uploading a pre-existing list of discount codes via CSV. The Shopify Help Center on exporting discounts confirms codes can be exported to CSV but never imported. This is the single biggest limitation when migrating from another platform or integrating with an external loyalty system.
• 20,000,000 cumulative code cap per store. Once a store hits this limit, codes must be deleted before new ones can be created. Apps cannot bypass this cap.
• 100-item limit per discount code. A single code can apply to a maximum of 100 specific customers, products, and variants combined before Shopify returns an error.
• No per-code expiry. All codes in a batch share the same expiry date inherited from the parent discount. Per-code expiry (for example, a 7-day countdown from the moment a customer receives the code) requires an app.
• Limited code format control. Native generation produces random alphanumeric strings. There is no built-in option for custom prefixes (BRAND-XXXX), suffixes (XXXX-2026), or controlled character length.
• Basic per-code analytics. Native reporting aggregates redemption data at the parent discount level. Per-code redemption tracking with detailed attribution (which influencer drove which redemptions, which abandoned cart converted) requires an app.
When the native Generate codes feature falls short, a discount app fills the gap. Kite Discount and Free Gift is the practical choice on Shopify for bulk code generation because its Discount Generator supports three generation modes in one workflow, including the CSV upload that Shopify does not support natively.
Within Kite, the Discount Generator offers three generation modes:
• Randomly Generate: Kite creates randomized unique codes with full format control, including custom prefix or suffix, custom character length, and the choice of alphanumeric, alphabetic, or numeric output.
• Upload List: Import a pre-defined list of codes via CSV. This is the workflow Shopify does not support natively, and the most common reason Shopify stores install Kite for bulk code work.
• Manual Entry: Type codes individually. Useful for small batches of high-value branded codes (for example, 20 codes for a press launch or 50 codes for a VIP event).
The setup flow in Kite:
Step 1: Create or open a promotion that uses the code-level discount method. Automatic discounts cannot generate bulk codes; the discount must require customer entry at checkout.
Step 2: From the active promotion or the create promotion page, scroll down and click Generate codes.
Step 3: Search for and select the discount to generate codes for. A summary of the discount displays for confirmation.
Step 4: Choose the generation method: Randomly Generate, Upload List, or Manual Entry.
Step 5 (Randomly Generate): Enter the quantity (for example, 1,000), customize the prefix or suffix, set the character length, and choose the randomness type. A real-time preview shows the format.
Step 6 (Upload List): Attach the CSV containing the pre-existing codes. Kite parses each row and creates it as a unique discount code under the parent discount.
Step 7 (Manual Entry): Type each code into the input field.
Step 8: Optionally enter an email address to be notified when processing completes. Click Generate.
Step 9: Once Kite finishes, select the codes and click Export to download the final list.
Kite also enforces per-customer and total use limits on each bulk-generated code, so each unique code can be restricted to one use per customer and capped at a total redemption count. This is essential for win-back, abandoned cart, and loyalty campaigns where the entire purpose of bulk unique codes is to prevent code sharing and resale on coupon aggregator sites.
Most public sales run fine on a single shared code (SUMMER25 used by everyone). Bulk unique discount codes start mattering the moment a Shopify store needs to know which customer redeemed which code, or which partner drove which sale. A single shared code makes that impossible: every redemption in the Shopify admin looks identical, the code leaks onto coupon aggregator sites within days, and there is no clean way to tie a sale back to a specific influencer, email, or campaign. Bulk unique codes fix all three. Six common reasons Shopify stores generate bulk unique discount codes:
Each influencer gets a uniquely branded code (for example, JANE-FITNESS-20) that functions as both a discount and an attribution identifier. When a customer enters the code at checkout, the Shopify store can pull the redemption count per influencer from the Shopify admin export, calculate revenue attributed to that influencer, and decide whether to renew the partnership, increase the budget, or end it. Without unique codes per influencer, attribution falls back on UTM parameters or self-reported claims, both of which break down in cross-device, cross-browser, and post-cookie environments. A unique code is the cleanest possible attribution signal because it is captured at the point of purchase by the customer.
Klaviyo, Omnisend, or Shopify Email triggers an abandoned cart email sequence at 1, 6, and 24 hours after a customer abandons checkout. To prevent the recovery offer from leaking onto coupon aggregator sites (Honey, RetailMeNot, Rakuten, Capital One Shopping), each abandoned cart receives its own single-use unique code with a short expiry window (typically 24 to 72 hours). Even if the customer screenshots the code and shares it, it stops working after one redemption. This protects margin, preserves the urgency of the recovery offer, and prevents the kind of code-stuffing that turns a 10% abandoned cart recovery offer into a 10% storewide discount overnight.
Lapsed customers (typically 90 or more days since last purchase) receive a personal single-use code via email or SMS. Because the code is unique and tied to one customer's email, a Shopify store can offer a steeper win-back discount (25 to 40%) than it would in a public sale (10 to 15%) without worrying about the offer being scraped, shared on coupon sites, or stacked across multiple customer accounts. The unique code makes the offer functionally personal even if the underlying email template is the same for thousands of lapsed customers.
Each loyalty tier member receives a personal code (for example, GOLD-CUST-X4F92) tied to their account and redeemable once per reward earned. Loyalty platforms like Smile.io, Yotpo, LoyaltyLion, and Stamped generate these codes externally based on points balances and member activity, and the codes need to be imported into Shopify to be redeemable at checkout. This is one of the most common reasons a Shopify store running an external loyalty program needs bulk CSV upload functionality, and it is the single biggest gap in Shopify's native discount tooling for that use case.
Each affiliate, wholesale partner, or media partner receives a branded code (for example, PARTNER-NAME-50) that functions as their branded checkout offer and attribution mechanism in one. Affiliates often run their own marketing channels (newsletters, YouTube, podcast sponsorships, blog reviews, paid social), and a unique branded code is both the offer they promote and the data point that lets the store measure performance per partner. Affiliate platforms like Refersion, GoAffPro, and ShareASale integrate with Shopify by either generating codes inside Shopify or pushing pre-generated codes into Shopify via CSV.
Cancelled subscribers receive a unique reactivation code with a hard expiry (typically 7 days). The unique code prevents the reactivation offer from being scraped and republished by ex-subscribers, and the short expiry creates time pressure that converts higher than open-ended reactivation offers. Subscription platforms like Recharge, Smartrr, and Loop integrate with Shopify discount codes and can trigger the issuance of a reactivation code automatically when a subscriber cancels.
The common thread across all six: a Shopify store needs to know who redeemed what, or which partner drove which sale. A single shared code cannot deliver that. Bulk unique codes can.
Here is a common situation a Shopify store hits: a list of discount codes already exists outside Shopify, and those exact codes need to work at Shopify checkout. Shopify does not support CSV import of discount codes natively. The Shopify Help Center is explicit on this point:
"Discounts can be exported only to a CSV file. You can't import discount codes to your store using CSV files."
There is no other native import path documented anywhere in the Shopify admin: no API-based import UI, no bulk upload tool, no built-in connector for external loyalty or affiliate platforms. This is the single biggest gap in Shopify's discount system for any Shopify store running multi-platform, external-loyalty, or partner-attribution campaigns.
The reason a Shopify store needs CSV bulk upload (rather than generating fresh random codes inside Shopify) is that the codes already exist somewhere else and have to keep working. Six common reasons:
• Migrating from another ecommerce platform (WooCommerce, Magento, BigCommerce, Squarespace, Wix) where active codes are already in customers' inboxes, on landing pages, or in printed marketing materials and need to keep working after the migration to Shopify.
• External loyalty or rewards platforms (Smile.io, Yotpo, LoyaltyLion, Stamped, or custom-built systems) that generate codes externally based on points balances and need those codes imported into Shopify for redemption at checkout.
• Printed codes on flyers, packaging inserts, scratch cards, QR campaigns, or unboxing materials where the physical code is already in circulation and cannot be regenerated.
• Partner or affiliate codes created in an affiliate platform (Refersion, GoAffPro, ShareASale, Awin, Impact) with specific branding (for example, INFLUENCER-JANE-001) that need to be bulk imported into Shopify for redemption tracking.
• Gift card or voucher providers whose codes need to be redeemable in Shopify alongside Shopify's native gift cards.
• Bulk B2B or wholesale codes distributed through a sales rep or partner network where each customer account receives a unique code generated outside Shopify in a CRM or spreadsheet. These are often paired with Shopify tiered pricing for volume-based wholesale discounts.
Shopify's native Generate codes feature only creates random new codes, so it does not solve the import problem. You can not technically bulk upload discount codes on Shopify natively. A Shopify store has three workable paths to get pre-existing codes live in the store:
• A third-party discount app. Apps like Kite Discount and Free Gift and Bulk Discount Code Bot use Shopify's Admin API on the backend to push externally-generated codes into the store. This is the fastest path for a non-technical Shopify store because the CSV upload is built into the app's UI and no code is required.
• Custom development against the Shopify Admin API. A developer can write a script against the Price Rules and Discount Codes API endpoints to programmatically create specific codes in bulk. This is the right path for stores with engineering resources and a one-off migration or recurring sync requirement that does not fit any app's workflow.
• Shopify Flow. Flow can create individual discount codes triggered by events (a new customer signup, an order tag, a loyalty tier change), but it is not a true bulk import path for a pre-existing list. Flow fits recurring per-event code issuance, not the one-time migration of thousands of existing codes.
For most Shopify stores, the third-party app path is the practical choice. The walkthrough below uses Kite Discount and Free Gift because its Discount Generator surfaces CSV upload as a first-class option alongside random generation and manual entry.
Kite Discount and Free Gift solves the CSV import gap through its Discount Generator feature, which includes Upload List as one of three generation modes. The full bulk upload workflow:
Step 1: Install Kite Discount and Free Gift from the Shopify App Store and open the app from the Shopify admin.
Step 2: Create a new discount campaign of any type (Free Gift, BOGO, Volume Discount, Order Discount, Shipping Discount) or open an existing campaign. The discount must use the code-level method, meaning customers enter the code at checkout. Automatic discounts cannot accept bulk uploaded codes.
Step 3: Within the campaign editor, scroll down to the Discount Generator section and click Generate codes.
Step 4: Search for and select the parent discount campaign. A summary of the discount value, product scope, customer eligibility, and usage limits displays for confirmation. Every code in the CSV inherits these settings from the parent discount.
Step 5: Choose Upload List as the generation method. The other two options (Randomly Generate and Manual Entry) are for creating new codes; Upload List is the option for importing pre-existing codes.
Step 6: Attach the CSV file containing the pre-existing discount codes. The format is one code per row in a single column. Kite parses each row and creates it as a unique discount code under the parent campaign.
Step 7: Optionally enter an email address to be notified when processing completes. Bulk uploads of 10,000 or more codes can take several minutes to process.
Step 8: Click Generate. Kite imports the CSV, creates each row as a unique discount code in Shopify, and links each code to the parent campaign.
Step 9: Once processing completes, select the imported codes and click Export to download the final list. Use the export to verify that every code from the original CSV is now live in Shopify and ready to redeem at checkout.
Once the codes are uploaded, they appear in the Shopify admin under the parent discount and behave identically to any other Shopify discount code. Customers enter them at checkout, redemption is tracked in the admin export, and per-code limits configured in Kite are enforced automatically on every redemption.
Two things often get conflated in Shopify discount conversations: types of Shopify discounts and types of Shopify discount codes. They are not the same. Types of discounts refers to what the discount does at checkout, meaning the value structure: percentage off products, percentage off order, free shipping, or Buy X Get Y. Types of discount codes refers to how the code itself is structured and distributed, meaning the code structure: single shared codes used by many customers vs. bulk unique codes used by one customer each, manually-named codes vs. auto-generated codes, codes created inside Shopify vs. codes uploaded from outside. A Shopify store has to make decisions on both axes when planning a campaign, and the type of code chosen often matters as much as the type of discount.
The Shopify store types the code name (SUMMER25, WELCOME10, BLACKFRIDAY) and the same code is redeemed by many customers. Best for storewide sales, email broadcasts, social media promotions, and any campaign where the code itself carries marketing weight (a memorable code is part of the offer). The trade-off is no per-customer attribution and full exposure to code-stuffing and coupon aggregator scraping.
Shopify generates a random alphanumeric string as the code. Functionally identical to custom-named single shared codes in how they redeem, but the random format makes them harder to guess, share publicly, or surface on a coupon aggregator site. Used when the code is sent privately to a specific customer or small group (for example, a VIP, a service recovery situation, or a private beta cohort) and does not need to be memorable.
Shopify or a discount app generates a batch of unique random codes, each redeemable once. This is the right setup for influencer attribution, abandoned cart recovery, win-back campaigns, and any campaign where per-customer or per-partner tracking is the goal. Native Shopify supports this through the Generate codes feature; apps add format control and per-code analytics on top.
Bulk unique codes with a custom prefix or suffix (for example, INFLUENCER-JANE-X4F2 or BRAND-NAME-X7K9). This combines the marketing weight of a branded code with the per-customer attribution of a unique code. Native Shopify cannot create these because its bulk generation produces random strings only with no prefix or suffix control. A discount app like Kite is required to generate branded prefix bulk codes.
Pre-existing codes generated outside Shopify (in a loyalty platform, affiliate platform, gift card system, or the store's previous ecommerce platform) and bulk uploaded into Shopify via CSV. Native Shopify does not support CSV import; an app is required. Once uploaded, imported codes behave exactly like Shopify-generated codes at checkout, with the same redemption tracking and the same admin visibility.
The four types of Shopify discounts (Amount off products, Amount off order, Free shipping, and Buy X Get Y) are a separate axis from the type of code. The right campaign uses the right combination of both: a type of discount (what the customer gets) and a type of code (how the code is structured and distributed). For campaigns that pair tiered pricing structures with discount codes, see our guide on how to set up Shopify tiered pricing, and for stacking and combining discounts, see how to combine discounts on Shopify.
1. Shopify Help Center, Discount types: the four core discount types.
2. Shopify Help Center, Discount codes: code creation, limits, expiry, customer eligibility, and combinations.
3. Shopify Help Center, Exporting discounts: native CSV export and confirmation that CSV import is not supported.
4. Kite Discount and Free Gift, Generating unique codes for a single discount campaign: bulk code generation walkthrough with three options including CSV upload.
5. Kite Discount and Free Gift, Discount code limits setup: per-customer and total usage limits.
In practice, Shopify discount codes are typically not case sensitive at checkout. A customer can usually type SUMMER20, summer20, or Summer20 and the same discount applies. The current Shopify Help Center does not explicitly document this rule, so operators should verify the behavior in their own admin with a test order before relying on it for a high-stakes campaign.
There is no functional difference. "Discount code" is the official term Shopify uses in the admin. "Coupon code" is the common term customers use and what other platforms (WooCommerce, Magento, BigCommerce) use in their admin interfaces. Both refer to the same thing: an alphanumeric code a customer enters at checkout to receive a discount.
Yes, but only if the codes are configured to combine. Under the Combinations setting on each discount, operators can mark a code as combinable with other product, shipping, or order discounts. Customers can apply a maximum of 5 product or order discount codes plus 1 shipping discount code on the same order.
At Shopify POS, staff apply discount codes during checkout by selecting the cart, tapping Discount, and entering the code (or selecting a customer who has a personal code attached). The staff member needs the "Apply discount codes" permission, which is distinct from the "Apply custom discounts" permission. Both are configured under Settings then Users then Roles then Permissions then POS permissions in the Shopify admin.
In the Shopify admin, go to Discounts and click Export. Shopify offers four scope options (Current page, All discounts, Selected discounts, or Current search) and two format options (CSV for Excel, Numbers, and other spreadsheet programs, or Plain CSV file for text editors). Click Export discounts to download the file. The reverse (CSV import of codes) is not supported natively.
Discount codes can be distributed through several channels: email marketing (Shopify Email, Klaviyo, or another ESP), SMS campaigns, post-purchase emails (triggered automatically by Shopify order flows), product page banners, and direct customer service interactions. The right channel depends on the campaign type and the customer relationship stage.
.avif)