Start with one authoritative offer record
A campaign message such as “ten percent off” omits most of the information checkout needs. Record the discount class, eligible products or collections, customer segment or market if any, start and end time, minimum spend, redemption limit, and whether other discounts may combine. Put the approved wording next to those settings so marketing, support and checkout work from the same offer. Shopify distinguishes product, order and shipping discounts and treats a discount code differently from a sale price displayed with a compare-at price. A store using another platform should map its own capabilities before publishing the promise. Do not say a code is universally valid merely because it exists in the admin. Validity depends on the particular cart and customer at the moment the price is calculated.
Define which cart amount the offer uses
For a minimum-spend rule, decide whether the threshold is tested against eligible goods, the whole merchandise subtotal, or a value after another discount. Then decide what shipping and tax do to the threshold and final total. Do not leave these as hidden implementation details when the advertised claim depends on them. A percentage off one product variant is different from a percentage off the order; a fixed amount applied once is different from an amount applied to each quantity. Shopify’s documentation describes distinct product, order and shipping classes and gives examples of variant-specific eligibility. When the cart changes, recalculate the discount from the canonical cart lines rather than retaining an obsolete amount from an earlier screen. The customer should see which lines actually received savings, not only a mysterious reduction at the bottom.
Treat time and usage as part of eligibility
A code launched at midnight may be active in one configured time zone but not another. Record the platform’s admin time zone and write the campaign copy with an unambiguous local end time, especially when the store sells outside Hong Kong. Shopify says its discount end date and time use the time zone displayed in the admin. Usage limits also need a precise meaning: a total campaign cap and one use per customer solve different problems. Explain what happens if a shopper begins checkout before the deadline but submits afterward; test the platform’s behavior rather than assuming the cart freezes eligibility. Preserve the terms that applied when an order was actually accepted. If a code appears exhausted but no completed order is found, investigate a held unfinished checkout before telling the customer they already used it.
Specify combinations in both directions
A shop may allow a free-shipping code beside a product discount but disallow two discounts on the same item. Record the intended combinations as a small matrix and compare them with the platform’s settings. On Shopify, each discount involved must allow a combination, and some combination types depend on merchant eligibility or plan. This makes “all codes stack” an unsafe general promise. Include automatic discounts in the review, because a customer may arrive with an automatic price reduction before entering a code. If incompatible offers are present, the checkout should show which saving applied and why another was excluded. Support staff should see the same explanation, including the code names and cart state, without needing to guess which campaign was advertised. Test the final total for the worst eligible combination as well as the most common one.
Make rejection messages actionable
“Invalid code” is a poor explanation when the code is active but the basket lacks an eligible item. Distinguish an unknown code, an expired offer, a customer restriction, an excluded product, a minimum not met, a use limit, and a combination conflict. Reveal enough to help a legitimate customer without exposing private segment rules or another customer’s history. Shopify’s own FAQ gives different checkout messages for nonexistent codes, codes inapplicable to cart items, and incompatible combinations. A custom checkout should follow the same principle even if the wording differs. Keep the entered code while the customer edits the cart, but recalculate and explain any change. Never leave a struck-through total on screen if the code has ceased to apply; the final review and payment request must match the server’s current calculation.
Rehearse a concrete basket
Consider a hypothetical cart with an eligible jacket at HK$400, an excluded accessory at HK$100 and HK$40 delivery. Suppose the merchant’s approved offer is 10% off the jacket only, with no shipping saving. The correct merchandise discount is HK$40, leaving merchandise of HK$460 before any applicable tax and a delivery charge of HK$40. This is arithmetic for an invented scenario, not an observed store price or a statement of tax treatment. If the jacket is removed, the code may remain entered but its applied saving becomes zero, with an explanation. If a separate free-shipping code is introduced, the answer depends on the merchant’s approved combination settings and platform eligibility. Test both accepted and rejected paths rather than promising the second code will always work.
Use one price at the payment boundary
The checkout display, stored order and payment request must derive from the same authoritative calculation. Recheck eligibility when the order is submitted because the cart, customer identity, clock or usage cap can change after a code first appears valid. If a payment attempt fails, do not count a successful redemption merely because the customer clicked Pay. Shopify documents a discount-code hold during unfinished checkout and says declined payment releases it, though integration problems can leave a hold. A custom shop needs its own reservation and release design. Show a changed amount for explicit customer review before a new payment attempt; silently charging more than the displayed total breaks the buying decision. Log the rule version and applied discount lines with the order so support can reconstruct a disputed total later.
Keep campaign copy aligned with settings
Before a code goes live, read the email, social post, product page and checkout wording beside the configured rule. If the announcement says “all products” while the code excludes a collection, fix one side before sending. If a campaign link pre-applies a code, test whether the customer can remove it and how it combines with an existing cart discount; Shopify notes that shareable code links can persist in a cart and combine only under the defined rules. Do not copy a discount total into marketing artwork as if every shopper will get it. Date the internal approval and record who can change the code. When a campaign ends, update customer-facing copy and support guidance so an expired promotion is not still advertised on a page that receives traffic.
Build a small but meaningful test matrix
Use one row for each rule boundary: eligible and excluded product, just below and exactly at minimum spend, before and after the end time, eligible and ineligible customer, unused and exhausted code, single code and incompatible pair. Include mobile checkout and a returning customer with an old cart. For each row, write the expected discount lines, displayed explanation, order total and payment amount before testing; otherwise testers may approve a plausible-looking total that is wrong. Repeat after changing collections, markets or combination settings. Where a platform restriction prevents the proposed promotion, change the campaign terms rather than masking a failing checkout. The useful outcome is not a high redemption metric, which this draft does not have, but a customer who can see why a price changed and decide whether to complete the order.
Assign one owner for rule changes
A promotion can break after launch without anyone editing the code itself. A merchandising change may move a product out of the eligible collection; a market setting may change availability; another team may activate an automatic discount that conflicts with the campaign. Give one owner responsibility for the offer record and require a short impact check before related catalogue, pricing or checkout settings change. Keep an audit of who changed the discount, when and why, together with a saved example cart that demonstrates the approved behavior. When support receives a complaint, it can replay the cart and identify whether the message was misleading, the configuration drifted or the customer is genuinely ineligible. Correct the source rule and customer copy together. A private support coupon may solve one case but should not conceal a promotion that is broadly failing for eligible buyers.
Give support a reproducible case
When a customer says a code failed, collect the code, cart item identifiers and variants, quantity, market, customer eligibility as permitted, approximate attempt time and the message displayed. Do not ask for a full card number or a screenshot of sensitive payment details. Reproduce the same conditions in a test checkout and compare the platform’s rule settings with the advertised offer. If the customer completed an order without the expected saving, decide whether an authorised adjustment is appropriate under the published terms; keep that decision linked to the order and avoid secretly changing its historical price. If the order was not completed, explain the exact condition to fix or acknowledge that the store’s configuration was wrong. Close the case only when the customer has a usable answer and the underlying issue has an owner.
Before you launch
- Does campaign wording match the configured scope, clock and limits?
- Do incompatible codes explain which saving applied?
- Do display, order record and payment request agree?


