Skip to content

Keep Physical Gift Cards Out of Discounts

Set up Shopify discounts so Totus physical gift cards are always charged full price

Your Totus physical gift card is a regular Shopify product, not a Shopify gift card. That means an Amount off order discount takes money off the gift card along with everything else in the cart.

This guide shows how to run the same promotions as product discounts that cover everything in your store except gift cards. It is for brands that sell Totus physical gift cards in Shopify, and for the Shopify partners who set up their discounts. Screenshots are from a Totus test store, so your product names will differ.

Gift card promotions you plan on purpose, such as a bonus card offer, stay separate. Set those up with your Totus Client Success Manager.

Two collections and one discount type do the work. You can name the collections anything; this guide uses the names below.

  1. Non-discountable items holds every gift card product.
  2. Discount-eligible items holds all your products, minus everything in Non-discountable items.
  3. Each promotion is an Amount off products discount that applies only to Discount-eligible items.
  4. At checkout, merchandise gets the discount. Gift cards are charged their full amount.
  5. When you add a new gift card product, you put it in Non-discountable items before you publish it.

The finished setup in Products › Collections: two collections, each with its rule shown under Conditions.

Figure 1. The finished setup in Products › Collections: two collections, each with its rule shown under Conditions.

PartTaskWhere
1Make the two collections and check themProducts › Collections
2Set up every new promotion as Amount off products, never Amount off orderDiscounts › Create discount
3Move your current order discounts: convert them with the Admin API, or replace them in the adminAdmin API or Discounts
4Test, then go liveYour storefront checkout

Your Totus Client Success Manager can confirm which of your products and variants are Totus gift cards.

  • Check which collections screen your store has. Open Products › Collections and any collection. If you see sources (Products, Variants, Collection, App) and an Exclude option, you have the new collections model. If not, you have legacy smart collections; use the tag method in Step 2.
  • List every gift card product and variant in your store.
  • List your active and scheduled order discounts, with their codes, limits and dates.
  • Decide how you will move existing order discounts. Converting with the Admin API keeps codes and history. Replacing them in the admin creates new discounts and needs a naming plan (Part 3).
  • Pick a quiet time to switch. Customers with a code in hand should not notice.

A product discount is not an order discount

Section titled “A product discount is not an order discount”

The switch keeps gift cards out, but it can change how a promotion behaves. Review these four settings on every discount you move.

SettingAs an order discountAs a product discount
What it applies toEvery item in the cartOnly items in Discount-eligible items
Fixed amount, for example $10 offOnce per orderOnce per eligible item, unless Only apply discount once per order is on
Minimum purchaseThe whole cart countsOnly eligible items count; gift cards no longer help reach it
CombinationsOrder discount rulesProduct discount rules; check the other discounts it must combine with

Go to Products › Collections › Add collection.

  1. Title it Non-discountable items. A short description helps the next person who opens it.
  2. Under Sources › Products, add the condition Tag includes non-discountable. A tag rule picks up new gift card products as soon as they are tagged.
  3. Leave the collection unpublished on all sales channels (0 channels). Discounts can still use it.
  4. Save.

Non-discountable items, configured with a tag rule and no sales channels.

Figure 2. Non-discountable items, configured with a tag rule and no sales channels.

  1. Title and description.
  2. Condition: Tag · includes · non-discountable.
  3. 0 channels: the collection is hidden from shoppers but still usable by discounts.

Tag each gift card product. Open each gift card product and add the tag non-discountable under Product organization › Tags, then save. The product joins the collection automatically.

A gift card product with the tag applied. Shopify lists the collection it now belongs to.

Figure 3. A gift card product with the tag applied. Shopify lists the collection it now belongs to.

  1. Collections shows Non-discountable Items once the tag is saved. You don’t add it here by hand.
  2. Tags includes non-discountable.

Scroll to Collection items and confirm that every gift card product is listed.

Collection items in Non-discountable items, listing every gift card product.

Figure 4. Collection items in Non-discountable items, listing every gift card product.

  1. Every gift card product (physical and digital) appears here. Anything missing needs the tag.

Go to Products › Collections › Add collection.

  1. Title it Discount-eligible items.
  2. Include: in the Products source, add Status is equal to Active. This takes every product that is live, whether or not it tracks inventory.
  3. Exclude: click Exclude, switch Products to Collection, and add Non-discountable items. An exclusion always wins over an inclusion, so a gift card stays out even though it is Active.
  4. Leave it unpublished on all sales channels, and save.

Discount-eligible items: every active product, minus the Non-discountable items collection.

Figure 5. Discount-eligible items: every active product, minus the Non-discountable items collection.

  1. Title and description.
  2. Include: Status · is equal to · Active.
  3. Exclude: the Non-discountable Items collection.
  4. 0 channels: unpublished.

Open Discount-eligible items and scroll to Collection items. Search for each gift card product. None should appear. Then open a few ordinary products and confirm they do.

A miss caught by the check. This gift card was never tagged, so it is still discountable.

Figure 6. A miss caught by the check. This gift card was never tagged, so it is still discountable.

Go to Discounts › Create discount › Amount off products. Use this for every new store-wide promotion.

Choose Amount off products. Amount off order cannot leave out a collection.

Figure 7. Choose Amount off products. Amount off order cannot leave out a collection.

A $10-off promotion set up as a product discount on Discount-eligible items.

Figure 8. A $10-off promotion set up as a product discount on Discount-eligible items.

  1. The page heading confirms the type: Amount off products.
  2. Discount value: the same percentage or amount as the promotion.
  3. Applies to: choose Specific collections, then browse to Discount-eligible items.
  4. For a fixed amount, check Only apply discount once per order. Unchecked, $10 comes off every eligible item.
If the promotion is…Set the product discount to…
A percentage, for example 20% offThe same percentage
A fixed amount, for example $10 offThe same amount, with Only apply discount once per order checked. Unchecked, $10 comes off every eligible item.
A minimum purchase, for example $50Decide the new minimum. Only eligible items count now, so the same number is harder to reach when a cart has a gift card.
Combined with other discountsThe same choices, then open each other discount and confirm it allows the combination too

The rest of the form. Copy these from the original promotion.

Figure 9. The rest of the form. Copy these from the original promotion.

  1. Minimum purchase: Shopify notes it “Applies only to selected collections”. Gift cards no longer count toward it.
  2. Maximum discount uses: keep the same total limit and Limit to one use per customer setting.
  3. Combinations: match the original, then confirm the other discounts allow it too.

Keep everything else as it was:

  • Discount code and title
  • Start and end dates
  • Customer eligibility
  • Total usage limit
  • Limit to one use per customer
  • Sales channels

The same $10 promotion built as Amount off order. It discounts gift cards too.

Figure 10. The same $10 promotion built as Amount off order. It discounts gift cards too.

Part 3: Move your existing order discounts

Section titled “Part 3: Move your existing order discounts”

The Shopify admin has no setting that turns an Amount off order discount into an Amount off products discount. Once a discount is created, its type is fixed in the admin. You have two ways to move an existing order discount, and they are not the same thing:

A · Convert with the Admin API (recommended)B · Replace it in the admin
What happensThe existing discount is updated in place and becomes a product discountYou create a new product discount and retire the old one
Discount codeStays the sameMust be a new code, or the old discount must be deleted first (see Naming)
Usage historyKeptStarts at zero on the new discount
One use per customerCustomers who already used the code are still refusedCustomers who used the old code can use the new one
Total usage limitContinues from where it wasRestarts; set it to the remaining uses by hand
Who can do itA developer with API access (see the appendix)Anyone with access to Discounts

Open Discounts. The Type column and the summary line under each title show which discounts are product discounts and which are order discounts.

The Discounts list. Order discounts read “off entire order”; product discounts name the collection.

Figure 11. The Discounts list. Order discounts read “off entire order”; product discounts name the collection.

GroupWhat to do
Expired, deactivated or used upLeave alone
Single-code amount off order discountsConvert first with the API (option A), or replace them (option B)
Automatic order discountsConvert next, one at a time; check what they combine with
Bulk codes (many codes on one discount)Convert with the API only. Replacing them means reissuing every code. Check that every code keeps its history.
App or Functions discounts, Buy X get Y, special promotionsManual review with the app owner
Free shipping discountsNo change; they don’t discount the gift card itself

Whichever option you use, record each discount’s original settings, remaining uses, and what changed. That record is your rollback plan.

A developer updates each existing discount so that it applies to the Discount-eligible items collection, and, for a fixed amount, applies once per order. The appendix has the scopes, a dry-run plan and an apply step.

Test one first. Convert one low-risk discount. Then open it in the admin and check the summary panel before you convert the rest.

The summary panel of a converted discount.

Figure 12. The summary panel of a converted discount.

  1. Type reads Amount off products · Product discount.
  2. Details name Discount-eligible Items and, for a fixed amount, “Applies once per order”. The code is unchanged and the usage count under Performance has not reset.

Use this only if no one can run the API conversion. It is not a change to the old discount: it is a new discount with a new history, so plan the code name first.

  1. Open the old discount and record every setting: code, value, minimum purchase, customer eligibility, usage limits, remaining uses, combinations, dates and sales channels.
  2. Create a new Amount off products discount as in Part 2, applied to Discount-eligible items, with the same settings. If the old discount had a total usage limit, set the new limit to the remaining uses.
  3. Give it the code you chose under Naming.
  4. Retire the old discount: deactivate it if you used a new code, or rename or delete it if you are reusing the code.

Test each converted or replacement discount with these carts before you tell customers or move the next batch.

CartWhat should happen
Merchandise onlySame discount as before
Gift card onlyCode is not applied; full price
Merchandise and a gift cardDiscount on merchandise only; gift card at full price
Fixed amount, 3 eligible itemsThe amount comes off once, not 3 times
Just under and just over the minimum, with and without a gift cardDiscount applies only when eligible items reach the minimum
Customer who already used a one-use codeCode is refused (converted discounts only; a replacement starts with no usage history)
Before the start date and after the end dateCode is refused
With your other active discountsThey combine, or the better one wins, as you intend
Each currency or market you sell inSame results
  1. Convert or replace 2 or 3 discounts and test them.
  2. Place one real order that mixes merchandise and a gift card. Confirm Totus fulfills the card for its full amount.
  3. Move the rest in batches, keeping your record of each change.
  4. If a discount misbehaves, roll it back from your record: restore a converted discount’s original settings through the API, or deactivate a replacement and reactivate the old discount (possible only if you kept it under its own code).
If you…What happens
Add a new gift card productIt is discountable until you tag it or add it to Non-discountable items. Do that before you publish it.
Create a new promotion as Amount off orderIt discounts gift cards again
Rename or delete either collectionDiscounts that use it stop working as set up
Set a product to Draft or ArchivedIt leaves Discount-eligible items until it is Active again
Change the Exclude rule on Discount-eligible itemsGift cards can slip back in. Recheck Step 3.

For developers converting many discounts in place through the GraphQL Admin API. The plan step only reads and reports. The apply step writes, one small batch at a time, and only after approval.

Two API notes: read discountClasses, since the single discountClass field is deprecated. And asyncUsageCount updates in the background, so it can run behind real usage; treat remaining uses as an estimate.

Migration plan (pseudocode)
PLAN MIGRATION (dry run, no writes)
verify Discount-eligible items contains no gift card product
candidates = read ALL pages of discounts whose classes include ORDER
for each discount:
read full configuration and ALL pages of redeem codes
if expired, deactivated, or no longer ORDER:
record SKIPPED; continue
if not a single-code amount off discount (DiscountCodeBasic):
record MANUAL REVIEW; continue
remaining = UNLIMITED if usageLimit is null
else max(0, usageLimit - asyncUsageCount) # estimate
if remaining == 0:
record SKIPPED: used up; continue
patch = items: all items -> Discount-eligible items collection
if fixed amount:
keep amount; set appliesOnEachItem = false
warnings += minimum purchase now counts eligible items only
warnings += combinations now follow product discount rules
save original config, config fingerprint, patch,
remaining uses, warnings, rollback patch
return report for approval
APPLY APPROVED PLAN
require: single-discount conversion test passed
require: approval for this batch
for each approved discount, small batch first:
re-read current record
if already converted and verified: continue
if config changed since planning: record CONFLICT; continue
if now expired or used up: record SKIPPED; continue
journal BEFORE_WRITE
update existing discount by ID with the patch only
if result unclear: read back before any retry
if API refuses the change:
stop batch; record MANUAL REVIEW
do NOT recreate automatically
read back and verify:
discountClasses is PRODUCT
discount ID and redeem code IDs unchanged
usage count not lower than before
items = Discount-eligible items; value correct
limits, dates, customer rules unchanged
journal VERIFIED
run the checkout tests above
report verified, failed, skipped, manual review