# 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 `