Shopify Discount Codes, Bundles & Upsells: Setup and the 30-Day Rule
In short: You create a Shopify discount code in the admin under "Discounts": choose the discount type, code or automatic discount, value, conditions, combinations and active dates. Bundles work with the free Shopify Bundles app, cross-sells with Search & Discovery. In Germany, when you publicly advertise a price reduction, you must use the lowest price of the last 30 days as the reference price (§ 11 PAngV, the German Price Indication Ordinance), and countdowns must not create false urgency.
Discount codes, bundles and upsells are the fastest levers for more revenue per visitor. This guide shows you how to set up a Shopify discount code step by step, combine discounts, build bundles and promote offers without breaking German pricing law. It is part of our overview Shopify marketing: how to get your first sales.
Discount types in Shopify
Shopify has four basic types. Each of them can run as a discount code that customers enter at checkout, or as an automatic discount that applies without any input.
| Discount type | Example | Good for |
|---|---|---|
| Amount off products | 20% off the "Summer" collection | Sales on individual products or collections |
| Amount off order | €10 off orders of €50 or more | Welcome discount, larger carts |
| Buy X get Y | Buy 2, get 1 free | Quantity deals, free add-ons |
| Free shipping | Free shipping from €40 | Reducing abandonment due to shipping costs |
Rule of thumb: codes suit audiences you address directly, such as newsletter subscribers or an influencer's followers. Automatic discounts suit offers every visitor should get. According to Shopify, a store can have up to 25 automatic discounts active at the same time, app discounts included.
Create a Shopify discount code: step by step
According to the Shopify Help Center, this is how you create a percentage or fixed-amount code:
- In your Shopify admin, open Discounts and click Create discount.
- Choose Amount off products or Amount off order.
- Under Method, choose Discount code and enter a name, such as WELCOME10, or let Shopify generate a code.
- Under Value, choose Percentage or Fixed amount.
- Under Applies to, limit it to specific products or collections if needed.
- Under Minimum purchase requirements, optionally set a minimum order value or minimum quantity.
- Under Eligibility, decide who may use the code: everyone, specific customers, customer segments or markets.
- Under Maximum discount uses, limit the total number of uses and, if you like, to one use per customer.
- Under Combinations, decide which other discounts the code can be combined with.
- Under Active dates, set a start date and optionally an end date. Then click Save.
Combine discounts and exclude products
By default, the best single discount applies per order. If discounts cannot be combined, Shopify automatically applies the one that is best for the customer. For two discounts to apply together, the matching combination must be allowed on both.
According to the Shopify Help Center, these limits apply:
- Customers can use up to 5 product or order discount codes and 1 shipping discount code per order.
- Every store can combine order discounts with shipping discounts, product discounts with shipping discounts, and product discounts with each other if they apply to different items.
- Combining product discounts with order discounts, or order discounts with each other, only works in eligible stores, for example stores without legacy checkout customizations.
- The calculation order is: product discounts first, then order discounts, shipping discounts last.
Example: you want 10% off with WELCOME10 plus free shipping from €40. Create both, allow combination with shipping discounts on the code, and allow combination with order discounts on the shipping discount. The other way round: if the code should not apply together with free shipping, leave that combination off.
Exclude already reduced items from a discount
Shopify has no "excluding" field. You flip it around: the discount only applies to a collection that does not contain the reduced items. The easiest way is to give all regularly priced products a tag such as "discount-eligible", create an automated collection from it and select that collection under Applies to. How collections with conditions work is explained in the article Collections and menus in Shopify.
The same principle helps with personalized products: if the surcharge for personalization is charged as a separate product or through an app, you can limit the discount to the base product. Whether this works depends on how your personalization app handles the surcharge. How such apps implement surcharges technically is covered in the article on personalized products with Shopify.
You can also do it without tags, using the compare-at price: according to the Shopify Help Center, automated collections support the condition "Compare-at price" with the choice of whether a value is set or not. A collection with all products without a compare-at price contains your regularly priced products, and you limit the code to it. Watch out for variants: if only one variant has no compare-at price, the whole product lands in this collection. And a compare-at price of 0.00 counts as set.
Sale prices with compare-at price
For a classic strikethrough price you don't need a discount, but the compare-at price on the product. Open the product, click Compare-at price in the Pricing section, enter the previous price as the compare-at price and the new one as the price, and save (Shopify Help Center).
A common mistake: after the promotion, prices stay reduced. Unlike a discount with an end date, the compare-at price does not expire on its own. Put the regular price back into the Price field and clear the Compare-at price field completely. The value 0.00 is not the same as an empty field. With many products, the bulk editor or a CSV export is faster.
You can't find the compare-at price field? If a product has variants, price and compare-at price are no longer on the product but on each individual variant. Open the variant or edit all of them together in the bulk editor. By the way, with the reverse condition, "compare-at price is set", you can build a sale collection that fills and empties itself.
The 30-day rule: what the Price Indication Ordinance requires
When you announce a price reduction to consumers in Germany, you must state the lowest total price of the last 30 days before the reduction (§ 11 (1) PAngV, Preisangabenverordnung, in force since May 28, 2022). In 2024 the Court of Justice of the European Union clarified that this 30-day lowest price must be the reference point. It is not enough to mention it in small print and calculate the discount from a higher price (CJEU, judgment of September 26, 2024, C-330/23).
According to IT-Recht Kanzlei (German), it works like this:
| Situation | 30-day rule? |
|---|---|
| Strikethrough price via the compare-at price field | Yes, the compare-at price must be the lowest price of the last 30 days |
| "20% off everything", publicly advertised, even if the deduction only happens in the cart | Yes |
| Discount code you announce publicly, for example in a banner or on Instagram | Yes |
| Individual code for a single person | No, individual reductions are exempt (§ 11 (4) PAngV) |
| Comparison with the manufacturer's recommended retail price (UVP) | No, but the recommended retail price must be recognizable as such |
| Bundle price compared to the sum of the individual prices | No, if it is clear that the sum of the individual prices is meant |
| "Buy 2, get 1 free" | No |
Where the line runs for newsletter codes that are sent in a personalized way but go to all subscribers has not been conclusively settled. The safe route: always state the discount relative to the 30-day lowest price.
Countdowns and scarcity: what is allowed
A countdown is permitted if it tells the truth. Under No. 7 of the annex to the UWG (German Act Against Unfair Competition), it is prohibited to falsely claim that an offer is only available for a very short time in order to push customers into an immediate decision.
- Allowed: A timer counting down to the real end of a promotion, after which the price actually goes up again or the code no longer works. In 2026 the Regional Court of Deggendorf (LG Deggendorf) held a countdown to be permissible because it only showed the end of the promotional price (judgment of March 27, 2026, case no. 1 HK O 6/25, not final, appeal pending at the Higher Regional Court of Munich, IT-Recht Kanzlei report (German)).
- Not allowed: A timer that simply restarts after it runs out, or starts at 15 minutes individually for each visitor, even though the offer is permanent. The Regional Court of Bochum (LG Bochum) classified exactly such a case as misleading back in 2015 (IT-Recht Kanzlei report (German)): after running out, the clock jumped back to 96 hours, while the offer and price stayed the same.
- Equally risky: Made-up stock levels ("Only 3 left!") and made-up visitor numbers ("27 people are looking at this right now").
For real promotions, many stores use an announcement bar with a timer. Most themes already include a simple announcement bar; for countdowns you usually need an app from the Shopify App Store. Make sure you can set a fixed end date. Whichever app you use: always set the timer to the real end of the promotion and don't use any "evergreen" or reset feature.
Set up bundles
A bundle sells several products at a combined price. The free app Shopify Bundles covers two cases:
- Fixed bundles: For example shampoo, conditioner and comb as a set. Customers can choose variants such as size or color for the included products.
- Multipacks: For example a 3-pack of socks at a special price.
According to the app description, inventory of the included products is synced in real time. For flexible build-your-own bundles ("mix & match") or quantity breaks directly on the product page, you need a third-party app such as Fast Bundle or Kaching Bundles from the Shopify App Store.
If you dropship, check beforehand how the app passes the bundle to your supplier. If a "bundle" arrives in Shopify as a single item, the supplier doesn't know which individual parts to ship. In the end, every included product must appear individually in the order.
Always run the numbers on bundles with your real margin. How much discount you can afford is shown in the article Calculating prices in an online store.
Upsells and cross-sells
Upselling means offering the bigger or better version. Cross-selling means offering a matching add-on product. Both work in three places:
- On the product page: With the free Shopify app Search & Discovery, you set up to 10 complementary products for each product. In the theme editor, you display them with the "Complementary products" block (Shopify Help Center).
- In the cart: Many themes show recommendations in the cart drawer; otherwise apps help.
- After the purchase: Post-purchase upsells offer an add-on product with one click after payment. This only works with apps. Search the Shopify App Store for "Post Purchase Upsell" and make sure the app lets you use German button texts.
Less is more: one well-matched add-on sells better than six random ones. On the product page, the recommendations must not crowd out the buy button. More on the layout in the article Optimizing your Shopify product page.
Sell gift cards: using Shopify gift cards correctly
A gift card is something different from a discount code: the customer pays for it, and the amount is later credited like cash. In Shopify, you find gift cards in the admin under Products > Gift cards. There you create a gift card product with denominations such as €25, €50 and €100 that customers buy in your store like any other product, or you issue individual gift cards directly in the admin, for example as compensation for a customer (Shopify Help Center).
- How does the gift card reach the customer? Shopify gift cards are digital. The buyer receives the code by email; you customize the template under Settings > Notifications. You don't have to send a physical card.
- Physical cards: Printed gift cards from Shopify are only available for Shopify POS, i.e. selling in a physical store. For printed cards in online sales, you need a gift card app or your own process.
- Validity: You can set an expiry date, but you don't have to. In Germany, gift cards are generally subject to the three-year limitation period from the end of the year of purchase. A significantly shorter period in your terms and conditions (AGB) may be invalid; the Higher Regional Court of Munich (OLG München) ruled that one year of validity is unreasonably short (Verbraucherzentrale (German)). The safest option is not to set a shorter expiry date.
- VAT: A monetary gift card that is valid for products at 7% and 19% is a multi-purpose voucher (Mehrzweck-Gutschein). VAT only arises when it is redeemed, not when the gift card is sold (§ 3 (15) UStG). If, on the other hand, it is already clear at the time of sale what it is valid for and which tax rate applies, it is a single-purpose voucher (Einzweck-Gutschein), which is taxed immediately (§ 3 (14) UStG (German)). Clarify the bookkeeping with your tax advisor.
By the way, for tax purposes a plain discount code is not a voucher, just a price reduction (§ 3 (13) UStG).
Promote your discounts: how customers find out
A discount nobody knows about sells nothing. These channels work:
- Announcement bar at the top of your store: "10% off with code SUMMER10 until Sunday". Remember the 30-day rule.
- Shareable discount link: Shopify can generate a link for every active discount that applies the code automatically, also as a QR code. You create it in the discount's detail view using the share or promote feature (Shopify Help Center). Ideal for influencers, Instagram stories and flyers.
- Newsletter pop-up: Send the code in the welcome email after confirmation. That verifies the address and works cleanly with double opt-in. How to do this in a legally compliant way is covered in the article Email marketing in Shopify.
- Tiers by cart value: "€10 off from €50, €25 off from €100" works with several automatic order discounts with a minimum order value. If you don't allow combinations, Shopify automatically applies the best one in each case.
FAQ
I removed the discount, but prices are still reduced. What should I do?
Then you probably didn't use a discount, but the compare-at price. It doesn't expire. Open the products, enter the regular price in the Price field again and clear the Compare-at price field completely. For products with variants, check each individual variant.
Why does Shopify say my discount code is invalid?
Common reasons: the discount is deactivated or expired, the customer isn't in the eligible group or market, the minimum order value hasn't been reached, the per-customer limit is used up, or the code can't be combined with another active discount. Check the discount in the admin point by point.
Can I show discounts and strikethrough prices as a small business under the Kleinunternehmerregelung?
Yes. The small business rule (Kleinunternehmerregelung) only affects VAT, not price advertising. The same rules apply as for everyone: for publicly advertised price reductions, the lowest price of the last 30 days is the reference price. Separately, you must not show "incl. VAT" in your store and you need the note referring to § 19 UStG on your invoices.
Can I create a 100% code for product testers?
Yes. Create an amount-off discount of 100%, limit it to the test products and set the usage limit to 1. If needed, cover shipping costs with an additional shipping discount. Note: reviews from testers must later be labeled as a "free test product".
Does the 30-day rule also apply to my newsletter discount code?
The rule doesn't apply to an individual code that only one person receives. For a code that all subscribers or visitors receive, there is a strong argument that it is an announced price reduction. The line has not been conclusively settled. The safest approach is to always calculate the discount from the 30-day lowest price.
How do I make free shipping apply only to standard shipping and not to express?
According to the Shopify Help Center, the free shipping discount has the option "Exclude shipping rates over a certain amount". If standard costs €4.90 and express €9.90, enter €5, for example. Then only standard shipping becomes free, and express remains paid.
How do I prevent a discount code from applying together with free shipping?
Open the discount code and turn off combination with shipping discounts under Combinations. Check this on the shipping discount itself as well. Discounts are only combined if both allow it. If combination is off, the customer automatically gets whichever of the two discounts is better for them.
Read next
As of: October 2026. Menu paths according to the Shopify Help Center. This article is not legal or tax advice.
Appsentials
The matching app.
We build Shopify apps for EU merchants. This one solves the topic of this article:
Countdown timers, announcement bars and banners with fixed scheduling and targeting.
Free plan availableView in the App Store →