Everything it takes to discount, and prove it at checkout.
Four discount types. A rules engine built on item quantity, cart value and variant inventory, with dates set in Discount period on your store timezone. A native offer card on the product page, a Shopify Function at checkout, your own AI assistant, and analytics that separate what is exact from what is approximate.
DISCOUNT TYPES
Four discount types, one engine
Match the discount to the promotion, not the other way around. All four ship on every plan, including the free one.
- Percentage off
- A percent off the products you target. The value is clamped between 0 and 100, so a mistyped number can never hand away more than the product is worth.
- Fixed amount off
- A currency amount off. You choose whether it comes off once across the targeted products or off each item, because those are two very different promotions.
- Buy X get Y
- Discounts a gift line already sitting in the cart. It runs with the storefront offer card, which renders the gift picker the shopper chooses from.
- Free shipping
- A delivery target discount, evaluated separately from your cart lines at the delivery stage, by the same Function that prices the rest of the cart.
Worked examples
What each type actually takes off
The same four types, priced. Each example ends in the amount checkout charges, because that is the only number a discount is finally judged on.
Type 01 / 04
Percentage off
A percent off the products you target, held between 0 and 100.
- Product
- Stoneware mug$50.00 x 2
- Rule
- 20% off, autumn collection
Before
$100.00
At checkout
$80.00
The same percentage in the admin, on the offer card and at checkout, so the promise and the charge cannot drift apart.
RULES ENGINE
The rules the native editor will not give you
Conditions you can actually express, combined the way you would read them out loud, and ordered so you always know which discount wins.
- Quantity
- A minimum item count, a maximum, or both, so an offer only fires on the basket size you meant it for.
- Cart value
- A minimum and a maximum cart subtotal, in your store currency, so "over $80" becomes a rule instead of a hope.
- Inventory
- A minimum and maximum stock level, judged per product variant and resolved on the server before checkout rather than read from the cart. Its row always joins with AND, because stock can only narrow a discount.
- Dates are not a condition
- A start date, an end date, or both live in the discount’s own Discount period, not in Conditions. Both bounds are inclusive, a one day window is legal, and it runs on your store timezone, which the admin names for you so a sale never opens a day early.
- AND and OR, top to bottom
- Conditions fold strictly top to bottom. There is no grouping and no hidden precedence to reason about, and the admin says so on screen while you build the rule.
- Priority
- Discounts sort by priority, and the first one that passes wins on a line. No surprise stacking, and no promotion quietly paying for another.
STOREFRONT OFFER CARD
The offer, on the page where people decide
A theme app extension you place from the theme editor. It reads the same record checkout reads, which is why the card and the price agree.
- Placed from the theme editor
- Drop it in as a theme block, move it where it belongs, and you are done. There is no theme code to fight and nothing to paste into a template.
- Server rendered Liquid
- The card carries no client side price logic. Nothing about the offer is decided in the shopper browser, and that is what keeps it honest.
- The whole offer, stated
- The discount, the conditions that unlock it, and the schedule it runs on, all on the product page instead of discovered at checkout.
- Gift picker for Buy X get Y
- When the offer hands out a gift, the card renders the picker, so the shopper chooses the item before the cart ever sees it.
- Fails open on purpose
- When the card is unsure, it shows. A card that appears too often is visible and fixable. A card that quietly vanishes just looks like a broken app.
- English and French
- The card speaks both, so the offer reads naturally wherever your market is.
CHECKOUT AND PRICING
One record, read by both sides
Every discount lives in a single product metafield, written only by the validated action inside xDiscount. The Function that prices the cart and the card that shows the deal both read it.
- A native Shopify Function
- Pricing runs inside Shopify, in its own discount pipeline, at the moment the cart is evaluated. It is not a script bolted onto your theme.
- Cart lines and delivery
- The Function prices product lines and delivery in the same pass, so a free shipping offer goes through the same engine as a percentage off.
- One source of truth
- The admin, the Function, and the storefront card all read one product metafield. There is no second copy to drift out of date.
- Nothing is written by the browser
- A shopper device can never influence the price they pay, because no part of that price is decided there.
- Fails closed, deliberately
- An unknown rule, a malformed record, or a condition it cannot evaluate produces no discount at all. A wrong discount costs you money on every order it touches.
- No checkout hacks
- No scripts injected into your theme, no cart rewriting, and nothing that breaks the next time you update your theme.
The mechanism
The record both sides read
The Function that prices the cart and the card on the product page are reading the same product metafield. Trace either one back and it ends in the same place.
Flow diagram. The xDiscount admin sets a rule. xDiscount's own validated action is the only writer, and it writes one product metafield per product. Two readers read that same record: the Shopify Function, which prices the cart at checkout and fails closed, so an unknown rule produces no discount and the shopper is charged full price; and the storefront offer card, which shows the deal on the product page and fails open, so it stays visible rather than vanishing. Nothing is written by the browser.
Select a step to trace it through the diagram
Every discount for a product lives in a single product metafield. There is no second copy of the price to fall out of step with the first.
Only xDiscount's own validated action writes that record, whether the change comes from the admin or from a connected assistant. Nothing is written by the browser.
A Shopify Function prices cart lines and delivery inside Shopify's own pipeline. It fails closed: an unknown rule or a malformed record produces no discount, because a wrong discount costs money on every order.
The storefront offer card is server-rendered Liquid with no client-side price logic. It fails open: it would rather show than vanish, because a card that shows too often is visible and fixable, while a hidden one just looks broken.
On the product page
was $60.00$48.0020% off
The offer card renders the deal and its conditions in plain words from the record.
The record
One product metafield, written only by a validated action.
At checkout
$48.00
The Shopify Function prices the cart from that same record.
Because both sides read the same record, what a shopper is shown and what a shopper is charged cannot drift apart. Nothing is written by the browser, so a shopper's device can never influence the price they pay.
CONNECT AI
Bring the assistant you already use
Connect Claude, ChatGPT, or any tool that supports connectors, through a connection URL unique to your store, approved in your own Shopify admin with a visible expiry.
- No subscription to buy
- There is no AI plan to add and no provider key stored here. Whatever you pay your AI provider stays between you and them. Connect AI is on every plan, Free included.
- Typed tools only
- The assistant never writes a metafield directly. Every write goes through the same validated action the admin UI uses.
- Draft first, enforced in the backend
- Anything an assistant creates is forced to draft at the model layer, not in the UI, so no tool can talk its way around it. A live discount must be unpublished before it can be edited.
- Confirmation on the sharp edges
- Publish, unpublish, and delete are flagged confirmation required, so clients that support prompts ask you before anything moves.
- The whole toolset
- Read discounts, create, update, set rules, add and remove targets, publish, unpublish, archive, delete, read performance, and update settings.
- Revoked on uninstall
- Uninstalling xDiscount deregisters every connection, so nothing keeps access to a store you have left.
ANALYTICS
Prove what the promotion did
Two sources, kept apart on purpose. A storefront pixel measures behaviour, and the Shopify signed order webhook is the only thing that can move a money number.
- Four tiles, fixed
- Revenue, discounted orders, average order value and conversion rate, always in that order. There are no cards to arrange and no per discount breakdown.
- A chart and a filter
- Plot any one of the four over your chosen range, narrow it to storefront or Shopify metrics, or filter the whole page down to a single discount type.
- A consent aware web pixel
- The storefront funnel, views, offers seen, and carts, measured with zero shopper identifiers and never used for advertising.
- Exact where it counts
- Discounted orders comes from the Shopify signed order webhook and is exact, and it is the number your plan meters. Revenue comes from the storefront pixel and is labelled approximate, because a forged request must never be able to bill you.
- A day by day table
- The same range broken out per day underneath the chart, with history reaching back 250 days, so a spike has a date rather than just a shape.
- Roadmap: an events explorer
- A deeper analytics screen with a full events explorer is on the roadmap, so you will be able to open the raw funnel event by event.