Purple light trails on a dark field, suggesting a promotional decision path between Shopify automatic discounts and Discount Functions

Shopify Automatic Discounts vs Functions for Black Friday: The Double Sticker Check

Shopify Automatic Discounts vs Functions for Black Friday: The Double Sticker Check

Sep 21, 2026 Updated Oct 26, 2026

Octavian Contis 11 minutes

Share

Two cards sit on the same September promo board.

Card one is a 20% sitewide automatic discount that marketing has already scheduled in the Shopify admin. Card two is the founder brief from Monday: buy two and take 40% off the third, free shipping over £75, and a gift pot once the cart reaches £120.

Those cards need different discount engines. Shopify automatic discounts and discount codes live on the admin Discounts page and cover percentage, fixed amount, Buy X Get Y, and free shipping. Discount Functions are app-defined types that run as Shopify Functions whenever the cart changes, so one rule can reduce lines, the order, and shipping together, or apply tier and tag logic the native form cannot store.

Picture a shop assistant pricing a jumper. One sticker says 20% off, and someone else has already stuck a 25% sticker on top, so the till reads both and the jumper leaves far cheaper than anyone planned.

I call this the double sticker check. Before the freeze, every Black Friday offer gets one row saying which engine runs it, which other stickers can land on the same order, and who tested that pair on a live cart.

Introduction

This article teaches you to choose native Shopify automatic discounts or Discount Functions for each Black Friday promo by mapping stacking, BOGO, tiers, gift-with-purchase, Plus access, and peak performance before the freeze. Pairing a checkout banner with backend checkout logic is a different job, and it belongs in When to Use Checkout UI Extensions vs Shopify Functions.

The dated walk of checkout, inventory, fulfilment, and support gates sits in A Shopify Black Friday Readiness Checklist for Brands That Already Scale. This post stays on the discount method for the offers you already decided to run.

Merchant and developer threads in autumn keep returning to the same gap: a sitewide automatic that stacks with a code nobody re-checked, a gift that never appears as a line, or a Function that cannot see a discount code and a shipping country in the same run. The community signal is decision friction, and the sheet is how you settle it before paid traffic starts.

Which stickers can land on the same order?

Shopify gives you three ways to reduce price, and teams brief them as one promo. Automatic discounts apply when the cart meets the conditions and the buyer never types a code. Discount codes apply when the buyer, an email, or an abandoned-checkout recovery message supplies the code. App discounts, including Discount Functions, appear as extra types on the Discounts page after you install an app, and Shopify then executes the Function to calculate the reduction.

Shopify applies discounts to the subtotal before tax, and combination works by class: product, order, and shipping. Two product discounts behave differently from a product discount sitting beside an order discount, because the different classes are the ones that combine when both boxes allow it.

That is where margin goes. A 20% automatic on the collection plus a 25% welcome code can become a 40% effective cut when both combination boxes stay ticked, and nobody notices until the orders arrive.

List every code, automatic, and free-shipping rule that will be live in November, then inspect each pair on a live cart and write why each combination box is ticked or left off. Replay last year's peak SKUs against this year's planned stack on a spreadsheet before you trust the admin preview, and make sure cost per item sits on the variant, or no report will show whether the pair still leaves contribution.

Discount Functions join the same model. A Function declares its discount classes, and those classes decide which targets Shopify runs and how the Function sits next to native automatics and codes. A custom type that claims product, order, and shipping under one owner can hide the very pair you thought you had isolated.

Double sticker check

YesNoPublicCustomNative automaticor code covers the rule?Admin automaticor discount codeDiscount Functionor Function appCustom appor public app?Install and testbefore the freezePlus custom Functionshipped before freezeDouble sticker check
Double sticker check

A 20% collection automatic with the combination boxes written down is faster to test, cheaper to staff, and easier to switch off on 2 December than a WASM module you still have in review.

Does the brief fit a native rule?

Native automatic and code types are the same four shapes: percentage, fixed amount, Buy X Get Y or Spend X Get Y, and free shipping. Native Buy X Get Y covers "buy two, get the third at a set percentage or amount" when the rewarded item is already a catalogue line the buyer can add, and Spend X Get Y covers a threshold on the same shapes. The founder's 40% third unit is an admin rule when that third unit is the same product.

The brief leaves native once the third unit needs a different rate from the sixth, once customer tags change the band, or once the gift is a SKU that should appear only after the threshold. Volume apps that expose only static percentage steps hit the same wall, while a Discount Function can encode a formula or a tag table the admin form cannot hold.

Shopify’s Discount API can return product and order operations from cart.lines.discounts.generate.run, and shipping operations from cart.delivery-options.discounts.generate.run. One Function can therefore do work that would otherwise be three native discounts with three combination matrices, which is why teams brief Functions before the native form has been tried.

For a sitewide or collection percentage, use a native automatic. Put the collection or product list on the discount, write the combination boxes, and keep marketing codes on a separate class or with combinations off. That card can be scheduled, screenshotted, and switched off on 2 December without a deploy.

Tiered volume or member pricing starts with a public Discount Function app you already trust, if its configuration matches the tiers. Commission a custom Discount Function on Plus only when the table is brand-specific and the app would need a rewrite, and on either path get a large-cart Function log before paid traffic.

Why does the gift pot keep failing?

Zeroing a qualifying item the buyer already added is a discount job, while inserting a new gift line with its own title and image is a cart-shape job. Cart Transform can expand, merge, and update lines, yet adding a brand-new line is still a requested gap, which is why gift apps mix Functions with storefront cart calls.

Split the founder brief into rows. Free shipping over £75 is a native shipping automatic or code. The £120 gift pot is its own row, native only if the pot is a catalogue item the buyer adds, and otherwise an app or Function whose add path you have already tested with inventory.

A gift SKU with no available-to-sell number is an oversell you scheduled as a promo, so name the add path before ads mention the threshold. That inventory work sits beside the discount row in How to Stop Shopify Oversells During Black Friday Flash Sales.

Hide both rules inside one untested Function the week ads start, and you get a missing gift line plus a shipping discount nobody can reverse without a deploy.

Should the list get a code or the automatic?

Automatic discounts suit a sitewide or collection sale that runs the whole weekend. Codes suit an offer for a list, an affiliate, or an abandoned checkout, because you can expire the code without touching the automatic that still sits on the storefront.

Mixing both is where Black Friday goes quiet and then loud. Recovery emails can attach a code to a cart that already received the automatic, and combination settings decide whether that becomes a second reduction or a rejected code, so test guest checkout, logged-in checkout, and the recovery path on the same SKU.

A Function that must reject a code for some shipping countries carries a second constraint. The cart-lines discount target can see entered codes and often cannot see the delivery address, while the delivery-options target can see the country and may not run once a code is present. If one decision needs both inputs, settle that Function-design risk in October or drop the geo rule from the promo.

If checkout itself is dropping purchases, fix that path first with How to Fix Shopify Checkout Abandonment When Your Funnel Looks Healthy. A Function that calculates a clean discount still fails when Shop Pay or the payment step cannot complete.

Do I need Plus for this?

Stores on any plan can install a public App Store app that contains Functions, and only Shopify Plus can run a custom app that contains Shopify Function APIs. Shopify Help states the same split for building your own custom discounts app.

Checkout UI extensions, payment customisation, and delivery customisation remain Plus checkout work, and none of them makes a percentage automatic any better. If the plan question is still open, use Choosing the Right Shopify Plan before you treat an upgrade as a November discount patch.

A public Function app is still a production dependency at peak, so you inherit its WASM budget, its input queries, and its support hours. Prefer an app you already run in ordinary weeks over a seasonal install you will forget in January.

Will the Function hold on the Friday?

Shopify executes Discount Functions inside checkout, so delays and failed runs decide whether the buyer can purchase. Shopify recommends Rust for large carts, because JavaScript Functions are more likely to hit instruction or memory limits when the cart is full.

Function order is fixed: cart lines, Cart Transform, line discounts, and later delivery discounts and validation. A slow Discount Function therefore sits on the purchase path in front of fulfilment and payment customisation, and peak weekend makes a poor first load test.

Replay carts with last year's line counts, plus a worst-case gift or bundle expansion, and read the Function run logs before the freeze. If you cannot name the last successful run against a large cart, keep the offer on a native automatic until that log exists.

When does the sheet close?

Put the dates on the same sheet as the offers. Use the matrix below as the first columns: one row per offer, and the recommendation is the first column that the rule actually needs.

CriterionNative automatic or codePublic Discount Function appCustom Discount Function (Plus)
Rule shapePercentage, fixed amount, Buy X Get Y, free shippingTiers, tags, bundles, or mixed product and shipping in one type the app already shipsBrand-specific formula, membership table, or a class mix no public app can configure
StackingWrite product, order, and shipping combination pairs; test each pair on a live cartRead the app’s discount classes and how they sit next to native automaticsDeclare classes on purpose; one Function can replace three native discounts
BOGO and tiersOne rewarded rate, rewarded item already in catalogueStepped volume or category thresholds the app exposesFormula or tag-driven bands the admin cannot store
Gift-with-purchaseDiscount or zero a line the buyer already addedApp that owns the gift add path and inventoryFunction plus Cart Transform or cart API, with the add path named
Who can build itAny plan, Discounts pageAny plan, App Store installPlus custom app only
Peak riskCombination mishap, recovery code stackingApp WASM limits, leftover seasonal installUntested large-cart runs, input-query gaps, deploy during freeze
Choose this whenThe brief fits a native type and you can write the pairsThe app already matches the brief and has run on this storeThe brief is unique and the Function is in production before the freeze

At Black Friday minus 21 days, every offer has an engine (native automatic, code, public Function app, or Plus custom Function) and a named owner. At minus 14 days, combination pairs are tested on guest, Shop Pay, and recovery, Function run logs exist for a large cart, and the gift add path is proven with inventory.

At minus 10 days, live test orders show the expected discount lines and shipping with no staff workaround. After the freeze, nobody adds discount apps, deploys Functions, or edits combinations, apart from a documented hotfix with a rollback.

If the brief is still a spec on 1 November, simplify the offer to a native automatic or code and park the gift pot or the tag table until January. Seasonal badge, timer, and gift apps are easy to install in October and easy to forget, so write the uninstall date on the same row as the start date.

Check every sticker before the jumper reaches the till.

Conclusion

You can now choose native Shopify automatic discounts or Discount Functions for each Black Friday promo. Map stacking classes, BOGO and tier shape, gift-with-purchase add path, code versus automatic, Plus versus a public Function app, and peak Function performance, then freeze whatever you did not finish.

Start with the admin Discounts page when the rule fits. Use a Function, or a Function app, when one type must do work the native form cannot, and only when the run has already survived a large cart. The founder brief can wait until January if the engine is still a spec.

If an offer on the sheet needs a Discount Function scoped and shipped before the freeze, Shopify UI Extensions and Functions is where we map each promo to an engine your store can run on the Friday. Book a discovery call when you want that sheet written with the same staff who will keep the extra stickers off the jumper after peak.

Frequently Asked Questions

Shopify automatic discounts are native admin rules: percentage, fixed amount, Buy X Get Y, or free shipping, applied at cart and checkout when the buyer meets the conditions. Discount Functions are app-defined discount types that run as Shopify Functions when the cart changes, so one rule can reduce line items, the order subtotal, and shipping together, or apply volume, tag, and membership logic the admin form cannot encode. Automatic discounts belong on the Discounts page. Functions belong in an installed app, then appear as a custom discount type on that same page.

You can install a public App Store app that ships Discount Functions on any Shopify plan. Only Shopify Plus can run a custom app that contains Shopify Function APIs, including a Discount Function you commission for one brand. Checkout UI extensions, payment customisation, and delivery customisation stay Plus-only, and those surfaces are a different job from promo math. If the Black Friday rule already exists in a public Function app, Plus is not the switch that unlocks it.

Shopify can combine a product discount, an order discount, and a shipping discount when each discount’s combination settings allow the pair. A 20% automatic product discount plus a 25% order code can legally stack if both boxes are ticked, and that pair is where Black Friday margin usually disappears. List every code, automatic, and free-shipping rule that will be live in November, then test the pairs on a live cart before the freeze. Write down why each combination box is ticked or unticked, so every setting is a decision someone made.

Use a Discount Function when one promotion must apply different rates by quantity, customer tag, or spend band, or when one rule must discount products and shipping together. Native Buy X Get Y covers a simple free or discounted item after a quantity or amount, and it fails once the third unit needs a different rate or the gift is a SKU that is not already in the cart. Ship the Function, or the public app that wraps it, early enough that you can replay last year’s peak cart sizes against the WASM run. If that work still sits in a spec on 1 November, simplify the offer to a native automatic or code.

Native Buy X Get Y can discount or zero a qualifying item the buyer already added, which is enough for “buy two, get the third half price” when the third unit is the same catalogue item. A free gift that must appear as a new line, with its own image and a zero or token price, usually needs a Discount Function, a Cart Transform, or a gift app. Cart Transform can expand, merge, and update lines; adding a brand-new gift line is still a platform gap, so most gift-with-purchase apps still use cart APIs or mixed Function plus storefront work. Lock the gift SKU and the add path before ads point at the threshold.

Leave Discount Functions, checkout Functions, and new discount apps inside the same freeze you use for theme deploys. Peak traffic is when a WASM timeout, an input-query miss, or a combination change shows up as a missing discount or a double reduction. If a hotfix is unavoidable, keep one owner, a rollback to the last tested Function version, and a live test order on guest checkout and Shop Pay before you raise paid spend. Park unfinished custom discount work until January unless the live checkout already depends on a fix you can reverse in minutes.

Discount Functions calculate price reductions on cart lines, the order subtotal, and shipping rates. Checkout Functions such as payment customisation, delivery customisation, and cart validation change how checkout behaves, and they sit on Shopify Plus with Checkout UI Extensions. Pairing a discount result with a banner or progress bar is a display job, covered in the checkout UI versus Functions guide. Keep the Black Friday promo decision on the discount method first, then decide whether the buyer also needs a checkout message.

Related Articles