POS UI Extensions Now Return Accurate Percentage Values for Discounts

Shopify POS 11.15 updates the Discount.amount field for percentage discounts, aligning it with the Cart API contract. Developers must adjust their POS UI extensions to treat the amount as a percentage, not a monetary value.

POS UI Extensions Now Return Accurate Percentage Values for Discounts
6 sections

If you build or maintain Shopify POS UI extensions, the latest POS 11.15 release brings a critical change that can affect how discounts are displayed and calculated across your apps. This post breaks down the update, explains who needs to act, and provides clear steps to keep your extensions running smoothly.

What Changed

Prior to POS 11.15, a 25% discount on a $200 line item returned a Discount.amount of 50 – the monetary value of the discount. Starting with POS 11.15, Discount.amount now returns the literal percentage (25), matching the Cart API contract. The change applies to all percentage‑type discounts at the cart level and per line item, including manual, app‑applied, and automatic discounts that use type "Percentage". FixedAmount and Code discounts remain unchanged.

Who Is Affected

The update impacts every POS UI extension, regardless of the API version you target. Keeping an older api_version does not preserve the previous behavior, so extensions running on POS 11.14 or earlier will still see the old monetary amount, while those on 11.15+ will receive the percentage. Both developers and merchants who rely on extensions for loyalty points, savings calculations, or custom pricing logic will notice the difference.

Why It Matters

Treating the amount as a percentage eliminates a long‑standing mismatch between the POS UI and the Cart API. Without the fix, extensions that displayed the discount as money could double‑count savings or miscalculate loyalty rewards. Aligning the data model also prevents errors when extensions push cart state back via bulkCartUpdate, where a monetary value could be mistakenly interpreted as a percentage.

Action Steps for Developers

  • Guard against type assumptions. Before you treat Discount.amount as a currency, check Discount.type. If it equals "Percentage", treat the amount as a number representing the percent. Example:
  • js

    // Sample POS UI extension discount handling

    function formatDiscount(discount) {

    if (discount.type === 'Percentage') {

    // amount is now a percent, not a money value

    return ${discount.amount}% off;

    }

    // For FixedAmount or Code discounts, amount is a Money object

    return $${(discount.amount / 100).toFixed(2)} off;

    }

  • Update any UI that shows the discount as a price. Replace the monetary display with a percentage label or recalculate the monetary value on the client side using the line item price.
  • Review loyalty‑point or rewards calculations that rely on the discount amount. Use the percentage to compute the correct monetary savings before converting to points.
  • If your extension still supports POS 11.14 or earlier, add a fallback branch that detects the older behavior. You can inspect the POS version via the extension’s context and apply the appropriate logic until devices are upgraded.
  • Testing Your Extension

  • Install the extension on a device running POS 11.15 or later.
  • Create a cart‑level 25% discount and verify that Discount.amount is 25.
  • Add a line‑item discount of 10% and confirm the same behavior.
  • Run a bulkCartUpdate that sends the cart state back to the POS and ensure the discount is not re‑interpreted as a monetary amount.
  • Finally, test on a POS 11.14 device (if possible) to confirm your fallback logic works as expected.
  • Conclusion & Next Steps

    Shopify’s POS 11.15 fix brings the Discount.amount field in line with the Cart API, but it also means extensions that previously treated percentage discounts as money must be updated. By adding a simple type check and adjusting your UI and calculations, you can avoid display errors and keep loyalty programs accurate. Stay on top of future POS releases, and consider adding automated tests that validate discount handling across POS versions.

    Ready to update your extension? Dive into the Shopify developer docs, run the tests above, and publish the new version today. If you have questions, drop a comment or reach out to the Shopify developer community for support.

    Tags
    Sources

    Related Articles

    Understanding the New Per‑Customer Request Limit for Shopify’s Customer Account API

    Understanding the New Per‑Customer Request Limit for Shopify’s Customer Account API

    Shopify now caps each customer to 3,000 Customer Account API requests per minute per store, shared across all apps. Learn what changed, who it impacts, and how to add retry logic so your integrations stay reliable.

    October 7, 20264 min
    Cart Mutations Now Reject Unconfirmed Writes in POS UI Extensions (2026‑10)

    Cart Mutations Now Reject Unconfirmed Writes in POS UI Extensions (2026‑10)

    Shopify POS UI extensions using the 2026‑10 API now reject cart mutations when the platform can’t confirm a write. Learn what changed, who’s impacted, and how to update your code to handle rejections gracefully.

    October 7, 20264 min
    How to Downgrade Your Shopify App’s Access Scopes from Write to Read

    How to Downgrade Your Shopify App’s Access Scopes from Write to Read

    Learn how Shopify’s new appDowngradeAccessScopes mutation lets developers replace unnecessary write permissions with read‑only scopes, who is impacted, and step‑by‑step actions to implement the change.

    October 7, 20264 min
    Unlock Deep Insights: Analyze Purchase Orders Directly in Shopify Analytics

    Unlock Deep Insights: Analyze Purchase Orders Directly in Shopify Analytics

    Shopify now lets merchants review, export, and track purchase order data with three new analytics reports. Learn what’s changed, who it impacts, and how to start using the tools today.

    October 6, 20264 min