Do Your Functions Run on POS and Draft Orders, or Need a Rebuild?
Function channel parity DEPENDS on the function type, so test it rather than assume it. Shopify's changelog documents discounts reaching the POS app at version 9.10 on June 5, 2024, and no equivalent dated note covers other function types. Custom apps containing Function APIs run on Plus only, while public App Store apps containing functions run on any plan. Budget a per-channel test matrix, not a second build.
Your profile — see how the verdict shifts
- Confidence
- Medium — Read Shopify's Functions overview: only stores on a Shopify Plus plan can use custom apps that contain Shopify Function APIs, and stores on any plan can use public apps distributed through the App Store that contain functions (verified Sep 2026). Read the point-of-sale changelog: with POS app version 9.10, Shopify officially supports discounts created by Discount Functions, dated June 5, 2024. That is the only dated channel-parity milestone in the docs reviewed, so parity for delivery, payment and cart-transform functions on POS or draft orders is untested rather than documented. Read the test-and-debug docs: app function run executes a function against a provided JSON input, and app function replay re-runs it from a previously logged execution, which is what makes a per-channel matrix cheap. Checked the App Store's promotion category: Discount Ninja Promo Engine is the closest verified vendor at 4.4★ across 170 reviews, and no listing advertises making an existing custom function reach a channel Shopify has not shipped it to.
- Reference scenario
- $20M–$200M GMV · Shopify Plus · online store plus 8–40 POS Pro locations · staff-created draft orders for phone and email business · one or more custom Function apps already live in checkout
- As of
- September 2026
Decision at a Glance
| Your profile | Verdict | Why |
|---|---|---|
| Online store only | WAIT | One checkout, one code path. Ship the function, test it in checkout, and channel parity never enters the conversation. |
| Online plus POS, discount functions only | WAIT | Shopify shipped discount-function support to the POS app at version 9.10 on June 5, 2024. Confirm every till runs 9.10 or later and you're done. |
| Online plus POS, non-discount function types | DEPENDS | Delivery, payment and cart-transform functions carry no dated POS parity note. Run the test matrix first; the answer decides whether there's anything to build. |
| Omnichannel with heavy draft-order volume | CUSTOMIZE | Staff-created draft orders bypass the storefront path your function was tested against. Pair the function with draft-order price locks and custom line-item prices so reps aren't guessing. |
What Function Channel Parity Actually Drives
| Outcome | Impact | How it works |
|---|---|---|
| Revenue — direct | High | A promotion that silently fails at the register sells product at full price to customers who came in for the sale, and the loss shows up as flat store revenue rather than as an error. |
| Customer experience | High | Shoppers compare the price on their phone with the price on the receipt, and a mismatch turns a purchase into a service conversation at the counter. |
| Operational efficiency | Medium | Staff work around an unsupported channel by applying discounts manually or building draft orders by hand, which is slower and produces inconsistent line-item pricing. |
| Data & insight | Medium | Function run logs streamed through the CLI show which inputs actually reached the function, turning a suspected channel gap into an answered question. |
Spend ceiling: Spend on the test matrix before you spend on code. Capturing one input per channel and replaying it costs a few days; a second function built on the assumption of a gap that turned out to be a stale POS version costs a whole sprint.
What buying enables (top apps)
- + Live this week on any plan, because public App Store apps containing functions are not gated to Plus
- + Promotion types configured in a dashboard your merchandising team can edit without a deploy
- + Vendor-maintained compatibility as Shopify's channel support keeps moving
- + A 14-day trial on Discount Ninja's paid plans to test the channels you care about before paying (verified Sep 2026)
What building additionally unlocks
- + One pricing rule that resolves identically in checkout, at the till and on a staff-created draft order
- + A replay matrix in your repository that proves parity on every release instead of assuming it
- + Function run logs streamed into your own monitoring, so a channel regression pages you rather than a customer
- + Pricing logic that survives a promotion-app switch, because the source is yours
Find Your Verdict in 3 Questions
Is the function type you shipped a discount function, and does every register run POS app 9.10 or later?
Yes: Your verdict: WAIT — Shopify shipped that parity on June 5, 2024; run one till test and move on.
No: Go to question 2.
Have you replayed one captured input per channel against the function?
Yes: Go to question 3.
No: Your verdict: DEPENDS — run the matrix first, because most suspected gaps turn out to be a stale POS version or an untested input.
Did the matrix show a real gap on a channel that carries meaningful revenue?
Yes: Your verdict: CUSTOMIZE — make the input query channel-aware and write a documented fallback for the surface Shopify has not covered.
No: Your verdict: WAIT — you have parity; keep the matrix in CI and re-run it on each POS release.
The TCC Scorecard — 12 Dimensions
TCC — Total Cost of Capability: what it actually costs to have this capability over three years, whichever way you get it. Each dimension is scored 0–5 for both paths. How we score →
| Dimension | Buy | Build | Why |
|---|---|---|---|
| Cost | |||
| Acquisition & implementation | A public promotion app installs in a day; a channel-aware function plus its test matrix runs an estimated 3–7 weeks (Deploi estimate, illustrative). | ||
| Recurring fees | Promotion engines bill monthly and meter discounted orders; a function you own carries no per-order fee at all. | ||
| Maintenance & upgrades | The recurring build cost is re-running the channel matrix after each POS app release and each Function API version bump. | ||
| Switching & exit | Promotion logic configured in a vendor dashboard does not export; function source in your repository moves to any successor app. | ||
| Risk | |||
| Vendor risk | The promotion category is thin on channel-parity claims specifically, so you inherit whichever channels the vendor chose to support. | ||
| Security & compliance surface | Functions run inside Shopify with no network access, so pricing logic never leaves the platform in either lane. | ||
| Platform-deprecation exposure | Channel support has arrived incrementally rather than all at once, so both lanes track a moving surface and need re-testing each quarter. | ||
| Value | |||
| Fit to requirement | A function encodes your exact pricing rule; an app encodes the rules its product team decided to ship. | ||
| Time to market | An app covers a till-side gap this week; the matrix plus code lands in about a month. | ||
| Performance & scale | Functions run on Shopify's own infrastructure within a 256 kB binary and 10,000 kB of linear memory, with no third-party call in the cart path. | ||
| Data ownership & AI-readiness | Function run logs stream to your own tooling through the CLI; app-side promotion decisions stay in the vendor's reporting. | ||
| Focus & opportunity cost | Testing four channels is unglamorous work that still has to happen before anyone trusts the price on a receipt. | ||
The App Landscape
| App | Status | Pricing | Best for |
|---|---|---|---|
| Shopify Functions | Native — First-party Shopify platform. Only stores on a Shopify Plus plan can use custom apps that contain Function APIs, while stores on any plan can use public App Store apps that contain functions. Discounts created by Discount Functions reached the POS app at version 9.10 on June 5, 2024. Fixed limits: a 256 kB compiled binary and 10,000 kB of runtime linear memory. | Included with your Shopify plan; custom Function apps require Plus (verified Sep 2026) | Every channel where the specific function type is documented as supported |
| Discount Ninja Promo Engine | Live — 4.4★, 170 reviews; 14-day free trial on all paid plans. A public App Store app, so it runs on any plan rather than Plus only. Order allowances count only the orders the app influenced. Confirm on the current listing which surfaces each promotion type reaches before you rely on it at a till. | Starter $49/month (500 discounted orders), Pro $99/month (1,000), Grow $199/month, Plus $399/month (10,000 discounted orders) — verified Sep 2026 | Covering an online promotion gap fast without spending Plus-gated custom-app effort |
| Point-of-sale pricing and promotion apps | Category — The App Store's point-of-sale category carries till-side pricing, discount and staff-workflow apps. Those cover manual discounting at the register. None of them makes an existing custom function execute on a channel Shopify has not shipped that function type to. | Free to roughly $100/month across the category (illustrative) — confirm on each listing | A manual till-side workaround while a function type has no documented POS support |
| Channel-aware custom function plus test matrix | Build lane — One function whose input query reads the order source, plus a documented matrix that runs it against online checkout, POS and draft-order inputs before every release. Custom Function apps are Plus only; packaging the same function as a public App Store app removes that gate. | $12,000–$35,000 one-time plus roughly 15–20% a year in upkeep (Deploi estimate, illustrative) | Plus merchants whose pricing rule has to hold identically on a receipt and on a web order |
The Build Path
- Build the channel matrix before you write code: The app function run command performs a single execution against a provided JSON input, and app function replay re-runs the function from a previously logged execution (verified Sep 2026). One captured input per channel gives you a repeatable parity test that costs minutes, not a rebuild.
- One function, channel-aware input query: Read the order or cart source inside the input query and branch there, instead of shipping a second function per channel. Two functions means two deploys, two test matrices and two chances for the price on a receipt to disagree with the price on the site.
- A documented fallback for channels with no support: Draft orders let staff set a custom price on a line item and lock prices so they don't change when catalogs update (verified Sep 2026). Write the fallback into the rep's runbook rather than letting each rep invent one.
- Stream function logs into your own tooling: Log streaming and replay for Shopify Functions became generally available with Shopify CLI 3.66 on August 21, 2024. Capture production inputs from each channel so a parity regression shows up in your monitoring rather than in a customer complaint.
- Effort band
- $12,000–$35,000 build — Deploi estimate (illustrative). One function type across two channels lands in the $10–25K contact-form band; three or more function types, each with its own matrix, lands in the $25–75K band
- Typical timeline
- 3–7 weeks (Deploi estimate, illustrative): about a week to capture inputs and stand up the matrix, the rest for channel-aware logic and staff runbooks
- Maintenance, honestly
- ~15–20% of build cost per year (Deploi estimate): roughly $1,800–$7,000/yr (Deploi estimate, illustrative) to re-run the matrix after each POS app release and each Function API version bump. There is no per-order fee.
- What you own — and what you take on
- You own: the pricing rule, the captured per-channel inputs, the replay tests and the run logs. You take on: re-testing on Shopify's release cadence, and keeping the custom app installed on every store that needs it.
3-Year Total Cost of Capability
| Buy (app path) | Build (custom path) | |
|---|---|---|
| Year 0 (setup) | $2,000–$6,000 (configuration and testing) | $12,000–$35,000 |
| Years 1–3 (recurring) | $3,600–$7,200 (subscription) | $5,400–$21,000 (matrix re-runs and API bumps) |
| 3-year total | ≈$5,600–$13,200 | ≈$17,400–$56,000 |
- † All figures illustrative samples for the reference scenario — not quotes, not verified pricing.
- † Buy path: Discount Ninja Promo Engine's Pro tier at $99/month (verified Sep 2026) held flat, plus a short configuration project at illustrative agency rates.
- † Build path: one channel-aware function, a three-channel replay matrix and staff runbooks; three-year horizon; POS hardware and plan fees excluded from both lanes.
What the Sticker Price Hides
On the buy path
- — Order allowances count only the orders the app influenced, so a busy promotion tier-jumps faster than a flat traffic forecast suggests
- — Channel coverage is a per-listing question; a promotion that works online may need a manual equivalent at the till
- — Two pricing engines means two places to check when a customer disputes a receipt
- — Public apps run on any plan, which is genuinely useful, but the app's own rules cap what you can express
On the build path
- — The test matrix is the real deliverable and it is easy to underfund at scope time
- — Every POS app release is a re-test trigger, not an optional check
- — Custom Function apps are Plus-only; a store that leaves Plus loses the app, not just a discount
- — Roughly $1,800–$7,000/yr in upkeep (Deploi estimate, illustrative) that no subscription line makes visible
What Merchants Say
Retail leads describe the receipt mismatch: a promotion that reads correctly on the site quietly does nothing at the register, and the first report comes from a customer, not from monitoring.
Promotion-app reviews cluster on surface coverage: the rule the merchant bought the app for turns out to apply on one channel and not the one that mattered that week.
If You Change Your Mind Later
If you bought and outgrow it
Promotion rules configured in a vendor dashboard don't export as logic, so plan to re-express them by hand. Screenshot the active promotions and record which channels each one reached before you uninstall, because that mapping is the part nobody remembers a quarter later.
If you built and want out
Nothing is stranded: the function source, the captured channel inputs and the replay tests all live in your repository. If you later move to a public promotion app, the matrix still tells you which surfaces the replacement has to cover, which turns a migration into a checklist.
When This Answer Changes
We're watching for:
- ▸ A dated changelog entry extending delivery, payment or cart-transform functions to POS or draft orders (only discounts carry one as of September 2026)
- ▸ POS app releases after 9.10 that change how function-created discounts render at the till
- ▸ Any change to the Plus-only gate on custom apps containing Function APIs
Verdict change log:
- 2024-06-05Shopify announced official support for discounts created by Discount Functions in POS app version 9.10, including automatic discounts and smart grid tiles for discount codes. That release turned discount parity on POS from a build problem into a version check, and it is the reason this verdict reads DEPENDS on the function type rather than a flat rebuild.
Common Questions
Do discount functions work in Shopify POS?
Yes. Shopify's changelog states that with POS app version 9.10 it officially supports discounts created by Discount Functions, including automatic discounts and smart grid tiles for discount codes. The entry is dated June 5, 2024. Confirm every register runs 9.10 or later, because an older till is the likeliest cause of a discount that applies online and not in store.
Do I need Shopify Plus to run a custom function?
Yes for custom apps. Shopify's docs draw 2 distribution paths. Only stores on a Shopify Plus plan can use custom apps containing Function APIs. Stores on any plan can use public apps distributed through the App Store that contain functions. Packaging the same function as a public app removes the plan gate, at the cost of App Store review and a public listing.
How do I test whether a function runs on a given channel?
Capture one real input per channel and replay it. The app function run command executes a function against a provided JSON input, and app function replay re-runs it from a previously logged execution. Log streaming and replay became generally available with Shopify CLI 3.66 on August 21, 2024. Three captured inputs give you a parity check that takes minutes per release.
Your Next Steps
If you're going with CUSTOMIZE
- List every channel that creates an order today: online checkout, each POS location, draft orders, and any sales channel app
- Capture one real production input per channel with function log streaming
- Replay the function against each captured input and record pass or fail in a matrix you keep in the repository
- Make the input query channel-aware only where the matrix shows a genuine gap
- Write the staff fallback for any uncovered surface, using draft-order custom prices and price locks
- Add the replay matrix to your release checklist so each POS update re-runs it
If you're going with BUY
- Confirm on the current listing which surfaces each promotion type reaches, in writing
- Model the order allowance against your promotion volume, not your total order volume
- Run one live till test before the campaign, not after
- Keep a single source of truth for pricing rules so the app and any function never disagree
- Diary a re-decision when a second channel needs the same rule
Official Docs & Sources
- Discount Functions support on Shopify POS (POS app 9.10) — shopify.dev
- Shopify Functions overview and limits — shopify.dev
- Test and debug Shopify Functions (run and replay) — shopify.dev
Official documentation linked for verification — our verdicts and estimates are our own.
Related Decisions
Should You Plan Around Plus's 200-Location Ceiling?
Shopify Plus supports adding up to 200 locations per store, a documented ceiling that decides when consolidation stops working and a platform starts paying.
Build or Buy Multi-Location Retail Ops on Shopify Plus?
Plus includes 20 POS Pro locations and waives the fee up to 200 with Shopify Payments. Outside Plus, POS Pro is $89/month per location (verified Sep 2026).
Build or Buy Cash Management and Till Reconciliation on Shopify?
POS Pro reconciles each register natively. Nothing rolls sessions up across stores or flags repeated shortages, and no app does. Write the SOP; build the roll-up.
Build or Buy Clienteling for Shopify POS Store Associates?
POS Pro already shows purchase history at the register; associate outreach, wishlists and tasks are the gap. Endear is the one app, with 17 reviews.
Build or Buy POS–Ecom Coherence on Shopify?
POS and ecom coherence on Shopify is native: one store, one catalog, one inventory pool, one customer record — the sync problem disappears.
Want to know where your functions actually run?
We capture one real input per channel, replay your function against each, and hand back a matrix that says exactly which surfaces are covered and which need a fallback.
Contact us todayVerdict scored for the reference scenario above. Estimates are not quotes; app pricing carries its verification date and gets re-verified quarterly. Channel support has arrived incrementally, so confirm current-state parity for your function type on Shopify's own reference before you commit budget.
Read how we score these decisions (the TCC Framework). No affiliate links, no paid placement — no app vendor pays to appear here.