# Product updates
Source: https://discountkit.app/changelog
Track updates, improvements, and bug fixes to Discount Kit
All notable changes to Discount Kit will be documented on this page.
* **Customer context**: Every discount type now has an **Eligibility** card,
powered by Shopify's native discount context. Limit a discount to specific
**customer segments** or **markets** (the two are mutually exclusive). The
Eligibility card targets the full range of your Shopify markets, while the
legacy **Market eligibility** option in the sidebar continues to target
regional markets only. Note: discounts limited to segments or markets can't
operate with Discount Kit Live storefront components. See
[Customer context](/discounts/common-settings#customer-context).
* **Sidekick AI assistant**: Discount Kit now works with
[Sidekick](/sidekick), Shopify's built-in AI assistant. Describe a discount
in plain language and Sidekick fills in the Discount Kit builder for you —
across Custom, Product Volume, Order Goal, Gift with Purchase, and Shipping
discounts. Sidekick can also find and explain your existing discounts. You
always review and Save before anything goes live. See [Sidekick](/sidekick).
* **Custom Discount — Unique Groups condition**: New cart condition that
fires when the cart contains items from at least N of a selected list of
Cart Groups. Useful for **Routine Builder**-style offers ("10% off when
you buy from 2 of these 4 steps, 15% for 3 steps, 20% for all 4") and
any promotion that rewards spanning categories rather than buying a
certain quantity of one thing. Requires at least 2 Cart Groups and a
minimum count of 2 or higher. See [Unique Groups condition](/discounts/custom#unique-groups-condition).
* **Discount Kit Live — opt-in via tags**: Discount Kit Live is now
opt-in. Tag a discount `dk:live` to surface it on your storefront; remove
the tag to hide it. Works for both **automatic** and **code-based**
discounts. Existing shops were auto-migrated, so nothing dropped on
rollout. The `discount_summary` metaobject gains `method`
(`automatic`/`code`), `code`, and `tags` fields for storefront use. See
[Discount Kit Live introduction](/live/introduction).
* **Tags**: Label any discount with up to 5 tags (`SEASONAL`, `LOYALTY`,
`BFCM`, …). Autocomplete suggests tags you've used elsewhere. Filter or
bulk-action discounts by tag from Shopify's native discounts list.
* **Cart-line stacking** (Shopify Plus): Two product discounts can now apply
to the same cart line when they share a tag in each other's cart-line
combination list. Set this up in the Combinations card under
Product discounts. See [Stacking discounts](/discounts/stacking) for the
full pattern.
* Admin app upgraded to Shopify Admin API `2026-04`.
* **Built for Shopify**: Discount Kit retained its Built for Shopify
status — Shopify's recognition of continued performance, quality, and
merchant-experience standards
* **Order Discount**: Added an "Exclude products with compare at prices" toggle
* **Discount metafields**: Product-discount metafields are now
`admin_filterable` and `analytics_queryable` — surface Discount Kit
values in Shopify admin product filters and Shopify analytics reports
* **Discount Functions**: All Discount Kit functions updated to Shopify
Admin API `2026-04`
* **Custom Discount**: Metafield Discount now supports `discount_fixed_price` — set
items to a specific price (e.g. `2500` for \$25.00) instead of only discounting
by a fixed amount or percentage. The metafield schema also now allows
additional custom properties (e.g. `discount_badge`) for use by theme code
* **Custom Discount**: Bundle pricing — create "3 for \$25" style offers with
repeating targets and fixed prices, no qualifiers needed
* **Custom Discount**: Consume mode — prevent discounted items from being
targeted by subsequent rules within the same discount. Useful for prioritizing
offers and preventing double-discounting
* **Custom Discount**: Improved Buy X Get Y — qualifiers and targets now share
a unified layout with smarter handling when both reference the same cart group
* **Cart attribute filter**: Gate any discount behind a cart attribute. Require
a specific key to be present, or require an exact key + value match. Works
across all discount types (Custom, Volume, Order Goal, GWP, Shipping)
* **Discount Kit Live**: Collection fan-out — discounts targeting collections
are now automatically resolved to individual products, so product metafields
include both direct and collection-inherited discounts. No extra Liquid logic
needed for product badges.
* **Discount Kit Live**: Write-skip fingerprinting — unchanged metafields are
no longer rewritten on each sync, reducing API usage and improving sync speed
* **Discount Kit Live**: Parallel collection resolution (3x faster) and
real-time sync progress visible in the dashboard
* **Discount Kit Live**: Scalar metafields (`max_reward_percent`,
`max_reward_cents`) now only reflect discounts visible to all visitors. New
`test` field on DiscountSummary for easy Liquid filtering
* **Custom Discount**: Nested and parent line targeting — target specific line
items within bundles or target the parent line of a bundle for more precise
discount control
* **B2B eligibility**: New "B2B only" option to restrict discounts exclusively
to B2B company buyers, in addition to the existing "All customers" mode
* **Custom Discount**: Per-proposal eligibility conditions for more granular
discount control - **Gift with Purchase**: Consolidated storefront settings
into a single app embed - **Discount Kit Live**: New tier-level fields
(`thresholds`, `reward_values`, `reward_quantities`, `reward_product_indexes`,
`threshold_messages`) for building dynamic storefront UIs like progress bars
and gift selectors
* **Discount Kit Live**: New quick-access metafields (`max_reward_percent`,
`max_reward_cents`, `max_reward_discount`) for simplified storefront badge
displays
* Order discount now supports excluded collections. Excluded items don't count
towards thresholds and don't receive the discount - Gift with Purchase: Added
option to prevent re-adding manually removed gifts, plus performance and
stability improvements
* Discount Kit Live. Create bespoke storefront experiences with instantly
available discount data! - Gift with Purchase, Product Volume, and Order Goal
migrated to Polaris Web Components
* Expanded support to cover 24/7, 365. - Admin migration to Polaris Web
Components - Markets/locations improvements (limit 250, selector updates)
* Migrated to Remix Router v7 - Public status page at
[status.discountkit.app](https://status.discountkit.app) - Added our
Enterprise plan, with lots of features for our larger customers - Target a
specific currency in a discount proposal - Create fixed price proposals
without recurring rules - Target the cheapest or most expensive product
targets - Target 'existing' customers across all discounts
* New Tiered Pricing function and UI extension - Shipping improvements:
delivery option cost to input, new operators added
* Retail support across our discounts, including retail only, specific
location, or any mix of online and retail
* Performance improvements allowing for significantly larger input to
functions - Multi effect (also known as multi class) support added to the
Custom discount. Order and shipping in one code? You got it! - New
'conditions' UI for the Custom discount, allowing more powerful, and more
readable discount configurations - 'Test mode', which lets you take Discount
Kit for a spin without needing a subscription - Support for 2048 variants
* More options to include or exclude markets or customer tags - Recurring
payments support for an arbitrary number of cycles
* Function performance improvements to cart iteration
* Performance improvements. An average of almost 60% gains across all of our
discount functions - Custom Discount product‑level metafield support - "Apply
to compare‑at price" option - Updates to our Gift selector component
* Subscription vs one‑time handling - More options added to the shipping
discount conditional operators
# App blocks vs. Web Components
Source: https://discountkit.app/components/app-blocks-vs-web-components
The two ways to place a Live Component, and when to use each
Every Live Component can be placed two ways. They render the **same component**
from the **same data** — the difference is who places it, how it's configured, and where
it's allowed to go.
* **App blocks** — added through the **theme editor**. No code; every setting is a control
in the editor. The right choice for most merchants, and the only way to render inside
**product cards** on collection pages.
* **Web Components** — the `` element written **directly into your theme's
Liquid**. Configured with `data-*` attributes and `--dkl-*` CSS. For developers
customizing a theme by hand. (These are labelled "Web Components" on each component page.)
## At a glance
| | App block | Web Component |
| ------------------------------------ | ---------------------------------------- | --------------------------------- |
| **Added by** | Theme editor (drag-and-drop) | Hand-written in theme Liquid/HTML |
| **Configuration** | Editor settings panel | `data-*` attributes |
| **Styling** | Editor pickers (colours, spacing, fonts) | `--dkl-*` CSS styling tokens |
| **Which discount** | The block's **Discount** picker | `data-discount-id` attribute |
| **Product cards / collection grids** | ✅ Supported | ❌ Product-page only |
| **Needs the app embed** | ✅ Yes | ✅ Yes |
| **No-flicker render** | ✅ Inline server render | ✅ From a head carrier |
| **Best for** | Merchants, no code | Developers, full control |
Both paths require the **Discount Kit Live** app embed to be enabled — it loads the shared
runtime (styles + behaviour) and pre-renders the data each component reads. See
[Enable the Global App Embed](/components/overview#enable-the-‘discount-kit-live’-app-embed).
## App blocks
An app block is a theme block you add in the editor — **DK: Price**, **DK: Volume Groups**,
**DK: Discount Badge**, or **DK: Order Goal**. Drop it into a section or product-card slot,
and configure it entirely through the editor's settings panel.
```text theme={null}
Online Store → Themes → Customize → (add block) → DK: Price
```
What an app block does for you:
* **Resolves the eligible discount itself** — using the shared eligibility rules, so it
agrees with the custom-tag path. When more than one discount applies, it renders the
first eligible one, or a specific one chosen in its **Discount** picker setting.
* **Exposes every option as an editor control** — colours, spacing, labels, and
behaviour toggles. Your choices are written into a scoped `