Campaign builder

Fixed a bug which prevented changing the redemption limit when editing a campaign.

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, for example POST_v1_vouchers_import_csv.
  • User: Lists all logs for actions performed by a given organization user. It 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. It 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. It requires Access Project Settings permission.

Export API logs – API endpoint

You can also export API logs in a CSV file with 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).
  • order: created_at (ascending order), -created_at (descending order).

Audit logs

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

Async actions

GET v1/async-actions/{Id} endpoint returns now the user and log_id.

Bundle Multiplication is now available for all users. Bundle multiplication determines how many times a bundle can be applied within a single order. It’s 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).
  • Any 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 the 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.

Discount wizard validation

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

Timeframe

Removed the Timeframe section above Campaign and Voucher details, as this information is already displayed in its own section.

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 new 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}

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.

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.

Time picker

The time picker has been updated to use a dropdown menu instead of a clock. The dropdown 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.