> ## Documentation Index
> Fetch the complete documentation index at: https://docs.voucherify.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Product updates and announcements

<Update label="12 May 2026" description="v20260504_l" rss={{ title: "Editing vouchers in referral and loyalty campaigns"}}>
  ## Hotfix

  ### Editing vouchers in referral and loyalty campaigns

  Fixed an issue where the application froze when editing vouchers in referral or loyalty campaigns.
</Update>

<Update label="06 May 2026" description="v20260424_o" rss={{ title: "Scheduling, stacking rules, and validation improvements" }}>
  ## Improved

  ### Smarter time selection

  The time picker now uses **00:00** as the default start time and **23:59** as the default end time. Consistent 30-minute intervals were also added to make campaign scheduling faster and easier.

  ### Better stacking rules filtering

  Promotion tiers, campaigns, and categories can now be found more easily in the Stacking Rules view thanks to new filtering options.

  ### More stable Mailchimp integration

  Metadata handling in the Mailchimp integration has been improved so customer source information is kept correctly.

  ### Faster access to documentation

  A direct link to the stacking rules documentation has been added to the interface, making it easier to find help when needed.

  ### New resource drawers

  Referral Campaigns and Gift Vouchers now open in drawers, allowing details to be viewed without leaving the current page.

  ## Fixed

  ### Validation rule editing

  Fixed an issue where multiple values in customer metadata array validation rules could not be saved or edited.

  ### Clearer validation logic

  When adding multiple conditions to one validation rule, the interface now clearly shows whether all conditions (**AND**) or at least one condition (**OR**) must be met.

  ### Stacking rules permissions

  Fixed an issue where users with read-only access could still attempt to move campaigns using drag and drop.
</Update>

<Update label="27 Apr 2026" description="Scheduled maintenance" rss={{ title: "Scheduled maintenance" }}>
  ## Scheduled maintenance for shared clusters (EU1, US1, AS1)

  Planned maintenance will be performed on shared clusters (EU1, US1, AS1) to improve system stability and reliability.

  * **AS1:** May 5, 18:00–19:30 CEST
  * **US1:** May 7, 08:00–09:30 CEST
  * **EU1:** May 11, 06:00–07:30 CEST

  A brief downtime (\~5–10 minutes) will occur during each window. Requests made during this time may return **500 errors**.

  Status pages:

  * AS1: [Status page](https://status.voucherify.io/incidents/tj3bj36zp12z)
  * US1: [Status page](https://status.voucherify.io/incidents/vwq5013p6p3v)
  * EU1: [Status page](https://status.voucherify.io/incidents/6yqhnr349f20)
</Update>

<Update label="23 Apr 2026" description="v20260417_o" rss={{ title: "System security and permission improvements" }}>
  ## Improved

  ### System security and permissions

  Updated system security and permission protocols to ensure consistent access control across all user roles, with no impact on the user experience.
</Update>

<Update label="22 Apr 2026" description="v20260420_l" rss={{ title: "List customers in segment hotfix"}}>
  ## Hotfix

  ### GET v1/customers

  Fixed an issue when the [GET List customers](/api-reference/customers/list-customers) with a `segment_id` query parameter didn't return customers for a passive segment. These segments now correctly display all customers when requested through the API.
</Update>

<Update label="21 Apr 2026" description="v20260420_l" rss={{ title: "Hotfix for Mailchimp integration"}}>
  ## Hotfix

  ### Mailchimp

  Fixed an issue where updating the audience in the Mailchimp configuration would unexpectedly disconnect the integration.
</Update>

<Update label="17 Apr 2026" description="v20260403_o" rss={{ title: "Campaign transfer and improved Braze integration" }}>
  ## Added

  ### Campaign management

  You can now transfer campaigns between projects within the same cluster. This action is available directly from the Campaign details view, making it faster to reuse campaigns across projects.

  ### Braze

  You can now connect to additional Braze region endpoints: **KR-01**, **JP-01**, and **ID-01**.

  ## Improved

  ### Braze

  You now have more control over data sent to Braze. You can decide whether **barcode** and **QR code** information should be included in the Braze customer profile. Existing integrations continue to work without any changes.

  ### Areas and Stores picker

  Selecting Areas and Stores is now faster. You can **select all or deselect all** with a single click.

  ### Dropdowns

  You can now click anywhere within a dropdown option to select it, improving responsiveness and reducing misclicks.

  ### Data viewer

  Publication details, product/SKU attributes, and earning rules metadata now open in a **larger side drawer**, making it easier to explore and review detailed data.

  ## Fixed

  ### Referral campaigns in distribution

  Referral campaigns now display correctly when creating a distribution with the **"reward redeemed"** trigger.
</Update>

<Update label="15 Apr 2026" description="v20260407_k" rss={{ title: "New discount effect for BOGO" }}>
  ## Added

  This release brings a new discount effect.

  You can now select a collection as the source of free items in discounts covering **Rewards** and **Buy X, Get Y free** types. The new **Add same items as ordered** discount effect allows you running campaigns with "add free items" effect across large product collections. Voucherify adds the collection products that are in the customer's cart.

  In the API, this effect is called `ADD_SAME_ITEMS` and it's found in `redeemables.result.discount.effect` field for [validation](/api-reference/validations/validate-stackable-discounts#response-redeemables-items-one-of-0-result-one-of-0-discount-one-of-1-effect) and [redemption](/api-reference/redemptions/redeem-stackable-discounts#response-redemptions-items-voucher-discount-one-of-1-effect) endpoints.
</Update>

<Update label="2 Apr 2026" description="v20260317_o" rss={{ title: "Product imports, voucher UI updates, and multiple fixes" }}>
  ## Added

  ### Product collections (CSV import)

  You can now import a CSV file to create product collections, making it easier to handle large catalogs and set up product discounts at scale. You can also assign static metadata to all imported products.

  ### Vouchers

  Introduced a new drawer-based experience for discount voucher details, improving consistency across the dashboard.

  ## Improved

  ### Products & Bundles / Validation Rules

  Improved feedback when deleting an SKU. The UI now clearly indicates if the SKU is linked to a validation rule or bundle and cannot be removed.

  ### UI

  Added subtle borders to card components for better visual clarity.

  ## Fixed

  ### Campaigns

  Fixed pagination in advanced filtering when browsing categories in the campaign wizard.

  ### Promotion tiers

  Restored the missing **Validation rules** section in the Rules tab.

  ### Vouchers

  Fixed an issue where standalone vouchers created via API could cause infinite loading in the dashboard.

  ### Permissions & navigation

  Fixed sidebar layout issues for custom roles with limited permissions.

  ### Loyalty

  Fixed an issue where loyalty tiers in advanced filtering required a reload to appear.

  ### Date/time filters

  Fixed an issue where filtering customers or products by date-type metadata (using days in the future or past) returned incorrect results due to a default date value. Filters now return correct results based on the selected time range.
</Update>

<Update label="31 Mar 2026" description="20260325_k" rss={{ title: "Fixes to products, promotions, and referral campaigns"}}>
  ## Fixed

  This release brings several fixes to Voucherify:

  * **Products**: Fixed an issue when a deleted SKU item was still visible in the product list.
  * **Promotions**: Fixed an issue which allowed deleting a promotion tier when it was used in a distribution. Now, a promotion tier can't be deleted and it has to be removed from a distribution first.
  * **Referral campaigns**: Fixed an issue which caused the referral flow to occur when a custom event was triggered in an inactive referral campaign.
</Update>

<Update label="26 Mar 2026" description="20260316_k" rss={{ title: "Hotfix for roles and permissions"}}>
  ## Hotfix

  ### Roles and permissions

  Fixed the issue where users with a custom **USER** role could access **Team Settings** and **Project Settings** without the required permissions, which could result in unauthorized changes.
</Update>

<Update label="25 Mar 2026" description="v20260316_k" rss={{ title: "Removed cockpits and landing pages" }}>
  ## Removed

  The following features were removed from Voucherify.

  ### Customer cockpits

  Customer cockpits were removed. URLs to customer cockpits will redirect to dashboard Preference center, where customers can manage their email preferences. The updated URL is also returned by the [GET Customer endpoint](/api-reference/customers/get-customer).

  ### Landing pages

  Landing pages were removed. URLs to past landing pages will return a `404 Not found` page.
</Update>

<Update label="24 Mar 2026" description="v20260309_o" rss={{ title: "Hotfix for redemptions"}}>
  ## Hotfix

  ### Redemptions

  Fixed an issue where rolling back a redemption without an assigned customer via the UI failed.
</Update>

<Update label="17 Mar 2026" description="v20260309_o" rss={{ title: "Hotfix for approval requests"}}>
  ## Hotfix

  ### Approval requests

  Fixed an issue where pagination did not work correctly in the **Approval requests** table. You can now navigate between pages and change the number of rows displayed per page.
</Update>

<Update label="17 Mar 2026" description="v20260309_o" rss={{ title: "Improved Stacking Rules and Categories management"}}>
  ## Added

  ### Improved stacking rules and categories management

  Configuring how incentives interact with each other is now **simpler and more transparent**.

  Previously, **categories and stacking rules were managed in separate views**. Users first created categories and then configured their stacking behavior later in the **Stacking Rules** view. This separation made the setup process less intuitive and required switching between different parts of the dashboard.

  **What changed**

  * Categories and stacking rules are now configured in a single view
  * Stacking eligibility and discount calculation mode can be defined during category creation
  * Terminology has been updated to better reflect stacking behavior
  * New permissions for viewing and modifying stacking rules
  * Updated default permissions for Admin, User, and Viewer roles

  With this update, category creation and stacking configuration are **unified into a single workflow**, allowing stacking behavior to be configured directly when creating or editing a category.

  <Note>
    The **behavior of stacking rules and categories has not changed**.\
    Existing configurations will continue to work as before, and **no updates to project configuration are required**.
  </Note>

  **New permissions for Stacking Rules**

  To support the updated workflow, we introduced two new permissions:

  * **Read Stacking Rules** – allows users to access the Stacking Rules page and view stacking configuration.
  * **Modify Stacking Rules** – allows users to edit stacking settings and assign stacking parameters to categories.

  **Default role permissions**

  | Role       | Permissions                                                           |
  | ---------- | --------------------------------------------------------------------- |
  | **Admin**  | Full access                                                           |
  | **User**   | Read stacking rules, read categories, create/modify/delete categories |
  | **Viewer** | Read categories, read stacking rules                                  |

  **Learn more**

  * [Manage categories](https://docs.voucherify.io/orchestrate/manage-categories)
  * [Stacking rules](https://docs.voucherify.io/orchestrate/stacking-rules)
  * [Using stacking rules and categories](https://docs.voucherify.io/orchestrate/using-stacking-rules-and-categories)

  ### Payload designer autocomplete

  The **Payload Designer** now provides inline autocomplete suggestions for available variables.

  When typing in the editor, relevant variables appear as semi-transparent suggestions. Press **Tab** to insert the suggestion instantly and continue writing.

  This makes it easier to discover available variables and build payloads **faster and with fewer errors**.

  ### Redemptions in drawers

  The **Redemptions** section now opens in **drawers**, improving navigation and making redemption details easier to explore without leaving the current view.

  The drawer includes dedicated tabs for:

  * **Transactions**
  * **Metadata**
  * **Dashboard**

  This layout helps you quickly access redemption details while keeping the main interface visible.

  ### Bundle scaling option

  A new option, **Bundle scaling**, lets you control how discounts apply when multiple eligible bundles appear in the cart.

  You can now choose whether the discount:

  * applies **once per order**, or
  * **scales automatically** based on the number of qualifying bundles.

  This provides greater flexibility when configuring bundle promotions and allows discounts to scale automatically without requiring custom formulas.
</Update>

<Update label="12 Mar 2026" description="v20260223_k" rss={{ title: "New validation rules and locale settings"}}>
  This release brings new validation rules, locale settings for dates, and several improvements and fixes.

  ## Added

  ### New validation rules

  You can now use the following validation rules:

  * **Total amount after discounts**: The rule allows to block validation and redemption when the total amount is discounted beyond the defined value. For example, you can prevent orders from being discounted to \$0. To differentiate the validation rules, the\*\* Total amount\*\* rule is renamed to **Total amount before discounts**.
  * **Total number of redemptions per week**: Define the weekly limit of redemptions allowed in the entire campaign for all customers (the sum of all redemptions made with unique codes from the campaign).
  * **Redemptions per incentive per week**: Define the weekly limit of redemptions for a given incentive.
  * **Redemptions per customer per incentive per week**: Define the weekly limit of redemptions that a particular customer can make using a given incentive.
  * **Redemptions per customer in a campaign per week**: Define the weekly limit of redemptions that a particular customer can make using codes from a particular campaign.

  ### Project settings: Add locale

  You can now add locale settings for the project. The locale determines date and time formats and the starting day of the week (Monday, Saturday, or Sunday). The starting day of the week affects the new "per week" validation rules added in this release.

  ## Improved

  ### Distributions: Customer entered segment trigger

  The distributions using the **Customer entered segment** trigger can now send the message to customers who have already joined the segment once the distribution is saved. The distribution then sends messages to each customer who joins the segment.

  ### Errors in validations and redemptions

  Validations and redemptions requests will now return unified `redeemable_type` and `redeemable_id` fields for errors during validation or redemption. The change makes it easier to find an invalid redeemable in the API response.

  ### Audit log

  The performance of API logs in the Audit log is now improved. The results load now faster.

  ### Categories API

  The `DELETE /v1/categories/{id}` endpoint now blocks category deletion if it's used in Stacking rules. However, you can force the deletion together with entry to Stacking Rules by passing a new query parameter `remove_from_stacking_rules`; for example: DELETE `/v1/categories/{id}?remove_from_stacking_rules=true`.

  ## Fixed

  * **Stacking rules and categories**: Fixed a bug that displayed a category ID in stacking rules when the category was deleted.
  * **Audit log**: In custom webhook distributions, fixed a bug which incorrectly displayed a generic webhook payload instead of showing the actual payload.
  * **PUT Update customer segment**: Fixed a bug which allowed entering any value to the `junction` field.
</Update>

<Update label="9 Mar 2026" description="v20260224_o" rss={{ title: "Custom webhook headers"}}>
  ## Added

  ### Custom headers for webhooks in Project settings

  You can now configure custom headers for webhooks in **Project settings**. This is consistent with the options available for webhooks available in **Distributions**.

  ### Drawer interface in promotions

  Access and manage settings of Promotions with a new drawer interface.

  ### 12-month dashboard view

  Review and analyze data from the past year by selecting the last 12 months as a time period in the new Dashboard.

  ## Improved

  ### Validation rules editing in the Rules tab

  Selecting a new validation rule in an incentive’s **Rules** tab updates the display instantly. Before, the configuration had to be saved to see validation rule configuration.

  ### Loyalty tier selection clarity

  When you select a loyalty tier in validation rules or distributions, you can now see the campaign each loyalty tier belongs to. This way you can easily distinguish between tiers with the same name in different campaigns.

  ## Fixed

  * Clickable customer links in validations: When validating discounts, if a customer with a specific source ID exists, the validation list now displays a clickable resource link instead of plain text.
  * Redemption limit message: Fixed an issue where a message incorrectly appeared stating that the redemption limit was reached for vouchers from campaigns with unlimited redemptions.
  * Earning rules and used count: When disabling an earning rule, the **Used count** will now remain unchanged as expected.
  * Campaign filtering: Filtering for vouchers, redemptions, and publications in campaign details now uses unique IDs instead of names, resolving crashes caused by special characters like `%` and improving performance.
</Update>

<Update label="19th Feb 2026" description="Optimize docs section" rss={{ title: "Optimize section in User guides"}}>
  As part of migrating [the Help Center](https://support.voucherify.io/ "Voucherify Help center – support documentation"), we've published a new section called [Optimize](/optimize/optimize-overview).

  There, you can find details about:

  * [Validations and redemptions](/optimize/validations-and-redemptions)
  * [Creating validation rules](/optimize/create-validation-rules)
  * [Validation rule reference](/optimize/validation-rules-reference)
  * [Time limits](/optimize/time-limits)
  * [Creating rewards](/optimize/create-rewards)

  Additionally, we've added a new article about [Loyalty card import](/build/loyalty-card-import) to the [Build section](/build/campaign-overview).
</Update>

<Update label="16th Feb 2026" description="v20260209" rss={{ title: "Gift campaign drawers"}}>
  ## Added

  ### Gift campaign drawers

  You can now open gift campaigns in a drawer view.
  This makes it faster to view campaign details without leaving your current page.

  ### Payload designer – phone support

  The payload designer now always includes the `phone` variable for both customer and holder objects.
  This helps you personalize your payloads more easily.

  ## Improved

  ### Validations table – show more and show less

  The validations table now includes a **show more/show less** button.
  You can expand or collapse the incentive list to keep the view clean.

  ### API keys – improved security

  Secret keys are now hidden after the first time they are generated.
  Only the last four digits remain visible for verification.
  This change applies to production projects.
  Sandbox behavior is unchanged.
</Update>

<Update label="9th Feb 2026" description="v20260205" rss={{ title: "New query parameter to GET Campaign template"}}>
  ## Improved

  ### GET Campaign template

  The [GET Campaign template](/api-reference/templates/get-campaign-template) endpoint has now a query parameter `expand=json_template`. The query parameter returns a `json_template` object that lists details about the campaign template, like `campaign`, `validation_rule`, or `campaign_type` fields.

  <Info>
    The update to the documentation is in progress.
  </Info>
</Update>

<Update label="9th Feb 2026" description="v20260128" rss={{ title: "February 9th release", description: "Vouchers dashboard tab" }}>
  ## Added

  ### Vouchers dashboard tab

  The vouchers dashboard tab has a refreshed and unified design across all campaign types.
  This provides a clearer and more consistent experience.

  ## Improved

  ### Integrations

  Integration credentials are now hidden after saving.
  This improves security and prevents secrets from being shown in the UI.

  ## Fixed

  ### Team settings

  Fixed an issue that caused the API call limit to not update automatically when switching projects.

  ### Areas and stores

  Fixed an issue where areas and stores assignments were not visible in project settings until the page was refreshed.

  ### Dashboard redemption

  Fixed an issue which prevented vouchers from being redeemed after reloading the page during the redemption flow.

  ### Filters

  * Fixed an issue that caused metadata filters with a value of `0` to display empty filter chips and apply incorrect filtering.

  * Fixed an issue where value inputs were missing for **Includes** and **Overlaps** conditions when filtering by array date or datetime metadata.

  * Fixed an issue which caused advanced filtering in distributions to show only active segments.
    Passive segments are now also displayed.
</Update>

<Update label="3rd Feb 2026" description="v20260115" rss={{ title: "February 3rd release", description: "Campaign drawers hotfix" }}>
  ## Hotfix

  ### Campaign drawers

  Fixed an issue with business rule assignment in campaign drawers.
</Update>

<Update label="28th Jan 2026" description="v20260115" rss={{ title: "January 28th release", description: "Added drawers for orders, customers, products, and discount campaigns" }}>
  ## Added

  ### Drawers for orders, customers, products, and discount campaigns

  Orders, Customers, Products, and Discount Campaigns can now open in a drawer view.
  This lets you view and edit details without leaving your current page.

  ### Product collection activity tab

  Product collections now include an Activity tab.
  The tab shows a history of changes made to each collection.

  ### Payload designer

  The Payload Designer now supports mapping individual array elements.
  You can select specific items using a picker, including quick options for the first item, second item, or a custom index.

  ### Campaign templates

  Creating campaigns and tiers from templates now uses a wizard-based flow.
  You can select existing resources such as product collections and segments during setup.

  ## Improved

  ### Order status update

  You can now update the order status directly from the order header.
  This makes quick status changes easier.

  ### Customer custom event wizard

  The flow for creating customer custom events has been redesigned as a step-by-step wizard.
  This improves clarity and usability.

  ### Filtering earning rules

  You can now search for Earning Rules by name in Campaign edit mode.
  Search is case-insensitive.

  ### Product collection edit

  You can now edit both static and dynamic product collections directly from the Product Collection view and the Campaign wizard.

  ### Campaign template preview

  When creating a campaign from a template, you can now preview discount details and selected resources before creating the campaign.

  ### Unified voucher headers

  Discount Vouchers, Loyalty Cards, Referral Codes, and Gift Cards now use unified headers.
  This improves consistency and clarity across views.

  ### Resource links

  Resource links now support standard browser behavior.
  You can open links in a new tab using Cmd-click (macOS) or Ctrl-click (Windows/Linux).

  ## Fixed

  ### Validation rules

  Fixed an issue which allowed creating validation rules with unknown metadata properties.

  ### Discount campaign publish button

  Fixed an issue that caused the Publish button to be out of sync with the campaign status.
  The button now updates correctly without requiring a page reload.

  ### Formula builder

  Fixed an issue which caused long parameter names in Dynamic Discounts to be hard to read.
  Names are now truncated with an ellipsis and shown in full using a tooltip.

  ### Resource links

  Fixed an issue where resource links could get stuck in an infinite loading state after a page refresh.

  ### Filters

  Fixed an issue which caused filter controls to overflow when multiple conditions were added.
  All controls now remain visible and accessible.

  ### Validation rules input

  Fixed an issue which caused the Validation Rules input to become disabled after clearing a selected rule while editing a discount campaign.
  The input now stays active and allows selecting or creating a new rule.
</Update>

<Update label="19th Jan 2026" description="v20260107" rss={{ title: "January 19th release", description: "Fixed voucher publication performance and loyalty points rounding" }}>
  ## Fixed

  ### Voucher publication performance

  Fixed an issue that caused very slow voucher publication for large campaigns where all vouchers were already published.
  The system now skips unnecessary checks and creates a new voucher immediately, which significantly improves performance for large campaigns.

  ### Loyalty points rounding

  Fixed an issue that mainly affected loyalty programs using formulas to calculate points.
  When a formula returned a decimal value, points were not added because only whole numbers were supported.
  Points are now automatically rounded to the nearest whole number before being added to the customer’s loyalty card.

  ### Loyalty campaigns

  Fixed an issue where Validation Rules could not be added when creating or editing Earning Rules in Loyalty campaigns.
</Update>

<Update label="15th Jan 2026" description="v20260108" rss={{ title: "January 15th release", description: "Introducing audit log browser" }}>
  ## Added

  ### Exported audit log browser

  You can now browse exported API audit logs directly in the app.
  The new browser lets you search, filter, and view log details for ready exports created within the last 90 days. This makes reviewing API activity easier.

  ## Improved

  ### Voucher filtering

  The filter previously named Voucher quantity is now called Redemptions quantity.
  This name better reflects what the filter does when searching vouchers.

  ### Consistent tab names

  Tab names across campaigns, vouchers, and customer views are now more consistent.
  For example, Validation Rule is now Rules, and Redemption History is now Redemptions.

  ### Unified validation rules tab

  The Rules tab now looks and works the same for Discount coupons, Gift cards, and Referral codes.
  This makes validation rules easier to understand and manage.

  ### Payload Designer

  The Payload Designer now supports mapping individual Voucherify metadata fields into the payload.
  This allows more flexible payload configuration.

  ## Fixed

  ### Campaign templates and segments

  Fixed an issue which caused campaigns created from templates to reuse an edited dynamic segment instead of creating a new segment based on the template.

  ### Approval requests for promotion tiers

  Fixed an issue that prevented approval requests from being triggered when users with limited permissions edited promotion tiers.

  ### Braze channel in distributions

  Fixed an issue which caused the Braze distribution channel to be missing for some triggers.
  The channel is now available for Reward redeemed, Loyalty points adjusted, and Customer rewarded loyalty points.
</Update>

<Update label="7th Jan 2026" description="v20251219" rss={{ title: "January 7th release", description: "Introducing drawers to rewards" }}>
  ## Added

  ### Drawers for rewards

  Rewards now support drawers for a smoother navigation experience. When a reward is opened via an in-app resource link, it will open in a drawer, while opening the link in a new tab displays a dedicated reward page. This ensures consistent behavior with existing resource links and event handling.

  ## Improved

  ### Drawer headers

  Drawer headers now display pills in a unified and consistent order across all resources. This standardization improves visual consistency and makes key information easier to scan and predict.

  ## Fixed

  ### Filters

  Fixed a server error (500) that occurred when filtering resources by metadata with large IN conditions (more than 21 values).

  ### Areas and stores

  Fixed an issue where cloned campaigns lost Area and Store assignments after an approval request was approved.
</Update>

<Update label="22nd Dec 2025" description="v20251208" rss={{ title: "December 22nd release", description: "New endpoints for product collections API" }}>
  ## Added

  ### Product collections – API

  This release brings two new functionalities to the product collection API.

  You can now use the PUT `v1/product-collections/{productCollectionId}` endpoint to:

  * Update the name of a static or auto-update product collection.
  * Update the filters of an auto-update product collection.

  This way you can change the products covered by an auto-update collection, so you don’t have to add a new collection and edit your campaigns when you need to quickly tweak which products your promotion activities target.

  Additionally, you can now use the GET `v1/product-collections/{productCollectionId}/activities` endpoint to check when the product collection was created and its name or filters updated.

  ## Improved

  * **GET `v1/products/{productId}` endpoint**: Added a query parameter `hide=sku` to return only the product data without its SKUs.
  * **GET `v1/segments/{segmentId}/activities` endpoint**: Added `has_more` and `starting_after_id` fields for pagination.
  * **Preference center**: Customer email preferences can now be managed from the customer’s profile by clicking the cog button in the top right corner of the screen.
</Update>

<Update label="19th Dec 2025" description="v20251211" rss={{ title: "December 19th release", description: "Customer segment events and new UI drawers" }}>
  Welcome to your latest Voucherify update! Here's what's new, improved, and fixed!

  ## Added

  ### Customer segments: activity tab

  **Customer Segment** pages now include a new **Activity** tab that provides a clear view of segment events. This log lists segment creation, activation, and update, helping teams better understand how segments change over time.

  ### Audit log: New drawer views for background tasks and exports

  You can now preview **Background tasks** and **Exports** details in a drawer, so you can access information directly from the list view and you don't have to leave your current context.

  ### Vouchers list: Campaign is Unknown filter

  The **Vouchers** list now supports filtering vouchers with or without a campaign assignment.

  ## Improved

  ### Drawers: Consistent design

  The design and behavior of resource drawers (logs, metadata schemas, distributions, and so on) have been improved for better consistency and usability.

  ### Vouchers: Validation history

  The **Validation history** view in voucher details has been updated. Vouchers are now automatically scoped to the current incentive via a pre-set, non-removable filter, so you only see relevant results. You can also filter by status and creation date.

  ### Approval requests: Multiple edits

  Improved the approval requests list to make it easier to review and manage approvals for related resources.

  ## Fixed

  * **Approval requests: Multiple edits**: Fixed an issue where approval requests could not be approved if multiple edits targeted the same object.
  * **Earning rules: Long names**: Fixed an issue where long earning rule names overlapped the action menu, making edit and delete actions inaccessible.
  * **Distributions: Infinite loader**: Fixed an issue where an infinite loading icon was displayed in the Distribution drawer after changing the distribution status.
  * **Loyalty campaigns: Earning rule Mapping**: Fixed an issue where earning rule mappings were unintentionally removed during loyalty campaign edits.
</Update>

<Update label="December 15th, 2025" description="v20251203_o">
  ## Hotfix

  ### Payload Designer

  Resolved an issue where webhook payloads did not include certain custom event data. Webhooks now correctly deliver all configured custom payload fields.
</Update>

<Update label="15th Dec 2025" description="New API endpoint documentation" rss={{ title: "New documentation", description: "API reference for POST Loyalty point estimation" }}>
  ## v1/loyalties API

  The documentation for endpoint POST `v1/loyalties/{campaignId}/qualifications` [has just been added](/api-reference/loyalties/estimate-loyalty-points).

  Use this endpoint to calculate an estimate number of points that a customer will receive for their order. The points are calculated for earning rules based on the order paid rule.
</Update>

<Update label="11th Dec 2025" description="v20251203_o" rss={{ title: "December 11th release", description: "Discount and Loyalty fixes and improvements" }}>
  ## Improved

  ### Loyalty program experience

  Labels and info panels in Loyalty Campaigns now explain points expiration rules more clearly. This helps you understand how expiration works and what options are available.

  ### Discount campaign dashboard

  The Dashboard tab in Discount Campaigns has a cleaner and more focused design.

  ### Discount campaign header

  The Discount Campaign header has been updated for a clearer and more streamlined management experience.

  ### Product selection in discounts

  When using Add Items, the first empty field in the Bundled Items or Discounted Items list is now filled automatically. New items are no longer added to the next position when an empty field is available.

  ## Fixed

  ### Discount campaign analytics

  Fixed an issue which caused the "Total orders value" and "Discounted amount" to be missing from the Orders analytics chart for Discount Campaigns. These values now display correctly.

  ### Discount value fallback

  Fixed an issue which caused the Discount value fallback to be hidden in campaign details for discount types created with the formula builder. The fallback value is now always visible.

  ### Formula tooltip consistency

  Fixed an issue that caused the fallback tooltip in Discount Campaigns to show raw API values. The tooltip now displays the same formatted value shown on the dashboard.

  ### Activity log button

  Fixed an issue that made the Log button unavailable for events in the Activity tab. The Log button is now enabled for all events with an associated log.

  ### Passive segments in referral campaigns

  Fixed an issue which caused customer segments triggered by tiers in Referral Campaigns to be created incorrectly when using the approval flow. Segments now appear with the correct name and filter.
</Update>

<Update label="3rd Dec 2025" description="v20251203" rss={{ title: "December 3rd release", description: "Fix to qualifications" }}>
  ## Fixed

  * **Qualifications**: Fixed an issue that failed to return redeemables in campaigns with a validity time frame set with interval and duration when daylight saving time changes.
</Update>

<Update label="2nd Dec 2025" description="v20251125" rss={{ title: "December 2nd release", description: "Activity tab advanced filtering" }}>
  ## Added

  This version brings several new features to Voucherify.

  ### Activity tab – advanced filtering & navigation

  The Activity tab now has a new table view with advanced filters. You can filter by event name, category, date, and context-specific options (such as campaign or campaign type in Customers). This makes it easier to find specific changes without scrolling through long lists.

  ### Validation rules in drawers

  Validation rules now open in drawers. This lets you view rule details without leaving your current page.

  ### Voucher import CSV

  You can now map two new fields in CSV imports: start\_date and expiration\_date. These fields are supported when importing vouchers into campaigns and when creating standalone vouchers.

  ## Improved

  ### Discount campaign analytics tab

  The Analytics tab in Discount Campaigns has a cleaner layout. You can choose how many charts to show per row (1–3), making it easier to view and compare results. All existing analytics features remain available.

  ### Discount wizard – step summaries

  The discount wizard now shows key discount details under each step title. This includes discount type, value, effect, and related product, SKU, or collection links with “Show more” support. Validation rule names are shown as plain values, and steps without a rule are clearly marked.

  ## Fixed

  ### Metadata dictionary validation

  Fixed an issue where users could continue even when a metadata dictionary value was invalid or removed. You must now fix all metadata errors before proceeding, including in cross-project approval scenarios.

  ### Approvals – duplicate error toasts

  Fixed an issue that caused two error toasts to appear when an approval failed. Only one clear error message is now shown, giving you enough time to read and understand it.

  ### Product search

  Fixed an issue that made product search case-sensitive and unclear. Search is now case-insensitive and begins after you type 3 characters. The “No items found” message only appears after 3 characters. Products with very short names can still be found with advanced filters.
</Update>

<Update label="25th Nov 2025" description="v20251124" rss={{ title: "November 25th release", description: "New customer segment endpoints" }}>
  ## Added

  This version brings several new features to Voucherify.

  ### Webhooks

  You can now monitor changes to your customer profiles with the new webhook covering the `customer.updated` event. You can find this webhook in Project settings. This webhook is not triggered by bulk customer updates, like import customers with a CSV file, update customers in bulk, or update customers' metadata in bulk.

  ### Customer segments

  This version brings a couple of new features to customer segments.

  We've added a new API endpoint GET v1/segments to list your segments. You can use the following query parameters:

  * `limit` with a maximum value of 100
  * `order` with `created_at` (ascending) and `-created_at` (descending) values
  * `filters` with `id`, `type`, `name`, `created_at` values
  * `starting_after` with an ISO 8601 timestamp value
  * `ids` with an ID as a string or an array of ID strings

  Additionally, there's another new API endpoint for monitoring activities in the segment, GET `v1/segments/{id}/activities`. You can list the following events related to that segment:

  * created
  * updated
  * activated
  * filters\_updated

  You can use the following query parameters:

  * `limit` with a maximum value of 100
  * `order` with `created_at` (ascending) and `-created_at` (descending) values
  * `starting_after` with an ISO 8601 timestamp value
  * `starting_after_id` with an activity ID; it returns activities created after this activity.
  * `start_date` with an ISO 8601 timestamp value
  * `end_date` with an ISO 8601 timestamp value
  * `type` with an event type name
  * `category` with an event category

  ## Fixed

  * **Campaigns**: Fixed an issue that failed to set an unlimited redemption limit for vouchers when setting default\_voucher\_redemption.quantity to null while updating a campaign.
  * **Redemptions**: Fixed an issue that prevented rolling back a parent redemption which had a successful and a failed redemption.
</Update>

<Update label="November 24th, 2025" description="v20251119" rss={{ title: "November 24th release", description: "Payload designer" }}>
  ## Added

  * **Payload Designer – Context-Based Examples**: The Payload Designer now shows example payloads that change automatically based on the selected trigger. Only variables relevant to the trigger type are displayed, making it easier to build and test payloads.
  * **Payload Designer – Raw Payload Support**: You can now send raw webhook payloads. A new checkbox lets you switch between sending the full webhook payload or only the raw payload from the designer.
  * **Payload Designer – Payload Preview**: A new preview panel shows example payload data. You can toggle the preview on or off for both default and custom payloads.

  ## Fixed

  * **Lists**: Fixed an issue where several list views (such as Promotion Tiers and Promotion Stacks) did not refresh correctly after create, edit, or delete actions. Record counts, search results, and pagination now update correctly.
  * **Events**: Fixed a bug where the *Performed By* and *Channel* fields were missing in event details when logs were unavailable. These fields are now always displayed.
</Update>

<Update label="November 19th, 2025" description="v20251114" rss={{ title: "November 19th release", description: "Logs export" }}>
  ## Added

  * **Export Logs**: You can now export filtered API audit logs to CSV directly from the UI. All filters are supported.
  * **Advanced filters for logs**: You can now filter logs by text in the request body and response body during export. Use one or both filters. Available on request for Enterprise customers.

  ## Improved

  * **Segments**: The “Filtered Segment” name is now changed back to “Dynamic Segment” to match our standard terms.

  ## Fixed

  * **Earning Rules**: Fixed an issue that blocked editing the time frame after setting an expiration date. You can now update all date fields correctly.
</Update>

<Update label="November 17th, 2025" description="v20251103" rss={{ title: "November 17th release", description: "Improvements to SAML login" }}>
  ## Improved

  * **SAML**: For clients with enabled SAML login, the password setup process while creating a new account is now completely disabled as this step is redundant.
</Update>

<Update label="November 14th, 2025" description="v20251105" rss={{ title: "November 14th release", description: "Improvements and bug fixes to UI" }}>
  ## Improved

  * **Show more**: The **Show more** component is now consistent across the app. You'll notice a unified click-to-open experience. It has also been introduced for Areas and Stores assignments, with a display limit and the remaining items accessible with the **Show more** button.
  * **Payload designer**: Improved the Payload designer to correctly retain variables with `null` values when saving and reopening custom payloads.

  ## Fixed

  * **Metadata**: Fixed an issue where dates in “array of dates” metadata fields were displayed incorrectly in pills when the project timezone differed from your local timezone. Dates now reflect the values you select, regardless of the timezone.
  * **Time frame**:
    * Fixed an issue where the **Starts in X days** label for promotion tiers differed from the campaign label when daylight saving time or timezone offsets were applied. The display is now consistent.
    * Campaign start and expiration dates now consistently match your input, even during daylight saving time transitions.
  * **Payload designer**: Payload designer now correctly saves empty arrays `[]` and empty objects `{}` in custom payloads.
</Update>

<Update label="November 6th, 2025" description="v20251024_k">
  ## Removed

  * **Segments**: Removed the initial\_sync\_status property from responses in POST v1/segments and GET v1/segments/{segmentId} endpoints.
</Update>

<Update label="November 5th, 2025" description="v20251031">
  ## Added

  ### Passive segments

  This change helps you manage customer segments more efficiently. It reduces noise from frequent profile updates and gives you better control over when segment events should be tracked.

  Segments created from filters are now Passive by default.

  * Passive segments do not trigger join or leave events in a customer profile.

  * Active segments still trigger these events.

  * If a Passive segment is used in Earning Rules, Distributions, or Referral Tiers, it becomes active automatically.

  * Existing Active segments are not affected.

  ### Read-only segments tab

  A new Segments tab in the Customer Profile shows all segments a customer belongs to. This tab is read-only and includes search, pagination, and sorting.

  ### Edit passive segments

  You can now edit conditions for Passive segments directly in the app. Once a segment becomes Active, it can no longer be edited.

  ### Drawers

  Drawers now support a URL parameter to keep the opened item state after refresh or when sharing a link.

  ## Fixed

  ### Drawers

  Fixed an issue where breadcrumb navigation didn’t close drawers for Metadata and Audit Logs. Clicking the breadcrumb now closes the drawer correctly.

  ### Metadata

  Fixed an issue where a duplicate warning appeared for required metadata fields with predefined dictionary values.
</Update>

<Update label="October 31st, 2025" description="v20251029">
  ## Improved

  ### Filters

  You can now filter resources by an exact date in date-type fields, making it easier to find what you need.

  ## Fixed

  ### Discounts

  Fixed an issue where editing discounts with dynamic collections triggered extra validation.

  ### Demo Shop

  Fixed an issue where Free Item Discount campaigns with the “always add new items” setting didn’t show the free item correctly in the cart. The free unit now appears as a separate line, matching the API response.

  ### Orders

  Fixed an issue where products selected by source ID didn’t display correctly as resource links when creating an order.

  ### Rewards

  Fixed an issue where the Related Object column in the Rewards table showed wrong information for rewards assigned to referral tiers.

  ### Loyalties

  Fixed an issue where the Adjust points button was active for unpublished loyalty cards. It’s now disabled to prevent errors when adding points to cards without a holder.

  ### Redemptions

  Fixed an issue where the pagination counter in order details counted units instead of order line items.

  ### Earning rules

  Fixed an issue where the points expiration label was unclear. It now says “Use campaign expiration rules” to better describe how it works.
</Update>

<Update label="October 29th, 2025" description="v20251024">
  ## Added

  ### Metadata

  The updated metadata editor — once only in Customers and Rewards — is now available everywhere. You can now edit metadata consistently in campaigns, customers, products, orders, redemptions, and more.

  ## Fixed

  ### Approval requests & metadata

  Improved error handling when metadata changes from a single value to an array. The system now validates schema changes correctly, approval requests no longer fail, and error messages are clearer.
</Update>

<Update label="October 24th, 2025" description="v20251014">
  ## Improved

  ### Table usability

  Tables now support horizontal scrolling. Key columns such as ID/Name, Status, and Actions stay fixed while you scroll, making it easier to view and compare data across wide tables.

  ### Product & SKU display

  The Product and SKU columns are now combined into one Name column for better clarity. If the item is an SKU, both the Product Name and SKU Name appear together.
</Update>

<Update label="October 16th, 2025" description="v20251007">
  ## Added

  ### Audit log

  This version brings new filters and functionalities to Logs. Thanks to these changes, you can quickly find relevant logs for analytics or troubleshooting.

  #### New filters

  Users with the **Read events and technical logs** permission can now find data quicker in the Audit logs thanks to the new filters:

  * **Endpoint** – Lists all logs for a specific endpoint, e.g. `POST_v1_vouchers_import_csv`.
  * **User** – Lists all logs for actions performed by a given organization user. Requires **Access to Project's Users list** permission.
  * **Server-side API key** – Lists all logs performed with a given server-side API key. The filter uses the key name, so the key itself is protected. Requires **Access Project Settings** permission.
  * **Client-side API key** – Lists all logs performed with a given client-side API key. The filter uses the key name, so the key itself is protected. Requires **Access Project Settings** permission.

  #### Export API logs – API endpoint

  You can now export API logs in a CSV file using the `POST /v1/exports` (Create exports) endpoint.\
  Pass `"exported_object": "api_log"` in the request body.

  You can use the following parameters:

  * **fields:** `"id"`, `"created_at"`, `"status"`, `"request_id"`, `"channel"`, `"method"`, `"endpoint"`, `"url"`, `"user_email"`, `"app_id"`, `"client_app_id"`, `"request_duration"`, `"request_body"`, `"response_body"`.
  * `filters`: `created_at` (with `$before` and `$after` conditions), `status` (with `$is` and `$is_not` conditions), `channel` (with `$in`, `$not_in` conditions), `app_id` and `client_app_id` (both with `$in`, `$not_in`, `$is`, and `$is_not` conditions).
  * **order:** `created_at` (ascending order), `-created_at` (descending order).

  ## Improved

  ### Audit logs

  * Logs for imports now include a downloadable file that was used in the import.
  * Audit log now shows the async action ID, if applicable.
  * Async action details now return the corresponding audit log ID.
  * The **Channel** filter now only shows channels that were used and lists used SDKs as a channel source.

  ## Fixed

  * Campaign builder: Fixed an issue which prevented changing the redemption limit when editing a campaign.
  * Async actions: `GET v1/async-actions/{id}` endpoint now returns the `user` and `log_id`.
  * Product CSV import: Fixed an issue which caused incorrect update of metadata for products in collections.
</Update>

<Update label="October 14th, 2025" description="v20251003">
  ## Added

  ### Bundle multiplication

  [Bundle Multiplication](/build/product-bundles) is now available for all users. It determines how many times a bundle can be applied within a single order, based on the number of complete sets of bundled items a customer adds to their cart.

  With bundle multiplication, the system automatically checks how many full bundles exist in the order and applies the discount that many times.

  #### What gets multiplied

  * The **discount value** (for example, a \$10 bundle discount becomes \$20 if two complete bundles are found).
  * **Free items** or **discounted quantities** linked to the bundle.

  #### Example scenarios

  * “Buy 2 T-shirts, get 1 hat free.” → The more T-shirts customers buy, the more hats they receive.
  * “Buy a laptop and a mouse together for 10% off.” → Discount applies only to eligible products, up to the configured limit.
  * “Get 20% off every second coffee mug (max 3 bundles per order).” → Maximum eligible bundles limit the number of discounted sets.
  * “Buy 3 skincare products and pay only for 2.” → Item discount limit ensures only one item in each bundle is free.
  * “Bundle any 4 books and get \$10 off the whole order (up to \$50 total).” → Discount multiplies with each bundle up to the set cap.

  ### Bundle multiplication

  The **Discount Effect** can now be multiplied by the number of bundles in the cart.\
  Each bundle increases either the **discount value** or the **discounted product limit**, depending on the configured Discount Effect, up to the maximum eligible bundles limit.

  ### Copy bundle button

  Added an option to copy bundled items directly to discounted products with a single click.\
  This feature works for all discount types except selected free product discounts.

  ### Discount tab

  Updated the **Discount** tab with clearer sections for **Bundled Items**, **Discounted Products**, and **Excluded Products** in a simplified, read-only layout.\
  A **collection badge** now indicates when a resource belongs to a product collection.

  ### Bundle discount setup

  Redesigned the setup flow for **bundle discounts**, making the configuration process more intuitive and streamlined.

  ## Fixed

  ### Discount wizard validation

  Fixed an issue where validation in the **Discount Wizard** did not persist across steps, which could allow saving incomplete or empty discounts.

  ## Removed

  ### Timeframe

  Removed the **Timeframe** section above Campaign and Voucher details, as this information is already displayed in its own dedicated section.
</Update>

<Update label="October 7th, 2025" description="v20250910">
  ## Added

  ### Areas and stores in the Management API

  Added new endpoints for managing areas and area stores with the Management API. The endpoints allow you to:

  * List areas in your project: `GET /management/v1/projects/{projectId}/areas`
  * Get details about a specific area: `GET /management/v1/projects/{projectId}/areas/{id}`
  * Create a new area: `POST /management/v1/projects/{projectId}/areas`
  * Update an existing area: `PUT /management/v1/projects/{projectId}/areas/{id}`
  * Delete an area: `DELETE /management/v1/projects/{projectId}/areas/{id}`
  * List all area stores: `GET /management/v1/projects/{projectId}/areas/{areaId}/stores`
  * Get a specific area store: `GET /management/v1/projects/{projectId}/areas/{areaId}/stores/{storeId}`
  * Create a news area store: `POST /management/v1/projects/{projectId}/areas/{areaId}/stores`
  * Update an existing area store: `PUT /management/v1/projects/{projectId}/areas/{areaId}/stores/{storeId}`
  * Delete an existing area store: `DELETE /management/v1/projects/{projectId}/areas/{areaId}/stores/{storeId}`

  ## Improved

  ### Areas and stores

  * Improved navigation when selecting areas, stores, and all stores.
  * Improved permission checking for Areas & Stores features, ensuring proper access control.
  * Added areas and stores filters to the campaign list.

  ## Fixed

  ### Areas and stores

  * Fixed an issue which failed to copy areas and stores assignments when cloning a campaign.
  * Fixed an issue which failed store assignments to display in area details view.
  * Fixed an issue which allowed the users without required permissions to see areas and stores tabs.
  * Fixed an issue which prevented users from creating promotion campaigns.
  * Fixed an issue which allowed restricted users to add and publish vouchers for campaigns that the restricted users could only view.
</Update>

<Update label="October 3rd, 2025" description="v20250930">
  ## Improved

  ### Time picker

  The time picker has been updated to use a drop-down menu instead of a clock.
  The drop-down provides options every 30 minutes, and any valid time can also be entered manually.
  Some time inputs in metadata definitions are not yet affected by this change and still use the legacy picker.

  ## Fixed

  ### Onboarding

  Fixed the issue where the Demoshop onboarding flow stopped at step 5, so it now continues smoothly through all 8 steps.

  ### Metadata

  * Fixed the issue where negative numbers could not be used in customer metadata and filters; negative values are now supported.
  * Fixed the issue where metadata definitions were sorted by name length instead of alphabetically.
</Update>

<Update label="September 29th, 2025" description="v20250924">
  ## Added

  ### Payload designer

  We have introduced the **Payload Designer** for webhook integrations.
  It lets you choose between sending the full webhook payload or designing your own JSON structure with static values, dynamic Voucherify keys, and nested objects.
  It solves the main limitation of the previous approach by giving you greater control and clarity when shaping webhook data.
  The mapping will be visible in the `data` object in the webhook.

  ## Improved

  ### Support widget update

  We’ve refreshed the look of the support widget in the Dashboard and introduced a new support link.
  While the appearance is slightly different, you can continue to reach out to our support team in the same way as before.
</Update>

<Update label="September 23rd, 2025" description="v20250911">
  ## Added

  ### Earning rules

  Added a message that appears when customers reach the 100-rule limit. To add a new rule, you must first delete the existing one.

  ### Verification

  Added `org_id` field to the general tab in the My profile section. Users can use it for verification when requesting sensitive data.

  ## Improved

  ### Validation rules

  Updated the discount campaigns and referral campaigns by renaming the "Validation Rules" tab to "Discount" and aligning its UI with the promotion tier. The tab now displays bundles, included and excluded products, and all application rules.

  ### Delete resources

  Updated the resource delete dialog with a clearer, simplified design. You can now choose between moving a resource to the bin or deleting it permanently using a streamlined layout.

  ## Fixed

  ### Vouchers

  Fixed the issue where the loader kept spinning when manually adding a voucher to a campaign. The interface now shows a clear message and remains usable without errors.
</Update>

<Update label="September 17th, 2025" description="v20250905">
  ## Added

  ### Loyalty

  Estimate how many loyalty points your customers will receive with a new endpoint:
  `POST /v1/loyalties/{campaignId}/qualifications`.

  See the sample request and response:

  <CodeGroup>
    ```JSON Request theme={null}
    {  
        "customer": {  
            "source_id": "customerSourceID",  
            "metadata": {  
                "reason": "loyaltyQualifications"  
            }  
        },  
        "order": {  
            "id": "ord_113628fa0685537f99",  
            "metadata": {  
                "source": "qualifyPoints"  
            }  
        }
    }
    ```

    ```JSON Response 200 OK theme={null}
    {  
        "campaign": {  
            "id": "camp_6hAtKbSF3iMj8wN8HjlvPuQG",  
            "name": "Loyalty-campaign",  
            "object": "campaign"  
        },  
        "points_estimation": 51  
    }
    ```
  </CodeGroup>

  <Warning>
    ### Point estimation

    This endpoint returns only an estimation, not a precise point value.

    Also, this estimation works only for the Order paid earning rules. If a campaign includes tiers, mappings, and multiple earning rules, the calculation becomes more complex. During final calculation, a customer may change tiers and earn more or fewer points depending on other factors.
  </Warning>

  ## Improved

  ### Voucher import

  Added support for start\_date and expiration\_date when importing vouchers with CSV. You can add the respective columns to a CSV file to import vouchers with these parameters.

  ### Management API

  Added limit and page query parameters to GET management/v1/projects/{projectId}/users endpoint. You can set a limit of a maximum of 100 results and paginate them.

  ## Fixed

  ### Product and SKU export

  Fixed a bug which prevented a notification from being sent and displayed in the app when a product or SKU export was finished.
</Update>

<Update label="September 11th, 2025" description="v20250828">
  ## Added

  ### Export

  Export products & SKUs directly from the dashboard!
  Grab all items or just your filtered view in seconds — no API needed. Files are ready in Exports in the Audit log for instant download. This makes sharing data or prepping lists for campaigns faster than ever, right from the dashboard.

  ### Earning rules

  Added an option to search earning rules by name directly in the campaign dashboard. The search works across all earning rules, is not case sensitive, and shows only rules that match your text.

  ## Improved

  ### Validation rules

  Renamed “Redemption by code holder” rule to “Redemption only by code holder” to more accurately describe its function.

  ### JSON viewer

  Improved how objects are shown in the dashboard. Empty objects and confusing property counts are no longer displayed, making the view clearer and easier to read.

  ## Fixed

  ### Export

  Fixed an issue where users without permission to export publication or redemption data could still see export buttons on the corresponding lists.

  ### Loyalty

  Fixed an issue where users could not put 0 to ‘Months after earning activity rule’.
</Update>

<Update label="September 3rd, 2025" description="v20250804">
  ## Hotfix

  ### Webhooks

  Fixed a bug which caused `VOUCHER.GIFT.TRANSACTION.CREATED` and `VOUCHER.LOYALTY_CARD.PENDING_POINTS.UPDATED` not to appear in Project settings and in the filters in Webhook send outs in the Audit log.
</Update>

<Update label="September 2nd, 2025" description="v20250804">
  ## Added

  ### Stacking rules

  We’ve added a new limit for Stackable Discounts API: Limits per category. You can now set a limit (up to 10) of stacked incentives for individual categories.

  For example, if you have a three categories, Bronze, Silver, Gold, you can set up a limit of 2 for Silver, and 1 for Gold, while Bronze is limited by the Maximum count of valid promotions per category to apply in a request. This means that a maximum of 2 incentives from the Silver category and 1 from the Gold category can be validated or redeemed in one stackable API request.

  ## Improved

  ### Segments

  Changed the name of Dynamic segments to Active.

  ## Fixed

  ### Audit logs

  Fixed an issue which caused incorrect filtering for the API value with the “not in” condition for Channel.

  ### Loyalty programs

  Fixed an issue that caused the loyalty balance to reset after changing the time frame in the loyalty card.
</Update>

<Update label="September 1st, 2025" description="v20250820">
  ## Improved

  ### Dynamic discount

  Added support for order item quantity, price, and product metadata in the "Amount Discount: Apply the full discount to each item unit".

  ## Fixed

  ### Loyalty programs

  Fixed an issue that triggered updates to all earning rules and loyalty tiers (even when no campaign changes were made) while updating a campaign.

  ### Bundle

  Fixed an issue where creating a Bundle via API without specifying "type": "product\_or\_sku" caused the product not to be shown in the UI.

  ### Discount value

  Fixed an issue that caused \[object Object] to be displayed as a discount value in orders.

  ### Log in page

  Fixed an issue that caused users to log in automatically after selecting the Read more button in the carousel.
</Update>

<Update label="August 21st, 2025" description="v20250813">
  ## Added

  ### New expiration type for campaigns and earning rules

  We’ve added support for `FIXED_DAY_OF_YEAR` expiration type in Earning Rules. This new option gives you more control over loyalty point expiration, because you can set an exact month and day. This is a perfect option for seasonal promotions, loyalty program resets, or end-of-year expirations. For example, you can set an expiration date of 31 December for all loyalty points earned during the Black Friday sales.

  Also, to improve clarity, expiration descriptions now display with short month names and a clearer date format.

  ### New drawer view for distribution details

  Distribution details now open in a drawer view across the app, including when accessed through a direct URL address. The drawer includes complete distribution data, tabs, status controls, and a redesigned actions menu. Access is available to users with Read Distributions and Publications permissions.

  ## Improved

  Improved the analytic tab to look consistent with other drawers across the app.

  ## Fixed

  ### Audit log

  The filter label for Webhook send outs has been updated. The field previously shown as ID is now displayed as send out ID.

  ### Publications

  Fixed an issue where users could view the publication history tab without proper permission.

  ### Stacking rules

  Fixed an issue that caused stacking rules to be visible to users without the proper permission.
</Update>

<Update label="August 13th, 2025" description="v20250805">
  ## Improved

  ### Rewritten the ResourceLink component to the new Angular version

  We rewrote the ResourceLink component to the new Angular version, ensuring resource displays and tooltips are now consistent across the app.
  We also made detail navigation work smoothly—opening in drawers or new tabs with our new drawer layouts.

  ## Fixed

  ### Approvals

  * Fixed an issue where voucher details were missing in the approval request preview when multiple vouchers were selected.
  * Fixed an issue which caused the campaign templates not to work correctly with approval requests.

  ### Custom events

  Fixed custom event schema filters so they now update correctly when the condition changes.

  ### Distributions

  Fixed an issue where changing the trigger for the distribution caused the campaign assignment to reset and allowed saving the distribution without a campaign assigned.

  ### Drawers

  Fixed an issue that caused products from static collections to open in the same window instead of a new tab.

  ### Earning rules

  Fixed an issue that caused a collection ID to be displayed instead of its name when multiple products or collections were selected.

  ### Referral campaigns

  Fixed a bug which caused the criteria in the Custom conversion event to change upon saving.

  ### ResourceLink

  Fixed an issue that caused the validation rule's name in the resource link not to refresh automatically after editing.

  ### User interface

  Adjusted spacing in the campaign view between the tabs and the timeframe.

  ### Loyalty programs

  Fixed an issue that triggered updates to all loyalty cards (even when no campaign changes were made) while updating a campaign.
</Update>

<Update label="August 7th, 2025" description="v20250729">
  ## Added

  ### Stacking rules

  We have added a new setting to Stacking rules: Sorting rule for grouped redeemables. You can now define a general order in which redeemables are applied when stacked discounts (validations or redemptions) include discounts with categories assigned to Joint and Exclusives.

  This rule has two options:

  * **Apply Joint categories last:** This is a default setting and the current behavior of the Stacking rules. In this scenario, Exclusive categories are applied first and then the Joint categories.
  * **Apply Sorting rule to combined Joint and Exclusive categories:** This is a new setting. In this scenario, Stacking rules combine the discounts assigned to Joint and Exclusive categories into one group and apply the discounts according to the Sorting rule setting – request order or hierarchy.
</Update>

<Update label="August 5th, 2025" description="v20250730">
  ## Added

  ### Refreshed UI for the publications history tab inside the discount coupon campaign view

  We've refreshed the UI for the Publication history tab inside the discount coupons campaign view to match the recent UI changes. The refreshed look provides a compact overview of key details matching our latest UI style for improved usability and a smoother experience.

  ## Fixed

  ### Validation rules

  Fixed an issue that did not allow the use of negative values when creating validation rules based on number metadata fields.

  ### UI

  Fixed an issue where voucher codes incorrectly appeared as 'no code' in the history tab following bulk publication in discount coupon campaigns.

  ### Filters

  Incentive filtering in the Validations has been split into two separate filters for better usability:

  * **Number of stacked incentives** – allows conditions such as 'has exactly', 'has more than', or 'has less than' to filter based on the number of applied incentives.
  * **Incentive name** – uses the “includes” condition to filter by specific incentive names.
</Update>

<Update label="July 30th, 2025" description="v20250725">
  ## Added

  ### Refreshed UI for voucher tabs inside the campaign view

  We've refreshed the UI for Vouchers, Referral codes, and Loyalty cards tabs inside the Campaign detail view to match the recent UI changes. The new tabs provide a compact overview of key details matching our latest UI style for improved usability and a smoother experience.

  ### Refreshed drawer layout for segments and collections

  We’ve updated the UI for drawers used in Customer Segments and Product Collections, delivering a cleaner and more consistent experience.
  This update also includes enhancements to breadcrumb navigation links, ensuring better usability and clarity.

  ## Fixed

  ### Approvals

  * Fixed an issue where the non-existent record with draft status briefly appeared before the page loaded the approvals list.
  * Fixed an issue where users with limited permissions could not delete vouchers with an approval request.

  ### Import

  Fixed an issue where the redeemed amount property appeared during the field mapping step when importing referral or discount vouchers. The redeemed amount property is not relevant for these voucher types.

  ### UI

  Fixed an issue where a segment and collection drawer could not open in a new tab from the segments and collections list view respectively.
</Update>

<Update label="July 29th, 2025" description="v20250704">
  ## Added

  ### Discounts - new value limits for products

  <Note>
    This feature can be enabled for you on demand. Contact [Voucherify support](https://www.voucherify.io/contact-support "Contact Voucherify Support site") to enable it.
  </Note>

  You can now limit the number of discounted item units in discount coupons and promotions. With these new limits, you can build a scenario where each of your customers can get for example only 2 discounted product units in total in a campaign and the whole campaign covers only 200 discounted product units – units sold above this limit will not be discounted.

  The limits cover the following product discounts:

  * Amount discount: Apply the full discount to each item unit
  * Percent discount: Apply the discount to item subtotal
  * New price: Apply the discount to item subtotal

  You can set the limits for products, SKUs, or collections. The new value limits are:

  * **Maximum units per customer in campaign:** limits the number of discounted item units that one customer can receive in a given campaign.
    For example, the limit is set to 2 for a T-shirt from the Adventure brand. One customer can only discount 2 units of this T-shirt.

  * **Maximum units per campaign:** limits the number of discounted item units that all customers can receive in a given campaign.
    For example, there are 10 Adventure T-shirts that can be discounted. The 10 discounted T-shirts are available to all customers and the customer who buys the 11th T-shirt won’t receive a discount.

  * **Maximum units per campaign for a product in a collection:** limits the number of discounted item units of a given product in a collection that all customers can receive in a given campaign.
    For example, the limit is set to 5 for the “Adventure-brand” collection consisting of T-shirts, beanies, and posters; this means that maximum 5 T-shirts, 5 beanies, and 5 posters will be discounted. The limit isn't split between products; each product has its own limit of 5 item units.

  * **Maximum units per customer for a product in a collection:** limits the number of discounted item units of a given product in a collection that one customer can receive.
    For example, the limit is set to 5 for the “Adventure-brand” collection consisting of T-shirts, beanies, and posters; this means that maximum one customer can get a discount on a maximum of 5 T-shirts, 5 beanies, and 5 posters. The limit isn't split between products; each product has its own limit of 5 item units.

  * **Maximum units per promotion tier:** limits the number of discounted item units that all customers can receive in a promotion tier.
    For example, there are 10 Adventure T-shirts that can be discounted. The 10 discounted T-shirts are available to all customers and the customer who buys the 11th T-shirt won’t receive a discount under a given promotion tier.

  * **Maximum units per customer in promotion tier:** limits the number of discounted item units that one customer can receive in a given promotion tier.
    For example, the limit is set to 2 for a T-shirt from the Adventure brand. One customer can only discount 2 units of this T-shirt under a given promotion tier.

  * **Maximum units per promotion tier for a product in a collection:** limits the number of discounted item units of a given product in a collection that all customers can receive in a given promotion tier.
    For example, the limit is set to 5 for the “Adventure-brand” collection consisting of T-shirts, beanies, and posters; this means that maximum 5 T-shirts, 5 beanies, and 5 posters will be discounted. The limit isn't split between products; each product has its own limit of 5 item units under a given promotion tier.

  * **Maximum units per customer in promotion tier for a product in a collection:** limits the number of discounted item units of a given product in a collection that one customer can receive in a given promotion tier.
    For example, the limit is set to 5 for the “Adventure-brand” collection consisting of T-shirts, beanies, and posters; this means that maximum one customer can get a discount on a maximum of 5 T-shirts, 5 beanies, and 5 posters. The limit isn't split between products; each product has its own limit of 5 item units.

  All of the new limits can be combined with dynamic formulas. A dynamic formula determines the number of units that’s covered by the limit.

  The limits can be configured in the Dashboard and through the API – validation rules.
</Update>

<Update label="July 25th, 2025" description="v20250718">
  ## Added

  ### New referral tier builder

  We've introduced a new referral tier builder in the fifth step of the referral campaign creation process.

  ## Improved

  ### Rewards

  Added a drop-down to the reward step in the loyalty campaign creation process.

  ## Fixed

  ### Discount

  Fixed an issue with missing fields in the 'capped by' option for:

  * Product discount > Percent discount: Apply the discount to item subtotal
  * Bundle with Product discount > Percent discount: Apply the discount to item subtotal

  ### Metadata

  Fixed an issue with the metadata schema update that caused the schema to be cached.

  ### Earning rules

  Fixed an issue with overlapping values in the Earning rules.
</Update>

<Update label="July 17th, 2025" description="v20250701">
  ## Added

  ### Loyalty campaigns

  You can now define multiple products and collections in the following rules in the Order has been paid earning rule, proportional calculation:
  Pre-discount amount spent on items, Amount spent on items, Quantity of items in the cart.

  Multiple products and collections are also supported in the API. A new parameter called applicable\_to can be added to the following PROPORTIONAL earning rules:
  `ORDER_ITEMS_QUANTITY`, `ORDER_ITEMS_AMOUNT`, `ORDER_ITEMS_SUBTOTAL_AMOUNT`.

  The parameter replaces the object and id fields with an array of objects, which contain an id and an object with a type product, sku, or products\_collection.

  You can also define a dynamic formula for earning loyalty points. The configuration works in a similar way to a dynamic discount formula.

  The dynamic formula is also supported in the API. There’s a new points\_formula field that defines the dynamic calculation of loyalty points.
</Update>

<Update label="July 16th, 2025" description="v20250708">
  ## Added

  ### Commercetools connector

  We've introduced a Gift Card connector for Commercetools that allows using Voucherify's gift cards during checkout.
  This connector features an enabler module to flexibly embed frontend components and a processor module that integrates Voucherify with checkout and payment flows.

  ### Distributions

  * You can now select which fields Voucherify will send in the webhook distribution channel. All fields are pre-selected by default.
  * You can also map the fields to custom values, for example you can change fields customer.source\_id to any keys required by your system, like user.id.
  * Added detailed webhook summaries to the distributions, showing the number of mapped fields, used headers, and the precise target URL.

  ## Improved

  ### Audit logs

  Requests and responses are now displayed side by side in the drawer view.

  ### Distributions

  For webhook distributions, limited the set of the characters to lowercase letters, numbers, and dashes in the additional HTTP headers.

  ### Filters

  Clicking on the background while using filters now closes only one window at a time, instead of the entire filter panel.

  ## Fixed

  ### Loyalty

  Fixed a bug which prevented the time frame for individual loyalty cards from being adjusted through the UI.
</Update>

<Update label="July 8th, 2025" description="v20250702">
  ## Deprecated

  * The Magento extension plugin has been deprecated.
  * The Cockpit feature is going to be deprecated – all related links and sections have been removed from the Voucherify dashboard.

  ## Improved

  ### User interface

  Drawers now remember the previously selected tab, filters, and page when navigating back.

  ## Fixed

  ### Bundles

  * Fixed an issue where bundle effect discounts were not retained for the draft campaigns.
  * Fixed an issue that caused input validation to prevent saving a discount in specific contexts.

  ### User interface

  Fixed an issue where drawers remained open after clicking a resource link.

  ### Validation rules

  Fixed the issue which prevented the correct display of unselectable items in nested lists, including geopoint metadata selection in the Validation Rules Builder.
</Update>
