Shopify removed the Discounts Allocator Function API on September 10, 2026. The removal is not the part that will hurt. The deploy is. From September 29 at noon Eastern, any app that still declares the allocator extension target fails shopify app deploy for the entire app, not just for that one extension. If you build discount logic for Shopify Plus merchants and you touched the preview at any point this year, you have two weeks to find out whether that line is still sitting in your app config.
What Shopify removed on September 10, 2026
The Discounts Allocator Function API is gone and will never ship as a stable API. Shopify closed the developer preview and confirmed the API will not be released, in a changelog entry dated September 10, 2026. Apps that already cut a release stay installable, but their allocator functions no longer execute. The two Admin mutations that registered and unregistered them, discountsAllocatorFunctionRegister and discountsAllocatorFunctionUnregister, only ever existed on the unstable API version. Nothing pinned to a dated stable version ever had access to them.
The stated reason is that native discount behaviour caught up while the preview was open. Stacking several product discounts on the same line is now handled by the platform itself. That was one of the main jobs merchants reached for a custom allocator to do, so carrying a whole Function API forward to serve the remainder stopped making sense.
Discounts Allocator vs the Discount Function API
The Discount Function API is the replacement, and it inverts the model rather than renaming it. The allocator asked you to own the arithmetic: given a discount and a cart, you decided how the value spread across lines. The Discount Function API asks you to declare intent and lets Shopify allocate. A single function handles one discount, code based or automatic, and can apply savings across all three discount classes through ProductDiscountsAdd, OrderDiscountsAdd and DeliveryDiscountsAdd. The two targets are cart.lines.discounts.generate.run for cart, order and shipping value, and cart.delivery-options.discounts.generate.run for shipping specifically. The current specification sits on API version 2026-07.
That inversion is the whole story for anyone who was waiting on the allocator. If your requirement was genuinely about allocation mechanics, a custom spread across lines that Shopify would not produce on its own, the replacement does not give it back. If your requirement was really about eligibility and value, which covers most of the promotional work we see on premium catalogues, the Discount Function API is a shorter path than the allocator ever was. Functions also gained proper visibility into discount state in API version 2026-04, on March 2, 2026, at cart level, line item level and delivery group level, for any function running after discounts in the checkout sequence. A lot of logic that needed an allocator in early 2026 can now read what it needs and stop.
Why a removed preview breaks a whole app deploy
Extension targets are validated as a set, so one unknown target rejects the entire deploy. Shopify does not skip the orphaned extension and ship the rest. After September 29 at 12:00 PM Eastern, an app config still declaring purchase.discounts-allocator.run fails shopify app deploy with an error naming the missing API target, and every other extension in that app goes down with it.
This is the failure mode worth planning around, because of when it lands rather than what it costs to fix. The fix is deleting an extension block. The cost is discovering you need to delete it at the moment you are trying to push an unrelated hotfix into Q4 trading. Nothing warns you before then. The functions stopped running on September 10 and the deploy keeps working until September 29, so there is a nineteen day window where the app looks fine in CI and is already broken in production behaviour. Teams who only deploy every few weeks will walk straight into the far edge of it.
What we would change before September 29
Grep every app config you own for the allocator target today, not in the last week of September. The string is purchase.discounts-allocator.run, and it will be in shopify.app.toml or an extension TOML underneath it. Search across branches, not just main. Preview experiments have a habit of living on a feature branch that someone will merge in October without thinking about it.
Then check whether anything is quietly depending on the function still running. Anything shipped before September 10 still installs, so a merchant can have an app on their store whose discount logic went silent five days ago with no error anywhere. That is a support ticket waiting to be misdiagnosed as a pricing bug. On the commerce builds we run, this is the check that matters more than the config edit, because the config edit is obvious once you find it and the silent behaviour change is not.
The wider lesson is about how much promotional logic should live in custom code at all. Every preview API you adopt is a bet that Shopify ships it. This one did not pay out, and the platform absorbed the feature natively instead. That pattern repeats: Scripts gave way to Functions, and specialised Function APIs are giving way to a unified discount surface. Build the parts of a promotion that are genuinely yours, the eligibility rules tied to your catalogue and your customer segments, and let the platform own the arithmetic underneath them. The studios that get burned by deprecations are the ones that wrote platform behaviour by hand.