xDiscount is on the Shopify App Store. Founding merchants lock in lifetime founder pricing.

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

1 of 4, Percentage off

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

Save $20.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.

Written once by a validated action, read by checkout and by the product page

Select a step to trace it through the diagram

  1. 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.

  2. 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.

  3. 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.

  4. 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.