# Welcome to Open Loyalty!

This guide was created to help you navigate through Open Loyalty Admin UI. If you have any questions, ideas, or feedback, feel free to get in touch via www\.openloyalty.io.

**Open Loyalty is a headless, API-first loyalty platform.** Unlike old-fashioned and monolithic software, it is easy to integrate with and ensures complete flexibility, speed, and efficiency at all levels.

The core of Open Loyalty is REST API, and on top of that, there is an Admin UI (Admin Panel) designed by top loyalty professionals around the globe to help you access members' data, launch targeted campaigns, and manage rewards.&#x20;

***

This guide is divided into two sections:

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th><th data-hidden data-card-cover data-type="files"></th></tr></thead><tbody><tr><td><strong>User Guide</strong></td><td>Learn how to skillfully manage your loyalty program using the Admin Panel.</td><td></td><td><a href="/pages/-MkLZ27dr2gFVkVfT1R4">/pages/-MkLZ27dr2gFVkVfT1R4</a></td><td><a href="/files/jq9DqwywRbhKNNWNivcY">/files/jq9DqwywRbhKNNWNivcY</a></td></tr><tr><td><strong>Technical Guide</strong></td><td>Discover how to seamlessly integrate with OpenLoyalty's API.</td><td></td><td><a href="/spaces/gIv2CyIIYf7vRfuhMKQ6">/spaces/gIv2CyIIYf7vRfuhMKQ6</a></td><td><a href="/files/IKjC2piXFefNuWX2TadH">/files/IKjC2piXFefNuWX2TadH</a></td></tr></tbody></table>

***

Remember to stay updated on our newly released features and upcoming enhancements!

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>What's New</strong></td><td>Keep up to date with all released features and improvements!</td><td></td><td><a href="/pages/su6pIma8yBoZjSrAaXIU">/pages/su6pIma8yBoZjSrAaXIU</a></td></tr><tr><td><strong>What's Next</strong></td><td>Discover the exciting releases coming your way soon!</td><td></td><td><a href="/pages/9wl4yMj3N8Bm1ydYQkQR">/pages/9wl4yMj3N8Bm1ydYQkQR</a></td></tr></tbody></table>


# What's New

Discover the latest features and improvements that make OpenLoyalty even better.

**From fresh features to powerful enhancements - see how OpenLoyalty keeps getting better.**\
Browse updates by year and explore every improvement we’ve made along the way.

<table data-card-size="large" data-column-title-hidden data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>2026</strong></td><td><a href="/pages/LBV0RunmswIAbpfdp0fn">/pages/LBV0RunmswIAbpfdp0fn</a></td></tr><tr><td><strong>2025</strong></td><td><a href="/pages/alurzNlWKNAzQcC7bnZv">/pages/alurzNlWKNAzQcC7bnZv</a></td></tr><tr><td><strong>2024</strong></td><td><a href="/pages/H22sMNdKCxBc6w7Gqoxi">/pages/H22sMNdKCxBc6w7Gqoxi</a></td></tr><tr><td><strong>2023</strong></td><td><a href="/pages/N84hWDYg8Itw7B2fFq21">/pages/N84hWDYg8Itw7B2fFq21</a></td></tr><tr><td><strong>2022</strong></td><td><a href="/pages/48lGM6ZgSpAo0jMEvB8X">/pages/48lGM6ZgSpAo0jMEvB8X</a></td></tr></tbody></table>


# 2026

Keep up to date with all released features and improvements!

{% hint style="success" %}
**📡 Stay up to date** — Subscribe to the RSS feed to get notified whenever new releases are published.
{% endhint %}

#### August 2026

{% updates format="full" %}
{% update date="2026-08-17" tags="new-feature" %}

## **🗂️ Custom Fields**

You can now extend Members, Campaigns, and Rewards with your own typed, validated fields. Define a field's name, type, and validation rules once in the Admin Panel, and it appears on the relevant forms and becomes available through the API, imports, and exports. Fields are organized into groups, and Members additionally support subgroups for repeatable data, like a list of owned vehicles or a score history.

**Why it matters:** Loyalty data no longer has to be squeezed into generic key-value attributes or built as a one-off development request. Program teams can model exactly the data their program needs — validated on every write, segmentable, and available everywhere Open Loyalty touches Members, Campaigns, and Rewards.

👉 Learn more about [Custom Fields](/integrations-and-data-exchange/custom-fields)
{% endupdate %}

{% update date="2026-08-17" tags="new-feature" %}

## **📦 Product Catalog**

You can now upload your product catalog (SKUs) to Open Loyalty and reward individual products, instead of maintaining hundreds of separate campaigns. Import your catalog from a CSV file, browse and search it by SKU or name, and organize it into a category tree. Then use the new Product Catalog campaign type to reward specific SKUs or whole groups of products, by category, brand, or attribute. Each campaign supports per-tier point multipliers, bundle rewards, and optional conditions such as a minimum quantity or minimum value of the products purchased.

**Why it matters:** Point rules that used to need a separate campaign per SKU, multiplied by every tier, are now defined once and applied automatically to every matching product. Loyalty configuration lives in one place, Open Loyalty, instead of being duplicated in your shop system.

👉 Learn more about [Product Catalog](/integrations-and-data-exchange/product-catalog)
{% endupdate %}

{% update date="2026-08-17" tags="new-feature,enhancement" %}

## **🆕 Assign a Tier via Campaign Effect**

Campaign rules now include a new **Assign a Tier** effect alongside Add/Deduct Units, Give Reward, and Grant Badge. When a member fulfills a rule's conditions on a Purchase Transaction or Custom Event campaign, you can move them straight into a selected tier. Members can still progress further on their own afterwards, once they qualify for a higher tier through standard tier criteria.

**Why it matters:** Program teams can react instantly to a qualifying purchase or event — a large order, a VIP action, a partner milestone — and place the member in the right tier the moment it happens.

👉 Learn more about [Campaign Effects](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns#add-rules-conditions-and-effects)
{% endupdate %}

{% update date="2026-08-17" tags="new-feature,enhancement" %}

## **🔄 Bulk Update of Redeemed Reward Statuses**

Thousands of issued rewards, one update. Upload a CSV with the reward ID, new status, and an optional comment, and Open Loyalty takes care of the rest — no more clicking through redemptions one by one.

**Why it matters:**\
Fulfillment teams handling high redemption volumes — approvals, shipping updates, rejections — can move a full batch through its lifecycle in a single import, with a complete audit trail and optional comments for tracking notes along the way.

👉 Learn more about [Mass Reward Status Change](/rewards-redemption/rewards/reward-fulfillment/mass-reward-status-change)
{% endupdate %}
{% endupdates %}

#### July 2026

{% updates format="full" %}
{% update date="2026-07-21" tags="new-feature,enhancement" %}

## Tier Analytics

A new analytics view for Tiers shows how members flow between tiers over time — how many upgraded, how many downgraded, and how many stayed. The interactive chart supports Isolation Mode for low-volume tiers, configurable timeframes, tier filters (up to 6 at once), and display settings like showing values on the static view or de-emphasizing same-tier flows.

**Why it matters:** Loyalty program managers can finally see tier movement at a glance — spotting upgrade momentum, churn, or downgrade patterns — without exporting data or building a separate report.

👉 [Learn more about Tier Analytics](/gamification/tiers/tier-analytics)
{% endupdate %}

{% update date="2026-07-09" tags="new-feature,enhancement" %}

## 🏷️ Custom Attributes on Campaign-Generated Unit Transfers

Point transfers created automatically by campaign "Add Units" effects can now carry custom attributes. Attributes are defined in the campaign configuration and are automatically applied to every transfer the campaign generates.

**Why it matters:** Reporting and reconciliation pipelines that need to tag point movements with business metadata — such as campaign type, budget category, or source — can now receive that context directly on campaign-generated transfers, without relying on manual transfers or post-processing.

👉 [Learn more about Campaigns](/campaigns/campaigns)
{% endupdate %}
{% endupdates %}

<details>

<summary>More July updates</summary>

**⚙️ Enhanced**

* **Member timeline, Audit Logs, and Custom Events** — Default date range extended from 30 to 60 days; a new "All" option in the timeline view lets admins see a member's full history without a date limit
* **Navigation RBAC** — Menu items that a user does not have VIEW permission for are now hidden from the navigation

**🛠️ Fixed**

* Segment member count remaining incorrect after a member is deleted when incremental segment statistics are enabled

</details>

***

#### June 2026

{% updates format="full" %}
{% update date="2026-06-25" tags="new-feature" %}

## ⚡ Points Were Activated Campaign Trigger

Campaigns can now fire automatically the moment a member's pending unit transfers transition to active. Use this trigger to reward members as soon as enough stamps clear, kick off a follow-up campaign, or push any downstream workflow that depends on freshly activated points.

**Why it matters:** Loyalty workflows that previously had to poll for balance changes or use workarounds can now react instantly to the activation event — enabling more responsive, event-driven experiences without custom integration overhead.

👉 [Learn more about Campaigns](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/internal-event#supported-internal-events)
{% endupdate %}

{% update date="2026-06-12" tags="enhancement" %}

## 🔄 Cancel Order Support

Return transactions can now automatically cancel the associated unit transfers, reversing points earned on the original purchase when a return is processed.

**Why it matters:** Loyalty programs handling product returns no longer need manual point corrections — submitting a return transaction triggers automatic reversal of the points, keeping member balances accurate without any extra admin work.

👉 [Learn more about Campaigns](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/return-transaction)
{% endupdate %}

{% update date="2026-06-05" tags="enhancement" %}

## 🏆 Leaderboard Sub-Groups

Leaderboards can now optionally group participants into independent sub-rankings by address field (postal code, city, province, or country) or by a custom attribute. Each group maintains its own Top-1000 ranking and its own reward distribution.

**Why it matters:** You can run localized competitions within a single leaderboard campaign — members compete against peers in their city or group rather than the entire member base, driving more relevant engagement.

👉 [Learn more about Leaderboards](/gamification/leaderboards)
{% endupdate %}
{% endupdates %}

<details>

<summary>More June updates</summary>

**⚙️ Enhanced**

* **Unit Transfers list** — Removed "Expired On" column and added descriptive tooltips to column headers for improved readability

**🛠️ Fixed**

* Challenge edit form — trigger condition value disappearing when the form is re-opened for editing
* Unit transfer timestamps — timezone conversion issue affecting microsecond-precision sorting
* Segment form — incorrect layout for "Custom event within last N days" criterion
* Admin panel — infinite React update loop causing crashes on certain member views
* Webhook PUT request — false validation error raised incorrectly on update
* Member Overview — Latest Activity panel not refreshing when the filter is changed
* PATCH Member API — 409 Conflict error on custom field update caused by a duplicate key violation

</details>

***

#### May 2026

{% updates format="full" %}
{% update date="2026-05-06" tags="integration,new-feature" %}

## **WalletBalanceUpdated Webhook**

A new `WalletBalanceUpdated` webhook event fires whenever a member's wallet balance changes, enabling real-time downstream integrations to stay in sync without polling.

**Why it matters:** Any system that tracks points balances externally — mobile apps, CRMs, data warehouses — can now react instantly to wallet changes instead of polling or reconciling.

👉 [Learn more about Webhooks](/integrations-and-data-exchange/webhooks/what-triggers-a-webhook)
{% endupdate %}
{% endupdates %}

<details>

<summary>More May updates</summary>

**⚙️ Enhanced**

* **"Show legacy campaigns" toggle** — Campaigns listing now defaults to hiding migrated legacy campaigns; use the toggle to show them when needed
* **Spanish translations** — Missing Spanish UI strings have been added across the admin panel

**🛠️ Fixed**

* Pagination reset sort order to oldest-first when navigating to next page across multiple list views
* Validation message not shown on invalid Custom Attribute keys on member profile
* "Name" filter on Tier Sets list was not working correctly
* Static segments not rebuilding on recalculation trigger
* S3 challenge progress export — total count mismatch in reconciliation reports (count was including challenge progresses that the export excluded)

</details>

***

#### April 2026

{% updates format="full" %}
{% update date="2026-04-07" tags="wallets,new-feature,enhancement" %}

## **⏱️ Unit Transfers Mass Actions — Set/Delete Expiration Date**

Admins can now set or remove expiration dates on multiple unit transfers at once using mass actions, directly from the transfers list.

**Why it matters:** Managing expiry across large member bases previously required individual edits. This change makes bulk expiry management practical at scale.

👉 [Learn more about Managing Unit Transfers](/members-and-activity/wallets/unit-transfers/managing-unit-transfers#bulk-actions)
{% endupdate %}
{% endupdates %}

<details>

<summary>More April updates</summary>

**🆕 Added**

* **"Copy to different tenant" for Challenges** — Quickly replicate challenge configurations across tenants from the Challenges listing
* **"Challenges" tab in Config duplication** — Challenges are now included in the Global Management config duplication workflow
* **"Download JSON" for Challenges** — Export challenge configurations as JSON directly from the listing view
* **Card number field hint** — When LCN auto-generation is enabled, the card number field displays as disabled with an explanatory hint in Member form
* **Global validation for Custom Attributes** — Empty values are now blocked on save across all Custom Attribute inputs

**⚙️ Enhanced**

* **"Migrated" pill moved to Name column** — In the Campaigns listing, the pill indicating a migrated Referral campaign now appears next to the campaign name (with a tooltip link to the corresponding Challenge)
* **Hide Custom Fields section** in Member form when no custom fields are configured
* Badge icon updated in Badges empty state view
* Migration Guide documentation for Achievements → Challenges

**🛠️ Fixed**

* Event frequency limit displayed incorrectly on single Challenge view when set to "1 in total"
* Transaction UUID shown instead of Document Number on single transaction view
* Empty string values were incorrectly accepted for Labels in PATCH Member API
* Challenge progress not refreshed after adding a transaction for a migrated achievement campaign
* Incorrect calculation of cumulative earned units in Tier Progress for member
* Missing date interval filter on member's custom events view
* Wallet Type detail view now displays the correct wallet name
* Challenge campaigns no longer incorrectly shown in direct campaign list with broken editing
* Fixed reward coupon creation/editing with "on a specific date" expiration rule
* Fortune Wheel import option no longer selectable (not supported, but was available in UI)

</details>

***

#### March 2026

{% updates format="full" %}
{% update date="2026-03-03" tags="challenges,enhancement" %}

## **🔄 Achievements → Challenges Migration & Navigation Redesign**

The major Achievements-to-Challenges rebranding continues with migration tooling, new navigation layout, and enhanced challenge management. A completely redesigned top navigation bar improves the overall admin panel experience.

**Why it matters:** The transition from "Achievements" to "Challenges" provides clearer terminology and improved management workflows. The new navigation makes it faster to find what you need.

👉 [Learn more about Challenges](/campaigns/challenges)
{% endupdate %}

{% update date="2026-03-10" tags="integration" %}

## **🔐 HMAC Webhook Signatures**

Webhook security gets a major upgrade with HMAC signature support for verifying webhook authenticity.

**Why it matters:** HMAC signatures let you cryptographically verify that webhook payloads genuinely come from Open Loyalty, protecting against spoofed events.

👉 [Learn more about HMAC Webhook Signature](/integrations-and-data-exchange/webhooks/hmac)
{% endupdate %}

{% update date="2026-03-17" tags="badges,enhancement" %}

## **🏅 Badges Integration with Campaign Effects**

Badges system integrates with campaign effects, allowing badges to be automatically awarded through campaign rules. Challenges also get enhanced visibility controls and migration readiness improvements.

👉 [Learn more about Badges Integration with Campaign Effects](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns#add-rules-conditions-and-effects)
{% endupdate %}

{% update date="2026-03-05" tags="members,enhancement" %}

## **🔢 Loyalty Card Auto-Generator**

A new configuration option enables automatic generation of Loyalty Card Numbers (LCN) for members, removing the need for manual entry or external systems.

**Why it matters:** Reduces friction in member enrollment and eliminates duplicate or invalid card numbers.

👉 [Learn more about Loyalty Card Auto-Generator](/members-and-activity/members/configuration)
{% endupdate %}
{% endupdates %}

<details>

<summary>More March updates</summary>

**🆕 Added**

* **Date validation on API ingestion** — Prevents future-dated or invalid timestamps from entering the system
* **Issued Reward references in Unit Transfer webhook and API** — Unit transfer webhooks now include associated reward details
* **High-precision timestamps for Points History** — Deterministic sorting with sequence fields for transfer records
* **Active Campaign limits per Tenant** — Configure maximum active campaigns per tenant with exclusions for gamification modules
* **Per-store wallet creation limit** — Prevent unlimited wallet type proliferation
* **Optional Comment Field for Admin P2P Point Transfers** — Admins can add context when performing peer-to-peer transfers
* **Soft delete for Badges** — Badges can now be soft-deleted with feature flag for incremental badges

**🛠️ Fixed**

* Custom Events: Fixed incorrect mapping of attributes to 'false' instead of text value
* Fixed `unitPluralName` incorrect value in GET /api/points response
* Fixed race condition allowing multiple redemptions of the same QR code
* DateTime display fix on `purchasedAt` column in transactions
* Fixed Allow spaces in Custom Attributes keys during points import and member PATCH updates
* Missing "Find by badge name" translation restored
* Fixed reward image upload limit (2MB enforced correctly)
* Fixed incorrect documentType field mapping in S3 Transaction exports
* Fixed reward webhook payload size issue when updating coupons

</details>

***

#### February 2026

{% updates format="full" %}
{% update date="2026-02-03" tags="challenges,new-feature" %}

## **🎮 Challenges Rebranding**

The full rebranding from "Achievements" to "Challenges" lands across the UI, API, and data model. Admins can now manually edit member challenge progress.

**Why it matters:** The "Challenges" terminology better communicates the feature's purpose. Manual progress editing lets support teams resolve edge cases without workarounds.

👉 [Learn more about Challenges](/campaigns/challenges)
{% endupdate %}

{% update date="2026-02-10" tags="wallets,enhancement" %}

## **📝 Custom Attributes for Manual Unit Transfers**

Manual unit transfers can now carry custom attributes — opening up integration possibilities for external systems.

**Why it matters:** Custom attributes on transfers let you tag point movements with metadata (e.g., reason codes, campaign IDs).

👉 [Learn more about Custom Attributes for Manual Unit Transfers](/members-and-activity/wallets/unit-transfers/managing-unit-transfers#edit-custom-attributes)
{% endupdate %}
{% endupdates %}

<details>

<summary>More February updates</summary>

**🆕 Added**

* **Partial Custom Attributes Updates via PATCH** — Member custom attributes can be partially updated without overwriting others

**⚙️ Enhanced**

* Achievement progress export refactored with improved date tracking
* Challenge progress endpoint filtering improvements
* Password recovery copy updated
* Webhook contract unified

**🛠️ Fixed**

* Fixed reward webhook payload size issue
* Fixed expired unit transfer created past expiry date upon unlocking
* Fixed static segment recalculation
* Fixed leaderboard calculation bug in February
* Fixed reward webhook payload overflow when updating coupons

</details>

***

#### January 2026

{% updates format="full" %}
{% update date="2026-01-05" tags="campaigns,new-feature" %}

## **📦 Campaign Code Import**

A new import feature for external redemption codes brings campaign codes into the platform.

**Why it matters:** Campaign code import allows you to use the generated list of codes (e.g., already printed out on your products).

👉 [Learn more about Campaign Code Import](https://help.openloyalty.io/whats-new/pages/SRo81A5dFHGeogQiRBKA#id-2.-imported-codes-csv-upload)
{% endupdate %}
{% endupdates %}

<details>

<summary>More January updates</summary>

**🆕 Added**

* **Tiers from Targeted Tiersets in Rewards** — Add tiers from any targeted tier set to reward targeting selection

**⚙️ Enhanced**

* Navigation tabs renamed: Achievements → Challenges (main nav and single member view)
* Segments protected against empty conditions
* Added `updatedAt` and `createdAt` columns to Segment Export files
* Transfer list filtering logic aligned with mass actions payload
* Segment criterion names updated to challenge terminology
* Analytics/dashboard data display and chart fixes

**🛠️ Fixed**

* Fixed 400 error when creating Segment with Achievement Completion condition
* Fixed missing conditions display for Achievement Completion campaigns
* Fixed incorrect error message for Transaction target attribute validation in Goals
* Fixed rewards targeted to non-default TierSet tiers not visible for members
* Fixed static segment recalculation
* Fixed Fortune Wheel Internal Server Error when unit effect exceeds wallet limit
* Fixed inconsistency in Members List Filtering UI — estimated count from API now displayed on frontend

</details>

***

*This page covers 2026 releases. For earlier releases, see What's New in 2025.*


# 2025

Keep up to date with all released features and improvements!

## December 2025

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RGVjZW1iZXIgMTU8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Expanded Data Export Integrations**

Data Export integrations have been expanded — in addition to AWS S3, you can now export data directly to **Google Cloud Storage (GCP)** and **Azure Blob Storage**. This gives you more flexibility to integrate with your preferred cloud platform for automated data exports.

👉 [Learn more about data export integrations](/technical-guide/data-exports/set-up-integration)

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RGVjZW1iZXIgODwvdGV4dD4KPC9zdmc+" alt=""></div>

**Wallet Balance Data Export**

We’ve added a dedicated **Wallet Balance data export** to the standard technical reporting suite. While previous exports focused on individual point movements, this new daily snapshot captures the total state of all member wallets at a single point in time.

**What’s new:** You can now access daily CSV files containing active, pending, expired, and spent balances for every member. This data is automatically pushed to your integrated cloud storage (S3, GCP, or Azure).

**Why it matters:** This simplifies financial reporting and liability tracking. Instead of manually calculating current balances from historical transaction logs, your BI tools can now ingest a single "frozen" snapshot to provide instant accuracy for accounting and auditing.

👉 [Learn more about wallet balance exports](https://help.openloyalty.io/technical-guide/data-exports/data-structure-and-types/wallet-balance)

<details>

<summary>More monthly updates</summary>

#### 🆕 Added:

* **New PATCH endpoint for member updates** – Update member details including custom attributes and custom fields.
* **Custom Event Schema duplication** – Quickly duplicate existing custom event schema configurations.

#### ⚙️ Enhanced:

* **UI improvements** to improve usability and performance, including:
  * Display of the tier downgrade method in the Tiers view
  * **Pending Points** column added to the Members list
  * Available coupons count is now displayed as a dedicated column instead of a tooltip
  * Refined Audit Log view for better readability
  * Comments are now visible in the member timeline for pending points entries

#### 🛠️ Fixed:

* **Segments:** Corrected the last recalculation date data
* **Audit Log:** Improved performance of Audit Log exports

</details>

## November 2025

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+Tm92ZW1iZXIgMjQ8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Local Time Strategy for Timezone Handling**

You can now configure a Local time timezone strategy at the tenant level. This option allows campaign availability, member limits, and reward redemptions to be evaluated based on the local time of the event or user, rather than the tenant’s timezone.

This is especially useful for loyalty programs with users across multiple timezones, ensuring fair daily and hourly limits, accurate campaign visibility, and correct expiration handling when users travel or operate globally.

👉 [Learn more about local time strategy](/administration/settings/tenants#timezone)

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+Tm92ZW1iZXIgMTc8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Fortune Wheels**

Introducing an element of chance to your loyalty program is a powerful way to boost engagement and daily active users. Instead of standard fixed rewards, you can now offer members a "spin-to-win" experience.

The Fortune Wheels module allows you to create randomized reward experiences. You can define various prize segments (points, coupons, or "no prize"), set the specific probability for each, and manage stock levels for physical or limited rewards.

**Why it matters:** Gamification reduces "reward fatigue." By triggering a Fortune Wheel after a purchase or milestone, you create a high-emotion moment that encourages members to return to your application or store to see what they’ve won.

👉 [Learn more about fortune wheels](/gamification/fortune-wheels)

<details>

<summary>More monthly updates</summary>

#### ⚙️ Enhanced:

* **UI improvements** to improve usability and performance, including:
  * **Custom Events:** Added filtering by custom event ID
  * Introduced quick time-range filters (e.g. last day, last 7 days, last 30 days)
* Reduced latency for endpoints serving images

#### 🛠️ Fixed:

* **Segments:**&#x20;
  * Fixed an issue where segment member count showed only recently added members instead of the total
  * Corrected segment calculations to properly include the current day
* **S3 Data Exports:** Exports now include local timezone information
* **Units (Points)**: Fixed expiration handling for blocked points that were never unblocked

</details>

## October 2025

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+T2N0b2JlciAyPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Enhanced Reward Redemption Limits** 🎁

Reward redemption limits are now more flexible and aligned with other modules. In addition to **total** and **unlimited**, you can set **time-based limits** (hourly, daily, weekly, monthly, yearly) for both global reward availability and per-member redemptions. For coupon-based rewards, availability is automatically limited by the number of uploaded codes in **Open Loyalty**.

👉 [Learn more about enhanced reward redemption limits](https://help.openloyalty.io/whats-new/pages/FFc8zAifvY7K3TbfMmb5#id-3.-redemption-limits)

<details>

<summary>More monthly updates</summary>

#### 🆕 Added:

* **New webhook: `SegmentMembershipDropped`** – Monitor sudden decreases in segment membership size.
* **Tier configuration duplication** – Quickly duplicate existing tier setups to speed up configuration.

#### ⚙️ Enhanced:

* **UI improvements** for a smoother and more consistent experience, including:
  * Phone number column added to the Members list view
  * Activate / Deactivate toggle added to the Referral Campaigns list view
  * Default pagination now starts from Page 1 for all paginated views
* **Members:** Custom Fields are now supported in both data exports and imports
* **Segments:** Segment rules can now be based on loyalty card numbers
* **Campaigns:** Trigger settings can be edited in duplicated campaigns
* **Tenant settings:** Tenant currency can now be changed at any time
* **SSO login:** Password change disabled for admin accounts linked via SSO

#### 🛠️ Fixed:

* **Leaderboards:** Fixed an issue with leaderboard position recalculation
* **Members:** Ability to remove address details from member profiles
* **Validation:** Fixed multiple validation-related errors across the platform

</details>

## September 2025

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+U2VwdGVtYmVyIDIyPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Member Custom Fields**

You can now define **custom fields for members**, allowing you to store and manage additional, business-specific member data. Custom fields are fully supported across **imports, exports, segments, and campaigns**, enabling more flexible personalization and data-driven loyalty logic.

👉 [Learn more about member custom fields](/members-and-activity/members/custom-fields)

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+U2VwdGVtYmVyIDk8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Referral Management Improvements**

It is now possible to **manage referral links even after a member has been created**.

You can:

* **Add** a referral link between members
* **Remove** an existing referral link
* **Change** the referral link between members

This gives you more flexibility in maintaining accurate referral structures and correcting mistakes without having to recreate member records.

👉 [Learn more about referral management](/members-and-activity/members/referred-members)

<details>

<summary>More monthly updates</summary>

#### 🆕 Added:

* **Leaderboards**: Effects can now be configured for leaderboard completion, enabling rewards for the most active members
* **Global Management**: Introduced a new metric for **Billable Loyalty Events**
* **Data Exports:**
  * New **Daily Tier Change Delta** export report
  * Tier exports now include **Tier Set name and ID** for improved traceability and reporting

#### ⚙️ Enhanced:

* **UI Improvements** for a smoother experience
  * **Change password** view redesigned
* **Campaigns:** Autocomplete field in **Effects -> Add/deduct units** for every trigger
* **S3 Data:** Deletes are now captured in the daily analytics
* **Dashboards**:&#x20;
  * Name change from **Registered Members** to **New Members** to better distinguish the statistics
  * Improved the overall performance
* Two new campaign effect templates with the transaction item filters

#### 🛠️ Fixed:

* **Campaigns**:&#x20;
  * Fixed error when editing rules in active campaigns
  * Fixed the error for summing up multiple transaction items with decimal gross values
* **Tiers:** Blocked transfers are now not included in the cumulative earnings
* **Reward Config Import:** Reward type incorrectly changed to fixed value after config import
* **Segments**: Fixed the error when the static segment would be emptied out during new members list import
* Date selector displayed incorrectly due to the local admin's timezone

</details>

## August 2025

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXVndXN0IDE4PC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Rewards: Return & Refresh Limits**

You can now cancel a redeemed reward, returning it to the pool of unused codes and refreshing the reward's limits. Cancelling a redemption will:

* ✅ Restore redemption limits for both the **member** and the **reward**.
* 🔁 Return the **uploaded coupon code** to the pool of available codes.
* 🗑️ Permanently remove the **autogenerated coupon code**.

This update helps improve **inventory control** and **limit management**, especially for use cases where redemptions are mistakenly triggered or need to be retracted before use.

👉 [Learn more about reward cancellation](/rewards-redemption/rewards/reward-fulfillment/canceling-redeemed-reward)

<details>

<summary>More monthly updates</summary>

#### 🆕 Added:

* **Leaderboards**: Effects can be set for the leaderboard completion, allowing you to reward the most active members.

#### ⚙️ Enhanced:

* **UI Improvements** for a smoother experience
  * **Change password** view redesigned
* **Campaigns:** Autocomplete field in **Effects -> Add/deduct units** for every trigger
* **S3 Data:** Deletes are now captured in the daily analytics
* **Dashboards**:&#x20;
  * Name change from **Registered Members** to **New Members** to better distinguish the statistics
  * Improved the overall performance
* Two new campaign effect templates with the transaction item filters

#### 🛠️ Fixed:

* **Campaigns**: Error when editing rules in active campaigns
* **Campaigns**: Fixed the error for summing up multiple transaction items with decimal gross values
* **Tiers:** Blocked transfers are now not included in the cumulative earnings
* **Reward Config Import:** Reward type incorrectly changed to fixed value after config import
* Date selector displayed incorrectly due to the local admin's timezone

</details>

## July 2025

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVseSAyMjwvdGV4dD4KPC9zdmc+" alt=""></div>

**Asynchronous Webhooks with AWS SQS! 🚀**

Open Loyalty now allows you to send webhook events directly to an Amazon Web Services Simple Queue Service (AWS SQS) queue. This enhancement enables asynchronous processing of your webhook data, improving reliability and scalability for high-volume integrations.

👉 [Learn more about how AWS SQS integration works](/technical-guide/webhooks/sending-webhooks-to-aws-sqs)

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVseSAxMTwvdGV4dD4KPC9zdmc+" alt=""></div>

**Leaderboards – Motivate Your Members With a Bit of Competition**

We’re excited to introduce **Leaderboards** – a brand-new feature designed to engage your members through healthy competition.&#x20;

With Leaderboards, you can:

* Highlight top members across weekly, monthly, or custom timeframes
* Define ranking rules&#x20;
* Create multiple boards&#x20;
* Combine with campaigns to drive behavior and boost loyalty

👉 [Learn more about how Leaderboards work](/gamification/leaderboards)

**Favourite Filters in All Views**

You can now **save and reuse filters** across all major data views - including Members, Rewards, Transactions, and more.

Quickly switch between your most-used filter combinations without rebuilding them every time.\
Rename, delete, or apply saved filters in just a few clicks — personalised for every admin.

💡 A simple way to stay organised and save time when navigating large data sets.

👉 [Learn more about Favourite Filters](/faq/favourite-filters)

<details>

<summary>More monthly updates</summary>

#### 🆕 Added:

* **Global Management:** Billable Loyalty Events Metric now available, allowing you to track the number of loyalty events sent to the platform each month.
* **Segments:** Option to duplicate segment configuration within tenant
* **Webhooks**: Possibility to have all webhooks sent to a single address, with **All webhooks** configuration option

#### ⚙️ Enhanced:

* **UI Improvements** for a smoother experience
  * **Single Member View:** Button sizes in modals
  * **Manage columns** footer in different views
  * Aligned import files modals for different modules
  * **Dashboard:** Enhanced granularity in the charts
* **Leaderboards:**&#x20;
  * Easy activation and deactivation of a leaderboard from a list view
  * Option to delete a leaderboard
* **SQS for Webhooks:** Implemented application layer encryption for webhook payload
* **Rewards List:** Added 'category' column to the view
* **Tier Sets & Tiers:** Easier setup with stepper and help texts
* **Campaign Simulator:** Clarified units receiver for referral campaigns
* **Tenants:** Easy timezone setup while creating and editing tenants

#### 🛠️ Fixed:

* Fixed a bug where multiple **custom attributes** with the same key were added.
* Filters are not being properly applied to **bulk actions**.
* Incorrect float to string conversion in Member Custom Attributes
* **Single Achievement/Member View:** Triggered events list empty for member
* Incorrect tenant redirection after inactivity or page refresh
* Roles duplication with inactive tenants assigned
* Rewards edit button grayed out in single reward view
* Unit transfers generated by a referral campaign provide now referee's `memberId` in the action cause.

</details>

## June 2025

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVuZSAyNDwvdGV4dD4KPC9zdmc+" alt=""></div>

**New option to cap individual transaction item values in filters**

You can now define a cap for each matching transaction item’s value or quantity.\
When applied, the system will count up to the specified limit **per item** when calculating total value or quantity.

For example:

* If one item is worth 300 and the cap is 100 → only 100 will be counted
* If another item is worth 50 → the full 50 is counted

This allows more flexible reward thresholds and prevents high-value items from skewing the results.

<details>

<summary>More monthly updates</summary>

#### ⚙️ Enhanced:

* **UI Improvements** for a smoother experience
  * **Enhanced pagination** in all list views
  * **Segmentation**: Styling & copy fixes
* **Global Search:** improved response time
* **S3 Bucket:** Consistent `updated_at` and `created_at` fields in all data exports
* **ACL**: Consistent UI/UX when permissions are missing
* **ACL**: Disabling any changes to the Master role.
* **Unit Transfers:** Additional date **Performed on** (`performedAt` in the API) added with the business date of a transaction or a custom event.

#### 🛠️ Fixed:

* Segmentation: Error message when conditions are empty
* Error message for the incorrect password input
* Importing Achievement configuration with additional translations
* CSV Exports: Fixed errors when initiations CSV exports from the Admin Panel
* Fixed Achievement Progression for lengthy custom events payloads
* Fixed Segmentation based on Achievement Progression
* Deleted Campaign still visible in Segments and Single Member View
* Tier Recalculation for Cummulative Units when units expire at the same time

</details>

## May 2025

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWF5IDIwPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Members – Non-Unique Identifiers Now Supported**

You can now mark member identifiers (like email or phone) as **non-unique**, allowing more flexibility in member creation and management.

⚠️ Non-unique identifiers:

* Can’t be required
* Can’t be used for event matching or integrations
* Can’t be reverted once saved

You can learn more in [this article](broken://pages/Zyn32QzPx6qiUOfPrYRA).

<details>

<summary>More monthly updates</summary>

#### ⚙️ Enhanced:

* **UI Improvements** for a smoother experience
  * **Filters** in all the views have been improved
  * **Single Member View**: Timeline copy improvements
  * **Single Member View:** Clickable events on timeline
  * **Rewards**: Rich text boxes refinement
  * **Help icon refinement:** Question Mark (?) vs. Information (i)
  * Change type selectors from checkboxes to radio buttons
  * Improved navigation between steps in the stepper regardless of validation errors
* Wallet balance attributes are now available for the **referrer**
* **Role** column added to the **Admin List** view
* **Members Import:** `registeredAt` field added to the import file

#### 🛠️ Fixed:

* Uniqueness of coupon codes across a single tenant only
* Campaign deactivation after changing the ordering number
* Webhook **CampaignUpdated** should be sent when activating and deactivating campaigns in the list view

</details>

## April 2025

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXByaWwgMjM8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Badges**

Introducing **Badges -** a new feature that awards members with a badge upon completing an achievement. These badges can be utilized across various modules, such as campaigns, or to easily retrieve a member's earned badges list.

**OIDC Integration**

Open Loyalty now supports **OpenID Connect (OIDC)** integration, enabling seamless single sign-on (SSO) with identity providers like Microsoft Azure Active Directory and OKTA.&#x20;

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXByaWwgMTY8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Segments - Single Segment View**

A new **Single Segment View** has been introduced. It provides a comprehensive overview of each segment, including rules, conditions, relationships with other modules (like campaigns and rewards), the last recalculation date, and — as before — the list of members assigned to the segment.

**Guide Tour**

New to Open Loyalty? A complete guided tour is now available to help you understand how the platform works and how to navigate it with ease.\
Enjoying the experience? Let us know if you'd like to see similar walkthroughs in other modules — we’d love your feedback!

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXByaWwgNzwvdGV4dD4KPC9zdmc+" alt=""></div>

**Members – Redesigned Single Member View**

The Single Member View has been revamped for improved usability. Key details are now accessible at a glance via the drawer panel. The layout mirrors the menu structure, making navigation more intuitive and streamlined.

<details>

<summary>More monthly updates</summary>

#### 🆕 Added:

* **Automation Campaign Export** now available in Global Management
* **Visual Environment Indicators** to clearly distinguish between **STAGE** and **PRODUCTION**
* **What's New** section in the product to keep you updated with all the important changes and new features

#### ⚙️ Enhanced:

* **UI Improvements** for a smoother experience
  * **Sidebar Icon Alignment** for a cleaner navigation panel
  * **Sticky Columns Selection** – choose which columns remain fixed
  * **Sticky Sidebar** – Sidebar now remains visible while scrolling through longer view
  * New **Date and Time** component across the product
* **Campaign Creation & Editing** – introduced a **stepper** to streamline the process, including helpful guidance text
* Enhanced **Coupon Impor**t mechanism for better performance with high-volume imports
* New filters added to the Unit Transfers view, allowing you to filter by **Cancelled** and **Pending** statuses
* Achievements can be **activated** and **deactivated** with a single click from the Achievement List view

#### 🛠️ Fixed:

* Achievement templates not loading properly
* Achievement progress exceeding the allowed limit in a single transaction
* Achievement member progress not resetting
* Changing admin settings no longer triggers unintended password resets
* Campaign files in the S3 Bucket are now generated after each change in the configuration and description
* Missing custom event conditions for the redemption campaigns

</details>

## March 2025

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWFyY2ggMjQ8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Campaigns – Enhanced Validation for Non-Default Wallets**

You can now set conditions based on balance and unit history in non-default wallets.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWFyY2ggMjE8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Achievements – Track Unique Values for Custom Event**

Progress can now be tracked for each new unique value in custom event attributes, without needing to define them beforehand. [Learn more](/campaigns/achievements/creating-achievement#track-unique-values)

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWFyY2ggNDwvdGV4dD4KPC9zdmc+" alt=""></div>

**Achievements – Triggers History**

View the list of events that contributed to a member's achievement progress directly from their profile.

<details>

<summary>More monthly updates</summary>

🆕 **Added:**

* **Referral Campaign Export** now available in Global Management

⚙️ **Enhanced**:

* **UI Improvements** for a smoother experience
  * **Dashboard & Campaigns** – Upgraded analytical graphs for better insights
* **Webhooks** – `CampaignEffectWasApplied` now includes business data from transactions and custom events
* **Campaign Effects** – Additional validation for custom pending and expiration settings
* **Campaigns** – Ability to select and delte multiple campaigns

**Fixed:**

* `AvailablePointsAmountChanged` webhook no longer triggers when canceling a pending transfer
* Tier set visibility and simulation issues in campaign settings
* Missing conditions now correctly displayed in the Achievement view
* Role-based permissions applied correctly in the Single Member View

</details>

## February 2025

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RmVicnVhcnkgMjU8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Achievements - Streaks**

The **"Consecutive"** option has been renamed to **"Streaks"** for improved clarity. New help texts and visual cues have been added to make configuring streak settings more intuitive and easier to understand.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RmVicnVhcnkgMzwvdGV4dD4KPC9zdmc+" alt=""></div>

**Tiers - new downgrade condition period: Every X months**

In the last release, we added a new downgrade option in the Tiers. Now you can set a downgrade option for: **Every X number of months after the Tier promotion date.**

<details>

<summary>More monthly updates</summary>

⚙️ **Enhanced:**

* **UI Improvements** for a smoother experience
  * **Achievements** – Goals are now displayed in a read-only format for clarity
  * **Achievements View** – Rules section now scrollable across all views for better accessibility
  * **Referral Campaigns** – Moved to a dedicated tab for easier access and organization
  * **Automation Campaigns** – Moved to a dedicated tab for easier access and organization
  * **Custom Attributes** – You can now copy custom attributes when setting up campaign conditions
* **Wallet Configuration** – Tooltips added throughout for improved guidance

&#x20;🛠️ **Fixed:**

* **Dashboard** -  Incorrect redemption rate
* **Campaign Duplication & Editing** – Incorrect `expiry` and `pending` data are no longer copied during duplication or edits
* **Expression Saving** – Special characters like `>` are now correctly preserved and no longer converted to HTML entities (e.g., `&gt;`)
* **Exports** based on filters correctly applied
* `PointsWillExpire`webhook includes improved points to expire calculation

</details>

## January 2025

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SmFudWFyeSAyNzwvdGV4dD4KPC9zdmc+" alt=""></div>

**Campaign limitation - changes in awarding points when limits are reached**

In this release, we have enhanced the recalculation logic for points when the limit is reached. If an action would grant more points than the remaining balance within the limit, only the available points up to the limit will be awarded.

**Example:**

* A campaign has a limit of **200 points per member**.
* A member has already earned **150 points** from this campaign.
* They perform an action that would grant **70 points**.
* Instead of exceeding the limit, the member receives only **50 points**, reaching the maximum allowed.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SmFudWFyeSAyNDwvdGV4dD4KPC9zdmc+" alt=""></div>

**Mass actions: Comment and info about the admin who triggered**

In the last release we introduced a new functionality that show the logs of mass actions in the Unit transfers. The Mass actions are registered under Imports / Exports.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SmFudWFyeSAyPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

#### The webhook AchievementsWereProcessed added to the webhooks events

In the last release, we introduced a new webhook [containing a summary of all achievements' progress](https://apidocs.openloyalty.io/#tag/Webhook-event/operation/AchievementsWereProcessed).

<details>

<summary>More monthly updates</summary>

⚙️ **Enhanced:**

* **UI Improvements** for a smoother experience
  * **Achievements Flow** – Step-by-step validation added for required fields
  * **Channels Redesign** – Updated visuals and improved usability
  * **Channels Relocation** – Moved from Settings to the main left-side menu
  * **Bulk Campaign Deletion** – Easily remove multiple campaigns at once
  * **Achievements Help Panel** – Contextual help added on the right-hand side
  * **Rewards Categories** – Refreshed with a new design
  * **Single Campaign View** – Added toggle button to activate/deactivate campaigns
  * **Custom Attributes** – Unified view across all platform sections
  * **Custom Events** – Improved clarity of system identifiers

🛠️ **Fixed:**&#x20;

* Incorrect next tier recalculation date
* Next scheduled run not updating correctly for Automation Campaigns

</details>


# 2024

See the complete list of features introduced back in 2024.

## December 2024

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RGVjZW1iZXIgMTI8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Webhook MemberAchievementProgressWasChanged - adding dates and triggers ID**

In the last release, we introduced new fields for the dates and triggers in the webhook [`MemberAchievementProgressWasChanged`](https://apidocs.openloyalty.io/#tag/Webhook-event/operation/MemberAchievementProgressWasChanged)`.`

<details>

<summary>Monthly updates</summary>

**Enhanced**:

* **UI**
  * Global management: Config duplication to another tenant
  * Achievements refinement: Summary step
  * Campaign limits & budget

</details>

## November 2024

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+Tm92ZW1iZXIgMjA8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

* **The mechanism for setting/changing the expiration date during the transfer.**

In the last release, we introduced the possibility to override the expiration date during unit transfer creation in the UI.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+Tm92ZW1iZXIgMTQ8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

* **Reconciliation of budget after canceling the units**

In the last release, we introduced the possibility of reverting points back to the pool of Campaign and Wallet points limits (Global and per member). Once the unit transfer is canceled, the points get back to the pool of the campaign (if it is a reward from the campaign) and wallet.

* **Mass actions with unit transfers (activate, cancel, expire)**

Now it's possible to activate, cancel, or expire filtered unit transfers in bulk.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+Tm92ZW1iZXIgNzwvdGV4dD4KPC9zdmc+" alt=""></div>

**Tiering - annual recalculation on the chosen dates**

In the Tier set configuration, we have added an option for tier downgrading. Right now your members can [downgrade annually on a chosen date](/gamification/tiers/tiers-configuration#tiers-configuration).

**Duplicate Wallet configuration between different tenants**

After the last release, the admin can [duplicate the Wallet configurations between different tenants.](/members-and-activity/wallets/wallet-types-and-configuration#exporting-wallet-configuration-to-a-different-tenant)

**Import/Export Wallets JSON**

A new feature has been added, allowing you to[ export multiple wallets set to a JSON file](/members-and-activity/wallets/wallet-types-and-configuration#wallet-export-import). You can import this configuration into any tenant as well (Duplicate Wallet configuration between different tenants).

<details>

<summary>More monthly updates</summary>

**Added:**

* Webhook MemberAchievementProgressWasChanged - adding dates and triggers ID
* Permanent tokens for the API

**Enhanced:**

* Editing campaign copy message
* Streamlining copy in unit transfers for the filter 'Created on
* Reward form optimization
* UI
  * Roles: ACL Redesign
  * Segmentation conditions: Copy changes to highlight "Purchase" in transactions
  * Display +X more value list in Campaigns/segments and achievements
  * Single Member View: Year on the timeline
  * Single Member View, Timeline - Achievement adjustment with the value of manual change
  * Achievements refinement: Steps in form
  * Disabled actions/exports when there are 0 records
  * Segmentation: Copy fix - Add (AND/OR) condition button
  * (S3 bucket) tenantId added to CustomEvent export.
  * Disabled actions/exports when there are 0 records selected

**Fixed:**

* Achievement progress reset for hourly achievements

</details>

***

## October 2024

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+T2N0b2JlciAyODwvdGV4dD4KPC9zdmc+" alt=""></div>

**Global Management - Overview**

In the last release, we[ added a new menu item](/global-management) to view and compare some of the metrics across all tenants.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+T2N0b2JlciAyMjwvdGV4dD4KPC9zdmc+" alt=""></div>

**3 decimals in product Quantity for Transaction**

In the last release, we changed the amount of decimals for the 'quantity' field in the [Transaction](/members-and-activity/transactions#single-transaction-view).

**Transaction filters on campaigns**

We introduced an additional section to narrow down campaign conditions in the Rules.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+T2N0b2JlciAxPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Segmentation: Member Registration date**

In the last release, we added a new condition of member registration date.

<details>

<summary>More monthly updates</summary>

**Added:**

* `actionCause` added to the webhook CustomerBoughtReward
* `memberId` added to the webhook PointsWillExpire

**Enhanced:**

* [Roles duplication](/administration/settings/roles#managing-roles)
* Display of the tier set names across the platform
* Custom event schemas - empty filter value
* Information on the default wallet pending and expiration settings when applying campaign effects

**Fixed:**

* Simulation for the campaigns using transaction item filters
* Description of the limitations across the platform

</details>

***

## September 2024

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+U2VwdGVtYmVyIDI0PC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

* **Duplicate Custom event schema configuration between different tenants**
* **Duplicate Rewards configuration between different tenants**

After the last release, the admin can duplicate the Custom Event schema and Reward configurations between different tenants.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+U2VwdGVtYmVyIDE2PC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

* **Custom units pending during the Campaign**

In the last release, we added another custom setting to the campaign configuration. Now, the admin can [override the wallet pending settings](broken://pages/pGKCOfXrNZNQA7xdi3ZQ#custom-unit-expiration-and-pending-explanation) per campaign.

* **Segmentation - Condition: Member tiers**

Our last release included a new condition in the Member Segments. It's possible to [group the members based on specific tiers.](broken://pages/p4iqNmTlfYw0N15deBCa#members-tier)

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+U2VwdGVtYmVyIDY8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

* **Custom tiers - More than 1 Set + Campaigns**

In the last release, we added the possibility of multiple-tier sets. It's possible to add tiers from different tier sets in the visibility and conditions of the campaign.

* **Expire units annually on the chosen date**

&#x20;In the wallets, we added a new option in the [expiration method](/members-and-activity/wallets/wallet-types-and-configuration#unit-expiration-method). Right now, we support expiring units annually on a chosen date

<details>

<summary>More monthly updates</summary>

**Added:**

* New transaction import

**Enhanced:**

**UI:**

* Import/Export Rewards
* Rewards: Expiration date and message presentation on Single Reward View
* Duplicate Achievement configuration between different tenants
* Add details about failed members from import
* Import members: Error messages
* Unit transfer: New filter - campaign name
* Campaign simulator: Referee note added to Member details page
* Tier Benefits optional fields

</details>

***

## August 2024

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXVndXN0IDc8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Segmentation - Condition: Specific custom events in last x days / last specific custom event**

In the recent release, it's possible to group the members based on the specific event that happened in the last x days in the Segment Conditions.

<details>

<summary>More monthly updated</summary>

**Added:**&#x20;

* Active Campaigns - limits
* Active Segments - limits
* Webhooks Subscriptions - limits
* messageId field added to each sent webhook
* requestId field added to each sent webhook
* ability to create a tenant code with a dash
* Redemption codes in Campaigns - limits

**Enhanced:**

UI:

* Add / Edit Role Redesign
* Single Member View: Units transfers - additional actions
* HotJar: Surveys with targeted questions
* Duplicate Campaign configuration between different tenants
* User profile - Usunięcie języka z profilu

<br>

</details>

## July 2024

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVseSAxOTwvdGV4dD4KPC9zdmc+" alt=""></div>

**Achievements: Editing "Trigger conditions" doesn't reset achievement progress**

In this release, our mechanism now allows editing trigger conditions in the Achievement without losing the member's progress. Additionally, [Trigger Conditions ](/campaigns/achievements/managing-achievements#editing-achievements)can now be edited without losing member progress, in addition to the Achievement/Rule basic settings.

**Time-Based Campaigns - Membership anniversary**

In our latest release, we have added a new time trigger for [Time-based Campaigns](broken://pages/LzyyCnWUJlw0u7XyhicR). Admin can now select the Member's anniversary for triggering the campaign on the registration date of the member.

**Export to S3 - Tenants**

With this upgrade, we have added a new report to [S3 bucket exports](/integrations-and-data-exchange/imports-exports/exports/s3-bucket-exports#tenants). Now, you can export the list of tenants with tenantID, code name, and status.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVseSAxMTwvdGV4dD4KPC9zdmc+" alt=""></div>

#### Time-based campaign - Weekly and Monthly triggers

In our latest release, we have added new time triggers for [Time-based Campaigns](broken://pages/LzyyCnWUJlw0u7XyhicR). Admin can now select the specific day of the week for triggering the Weekly campaign, and choose the days of the month or the last day of the month to trigger the Monthly campaigns.

**Custom event/Transaction triggered campaigns effect MVP 1st iteration**

In the new release, we display the campaign effects (points/rewards) in the single Transaction/Custom event view.

**Import-unit transfers**

We have released a new format where you can import points (add/deduct) within the XML or JSON file.&#x20;

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVseSAzPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Segmentation - Number of transactions in a given period**

(Added to [Segment Conditions)](broken://pages/p4iqNmTlfYw0N15deBCa) Within a new upgrade, we released a new condition in Segments, where you can group the members with the specific number of transactions in the selected period.

<details>

<summary>More monthly updates</summary>

Added:

* Unique identifier for custom events
* Soft delete Campaigns

Enhanced:&#x20;

* UI:
  * Single Member View: Achievement status - Drawer
  * Imports/Exports: Filters + Search box
  * Units transfers - Add "Registered on" column
  * Single Wallet View
  * Import units transfers: Error messages
  * Segmentation: Commandbar in segment conditions
  * Unpaid invoice & ACL - component refactor

Fixed:

* API docs improvements

</details>

***

## June 2024

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVuZSAyNDwvdGV4dD4KPC9zdmc+" alt=""></div>

**Segmentation - Achievement progression consecutive rules**

(Added to [Segment Conditions)](broken://pages/p4iqNmTlfYw0N15deBCa) Within a new upgrade, we released a new condition in Segments, where you can group the members who progressed the specific Achievement in the consecutive rule.

**Enhanced UI for the Nav Bar and Header**

OpenLoyalty got a new, fresh, and user-friendly look, making navigating through the Admin Centre easier.

**Language Change for Admin**

Language can be chosen just for a logged-in admin, not for the entire environment.

&#x20;

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVuZSAxMjwvdGV4dD4KPC9zdmc+" alt=""></div>

**New webhook added Achievement created/updated webhook.**

With this upgrade, we introduced a new webhook that is triggered when you create or update the achievement.

<details>

<summary>More monthly updates</summary>

**Added:**

* Import/Export Custom Event Schemas feature
* ACL (resource) for imports and exports

**Enhanced:**

* UI
  * Buttons refactor
  * Campaign Simulator redesign
  * Enhanced icon and tooltip for the manually assigned tier

**Fixed:**

* Visibility of all items in the dropdown - infinite scroll
* Field Role was empty for admins when list of roles is longer than 10 items<br>

</details>

***

## May 2024

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWF5IDI4PC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Segmentation - Achievement progression last x days rules**

(Added to [Segment Conditions)](broken://pages/p4iqNmTlfYw0N15deBCa) Within a new upgrade, we released a new condition in Segments, where you can group the members who progressed the specific Achievement in the last x days rule.

**Achievement edit without resetting the progress for general settings**

You can edit the achievement general settings without worrying about losing the member achievement progress.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWF5IDIzPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Segmentation - Achievement progression overall rules**

(Added to [Segment Conditions)](broken://pages/p4iqNmTlfYw0N15deBCa) Within a new upgrade, we released a new condition in Segments, where you can group the members who progressed the specific Achievement in the overall rule.

**IssuedRewardID in CustomerBoughtReward webhook**&#x20;

A new field IssuedRewardID was added to the CustomerBoughtReward webhook.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWF5IDEzPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Segmentation - Achievement completion**

(Added to [Segment Conditions)](broken://pages/p4iqNmTlfYw0N15deBCa) Within a new upgrade, we released a new condition in Segments, where you can group the members who completed the specific Achievement.

<details>

<summary>More monthly updates</summary>

**Added:**

* Additional search in the Admin Panel across table columns
* Active points balance is available in the member history timeline

**Enhanced:**

* Added predefined expressions to the campaigns
* Expiration settings visible when editing a campaign
* Group of Values renamed to Collections
* Tooltips improvements
* Chips with expressions are now editable

**Fixed:**

* Spaces incorrectly converted in the expressions
* Extra scroll in wallet dropdown
* Changed logic for pending points and expiration date

</details>

***

## April 2024&#x20;

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXByaWwgMzA8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Achievements - Rule name & description**&#x20;

This time we added new fields for the achievements rules:

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXByaWwgMjQ8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Transaction Campaign/Achievement Condition - Product meeting selected criteria**

This time, a new  condition has been added allowing you to [set multiple requirements that the product needs to meet](/sample-setups/sample-campaigns/10-product-meets-selected-criteria) to get the effect of the campaign:

New conditions:

* Quantity of products that match selected criteria
* Value of products that match selected criteria

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXByaWwgMTg8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Achievements Export/Import**

A new feature has been added, allowing you to [export multiple achievement](/campaigns/achievements/managing-achievements#achievement-export-import) sets to a JSON file. You can import this configuration into any tenant as well.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXByaWwgOTwvdGV4dD4KPC9zdmc+" alt=""></div>

**Tier Progress in a Single Member View**

A new feature allows you to [track member's tier progress](broken://pages/Cwdc1KzUzeBqP87pHXR2#personal-data) within various tiers based on predefined conditions. This feature is designed to enhance user engagement by providing clear milestones for levels.

**Duplicating Achievement Rules**

You can [duplicate rules within a single achievement](/campaigns/achievements/managing-achievements#duplicating-rule-in-the-achievement).

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXByaWwgNDwvdGV4dD4KPC9zdmc+" alt=""></div>

**Campaigns Export/Import**

A new feature has been added, allowing you to [export multiple campaigns](broken://pages/L6CznuzcK99uuj8vRTFU#campaign-export-import) set to a JSON file. You can import this configuration into any tenant as well.

**Rewards Duplication**

You can easily duplicate rewards in the Admin Panel.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXByaWwgMzwvdGV4dD4KPC9zdmc+" alt=""></div>

**Enhanced Webhook for Redemption Campaigns**

We have enhanced the webhook `CampaignEffectWasApplied` with trigger information for redemption Campaigns

<details>

<summary>More monthly updates</summary>

**Added:**

* New segment condition - Last transaction/Custom event within the last X and Y number of days

**Enhanced:**

* Enhanced descriptions in several places for clarity
* Updated API docs to reflect deprecated endpoints

**Fixed:**

* Rewards export to CSV with filters on resulted in an error

</details>

***

## March 2024

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWFyY2ggMjc8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Time-based campaigns**&#x20;

You can set a campaign that is triggered Daily or on Members' birthday

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWFyY2ggMjE8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Achievement Duplication**

You can duplicate achievements directly from the achievements list.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWFyY2ggNjwvdGV4dD4KPC9zdmc+" alt=""></div>

**New downgrade option and additional condition in tiers**&#x20;

We have added a new option in the tier downgrade, based on every anniversary. Additionally, traditional tiers are merged with the custom ones, extending the functionality to all OL users.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWFyY2ggNTwvdGV4dD4KPC9zdmc+" alt=""></div>

**The filter "completion" in the Single member view in the Achievement status**

We have added a new filter to the member achievement status.&#x20;

<details>

<summary>More monthly updates</summary>

**Added:**

* Member's registration date is now exported to the CSV files

**Enhanced:**

* UI
  * Scroll in tier sets
  * Single member view - Displaying consecutive occurrences in achievements status
  * Redesign of custom attributes in the campaigns
  * Templates in campaigns for Dynamic Coupon rewards
* Custom units expiration - fix copy

**Fixed:**

* Multiple images added to the reward are now displayed properly

</details>

***

## February 2024

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RmVicnVhcnkgMjQ8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Custom Units Expiration**

We introduced a new configuration for campaign effects.\
From now on, it is possible to set a custom expiration date for units for a given effect.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RmVicnVhcnkgMTU8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Custom Tiers**

The Custom Tiers module has been introduced to support the creation of tiers based on multiple criteria, including a new condition: **Months since joining the program**.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RmVicnVhcnkgMTwvdGV4dD4KPC9zdmc+" alt=""></div>

**Import Custom Segments**

Custom static segments can be created in the Segments module, allowing for the importation of members through CSV files.

<details>

<summary>More monthly updates</summary>

Enhancements:

* UI
  * New filtering UX - sidebar&#x20;
  * Added logic operators for campaign/tiers set/achievement conditions&#x20;
  * Fix for autocomplete in Campaign Effects
  * New filtering UX - fix for showing up names instead of IDs for rewards, segments, tiers
  * UI refinement - adding conditions & effects in campaigns and achievements
  * Achievements on single member view - fix for progress greater than goal
  * Custom events schemas&#x20;
  * New filtration UX
  * Add / Edit Webhook Redesign UI&#x20;
  * actionCause filtering added to List of Unit Transfers
  * Dashboard - Units overview - adding export and removing the old Dashboard.&#x20;
  * Single Member View - Visible Campaigns

</details>

***

## January 2024

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SmFudWFyeSAxMTwvdGV4dD4KPC9zdmc+" alt=""></div>

**Analytics - Previous Period Comparison**

In the reports for General Overview, Units Overview, and Campaign Overview, a dashed line represents data from the previous period, providing a visual comparison to current metrics. This feature aids in assessing performance trends over time.

**UnitsTransferWasAdded webhook**

A new webhook has been introduced that activates whenever a new Unit Transfer, in any status, is added to the system.&#x20;

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SmFudWFyeSAzPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Registration Date - a new business-related field in Member profile**

New field registeredAt added to Member profile. By default, it will have the value of createdAt field in the Member profile for existing Members and new ones for cases when registeredAt is not specified in the request body. \
This field will be displayed in the admin panel as Registration Date and will be used for Segment calculations, Campaign Conditions, and others. It is possible to edit this field using Member endpoints.\
Additionally, this field is returned with Member export to .csv file.

<details>

<summary>More monthly updates</summary>

Added:

* New fields to GET/api/{storeCode}/member/{member}/history and GET/api/{storeCode}/redemption/{issuedReward}
* Active units metric is added to the Units overview report
* Segmentation - linking conditions with OR operator

Enhancements:

* Single Custom Event view - Redesign UI

</details>


# 2023

See the complete list of features introduced back in 2023.

## December 2023&#x20;

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RGVjZW1iZXIgMTc8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Dashboard Units Overview**

A set of additional metrics per wallet has been added, including the metrics for issued points, pending, spent, pending, and expired, as well as redemption rate and breakage rate. It is now possible to see the amount of active points as well.

**Return Transactions**

A new campaign trigger has been added, allowing the specification of transaction types to streamline the return process. However, at the current moment, the functionality does not verify whether the returned items match those from the original transaction or if the quantities of products align.

**Campaigns - Conditions Command bar**

A new interface for selecting campaign conditions, featuring a tab named **Popular Conditions** has been created. This tab will utilize the browser's local storage to display recently selected conditions. Conditions will be included in this tab if they've been added at least three times.

<details>

<summary>More monthly updates</summary>

Enhanced

* UI - Campaign View - Several improvements have been made to the campaign edit and campaign overview views, including the display of campaign visibility settings.

Fixed

* Limitation calculation for referral campaigns - Fixed a bug where limitations were not calculated accurately.

</details>

***

## November 2023&#x20;

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+Tm92ZW1iZXIgMjg8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Dashboard - Units Overview**

The **Units Overview** on the Dashboard in the admin panel allows for the analysis of the history of issued units by wallet type. This feature provides administrators with valuable insights into unit distribution and trends over time, directly from the dashboard interface.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+Tm92ZW1iZXIgNzwvdGV4dD4KPC9zdmc+" alt=""></div>

**Variables Catalog**

Thanks to the Catalog of Variables feature adding and managing campaigns is way more convenient. We added a new module, where you can import grouped values from CSV files. Instead of typing thousands of values while creating a new condition, now it's possible to choose the whole group.

**Custom Events Export to S3 Bucket**

The data available for export to AWS S3 is now extended by the Custom Events file, which shows a complete list of the Custom Events that exist in the system.

<details>

<summary>More monthly updates</summary>

Added:

* Reports data exports - Data exports (.jpg, .png, .csv) are available for the General overview report and Campaign overview report.

Enhanced:

* Unit conversion coupon - logic change - Unit conversion coupon in Rewards module shows ratio from units to currency now.
* Settings - Redesign UX/UI
  * List of Members: Member registration method, Identification factors settings, Member Activation, Member profile settings and Active Member settings were moved to List of Members view.
  * Timezone settings were moved to List of tenants view
  * System logs view was moved to List of Admins view
  * Help menu has a link to API documentation now
* Achievement Completion status - Single Member View - There is additional column with a number of Achievement Completions by a Member.

</details>

***

## October 2023&#x20;

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+T2N0b2JlciAyMzwvdGV4dD4KPC9zdmc+" alt=""></div>

**Follow-up Campaigns**

**Campaign Completion** segment condition was added to the Segment module, and it is possible to create a segment of Members who completed a Campaign x time in a period of last x days (max of 62), last x weeks (max of 8) and last x months (max of 2). Along with the **Campaign Visibility** feature, it is possible to create follow-up Campaigns that are visible and available to the Members one after another, giving the option to implement additional gamification flows.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+T2N0b2JlciA2PC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Campaign Visibility**

The campaign visibility feature enables you to decide if a campaign should be shown to everyone, a specific segment, or a particular tier. This flexibility allows for targeted marketing strategies and personalized user experiences within the platform.

<details>

<summary>More monthly updates</summary>

**Added:**

* Rewards fulfillment table export -A new table has an export feature added to the admin panel. Filtering and exporting the data in the table happens asynchronously.

**Enhanced**:

UI Improvements:

* Single member view -  Events, Available rewards, redeemed rewards
* Exit modal for all forms
* Breadcrumbs optimization
* Referral token field added in Add Member form
* Single Member View - date of birth optimization
* Paging settings in admin panel saved on the device
* Add/Edit Single Member view redesign
* Maximum length of coupon code increased to 300 characters
* List of rewards - tooltips added to availability column
* Custom attributes - Shortening of chips component
* Segment - Custom members list refinement

</details>

***

## September 2023&#x20;

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+U2VwdGVtYmVyIDI3PC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Table Search by name**

Several tables now include a search bar feature, enabling users to efficiently search for resources by name. This functionality enhances navigation and allows for quicker access to specific data within the tables.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+U2VwdGVtYmVyIDE4PC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Multiwallets Member limitation status**

The status of units limitation per Member’s wallet is now visible in the Single Member View.

<details>

<summary>More monthly updates</summary>

**Added:**

* Filtering transactions in the admin panel with purchase place and product custom attributes.
* Campaign limitation status per Member - Checking the status of Campaign limitation is possible in Single Member View and API.
* Tables - Column configurator - It is possible to configure the column visibility in tables. The setting will be stored on the device.
* Scroll in the Tenant List - Scroll for tenant list is added. It is possible to view the higher number of Tenants.
* Support of empty fields in Member XML import - Empty fields in Member XML import are now omitted and export is successful.

**Enhanced**:

UI Improvements:

* Single member view - Custom attributes
* Settings
* Dropdowns
* Cells in tables
* Margins and buttons optimisation&#x20;
* List of Rewards revamp
* UI revamp - Secondary button style revamp and Modal/popup revamp

**Fixed:**

* Achievement status progress bar fix

</details>

***

## August 2023&#x20;

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXVndXN0IDI1PC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**New occurrence in Achievements - In the last x days**

A new Achievement occurrence allows counting the number of events (Transactions, Custom Events) in a chosen number of last days. This setting is less strict than the “In a row” occurrence, which resets the Member's progress when there is a gap in the streak. It is also possible to set up limits for triggering the rules, e.g., count only one transaction a day.&#x20;

Sample business cases:&#x20;

* Log in 5 times in 7 days, once a day, and get 100 points&#x20;
* Make 5 Transactions in 30 days and get a voucher for 25$

**Matching Transaction with customerId as an identification factor**

Transactions can be matched with Members using customerId on top of email, phone and loyaltyCardNumber fields.

<details>

<summary>More monthly updates</summary>

**Added**:

* Single member view - Achievements status
* Added filtering based on multiple status values in GET /api/{storeCode}/redemption endpoint - It is possible to filter rewards using multiple status values simultaneously.
* Single Transaction View - Showing many Custom Attributes - Admin panel allows viewing more Custom Attributes in a standard view and showing all Custom Attributes in a new popup.

**Enhanced**:

* Single Member View - Timeline filtering - It is possible to filter the Member’s Timeline in the admin panel for different events.
* Issued Rewards - Additional coupon information added
* Configuration tabs adjusted

**Fixed**:

* Coupon code entropy fix

</details>

***

## July 2023&#x20;

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVseSAzMTwvdGV4dD4KPC9zdmc+" alt=""></div>

**Active Members: Custom Events configuration**

Configuring the definition of Active Member, including Custom Events assigned to their profile is now possible. OR/AND conditions are available to be set with transactions and Custom Events.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVseSAxOTwvdGV4dD4KPC9zdmc+" alt=""></div>

**Rewards - Percentage coupon**

The Rewards module now includes a dedicated Coupon Type specifically for percentage discounts, allowing for the direct specification of the discount percentage value. This enhancement simplifies the process by eliminating the need for Custom Attributes to define percentage discounts, offering a more streamlined approach to creating and managing percentage-based coupons.

**Duplicate Campaign**

You can now duplicate an existing Campaign for reuse. The new Campaign is created with “Copy” in its name and is set to inactive by default, allowing for easy modification and activation as needed.

**Export Redemption Codes**

Administrators now have the capability to export redemption codes directly from the admin panel.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVseSA2PC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Reward - Coupon-specific expiration date**

Rewards now feature the option to set a specific expiration date for all coupons associated with a given Reward. Additionally, the expiration date can be specified at the time of coupon redemption, providing greater flexibility in managing the validity period of coupons.

<details>

<summary>More monthly updates</summary>

**Added:**

* Campaign exit modal - Exit modal was added to Add Campaign form when trying to leave the Campaign without saving.
* Export Tiers in the admin panel - Exporting the list of Members in the given Tier is now possible from the admin panel.
* Member export - It is now possible to schedule an export of the filtered Members list. It is possible from the level of the API and Admin panel (List of Members).
* Segment export - It is now possible to schedule an export of the Segment list. It is possible from the level of the API and Admin panel (Segments).

**Enhanced:**

* Webhooks: Add multiple headers to the webhook subscription - Configuration of webhooks includes the possibility to add multiple headers to the sent webhook.
* Add/Edit Rewards: HTML editors added to Reward description fields - An HTML editor added to Reward subscription fields allows formatting the text, which is later converted to HTML when saved on the backend side. It can be later retrieved to send formatted text in emails or other communication.
* Single Campaign view - Campaign rules - Campaign rules are now displayed in the Single Campaign View after clicking on the Campaign in the list.

UI Improvements:

* Campaigns - Rules
* Single Member View - Timeline

**Fixed**:

* *Achievement is one of* condition fix
* Export doesn’t work for higher volumes of data
* Data exported to AWS S3
* Fixed 'name' filtering for GET /api/{storeCode}/member/{member}/wallet endpoint&#x20;
* It was not possible to change the order of the Campaigns.

</details>

***

## June 2023&#x20;

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVuZSA2PC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Single Campaign analytics**

Single Campaign View was added, and it contains two metrics that can be used to track Campaign performance:

* Total engagement: Total number of times the campaigns engaged members within the set date range.&#x20;
* Engaged members: Total number of members engaged with the campaigns at least once within the set date range.

<details>

<summary>More monthly updates</summary>

**Enhanced**:

* Add/Edit Campaign form revamp
* Single Campaign View - details
* Adding additional labels for daily aggregation on the General Overview and Campaign reports

**Fixed**:

* Accent sign-in email fix
* customerId value fix for GET /api/{storeCode}/points/{transfer} and GET /api/{storeCode}/points/
* Cancelling particular units transfer caused 500 error
* Canceling units transfers causing 500 error&#x20;
* Expression length is too short causing 500 error

</details>

***

## May 2023

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWF5IDI2PC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Multi-dimensional achievements**

Open Loyalty supports the creation of hybrid achievements by combining various triggers.

These are sample cases:&#x20;

* Share a post on social media and make a purchase for at least 50$&#x20;
* Walk 10,000 steps five days in a row and buy three products from the supplements category

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWF5IDIzPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Segmentation based on location and age**

This feature allows for refined targeting by incorporating demographic and geographical criteria such as country, city, province, and postal code.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWF5IDExPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Specify Wallet for the Reward**

Now, for each Reward, you can designate a specific Wallet from which units will be redeemed. This feature is accessible through both the Add/Edit Reward form in the admin panel and via API, offering greater flexibility in managing rewards and redemptions.

**Admin Panel Import UI**

The admin panel now includes a user interface for the import functionality, enabling a new method for importing Members directly through the admin Panel. This update simplifies the process of adding members to the system, enhancing the user experience and administrative efficiency.

<details>

<summary>More monthly updates</summary>

**Added:**

* Creating Member without adding the Tier - It is now possible to use Open Loyalty without creating Tiers. Before, there had to be a basic Tier; now, Members can be created without any Tier assigned.
* Logout after a period of inactivity - An automatic logout is performed when there is no activity for some time. The default value is 15 minutes.
* Redemption codes export to CSV file - It is now possible to manage the exports of redemption codes.
  * POST /api/:storeCode/campaign/{id}/codes/export is used to schedule an export. It is also possible to use filtering in order to export the desired list of codes.
  * GET /api/:storeCode/export/{exportId} is used to get the details of the scheduled export.
  * GET /api/:storeCode/export/{exportId}/download is used to download the exported file.
  * GET /api/:storeCode/export is used to get the list of all scheduled exports.
* API - Items on page limited to 50

**Enhanced:**

* Filtering improvement - when clicking on the “chips” the edit option is displayed - It is possible to edit the filter by clicking on the “chips” component.

UI Improvements:

* UI forms performance enhancements
* Copy for Campaign table

**Fixed:**

* Create a Campaign with specific data - 500 status error
* Changing Member password causing 500 HTTPS error
* System logs username filtering 500 error&#x20;
* List of Members - filtering with “Amount excluded for Tier” 500 error
* Missing items in CSV exports

</details>

***

## April 2023

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXByaWwgMjE8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Units Conversion Coupon**

It is now possible to create a new coupon type that allows converting the Member’s units to a monetary value. It simplifies the management of coupons and enables burning points to just one high-value coupon rather than several lower-value ones. This approach helps to engage the Members more and drive sales.

**Redemption (QR) Codes Campaigns**

This new Campaign mechanic allows the creation of a set of codes that will yield an effect(Rewards, Units, etc) to the Member who is scanning it. OL can generate and validate the codes that can be presented in any desirable way (string, QR codes, bar codes, etc) to the Member. One of the cases involves printing the codes on the products to encourage customers to buy them.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXByaWwgMTk8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Dashboard - General overview of active members**

It is now possible to configure the Active Member definition in Settings. The definition takes into account the number of days that passed from the last Transaction of a given Member. Then Open Loyalty will gather and display the analytics data on these Members.

<details>

<summary>More monthly updates</summary>

**Enchanced:**

* Add/Edit Rewards - There is a new layout for the Add/Edit Rewards form.

**Fixed:**

* Filtering Members using memberId
* Sorting Rewards by type caused 500 error
* Filtering Rewards using Tiers caused 500 error
* Update Add/Edit role view- dropdown of Tenant and select component of "Access" and "Resource"
* Right to left mode admin panel improvements
* Creating Segment with “Members with custom attribute value”, “Members with custom attribute” conditions admin panel error
* Hiding unused fields when adding deduct units transfer
* PUT /api/{storeCode}/member/{member} email update error
* Timeline Unit Transfer dates fix
* Achievement concurrency issue

</details>

***

## March 2023

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWFyY2ggMjA8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Multi-level referrals**

It is now possible to set up the number of levels for which the referral Campaign will be triggered. For example for Referral Level = 2, and situation: Mary invites John and John invites Kate and Kate makes a transaction. In this case, both John (Level 1 referral) and Mary(Level 2 referral) will get the Campaign Effect(Points, Rewards, etc.). It is also possible to vary the Rewards based on the given level of Referral so that Mary can get a different Reward than John.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+TWFyY2ggMTQ8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Dashboard - General Overview**

New Dashboard element - General overview with various metrics was added.&#x20;

New metrics include:

* Registered members&#x20;
* Revenue&#x20;
* Avg. spending
* Transactions&#x20;
* Avg. transaction value
* Avg. number of transactions

<details>

<summary>More monthly updates</summary>

**Added:**

* Asynchronous Member import with XML file - It is now possible to import multiple xml files with Members and track the progress of the import.

**Enhanced:**

* Admin panel translations - Translations were enhanced in multiple places making the experience of using the panel better
* Set/Delete Member Custom Attribute effect enhanced in CampaignEffectWasApplied webhook - Information about the key and value of the assigned Custom Attribute has been added to the webhook CampaignEffectWasApplied
* Using loyaltyCardNumber, email and phone as memberId with endpoints - It is possible to use loyaltyCardNumber, email and phone, instead of memberId (uuid) using all endpoints that used memberId as a path parameter
* transferId added to AvailablePointsAmountChanged webhook

**Fixed:**

* Set Member Custom Attribute Effect and PUT /api/DEFAULT/member/{member}/custom-attribute request did not trigger the Campaign
* Error enhancement when deleting segment that contains Members
* Single Member View - different value for empty field: “-” instead of “NaN”
* Changing a member's email resets its data
* Fixed wrong Transaction and Unit Transfer date on Member timeline
* Layout improvements&#x20;
* Error status code for deleting segments fixed

</details>

***

## February 2023

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RmVicnVhcnkgMjc8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Export to S3 - Achievements progress**

It is possible to export Achievements progress as a CSV file to the S3 bucket.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RmVicnVhcnkgMTU8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Export to S3 Bucket**

It is possible to export Transactions, Rewards Redemption, Achievements as CSV files to the S3 bucket.

#### Campaign Effect - Assign/Delete Member CustomAttribute

There are two new Effects added in Campaigns:&#x20;

* Set Member Custom Attribute - it allows setting the Custom Attribute on the Member profile as an effect of a Campaign. \
  Use cases: assigning badges, assigning custom units to be rewarded ratio, custom segmentation, chaining Campaigns&#x20;
* Delete Member Custom Attribute - it allows deleting Custom Attributes from the Member profile.&#x20;

Additionally, it is possible to use numerical Member Custom Attributes in Campaigns in Effects, e.g. give units with custom individualised ratio for each Member.

<details>

<summary>More monthly updates</summary>

**Added:**

* RTL - Right-to-left support in admin panel - The admin panel is in right-to-left mode for Arabic and Hebrew language browser settings.
* Set a new password by administrator in admin panel - It is now possible to set a Member password in Admin panel.
* There is a wallet type code displayed in Admin panel for the default wallet. - Before this code was not shown but currently it is displayed as with their wallet types.

**Enhanced**:

* Achievements - Read-only mode - The edit achievement form is displayed in a read-only mode. When updating non-condition fields i.e. name, description, the progress achievements stay the same. When updating conditions the prompt is shown informing that the progress of achievements will change.
* transferId added to AvailablePointsAmountChanged webhook
* Matching transaction: Matching from Single Transaction View and showing explicit matching information - It is now possible to match a Transaction to a Member on Single Transaction view. Additionally, it is shown explicitly if Transaction is matched or not.
* Add/Edit new wallet type UI revamp- Layout for Add/Edit wallet type changed in Admin Panel&#x20;
* Campaigns in Admin panel - Conditions revamp: event.achievementId and purchaseAmount It is possible to set two new conditions in Campaigns:&#x20;
  * For Transaction Campaigns: Purchase amount - the value of all Transactions placed by a Member&#x20;
  * For Internal Event - Achievement progressed: Name of the progressed Achievement (before it was necessary to use the expression)

**Fixed**:

* Display Edit Campaign page in admin panel
* 400 error when editing image in Rewards
* Fixes in migration scripts
* Filtering units transfers as logged Member returned only default wallet transfers
* Edit Tier image 401 error
* Achievement - Transaction items custom attributes condition did not progress the achievement
* Wrong hover in Rewards details in Admin panel
* Admin panel - error with opening Achievements with brackets in Conditions

</details>

***

## January 2023

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SmFudWFyeSAyNDwvdGV4dD4KPC9zdmc+" alt=""></div>

**Export to S3 Bucket - Campaigns Usage, Members, Campaigns, Tiers**

It is possible to export Campaigns Usage, Members, Campaigns, and Tiers as CSV files to the S3 Bucket.

**Global limitations**

It is now possible to set a global limitation. There are two configurations:

* global wallet limitation - limit for all the wallets of the given type&#x20;
* member wallet limitation - separate limit for wallets of the given type per Member&#x20;

It is possible to set different time constraints: hourly, daily, weekly, monthly, yearly and in total.

<details>

<summary>More monthly updates</summary>

**Enhanced:**

* Admin Panel UI improvements - Navigation bar has been moved to the side and is now collapsible.
* Single Member View - expiration date for units transfers added
* Additional actionCause object added to AvailablePointsAmountChanged webhook\
  New object added to the webhook:\
  `"actionCause": {`\
  &#x20;     `"campaignId": "string" (uuid) | null,`\
  &#x20;     `"customerId": "string" (uuid) | null,`\
  &#x20;     `"transactionId": "string" (uuid) | null,`\
  &#x20;     `"customEventId": "string" (uuid) | null,`\
  &#x20;     `"internalEventName": "string" | null`\
  `}`\
  It gives information about a cause that triggered the event.

**Fixed**:

* Audit logs - opening some logs resulted in a blank screen&#x20;
* Coupons - daysInactive and daysValid validation fixed&#x20;
* Tier downgrade config fixed&#x20;
* Units to the next tier calculated for the wrong wallet&#x20;
* Export to s3 - CSV had breaks in the wrong places&#x20;
* Member edit returned 500&#x20;
* Reward edit error - image deleted&#x20;
* Units transfer cancellation fix&#x20;
* Too many decimals for Units on Single Member View in the admin panel&#x20;
* Filtering using customerId fix
* Cannot search the condition after choosing an item from the list
* A long email address is displayed outside the box
* GET /member/{memberID}/status returned value calculated with the wrong wallet
* Concurrent add units operation resulted in duplicating the wallet type for the single Member
* Campaign Limitation - The campaign showed the wrong limitation after the edit

</details>


# 2022

See the complete list of features introduced back in 2022.

## December 2022

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RGVjZW1iZXIgMTk8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**New Campaign Trigger: Internal event - Achievement progressed**

This event triggers when the progress of Achievement changes. It is possible to use achievement-related properties in the campaigns:&#x20;

* periodGoal - goal to be achieved&#x20;
* currentPeriodValue - current progress value&#x20;
* consecutivePeriods - applicable only for consecutive Achievements: periods to be achieved
* completedConsecutivePeriods - current achieved periods&#x20;
* progressChanges - the difference between the current periodGoal and the previous periodGoal

Additionally, an advanced cashback threshold mechanism was added to Campaigns Effect.

**Rewards - Export to S3 Bucket**

Rewards can now be exported as CSV files directly to the S3 Bucket, offering a streamlined way to manage and analyze reward data outside of the platform

**Adding Units Transfers in Admin Panel**

Admin panel allows adding units transfers and specify pending and expire values.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+RGVjZW1iZXIgMjwvdGV4dD4KPC9zdmc+" alt=""></div>

**Units Transfer - Export to S3 Bucket**

Unit Transfers can now be exported as CSV files directly to the S3 Bucket.

<details>

<summary>More monthly updates</summary>

**Added:**

* ACL - Language - There is now 403 error handling in admin panel for Language resources.
* Member Custom Attribute in Campaign Condition Expression - It is now possible to use Member Custom Attributes in Campaign expressions. Member Custom Attributes can be used as strings, datetimes and numbers.
* Single Member View - assigning a Tier - It is now possible to assign the tier using ACTIONS menu in Single Member View

**Enhanced:**

* Autocomplete:&#x20;
  * Style updates&#x20;
  * Bug with highlighting a template&#x20;
* Trigger related fields added to CampaignEffectWasApplied webhook&#x20;
* New fields added to this webhook:
  * triggerType - transaction/custom\_event/internal\_event/time/achievement",
  * trigger.triggerId - returned only for transaction/custom\_event/achievement
* Application logs returned as json<br>

**Fixed**:

* Targets were not taken into account when displaying rewards for test data -\
  GET member/{member}/reward
* Saving empty tierAssignType returns 500 error
* Too many decimal places returned for units - Units balance was returned containing too many decimal places
* No critical logs in stderr
* 500 error when image not found with GET /api/DEFAULT/reward/{rewardId}/photo/{photoId} - Error handling was added.
* Member import from XML when S3 is enabled - It is now possible to import members using XML file when S3 is enabled
* Not possible to filter with Units Transfers types in the admin panel
* Endpoint POST /api/audit/log/archive returned 500 error - Error handling was added.&#x20;
* Importing coupons with wrong file returned 500 error - Error handling and validation was added.
* Referral Achievement - Transactions in a row Achievement was not working&#x20;
* Deleting Tier with assigned Members returned the wrong error - The error was not precise and had spelling errors.&#x20;
* Special signs fixed in search boxes of email or phone were not working - Special signs like “+” were not working in search inputs in the Admin Panel.

</details>

***

## November 2022

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+Tm92ZW1iZXIgOTwvdGV4dD4KPC9zdmc+" alt=""></div>

**Achievements - unique Transactions (one per Member)**

Achievements now support the case for checking if the given number of Referees made an order, e.g: “10 of your invited friends made an order”

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+Tm92ZW1iZXIgODwvdGV4dD4KPC9zdmc+" alt=""></div>

**Achievements - Referral events**

The Achievements module now includes support for Referral events, allowing the configuration of achievements for Referrers based on Transaction and Custom events. This feature rewards Referrers for bringing in valuable Members who meet specific criteria, such as placing orders above a certain value or contributing a minimum number of product reviews.

<details>

<summary>More monthly updates</summary>

**Added:**

* Achievements - unique Transactions (one per Member) - Achievements now support the case for checking if the given number of Referees made an order, e.g: “10 of your invited friends made an order”

**Enhanced**:&#x20;

* Currency format in tables and charts improved - Places with currency display data with more consistency now.&#x20;
* unitsDeducted field returned for Transaction endpoints - Field unitsDeducted returned in endpoints:&#x20;
  * /api/{storeCode}/transaction/{transaction}&#x20;
  * /api/{storeCode}/transaction
* Admin panel UI revamp - Visual layout of admin panel was changed. No new functional changes, mainly UX improvements.&#x20;
* ACL - ACL/Roles and Sales channel - There is now 403 error handling in admin panel for ACL/Roles and Sales channel resources.&#x20;
* Description in the List of Campaigns - It is now possible to see the Campaign Description on the List of Campaigns when hoovering on the Campaign Name.

**Fixed:**

* Single reward view - copy table header replacement&#x20;
* There was no scroll to the error message in the edit Single Member View&#x20;
* “See all” button in the List of Campaigns not displayed correctly
* Add Unit Transfer button was not present in the List of Unit Transfers
* Filters related to units were not working in the List of Members
* Some responses contained info about filtering even though they were not filtered.
* limitReached field in GET/{storeCode}/member/{member}/campaign was set to false when trigger limit was reached and units limit was not reached.

</details>

***

## October 2022

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+T2N0b2JlciAyNjwvdGV4dD4KPC9zdmc+" alt=""></div>

Campaign popularity

A new endpoint, GET /api/{store}/analytics/campaign, has been introduced, which provides the number of campaign executions created. This feature enhances the ability to track and analyze the popularity and engagement levels of various campaigns, offering valuable insights into their performance.

**Deduct units in Campaigns**

It is now possible to configure the “Deduct units” option in Campaign Effect for given Conditions. It will create a spend unit transfer for a given Member.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+T2N0b2JlciAxMTwvdGV4dD4KPC9zdmc+" alt=""></div>

**Webhooks Subscription Interface**

The admin panel now features a new subscription mechanism, enabling the configuration of webhooks through a user-friendly interface. Each webhook can be directed to a specific URL. For legacy users, there's an option to activate legacy mode for individual webhooks to continue receiving responses in the old format. However, be aware that legacy mode will only be supported until the end of this year.

<details>

<summary>More monthly updates</summary>

**Added:**

* Rewards - choosing Wallet spending configuration - It is now possible to precisely choose the wallet that will be used to purchase Rewards. Initially by default Rewards are purchased using Default wallet.
* ACL - Custom Events - There is now 403 error handling in admin panel for Custom Events resource.
* Filtering transaction in Admin panel using matched and transactionId - It is now possible to filter the transactions using the matched and transactionId filters in the admin panel.

**Enhanced**:

* Autocomplete - Searched words are bolded - Now the searched words will be bolded in the Campaign Effects formula Autocomplete.
* Segments contain the date of computation - Segments will now contain the information about the time of computation. The field will be returned when computation took place and will not be returned when there was no computation.
* CustomerBoughtReward reward name attribute added - New field reward that contains rewardName was added to the CustomerBoughtReward webhook.

**Fixed:**

* Copy error in the List of Unit Transfers filters - Copy had “Transactions” instead of “Unit Transfers”
* “You don't have permission" appearing when it shouldn’t - There was an error that “You don't have permission" message appeared when it shouldn’t because permissions were in order.
* Security vulnerability in twig was fixed

</details>

***

## September 2022

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+U2VwdGVtYmVyIDEyPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Achievement - sum of event attribute’s values consecutively**

The new feature allows for the configuration of achievements based on the consecutive sum of values from Transaction and Custom Event attributes. Possible cases:

Custom Event:

* Track a workout of at least 30 minutes every day for 5 days in a row
* Walk at least 40 000 steps a week for 6 weeks in a row

Transaction:

* Spend 50$ 5 months in a row
* Buy 5 products from consumable category 4 months in a row

This enhancement enables more dynamic and goal-oriented achievements within the platform.

<details>

<summary>More monthly updates</summary>

**Added:**

* Showing more than 3 wallets on Single Member View  - It is now possible to browse more than 3 wallets on Single Member View.

**Enhanced**:

* ACL - 403 error handling in Admin panel for resources: Tiers Campaign Previously roles management worked on the BE side, now we are implementing usability optimisation for each resource.
* Webhook account.available\_points\_amount\_changed wallet related fields added - Additional wallet information was added
* Campaign display order - inline table edition - It is now possible to edit the Campaign display order on the Campaign table view. It provided a better user experience as one can see campaigns in a broader context.
* Multiwallets/Units Transfers table - new columns and filters:

**Fixed:**&#x20;

* Field flatVariables is returned as array \&object - The same field was sometimes returned as a different data structure.

</details>

***

## August 2022

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXVndXN0IDMwPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Achievement - Calculate Event Attributes values (Custom Events)**

Achievements module now supports cases where we want to aggregate event attributes, rather than event itself, e.g: Spending 5h on a workout

**Webhook subscription mechanism**

A new webhook subscription mechanism was added. Before, all webhooks were sent to a single address. Currently, it is possible to configure a separate address per webhook.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXVndXN0IDEyPC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Mutliwallet units expiration and locking**

It is now possible to set the expiration and locking configuration per wallet. Before only the default wallet had such a configuration.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+QXVndXN0IDI8L3RleHQ+Cjwvc3ZnPg==" alt=""></div>

**Achievement - Calculate Event Attributes values (Transactions)**

The achievements module now supports cases where we want to aggregate event attributes, rather than the event itself, e.g:&#x20;

* Spend a total of 300$ among many Transactions&#x20;
* Buy 10 products from your favorite brands ( Quantity of products with given Custom Attribute)
* Spend a total of 100$ on products with the given SKU

**Multi wallets**

A new module that allows managing multi-wallet scenarios. It is possible to have many wallets and assign units to them separately. Spending on units is also separate.

This feature introduces support for different business scenarios, e.g:&#x20;

* Separate wallets for paying with points and for redeeming&#x20;
* Rewards Credit wallet or debt wallet&#x20;
* Gamification: experience points wallets

<details>

<summary>More monthly updates</summary>

**Added:**

* Achievement progress notification - A webhook that is sent when achievement progress is changed, was added. For the consecutive achievements, it is also sent when the consecutive time streak is reset.
* Campaign effect assigned notification - Webhook is sent when the Effect was assigned for the Campaign. It can be used to notify a Member that its actions have positive outcomes.
* Campaign:&#x20;
  * Custom Attributes
  * Custom display order
* Achievements progress endpoints - It is now possible to retrieve the progress of achievements using endpoints:&#x20;
  * GET member/{member}/campaign - this endpoint returns achievement progress along the campaign data&#x20;
  * GET member/{member}/achievement - this endpoint is focused just on the achievement context
* Multiwallet Tier configuration - It is now possible to choose which wallet will be used to calculate the Tiers. It’s configured in Tiers configuration. Before Tiers were based on default wallet.

**Enhanced:**

* Autocomplete - support for editing - Before autocomplete worked only for creating a Campaign and now it works also for editing.
* UX Single Member View - copy button - There are buttons to copy some Member details on Single Member View.
* Table Filters UX - “None” option was removed and when there is only one filtering condition it is already chosen.
* Achievements - Single Member View Timeline update - Information about the completed achievement is presented on the Member’s Timeline.

</details>

***

## July 2022

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVseSAxNTwvdGV4dD4KPC9zdmc+" alt=""></div>

**Achievements - Custom Events - Overall**

It is now possible to create Achievements based on counting the number of Custom Events.

**Achievements - Consecutive**

It is now possible to create Achievements based on events (Transactions, Custom Events) in a row.

<div align="left"><img src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjM2IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgogIDxzdHlsZT4KICAgIC5idXR0b25UZXh0IHsKICAgICAgZm9udDogNTAwIDE1cHggJ0ludGVyJywgc2Fucy1zZXJpZjsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgZmlsbDogd2hpdGU7IC8qIENoYW5nZWQgdGV4dCBjb2xvciB0byB3aGl0ZSB0byBtYXRjaCB0aGUgaG92ZXIgc3RhdGUgKi8KICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IGNlbnRyYWw7CiAgICB9CiAgICAuYnV0dG9uQmFja2dyb3VuZCB7CiAgICAgIGZpbGw6IHJnYig2NCwgNTIsIDExOCk7IC8qIFVwZGF0ZWQgZmlsbCBjb2xvciB0byBtYXRjaCB0aGUgaG92ZXIgYmFja2dyb3VuZCAqLwogICAgICBzdHJva2U6IHJnYigyMTYsIDIxNiwgMjE2KTsgLyogQXNzdW1pbmcgeW91IGtlZXAgdGhlIHN0cm9rZSBhcyBpcyAqLwogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHJ4OiA0OyAvKiBib3JkZXItcmFkaXVzICovCiAgICAgIC8qIFVwZGF0ZWQgYm94LXNoYWRvdyB0byBtYXRjaCB0aGUgaG92ZXIgZWZmZWN0ICovCiAgICAgIGZpbHRlcjogZHJvcC1zaGFkb3cocmdiYSgwLCAwLCAwLCAwLjIpIDBweCAycHggNHB4IC0xcHgpIGRyb3Atc2hhZG93KHJnYmEoMCwgMCwgMCwgMC4xNCkgMHB4IDRweCA1cHggMHB4KSBkcm9wLXNoYWRvdyhyZ2JhKDAsIDAsIDAsIDAuMTIpIDBweCAxcHggMTBweCAwcHgpOwogICAgfQogIDwvc3R5bGU+CiAgPHJlY3QgY2xhc3M9ImJ1dHRvbkJhY2tncm91bmQiIHg9IjEiIHk9IjEiIHdpZHRoPSIxMjYiIGhlaWdodD0iMzQiIC8+CiAgPHRleHQgeD0iNjQiIHk9IjE4IiBjbGFzcz0iYnV0dG9uVGV4dCI+SnVseSA2PC90ZXh0Pgo8L3N2Zz4=" alt=""></div>

**Achievements - Transactions**

We added a new functionality of Achievements that allows gamifying the shopping experience in regards to Transactions and allows to create of loyalty Campaigns based on it. For example, it is possible to create this scenario: Shop 5 Transaction 50$ each

**Auth0 Support**

It is possible to configure Auth0 and log in to the admin panel with this method.

<details>

<summary>More monthly updates</summary>

**Added:**

* Webhook subscription mechanism - new endpoints introduced

**Enhanced:**

* Single Member View - Sorting added to columns in tables
* Custom Event assignment appears on the Members timeline - GET /member/{member}/history returns an entry when Member was assigned to a Custom Event. It is also shown in the Single Member View in admin panel.
* Member identification optimized - It is now possible to add loyaltyCardNumber as a main identification factor along email and phoneNumber. This value will be required when choosing this field.
* Field loyaltyCardNumber was added to tier and points webhooks

</details>

***

## June 2022

#### New Endpoint - Return all campaigns

Endpoint for returning available challenges per Member - `GET /api/{code}/member/{member}/campaign` endpoint added.&#x20;

This endpoint returns all active Campaigns with information if their limit was reached for a given Member. For Campaigns that have not reached the limit it returns "limitReached": false, and for Campaigns that have reached the limit it returns "limitReached": true.The logged Member can only see its own available Campaigns and precise Campaign logic is hidden

<details>

<summary>More monthly updates</summary>

**Enhanced:**

* Time comparison added to Expression functionality - It is possible to compare time, e.g. dates using timestamp function. Here is an example of checking if it was more that 30 days after Member registration: timestamp(customer.registeredDate) + 86400 \* 30

**Fixed:**

* POST api/token/refresh is now working for Member account

</details>

***

## May 2022

#### Campaign Limitation

A new feature of Campaign Limitation was implemented. It allows anti-fraud and business control of the Campaigns.&#x20;

* General Points limit - It allows limiting the points earned by all the Members for the given Campaign.
* Per Member Points Limit - It allows limiting the points earned per Member for the given Campaign.
* Per Member executions Limit - It allows limiting the executions of the given Campaign per Member.

<details>

<summary>More monthly updates</summary>

**Enhanced:**

* UX popup threshold changed to 1000px - There is a popup informing about optimal screen resolution. Its threshold was lowered to 1000 pixels.
* Campaign Autocomplete - Transaction autocomplete are no longer displayed in Custom and internal Campaigns. These tips were not relevant there.
* Reward logic refactor - Reward bought projector has been removed in order to move retrieving data about bought rewards from another source. It allows the next version to generate more detailed reports.<br>
* Autocomplete:
  * navigating with arrows - It is possible to navigate the popup with templates and variables
  * UX copy optimisation - There was a change in the copy so it’s more informative.

</details>


# What's New - OL

Keep up to date with all released features and improvements!

{% code overflow="wrap" %}

```
{"content":[{"description":"Extend Members, Campaigns, and Rewards with your own typed, validated fields — no development required. Define once in the Admin Panel and it's instantly available via forms, API, imports, and exports. ","header":"🗂️ Custom Fields","date":"2026-08-17","link":"https://help.openloyalty.io/integrations-and-data-exchange/custom-fields"},{"description":"Upload your product catalog (SKUs) to Open Loyalty and reward individual products instead of maintaining hundreds of separate campaigns. Import via CSV, then use the new Product Catalog campaign type to reward SKUs or groups by category, brand, or attribute. ","header":"📦 Product Catalog","date":"2026-08-17","link":"https://help.openloyalty.io/integrations-and-data-exchange/product-catalog"},{"description":"A new campaign effect lets you move a member straight into a selected tier the moment they fulfill a rule's conditions — no manual step required. Members can still progress further on their own afterwards. ","header":"🆕 Assign a Tier via Campaign Effect","date":"2026-08-17","link":"https://help.openloyalty.io/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns#add-rules-conditions-and-effects"},{"description":"Thousands of issued rewards, one update. Upload a CSV with the reward ID, new status, and an optional comment, and Open Loyalty takes care of the rest — no more clicking through redemptions one by one. ","header":"🔄 Bulk Update of Redeemed Reward Statuses","date":"2026-08-17","link":"https://help.openloyalty.io/rewards-redemption/rewards/reward-fulfillment/mass-reward-status-change"},{"description":"A new analytics view for Tiers with interactive charts shows how members flow between tiers over time — how many upgraded, how many downgraded, and how many stayed. ","header":"Tier Analytics","date":"2026-07-21","link":"https://help.openloyalty.io/main-features/tiers/tier-analytics"}]}
```

{% endcode %}


# What's Next

We're excited to share our product roadmap with you, outlining our plan for the future of our offerings. Our roadmap follows a **Now**, **Next**, **Later** approach to give you insight into what we're currently working on, what's coming up next, and what we have planned for the future.&#x20;

However, it’s important to note that **this roadmap serves as an outline and may change**. While we strive to follow the timelines outlined here, factors like evolving market conditions, customer feedback, technological advancements, and other unforeseen circumstances may require adjustments to our plans. We are committed to transparency and will keep you informed of any significant updates or changes to our roadmap as they occur.&#x20;

Your feedback and insights are invaluable as we continue to innovate and improve our products to serve your needs better.

{% hint style="info" %}
The roadmap is updated every two months.
{% endhint %}

## **Now**

**Features planned for the next 2 months.**

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th><select multiple><option value="0vfkFJ6d22Ko" label="Segment" color="blue"></option><option value="9Fs8FniikqSk" label="Units" color="blue"></option><option value="ZkYUUjjc0tLO" label="Achievements" color="blue"></option><option value="TUhOs6YofxFK" label="Tiers" color="blue"></option><option value="xtI0W45WTkOU" label="Campaigns" color="blue"></option><option value="lqwR4Lx9LhBh" label="Integration" color="blue"></option><option value="xQ7zmvMACKR2" label="Gamification" color="blue"></option><option value="IQ2zclFouiCS" label="Members" color="blue"></option><option value="GtJwrx9hlcNg" label="Analytics" color="blue"></option><option value="IbsCZETcmPxW" label="Webhooks" color="blue"></option><option value="Nm5ErZt7MzPg" label="Leaderboards" color="blue"></option><option value="xEmAsto0tm4j" label="Rewards" color="blue"></option></select></th><th></th></tr></thead><tbody><tr><td><strong>Tier Assignment via Campaigns</strong></td><td><span data-option="TUhOs6YofxFK">Tiers</span></td><td>Letting members qualify for a tier through a specific activity (like registering a device or completing a challenge), not only by reaching a points threshold.</td></tr><tr><td><strong>Product Catalog &#x26; SKU-Level Campaigns</strong></td><td><span data-option="lqwR4Lx9LhBh">Integration</span></td><td>Uploading a product catalog and configuring points campaigns down to the individual product or SKU level.</td></tr><tr><td><strong>Instant Campaign Effects (Sync &#x26; Preview)</strong></td><td><span data-option="xtI0W45WTkOU">Campaigns</span></td><td>Returning campaign effects like points and rewards immediately in the same response, plus a preview mode to show members what they'll earn before they complete an action.</td></tr><tr><td><strong>Bulk Update of Redeemed Reward Statuses</strong></td><td><span data-option="xEmAsto0tm4j">Rewards</span></td><td>Updating the status and comments of many redeemed rewards at once via CSV import or API, simplifying offline fulfillment and reconciliation.</td></tr></tbody></table>

## **Next**

**Features planned for the next 4-6 months, subject to change.**

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th><select multiple><option value="MiGm664Qt8VC" label="Segments" color="blue"></option><option value="6ISaWVUlsZAb" label="Webhooks" color="blue"></option><option value="TIw3oefyxNcC" label="Campaigns" color="blue"></option><option value="HG1KTndoMO8F" label="Integration" color="blue"></option><option value="u2sLmcbaBu0f" label="Authentication" color="blue"></option><option value="rau2NpSrWFq8" label="Wallets" color="blue"></option><option value="jp1DFyrJ8ldJ" label="Custom Evenets" color="blue"></option><option value="n5j0cG8FGL5r" label="Members" color="blue"></option><option value="ItUfm3sXQZGx" label="Gamification" color="blue"></option><option value="NcSU3KINBLQf" label="Custom Events" color="blue"></option><option value="PnTlVo7EFLwq" label="Rewards" color="blue"></option><option value="1stj7j2I6fuv" label="Analytics" color="blue"></option><option value="1STqiip9mVTg" label="Management" color="blue"></option><option value="HPAWIdXHAuRj" label="Audit" color="blue"></option><option value="AY3NwNM1glEr" label="Challenges" color="blue"></option></select></th><th></th></tr></thead><tbody><tr><td><strong>AI Challenges</strong></td><td><span data-option="AY3NwNM1glEr">Challenges</span></td><td>Generating a personalized goal and reward for every member based on their own activity history, with plain-language explanations and program-team approval before each round.</td></tr><tr><td><strong>Scaling Automation Campaigns</strong></td><td><span data-option="HG1KTndoMO8F">Integration</span></td><td>Removing the audience limit on automations so they can reward, re-tier, and re-engage millions of members at once.</td></tr></tbody></table>

## **Later**

**Features planned for the later period, subject to change.**

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th><select multiple><option value="MiGm664Qt8VC" label="Segments" color="blue"></option><option value="6ISaWVUlsZAb" label="Webhooks" color="blue"></option><option value="nvdAtYDbNGOk" label="Leaderboards" color="blue"></option><option value="zqX7nfxqHsAk" label="Gamification" color="blue"></option><option value="v07e3Ocb0CAg" label="Tiers" color="blue"></option><option value="pGWzGTpR7iHG" label="Analytics" color="blue"></option><option value="SWAvbxpbHEeJ" label="Custom Events" color="blue"></option><option value="wqdF6TJBTXbw" label="Achievements" color="blue"></option><option value="tfTMTbz3j33N" label="AI" color="blue"></option></select></th><th></th></tr></thead><tbody><tr><td><strong>AI Loyalty Manager Model</strong></td><td><span data-option="tfTMTbz3j33N">AI</span></td><td>Introducing a suite of intelligent tools, including an AI Loyalty Manager for smart program optimization and advanced image processing for automated receipt validation, to streamline operations and elevate member engagement.</td></tr><tr><td><strong>Tiers Enhancements</strong> </td><td><span data-option="v07e3Ocb0CAg">Tiers</span></td><td>Adding and enhancing features related to tiers.</td></tr><tr><td><strong>Gamification Enhancements</strong> </td><td><span data-option="zqX7nfxqHsAk">Gamification</span></td><td>Adding and enhancing modules related to gamification.</td></tr><tr><td><strong>Segment Enhancements</strong> </td><td><span data-option="MiGm664Qt8VC">Segments</span></td><td>Adding and enhancing features related to segmentation.</td></tr><tr><td><strong>Analytics &#x26; Reporting</strong></td><td><span data-option="pGWzGTpR7iHG">Analytics</span></td><td>Extending available options and data for analytics and reporting.</td></tr></tbody></table>


# Dashboard

The dashboard is the first page that appears when you log in to the Admin panel. The dashboard gives an overview of the members' activity in your loyalty programs.

The Open Loyalty dashboard is an informative hub for administrators managing loyalty programs. Upon logging in, admins are greeted with a comprehensive overview of member activities and program metrics. Key features include monitoring registered and active members, tracking revenue, and analyzing average spending and transaction values. The dashboard also offers detailed insights into transactions and lets admins view data across various time frames, including daily, weekly, monthly, and yearly aggregates. Additional metrics such as points earned, used, expired, pending, and member engagement without transactions are also available.&#x20;

This robust dashboard provides a clear and detailed view of loyalty program performance, aiding in effective management and strategy development.

{% hint style="info" %}
Metrics can be exported and utilized in any reporting tool you work with daily. \
To find out more, please refer to this article:

[S3 Bucket Exports](/integrations-and-data-exchange/imports-exports/exports/s3-bucket-exports)
{% endhint %}

For a more detailed view and specific information, please refer to one of the following sub-articles:

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>General Overview</strong></td><td><a href="/pages/38JA40X86P95WSd20JgJ">/pages/38JA40X86P95WSd20JgJ</a></td></tr><tr><td><strong>Units Wallet Overview</strong></td><td><a href="/pages/oVqbA5o2TMkt1e0qrOqf">/pages/oVqbA5o2TMkt1e0qrOqf</a></td></tr><tr><td><strong>Additional Metrics</strong></td><td><a href="/pages/JvTJNFWXrUEz3XGuSQrP">/pages/JvTJNFWXrUEz3XGuSQrP</a></td></tr><tr><td><strong>Members by Tiers</strong></td><td><a href="/pages/oPvuEiW1o6HlepGuC5CK">/pages/oPvuEiW1o6HlepGuC5CK</a></td></tr></tbody></table>


# General Overview

The dashboard is the first page that appears when you log in to the Admin panel. The dashboard gives an overview of the members' activity in your loyalty programs.

## General overview

The dashboard provides a general overview of the specific tenant[^1]. To see data for other tenants, you can change the view under the logo in the upper left corner.&#x20;

<figure><img src="/files/LPoE6MLWNRAMbZ08SSTW" alt=""><figcaption></figcaption></figure>

***

### Analytics - previous period comparison <a href="#analytics-previous-period-comparison" id="analytics-previous-period-comparison"></a>

There is a dashed line representing the previous period for the following reports: **General overview**, [**Units Wallet Overview**](https://help.openloyalty.io/main-features/dashboard/units-wallet-overview), and **Campaign overview**.

<figure><img src="/files/XBPbnIm715gQD24mdiDD" alt=""><figcaption></figcaption></figure>

***

### **Registered Members**

The number of loyalty program members who activated their account during a given period - is calculated for the period selected in the filters:

<figure><img src="/files/bWr9Q4BuEQP3ac3DpsrM" alt=""><figcaption></figcaption></figure>

***

### Active Members

Total number of active members on the last day in the set date range. Data range can be configured in the General settings:

<figure><img src="/files/negVP4BxeQLHuqzXhuwu" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
The configuration in the settings determines the total number of active members on the last day within the given date range. The activity of these members is recalculated under two circumstances:

1. **Real-time Recalculation:** The activity of members is recalculated every 60 seconds whenever there's a new activity, like a new transaction. This ensures that the count of active members stays up-to-date as members engage with the system.
2. **Daily Recalculation:** Additionally, activity is recalculated once a day. This daily recalibration considers any changes in the activity configuration specified in the settings. The previously calculated active member count will not change.
   {% endhint %}

***

### **Revenue**

The total value of transactions registered in the loyalty program (linked to a member's profile) during a given period (including returns):

<figure><img src="/files/9ONiI3gjKgN6GMV22iNK" alt=""><figcaption></figcaption></figure>

***

### **Avg. Spending**

The average value of spending per loyalty program member during a given period (calculated for the number of loyalty program members with whom at least one transaction was linked in the given time):

<figure><img src="/files/m9CxSgfJfkCfiAnNOp5n" alt=""><figcaption></figcaption></figure>

***

### **Transactions**

The total number of purchase transactions registered in the loyalty program (linked to a member's profile) during a given period. The date of purchase in the analytical module is considered as the transaction registration date:

<figure><img src="/files/rlY7dIEIuVbM2iarHkB2" alt=""><figcaption></figcaption></figure>

***

### **Avg. Transaction Value**

The average value of purchase transactions realized during a given period:

<figure><img src="/files/g1FD1JH3Lf0ne0754eR6" alt=""><figcaption></figcaption></figure>

***

### **Avg. Number of Transactions**

The average number of transactions per loyalty program member is calculated for a given period (calculated for the number of loyalty program members with whom at least one transaction was linked in the given period):

<figure><img src="/files/ArU34nHrQouHWJfZmKHU" alt=""><figcaption></figcaption></figure>

***

### Return transactions

Total number of return transactions within the set date range.

<figure><img src="/files/bZf9mcpLdtzyinxZvofE" alt=""><figcaption></figcaption></figure>

***

### Total Returns

Total value of return transactions matched with members within the set date range.

<figure><img src="/files/f2jrdTppk0fox18fN6jw" alt=""><figcaption></figcaption></figure>

***

### Avg. return value

Average return transaction value within the set date range.

<figure><img src="/files/MFUAsoeBzpSaR6abYU8u" alt=""><figcaption></figcaption></figure>

***

### Avg. number of return transactions

Average number of return transactions per member within the set date range.

<figure><img src="/files/ZIcdlEQBHdCU9swNvtcZ" alt=""><figcaption></figcaption></figure>

[^1]: Previously called Store


# Units Wallet Overview

The dashboard is the first page that appears when you log in to the Admin panel. The dashboard gives an overview of the members' activity in your loyalty programs.

## Units Wallet Overview

The **Units Wallet Overview** displays the history of different types of units per wallet, allowing for easy analysis.&#x20;

<figure><img src="/files/C6CBeLR9rGl8aqjfocCq" alt=""><figcaption></figcaption></figure>

* **Issued Units** - the total number of issued units counted at the end of the period. The metric is calculated based on unit transfers, whether they are active, used, expired, blocked, or spent. This value increases unless the units are canceled.
* **Active Units\*** - the total number of active units accumulated by members at the end of a selected period (blocked units are included)
* **Pending Units\*** - the total number of pending units accumulated by members at the end of a selected period
* **Spent Units** - the total number of spent units by member at the end of the selected period&#x20;
* **Expired Units** - the total number of expired units at the end of the selected period
* **Redemption rate** - the rate of points that have been issued and spent (Redemption rate value = spent/issued&#x20;
* **Breakage rate** - the rate of points that have been issued and expired (Breakage rate value = expired/issued&#x20;

{% hint style="info" %}
**\***&#x41;ctive and pending units are always displayed as accumulated. The example below (custom range of 4 days)&#x20;
{% endhint %}

<table data-full-width="false"><thead><tr><th>Description</th><th>1st day</th><th>2nd day</th><th>3rd day</th><th>4h day**</th></tr></thead><tbody><tr><td>The initial amount of units</td><td>100</td><td></td><td></td><td></td></tr><tr><td>Amount of points visible on the chart (<strong>+ units added to the wallet that day)</strong></td><td></td><td>250 <strong>(+150)</strong></td><td>320 <strong>(+70)</strong></td><td>420 <strong>(+100)</strong></td></tr><tr><td><strong>+ Total amount of added units</strong></td><td></td><td></td><td></td><td><strong>+320</strong></td></tr></tbody></table>

{% hint style="info" %}
**\*\***&#x41;mount of Units displayed on the dashboard "Active"

<img src="/files/O4SQ5KJ0Daq4C3MxQEFs" alt="" data-size="original">
{% endhint %}


# Additional Metrics

The dashboard is the first page that appears when you log in to the Admin panel. The dashboard gives an overview of the members' activity in your loyalty programs.

## Additional Metrics

<figure><img src="/files/hICJJwef769i6YeaAXeG" alt=""><figcaption></figcaption></figure>

### Members Total&#x20;

Total number of Members in the timeline over the last day/week/month/year

### Members without Transaction

Total number of Members without Transactions in the timeline over the last day/week/month/year

### Members with Transaction

Total number of Members that have Transactions in the timeline over the last day/week/month/year


# Members by Tiers

The dashboard is the first page that appears when you log in to the Admin panel. The dashboard gives an overview of the members' activity in your loyalty programs.

## Members by tiers

The diagram shows the sum of [**Members**](https://help.openloyalty.io/main-features/members) assigned to the [**Tiers**](https://help.openloyalty.io/main-features/tiers).![](/files/Gk3bEfGzGhopEqDH36Ih)


# Global Management

In this page you will see what metrics are included in the Global Managment overview.

<figure><img src="/files/6YRnVqvwFqBHU5sxFQc6" alt=""><figcaption></figcaption></figure>

The Global Management allows you to compare the following metrics across all tenants.


# Analytics

In this section, you will learn how to read the Open Loyalty global analytics.

The Analytics allows you to compare the following metrics across all tenants.

## Analytics

### Registered members

Total number of new members who activated their accounts within the specified date range.

<figure><img src="/files/Ot4BExyHGDawPqrZXdOj" alt=""><figcaption></figcaption></figure>

### Active Members

Total active members on the last day of the selected date range. This metric may take up to 60 seconds to recalculate.

[Configuration](broken://pages/Zyn32QzPx6qiUOfPrYRA) changes may take up to 24 hours to recalculate. This recalculation considers only historical data for the specified period in active member settings. Changes will be visible on the chart from the day the adjustments are made.

<figure><img src="/files/IwrJgpQkE1oVhCCMdvnx" alt=""><figcaption></figcaption></figure>

### Transactions

Total number of transactions within the set date range. [Learn more ](https://help.openloyalty.io/main-features/dashboard#transactions)

<figure><img src="/files/ifZjBT1hPWSxnGkyvdAs" alt=""><figcaption></figcaption></figure>

### Average number of transactions

Average transactions per member in the specified date range.

<figure><img src="/files/v2D5BAgIMWgWgObtyj5K" alt=""><figcaption></figcaption></figure>


# Settings

In this section, you will learn how to manage the Open Loyalty settings.

Learn more in the [Settings](/administration/settings) article.

<figure><img src="/files/uiX0B0QSMNqWA8LMaI9k" alt=""><figcaption></figcaption></figure>


# Config Duplication

In this section, you will learn how to duplicate the configuration of your loyalty program between tenants.

## Config Duplication

In this section, you can duplicate the tenant configuration for different tenants.&#x20;

<figure><img src="/files/NEMX0yEpLFjgrrLtXr2q" alt=""><figcaption></figcaption></figure>

The duplication includes:

* Wallets
* Custom event schemas
* Rewards
* Segments
* Achievements
* Campaigns
* Referral Campaigns
* Automations

{% hint style="warning" %}
Config duplication works for the duplication of the configuration with the same environment.

If you want to transfer the configuration between the environments, export the configuration to the individual modules' views.
{% endhint %}

{% hint style="success" %}
**Config duplication how-to**

1. Choose the configuration you want (wallets, Custom event schemas, etc)

![](/files/INaGuzGs3sWAoSJri3vR)

2. Select the tenant you'd like to duplicate the configuration from

![](/files/qzg3EkMHspSiQ1S1YwnE)

3. Select checkboxes next to the Name you'd like to migrate to a different tenant.

![](/files/d3DFTQsJ3flFV9E3kghf)

4. Click **Duplicate selected records** in the upper-right corner.

![](/files/W4X0uNIMBfZzPWNrDhHG)

5. The pop-up window will appear so you can choose **Target tenant -> Duplicate and view the target tenant.**

![](/files/y7HUyKNa7Kr9FNSiaIKh)

6. Once you duplicate, you may get a successful message that the record was duplicated or an **Action required**, so you will need to update information (Achievements, Campaigns)—more in the [Error handling](#error-handling-in-confit-duplication) section.

Example of a successful message:

![](/files/uS5DZwAtr2qfCitXISzD)
{% endhint %}

### Error handling in config duplication

Sometimes you may need to take additional action when duplicating config between tenants.&#x20;

* **Action required - We detected unsupported fields** - The message appears when duplication is not allowed due to unsupported fields. In this case, we tried to duplicate a Wallet that had an existing wallet code in the tenant to which we were attempting to migrate. The error occurred because the wallet code is not editable and must be unique. In summary, the wallet with the existing wallet code cannot be migrated.

<figure><img src="/files/RSN1jURM8Y9OE8K0rv6W" alt="" width="563"><figcaption></figcaption></figure>

* **Action required - Edit the records -** This message typically appears when you duplicate Campaigns or Achievements and Rewards that contain elements with generated IDs. To avoid this issue, ensure that these elements are created in the new tenant before duplicating the configurations. Below is a list of the elements that need to be created prior to duplicating specific configurations:

{% tabs %}
{% tab title="Rewards" %}
In the reward configuration the elements that contain IDs are the following:

* Tiers
* Segments
* Reward Collections
  {% endtab %}

{% tab title="Achievements" %}
In the achievement configuration the elements that contain IDs are the following:

* Custom event schemas
* Segments
* Tiers
* Channels
  {% endtab %}

{% tab title="Campaigns" %}
In the campaigns configuration the elements that contain IDs are the following:

* Achievements
* Custom Event schemas
* Segments
* Tiers
* Channels
* Rewards (as effect)
* Channels
* Collections
  {% endtab %}
  {% endtabs %}

<figure><img src="/files/EfGFnjesk31DlZ0t1PX2" alt=""><figcaption></figcaption></figure>


# Usage

## Usage

The chart shows the total number of events created in the system from all tenants within a specified period. For a business overview, see the [Dashboard.](/dashboard)

<figure><img src="/files/Wxhd1OitC006fvUIFaOD" alt=""><figcaption></figcaption></figure>

### Transactions

Total number of purchase and return events generated by the active members and sent to Open Loyalty within a calendar month.

### Billable members

Total number of members who interacted with the loyalty program at least once within a calendar month. These interactions include any of the following: Submitting a purchase, a return transaction, or a custom event; transferring, spending, or earning units; redeeming or using a reward; or referring a member.


# Members

In this section, we will cover everything related to Loyalty Program Members. We will show you all the operations you can do on each Member and what you can achieve with them.

The **Members module** is the central place to manage all program participants. It provides a complete view of each member’s details, activity, and engagement within your loyalty program. From here, you can browse, create, and update member records, segment your audience, configure member identifiers, and track referral relationships.

***

### Key Functionalities

The Members module enables you to:

* 📋 **Browse and manage the member list** — view details such as transactions, points balance, tiers, and personal information.
* ➕ **Create or import members** — add single profiles manually or bulk-import them via CSV.
* 🛠️ **Perform account actions** — transfer or deduct units, edit details, anonymize, or deactivate accounts.
* 🎯 **Segment members** — build dynamic or static groups based on attributes, activity, or custom conditions.
* 👥 **Track referrals** — view relationships between referrers and referees, including multi-level referral chains.
* ⚙️ **Configure identifiers and activity rules** — define how members are uniquely identified and what makes them “active.”
* 🏷️ **Manage custom fields** — extend member profiles with attributes specific to your program needs.

***

## Learn more about

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Member List</strong></td><td>Overview of the member list, creating and managing members, filters, and available actions.</td><td><a href="/pages/Cwdc1KzUzeBqP87pHXR2">/pages/Cwdc1KzUzeBqP87pHXR2</a></td></tr><tr><td><strong>Segments</strong></td><td>Building and managing static or dynamic member groups.</td><td><a href="/pages/-MYHFB9eGVOoFFe5u6Vf">/pages/-MYHFB9eGVOoFFe5u6Vf</a></td></tr><tr><td><strong>Referred Members</strong></td><td>Managing referral relationships and viewing referral chains</td><td><a href="/pages/VB6OPrZdiWJP1G4CNdAX">/pages/VB6OPrZdiWJP1G4CNdAX</a></td></tr><tr><td><strong>Custom Fields</strong></td><td>Adding and managing custom fields for member profiles</td><td></td></tr><tr><td><strong>Configuration</strong></td><td>Setting up member identifiers and rules for defining active members</td><td></td></tr></tbody></table>


# Member List

In this section, we will cover everything related to the list of members. We will show you how to manage, add, remove and anonymize Members' data, and you will understand Members data better.

The **Member List** is the central view for accessing and managing all members in your loyalty program. It provides a quick overview of member data and allows you to create, search, filter, and perform actions on member accounts.

<figure><img src="/files/0DpYwcJFWoEZxcDz9Xu9" alt=""><figcaption></figcaption></figure>

***

## Key Functionalities

* 📊 **Browse member data** — view profile details, transactions, units, spending, and more.
* 🔍 **Search & filter** — find members by identifiers or custom attributes, and save filters for reuse.
* ➕ **Add members** — create profiles individually or import them in bulk.
* ⚙️ **Manage accounts** — transfer units, assign tiers, edit details, deactivate or anonymize members.
* 📂 **Export results** — download member data to CSV for further analysis.

***

## Learn more about

For detailed instructions, see the following subarticles:

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Creating Members</strong></td><td>Add single members or import via XML.</td><td><a href="/pages/Cwdc1KzUzeBqP87pHXR2">/pages/Cwdc1KzUzeBqP87pHXR2</a></td></tr><tr><td><strong>Managing Members</strong></td><td>Perform quick account actions directly from the list.</td><td><a href="/pages/-MYHFB9eGVOoFFe5u6Vf">/pages/-MYHFB9eGVOoFFe5u6Vf</a></td></tr><tr><td><strong>Single Member View</strong></td><td>Explore the profile page and available member-level options.</td><td><a href="/pages/VB6OPrZdiWJP1G4CNdAX">/pages/VB6OPrZdiWJP1G4CNdAX</a></td></tr><tr><td><strong>Filtering &#x26; Searching Members</strong></td><td>Apply filters, search options, and save configurations for quick access.</td><td></td></tr><tr><td><strong>Removing Members</strong></td><td>Permanently delete member accounts or anonymize data.</td><td></td></tr></tbody></table>


# Creating Members

In this section, you will discover how to add individual members as well as multiple members.

The **Members** module allows you to add new participants to your loyalty program either manually or in bulk. This flexibility helps you onboard both individual customers and large sets of member data quickly and efficiently.

***

## Ways to Add Members

There are two ways to create members in the system:

### **Add a Single Member**

{% stepper %}
{% step %}
Navigate to **Members → List of Members**.

<figure><img src="/files/ghlfu3B5qc9RW80XunNU" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Click **Add member** and select **Add single member**.

<figure><img src="/files/PwLu3YEsOEv9YWy2V455" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Fill in the **Basic Information**

<figure><img src="/files/CAhUlrmEKhpqw0Pg8Dq7" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
You decide how much information you want to share with Open Loyalty. \
As a minimum, it is required to have **one** member identifier.&#x20;

If you decide not to share PII data with Open Loyalty, you might e.g. use **loyalty card number** to store your external UUID in this field; later on, all the members' activity can be matched using this identifier.

For more information on members' identifiers, please refer to this section of the User Guide:

[Configuration](/members-and-activity/members/configuration)
{% endhint %}
{% endstep %}

{% step %}
(Optional) Add **custom attributes** to store flexible, tenant-specific data.

<figure><img src="/files/YqTGAMjeRWvnvESPudQi" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Complete **custom fields** if they are defined and required for your tenant.

If **custom fields** have been marked as required in your tenant configuration, they must be completed to successfully create a member.

<figure><img src="/files/AMkfx1suBAD9Zg050DBT" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
(Optional) Enter **address** and **company details**, if enabled.

<figure><img src="/files/aCFr3h1W7bQpZJQQriKO" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
(Optional) Capture necessary **agreements**, such as legal, marketing, or data processing consent.

<figure><img src="/files/hsr3qSq2VFHzHK3kyjKZ" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Once all required fields are filled, click **Add member**.

{% endstep %}
{% endstepper %}

***

### **Import Members in Bulk**

{% stepper %}
{% step %}
Click **Add member → Import members**.

<figure><img src="/files/7V4lTuBXSW6vu1QWp3MH" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Upload a file in **XML format** (maximum file size: 100 MB).

<figure><img src="/files/xhdfrXhnMQco4vOQj0NL" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
For more information on import files, please refer to this section of the User Guide: \
[Imports](/integrations-and-data-exchange/imports-exports/imports)\
[Broken mention](broken://pages/-MZBtStiJdMqbAd-5BMa)
{% endhint %}
{% endstep %}

{% step %}
After uploading, confirm with **Import**.

<figure><img src="/files/rs4MiLHt00qYcZPHRuYK" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Imports are **asynchronous**.&#x20;

You can check the progress and final status under **Imports/Exports → Imports**.

<figure><img src="/files/2lByuYqkg49GDcAOyc0M" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
If the number of members exceeds the file size limit, split the data into multiple batches and upload them separately.
{% endhint %}

***

### Tracking Imports

* Go to **Imports/Exports → Imports** to review the status of uploaded files.
* Each import record displays the **file name, import type, start date, number of records**, and **current status**.
* Click into an import to see **individual records** and verify whether they were successfully processed.

***

## Key Points to Remember

* **One of the identifiers** (email, phone, or loyalty card number) must be set as unique identifiers to avoid duplicate members.
* Only **XML** imports are supported at the moment.
* Member activity (e.g., transactions or custom events) will be matched according to configured identifiers.
* Required **custom fields** must always be completed during member creation.


# Managing Members

Edit member profiles, manage custom attributes, assign tiers, and adjust balances or achievements.

## Overview

Use the member profile to maintain member data and loyalty status.\
You can edit profile details, manage custom attributes, assign a tier, and add unit transfers.

### Edit a member profile

Open a member from **Members → List of Members**.\
You can also open a profile directly from a member record.

{% stepper %}
{% step %}

### Open the profile editor

1. Select the member.
2. Open the context menu.
3. Click **Edit profile**.
   {% endstep %}

{% step %}

### Update member details

Edit the required fields, such as name, email, phone number, gender, or birth date.
{% endstep %}

{% step %}

### Save changes

Click **Save**.
{% endstep %}
{% endstepper %}

### Manage custom attributes

Custom attributes store additional member data as key-value pairs.\
Use them for preferences, external identifiers, or other program-specific details.

{% stepper %}
{% step %}

### Add an attribute

Click **New custom attribute** in the profile editor.

<figure><img src="/files/3N3orVkhRchvpmjPjlWe" alt="New custom attribute button"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Enter the key and value

Provide the attribute **Key** and **Value**, then save the profile.

<figure><img src="/files/nxSxgBIdGt8aXmR0ABcX" alt="Custom attribute key and value fields"><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

### Assign a tier manually

Set a member's tier during account creation or profile editing.

1. Select the member and click **Edit profile**.
2. Select the required **Tier**.
3. Click **Save**.

{% hint style="info" %}
Manual assignment prevents tier downgrades.\
Campaigns and other configured rules can still upgrade the member.

When manual assignment ends, normal upgrade and downgrade rules apply.
{% endhint %}

<figure><img src="/files/Ox2onfBN7uYzC2qqRPR2" alt="Manually assigned tier indicator"><figcaption></figcaption></figure>

### Add a unit transfer

Use unit transfers for one-off adjustments.\
For example, compensate a delivery delay or correct a member balance.

Start from the member profile or **Members → List of Members**.

{% stepper %}
{% step %}

### Start a transfer

From a member profile, click **Actions → Add units transfer**.

<figure><img src="/files/P6I6At9r06SMoAYtxAnA" alt="Add units transfer from member profile"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Set the transfer type

Select **Add** or **Deduct**.\
Complete the transfer fields, then click **Save**.
{% endstep %}
{% endstepper %}

From the members list, open the member context menu.\
Then select **Actions → Add units transfer**.

<figure><img src="/files/wAERxkU4oQfefj6gCK7g" alt="Add units transfer from members list"><figcaption></figcaption></figure>

For more transfer options, see [Units transfers](/members-and-activity/wallets#units-transfers-module-overview).

## Change achievement progress manually

Change a member's current achievement progress or completion status.

{% stepper %}
{% step %}

### Open the achievement

1. Go to **Members → List of Members**.
2. Select the member.
3. Open the **Achievement status** tab.
   {% endstep %}

{% step %}

### Manage progress

Open the achievement row context menu and click **Manage progress**.

<figure><img src="/files/QaiM9AfxbZA1PjSgNeTa" alt="Manage achievement progress action"><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Save the change

Update the progress or completion status, then click **Save**.

<figure><img src="/files/eSx9Uyx2r5eyaqcok0q8" alt="Save achievement progress"><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
Manual progress changes trigger associated campaigns.

You cannot set progress above the achievement **Goal**.

Completion status changes must respect **X in total** limits.\
See [achievement limits](/campaigns/achievements/creating-achievement#limits) for details.
{% endhint %}

<figure><img src="/files/hP7fLQ7wLned4qWKdqD2" alt="Achievement completion limit error"><figcaption></figcaption></figure>

<figure><img src="/files/q4CutnlWHGQr2A4MfgiI" alt="Achievement completion limit configuration"><figcaption></figcaption></figure>

<figure><img src="/files/xBtUphKqhA0MwbT7Ocvt" alt="Achievement progress goal limit"><figcaption></figcaption></figure>


# Single Member View

The **Single Member View** provides a complete profile of each member in your loyalty program. From here, you can access all the details, activities, and interactions related to an individual member. It serves as a central hub where you can review member data, manage accounts, and monitor participation in the program.

***

### Key Functionalities

In the Single Member View, you can:

* See **basic information** (email, phone number, registration date, referral token, loyalty card number).
* Monitor **business performance** (transactions, spending, returns, average values).
* Review **wallets, transactions, custom events, campaigns, achievements, referrals, badges, and custom fields**.
* Follow the **timeline** of a member’s activity (such as tier changes or points expirations).
* Manage **tiers** and progress toward promotions or downgrades.
* Perform **member actions**, including editing a profile, transferring units, changing passwords, anonymizing, or deactivating an account.

***

### Navigation

The Single Member View is divided into tabs with the same layout as the main menu, each focusing on a specific aspect of the member’s activity or data:

* [**General Info**](/members-and-activity/members/member-list/single-member-view/general-info)\
  Basic details and business performance.
* [**Wallets**](/members-and-activity/members/member-list/single-member-view/wallets)\
  Current balance, transfers, and wallets history.
* [**Timeline**](/members-and-activity/members/member-list/single-member-view/timeline)\
  Chronological view of member’s loyalty activity.
* [**Tiers**](/members-and-activity/members/member-list/single-member-view/tiers)\
  Member’s tier history and progress toward promotions or downgrades.
* [**Transactions**](/members-and-activity/members/member-list/single-member-view/transactions)\
  Purchase and return history.
* [**Custom Events**](/members-and-activity/members/member-list/single-member-view/custom-events)\
  Events triggered by the member.
* [**Campaigns**](/members-and-activity/members/member-list/single-member-view/campaigns)\
  Campaigns linked to the member and their limits.
* [**Achievements**](/members-and-activity/members/member-list/single-member-view/achievements)\
  Progress and completion of available achievements.
* [**Rewards**](/members-and-activity/members/member-list/single-member-view/rewards)\
  Rewards redeemed and available for the member.
* [**Referrals**](/members-and-activity/members/member-list/single-member-view/referrals)\
  Referrals linked to the member.
* [**Badges**](/members-and-activity/members/member-list/single-member-view/badges)\
  Badges earned within the loyalty program.
* [**Leaderboards**](/members-and-activity/members/member-list/single-member-view/leaderboards)\
  Current ranking and performance across leaderboards.
* [**Custom Fields**](/members-and-activity/members/member-list/single-member-view/custom-fields)\
  Additional fields defined in your tenant.

{% hint style="success" %}
This article acts as the **entry point**. Each tab has its **own dedicated sub-article**, so admins can dive deeper into specific functionalities when needed.
{% endhint %}


# General Info

The **General Info** tab provides an overview of the member’s profile, including their basic details, registration data, and program participation highlights. It is the starting point for understanding who the member is and how they engage with the loyalty program.

<figure><img src="/files/kMq41JzSFA6G9eqjtkot" alt=""><figcaption></figcaption></figure>

***

### Key Elements

* **Basic details**\
  Displays the member’s name, email, phone number, date of birth, gender, referral token, and loyalty card number.
* **Registration data**\
  Shows the date when the member joined the program.
* **Segments**\
  Lists the segments this member belongs to (e.g. *High Spenders*, *Inactive 90 days*, *Birthday in 2 days*).
* **Custom attributes**\
  Displays any attributes specifically assigned to the member.
* **Business performance**\
  Provides insight into the member’s economic activity:
  * Total spending
  * Number of purchase and return transactions
  * Average transaction and return values
  * Days since last transaction
* **Wallets overview**\
  A snapshot of balances in different wallets, including active, pending, expired, spent, and total earned units.


# Wallets

The **Wallets** tab shows a detailed overview of all units (points, cashback, etc.) that a member has earned, spent, or lost. Each wallet is displayed separately and allows you to review balances, limits, and transfers.

<figure><img src="/files/1cDShlEv8Dnbtg84e01o" alt=""><figcaption></figcaption></figure>

***

### Key Elements

* **Wallet summary**\
  For each wallet, you can see:
  * Active points
  * Pending points
  * Spent points
  * Expired points
  * Total earned points
  * Current earnings
  * Any global or member-specific limitations
* **Transfers list**\
  A detailed record of all unit transfers connected to this member. Each transfer shows:
  * Transfer ID
  * Type (*adding*, *deduction*, *expired*)
  * Status (Cancelled, Pending)
  * Value and comments
  * Dates (Created on, Registered on, Performed on, Expires on, Unlocked on, Locked until)
* **Managing transfers**\
  Individual transfers can be managed directly from this view. From the actions menu, you can:
  * **Cancel** a transfer
  * **Expire** a transfer

This allows precise control of a member’s balance in cases of errors, fraud, or program rules.

***

To find out more about the wallet module, please refer to this section of the User Guide:

{% content-ref url="/pages/-MZBsg7doWQHfFWAyYNz" %}
[Wallets](/members-and-activity/wallets)
{% endcontent-ref %}


# Timeline

The **Timeline** tab gives you a full picture of everything that has happened to a member since they joined your loyalty program — points earned and spent, tier changes, rewards redeemed, badges granted, and more. It's the first place to check when investigating a member's activity or answering a support question.

You'll find it inside any member's profile: **Members → select a member → Timeline**.

<figure><img src="/files/olU6fNkYIB1c6TAiFPLJ" alt=""><figcaption></figcaption></figure>

### What you'll see

Each entry in the feed tells you:

* **What happened** — a short description like *Earned 374 Points in Default Wallet* or *Changed tier from Silver to Gold*
* **When it happened** — the date and exact time
* **The event category** — a label such as *Units transfer*, *Tier*, or *Reward* so you can scan quickly
* **Points involved** — how many points were added, spent, or moved
* **Active balance** — the member's spendable points right after that event

Events are listed newest first. The total count (e.g. *191 Results*) is shown above the feed.

***

### Narrowing down the list

When a member has a long history, use **+ Add filter** to focus on what you need. You can combine multiple filters — just hit **Apply** to refresh the results.

<div align="left"><figure><img src="/files/vR6fe2HeY8BPewm8ULZ4" alt=""><figcaption></figcaption></figure></div>

There are three ways to filter:

#### By date

Use the **Created on** filter to look at a specific time window.

<figure><img src="/files/rUphBeY3z5ol4N1gsud7" alt=""><figcaption></figcaption></figure>

Pick a condition and a date/time:

| Condition       | Shows events…                       |
| --------------- | ----------------------------------- |
| Before          | …strictly before the date you enter |
| Before or equal | …up to and including that date      |
| After           | …strictly after that date           |
| After or equal  | …from that date onward              |

#### By event type

Use the **Type** filter to show (or hide) specific kinds of events.

Set the condition to **In** to show only the types you pick, or **Not in** to exclude them.

<figure><img src="/files/3G8hWShUOjpzQDX5s8jF" alt=""><figcaption></figcaption></figure>

Then open the **Value** dropdown and choose from the event categories:

<figure><img src="/files/lckvrpziQzBUSMs268XX" alt=""><figcaption></figcaption></figure>

Each category expands into individual event types you can select:

**Challenges (previously Achievements)**

* Challenge (Achievement) completed
* Challenge (Achievement) completion count was decreased
* Challenge (Achievement) progress was changed

**Assignment**&#x20;

* Assigned custom event to customer
* Assigned transaction to customer

**Custom attributes**&#x20;

* Custom attribute was added
* Custom attributes were updated
* Custom attributes were deleted

**Member**&#x20;

* Member was registered
* Member was activated
* Member was deactivated
* Member was anonymized
* Member was moved to tier

**Units**&#x20;

* Units were added
* Pending units were added
* Units were unlocked
* Units were spent
* Units were blocked
* Units were unblocked
* Units were canceled
* Pending units were canceled
* Units were expired
* Units were transferred

**Reward**&#x20;

* Reward was bought

#### By wallet

Use the **Wallet** filter to see activity for a specific point currency only — handy if your program runs multiple wallets.

***

### Event type reference

Here's a complete breakdown of every event you might see on the Timeline, what it means, and what causes it.

***

#### Points & account

All points events appear under the **Units transfer** label in the feed.

| What you'll see                           | What it means                                                                  | API event                   |
| ----------------------------------------- | ------------------------------------------------------------------------------ | --------------------------- |
| Earned {X} points in {Wallet}             | Points were added to the member's account and are immediately spendable        | `PointsWereAdded`           |
| Earned {X} points in {Wallet} *(pending)* | Points were added but are locked until a future date                           | `PendingPointsWereAdded`    |
| Unlocked {X} points in {Wallet}           | Pending points have passed their lock date and are now active                  | `PointsWereUnlocked`        |
| Spent {X} points from {Wallet}            | Points were used — either manually or automatically when a reward was redeemed | `PointsWereSpent`           |
| Blocked {X} points in {Wallet}            | Points were put on hold and temporarily removed from the spendable balance     | `PointsWereBlocked`         |
| Unblocked {X} points in {Wallet}          | Held points were released back to active                                       | `PointsWereUnblocked`       |
| Cancelled {X} points in {Wallet}          | Active earned points were reversed                                             | `PointsWereCanceled`        |
| Cancelled pending {X} points in {Wallet}  | Locked points were cancelled before they ever became active                    | `PendingPointsWereCanceled` |
| Expired {X} points in {Wallet}            | Points reached the end of their validity period                                | `PointsWereExpired`         |
| Transferred {X} points from {Wallet}      | Points were sent to another member                                             | `PointsWereTransferred`     |

{% hint style="info" %}
**Good to know:** Cancelling a points transfer creates different timeline entries depending on the transfer's state — *cancelled* for active points, *cancelled pending* for locked points, and *unblocked* for held points.
{% endhint %}

***

#### Member lifecycle

These events appear under the **Member operation** label.

| What you'll see        | What it means                                 | API event                |
| ---------------------- | --------------------------------------------- | ------------------------ |
| Member was registered  | The member's account was created              | `CustomerWasRegistered`  |
| Member was activated   | The account was activated                     | `CustomerWasActivated`   |
| Member was deactivated | The account was deactivated                   | `CustomerWasDeactivated` |
| Member was anonymized  | The member's personal data was removed (GDPR) | `CustomerWasAnonymized`  |

***

#### Tier changes

Tier events appear under the **Tier** label.

| What you'll see                                | What it means                                                                                                | API event                 |
| ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | ------------------------- |
| Reached first tier "{Tier name}"               | The member was assigned to a tier for the first time                                                         | `CustomerWasMovedToLevel` |
| Changed tier from "{Old tier}" to "{New tier}" | The member moved up or down a tier — either automatically when their points changed, or manually by an admin | `CustomerWasMovedToLevel` |

***

#### Transactions & custom events

| Label        | What you'll see                      | What it means                                      | API event                       |
| ------------ | ------------------------------------ | -------------------------------------------------- | ------------------------------- |
| Transaction  | Made transaction "{Document number}" | A purchase was recorded and matched to this member | `AssignedTransactionToCustomer` |
| Custom event | Custom event "{Type}" added          | A custom event was logged against the member       | `AssignedCustomEventToCustomer` |
| Reward       | Redeemed reward "{Name}"             | The member used points to claim a reward           | `RewardWasBought`               |

***

#### Custom attributes

| What you'll see                     | What it means                                            | API event                     |
| ----------------------------------- | -------------------------------------------------------- | ----------------------------- |
| Member custom attribute was set     | A new custom attribute was added to the member's profile | `CustomAttributeWasAdded`     |
| Member custom attribute was updated | An existing custom attribute was changed                 | `CustomAttributesWereUpdated` |
| Member custom attribute was removed | A custom attribute was deleted from the member's profile | `CustomAttributesWereDeleted` |

***

#### Rewards

| What you'll see                     | What it means                          | API event                  |
| ----------------------------------- | -------------------------------------- | -------------------------- |
| Redeemed reward "{Name}"            | The member claimed a reward            | `RewardWasBought`          |
| Canceled reward redemption "{Name}" | A previously issued reward was revoked | `IssuedRewardWasCancelled` |

***

#### Badges

| What you'll see          | What it means                                         | API event                             |
| ------------------------ | ----------------------------------------------------- | ------------------------------------- |
| Badge • Granted          | The member earned a badge                             | `MemberCompletedBadge`                |
| Badge • Manually changed | An admin adjusted the member's badge completion count | `MemberBadgeCompletedCountWasChanged` |

***

#### Achievements & challenges

| What you'll see                               | What it means                                                              | API event                                                                              |
| --------------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- |
| Achievement / Challenge                       | The member reached 100% progress and completed an achievement or challenge | `MemberCompletedAchievement`                                                           |
| Achievement adjustment / Challenge adjustment | Progress or milestones were updated, or a completion count was rolled back | `MemberAchievementProgressWasChanged` · `MemberAchievementCompletionCountWasDecreased` |

***

#### Fortune wheel

| What you'll see                                        | What it means                                         | API event                    |
| ------------------------------------------------------ | ----------------------------------------------------- | ---------------------------- |
| Fortune wheel "{Reward}" performed: {Rule} ({Chance}%) | The member spun a fortune wheel and received a reward | `RewardFortuneWheelWasDrawn` |


# Tiers

The **Tiers** tab in the single member profile provides detailed insight into a member’s current position in the loyalty program’s tier structure, their historical movements between tiers, and their progress toward the next recalculation.

<figure><img src="/files/ydQBG32iqua5oi2jPGtk" alt=""><figcaption></figcaption></figure>

***

### Key elements

* **Tier sets** – All available tier sets are displayed (e.g., Engagement Tier Set, Expiration Tier, Shopping Tier Set).
* **Current tier** – Shows the tier the member currently belongs to within a given tier set.
* **Last promotion / downgrade** – Indicates when the member was last promoted or downgraded.
* **Next recalculation** – Date of the next scheduled tier recalculation.

***

### Progress tracking

* **Cumulative earned units** – shows how many units the member has accumulated towards tier calculation.

{% hint style="info" %}
Depending on how the tier set is configured, this metric can display:

* **Active points**

* **Total earned points**

* **Total transactions**

* **Months since joining the program**

* or another metric defined in the tier configuration.
  {% endhint %}

* **Progress bar** – visual representation of progress toward the next recalculation.

* **Current progress %** – percentage completed for the ongoing cycle.

***

To find out more about the tiers module, please refer to this section of the User Guide:

{% content-ref url="/pages/-MZBspk\_YeJoAJMpx6a5" %}
[Tiers](/gamification/tiers)
{% endcontent-ref %}


# Transactions

The **Transactions** tab provides a detailed record of all purchase and return transactions made by the member. This view helps you track the member’s economic activity, verify values used in campaigns or achievements, and resolve potential discrepancies.

<figure><img src="/files/GwbEgDWPhX0LdCzHtfTW" alt=""><figcaption></figcaption></figure>

***

### Key elements

* **Transaction list**\
  Each record includes:
  * **Document number**
  * **Document type** (**Purchase** or **Return**)
  * **Document date**
  * **Transaction gross value** and
  * **Channel** (if provided)
  * **Points earned**

***

From the actions menu, you can **view details** of each transaction.

* **Linked data**\
  Transactions may also display:
  * **Assigned units** – loyalty points or cashback added as part of the transaction.
  * **Campaign triggers** – campaigns initiated by the transaction.
* **Returns**\
  Returned transactions are displayed separately and treated as independent records.
  * Campaign rewards earned from purchases are **not linked** to returns.
  * Units can be deducted when conditions are met, but technically, each return acts as a separate campaign trigger.

***

To find out more about the transactions module, please refer to this section of the User Guide:

{% content-ref url="/pages/-MYHFAw70zZruMhxcxC7" %}
[Transactions](/members-and-activity/transactions)
{% endcontent-ref %}


# Custom events

The **Custom Events** tab shows all events triggered by or associated with a member that are not standard transactions. Custom events provide flexibility to record and act on unique activities, such as registrations, reviews, referrals, or in-app actions.

<figure><img src="/files/swpGZOgtaMD9AjCRCq5u" alt=""><figcaption></figcaption></figure>

***

### Key elements

* **Event list**\
  Each record includes:
  * **Event date** – business date provided in the custom event.
  * **Event name** – as defined in your schema.
  * **Event attributes** – key-value pairs with details (e.g., `device=mobile`, `location=store-12`).
  * **Created on** – date when the event was registered in the system.

***

From the actions menu, you can **view details** of each custom event.

* **Linked data**\
  Custom events may also display:
  * **Assigned units** – loyalty points or cashback added as part of the custom event.
  * **Campaign triggers** – campaigns initiated by the custom event.
  * **Custom event body** - event attributes of the custom event.

***

To find out more about the custom events module, please refer to this section of the User Guide:

{% content-ref url="/pages/-MhwU9vuj9jlFAx19huA" %}
[Custom Events](/members-and-activity/custom-events)
{% endcontent-ref %}


# Campaigns

The Campaigns section in a member profile shows how active and visible campaigns relate to this specific member. It’s split into two tabs: Campaigns status and Visible campaigns.

***

### Key elements

#### **Campaigns status**

<figure><img src="/files/gXpxlGAqamTkkPqlHHBu" alt=""><figcaption></figcaption></figure>

What you see per campaign:

* **Campaign Name**
* **Status** – the campaign’s current state (e.g., Active, Inactive).
* **Member units limitation** – the maximum units this member can receive from the campaign (e.g., “Unlimited” or a capped value).
* **Member campaign completion** – how many times this member has completed the campaign vs. the allowed total (e.g., “0/1 in total” with a progress bar).
* **Campaign units limitation** – campaign-level issuance progress shown against the total (e.g., “400/10,000 in total”).

***

#### Visible Campaigns

<figure><img src="/files/nODjmOiDdxwJFgjwTUTY" alt=""><figcaption></figcaption></figure>

What you see per campaign:

* **Campaign Name**
* **Status** – the campaign’s current state (e.g., Active, Inactive).
* **Campaign type** – e.g., Direct.
* **Campaign trigger** – e.g., Purchase, Achievement, Time.
* **Active from / Active to** – the campaign’s runtime for this member (Active to is blank for open-ended campaigns).
* **Created on** – when the campaign was created.

***

### Notes and tips

* The progress bars and counts are calculated for this specific member.
* Inactive campaigns can appear in both views; they simply won’t issue benefits while inactive.
* Use “Manage columns” to tailor which columns you see in either tab.
* To change a campaign (rules, limits, dates), go to the **Campaigns** area of the app (you can do it with the context menu of each campaign); the Single Member View is informational only.

***

To find out more about the campaigns module, please refer to this section of the User Guide:

{% content-ref url="/pages/OKA9KdVo3MRNVC87yfdQ" %}
[Campaigns](/campaigns/campaigns)
{% endcontent-ref %}


# Challenges

The **Challenges** section in the member profile shows all challenges assigned to a member, together with their current progress, completion status, and related trigger history.

**Legacy achievements** are still available in a separate tab for customers who used the previous achievements configuration. New challenge-based flows should be managed from the Challenges tab.

<figure><img src="/files/972qcXFbhF4Tf1w2UCx6" alt=""><figcaption></figcaption></figure>

***

### Overview

In the member profile, the Challenges section includes two tabs:

* **Challenges** — shows challenge-based progress configured in the new Challenges module.
* **Legacy achievements** — shows achievements created with the previous achievements configuration.

In the Challenges tab, you can see:

* **Challenge name** — the name of the challenge assigned to the member.
* **Original achievement** — the related legacy achievement, if applicable.
* **Current progress** — the member’s current progress toward the challenge goal.
* **Times completed** — how many times the member has completed the challenge.
* **Limits** — member-specific limits, such as unit limit, completion limit, and effect application limit.
* **Additional details** — available from the challenge details drawer.

***

### Challenge details drawer

Opening the challenge details drawer shows detailed information about the selected challenge for that member.

The drawer includes:

* **Completion status** — the number of times the member has completed the challenge.
* **Rule name** — the rule connected with the challenge or milestone.
* **Rule description** — additional rule details, if configured.
* **Timeframe** — the period in which the rule applies.
* **Achievement type** — for example, Direct.
* **Achievement trigger** — the event that affects progress, such as a transaction or custom event.
* **Event frequency limit** — how often the event can count toward progress.
* **Goal** — the condition the member must meet, for example placing a specific number of transactions.
* **Current progress** — the member’s current progress toward the goal.
* **Triggers history** — transactions or custom events that affected the progress or completion of the challenge.

<figure><img src="/files/w2ENbzi0Gv2x4QxoZvi5" alt=""><figcaption></figcaption></figure>

***

### Manual progress updates

Admins can manually update challenge progress directly from the challenge details drawer.

The following values can be edited:

* **Completion status** — allows admins to manually adjust how many times the member has completed the challenge.
* **Current progress** — allows admins to manually adjust the numeric progress toward the challenge goal.

This can be used for support corrections, migration cases, testing, or situations where progress needs to be adjusted manually.

{% hint style="info" %}
Increasing the completion value may trigger effects connected with the challenge, depending on the challenge configuration and effect application limits.
{% endhint %}

***

{% hint style="info" %}
Since March 2026, challenge configuration has been simplified. Effects are now configured together with milestone rules, and admins can manually update member progress from the member profile.
{% endhint %}


# Achievements

{% hint style="warning" %}
**Legacy feature.** This feature will soon be fully replaced by [Challenges](/members-and-activity/members/member-list/single-member-view/challenges).
{% endhint %}

The **Achievements tab** shows all achievements assigned to a member and their current progress. This section is designed to track member engagement and performance in gamification-based goals, such as spending targets, login streaks, or custom event completions.

<figure><img src="/files/wTo4XnfAZ3bCMOaehy4T" alt=""><figcaption></figcaption></figure>

***

### Overview

In the Achievements tab, you can see:

* **Achievement name** – the title of the goal (e.g., *Walk 10,000 steps a day*).
* **Current progress** – a visual progress bar and the actual metric (e.g., 0/10,000 steps).
* **Completion status** – how many times the achievement has been completed.
* **Additional details** – such as rules, timeframe, and conditions (available in the details drawer).

Admins can also **filter achievements** to quickly locate specific ones.

***

### Achievement Details Drawer

Clicking **See details** from the context menu opens a **drawer** with comprehensive information about the achievement:

* **General info**
  * Achievement name and description.
  * Type and trigger (e.g., *Direct*, *Custom event*).
  * Event frequency limits, timeframe, and rules.
* **Goal configuration**
  * Exact condition for progress (e.g., “Member must log custom event *trip* with attribute `event.body.pickup_distance_meters` summing up to 10,000”).
  * Advanced settings (e.g., time-based restrictions).
* **Progress tracking**
  * **Current progress** bar shows how close the member is to completing the goal.
  * **Completion status** counter shows the number of completions.
* **Triggers history**
  * Displays the underlying transactions or custom events that contributed to progress.
  * If no actions have been recorded, it shows *No activity yet*.

***

### Manual Adjustments

Both **progress** and **completion status** can be manually updated by administrators directly in the drawer.

* **Completion status** – editable field to mark achievement completions.
* **Current progress** – editable field to adjust numeric progress toward a goal.

{% hint style="warning" %}
**Increasing** the completion value will also trigger any **associated campaigns** linked to that achievement.

However, each of the campaigns will be triggered only **once**, regardless of how much the completion has increased.
{% endhint %}

***

👉 This expanded view helps admins not only track member performance but also **diagnose issues** (e.g., why progress isn’t updating) and **validate rules** directly from the member profile.

To find out more about the achievements module, please refer to this section of the User Guide:

{% content-ref url="/pages/TIzTLmZBUDTHCduzAl3x" %}
[Achievements](/campaigns/achievements)
{% endcontent-ref %}


# Rewards

The **Rewards** tab provides a full overview of rewards available to and redeemed by a specific member. This allows administrators to monitor member entitlements, track reward usage, and adjust reward statuses when necessary.

***

### Available Rewards

<figure><img src="/files/cxK6zH2W96NbXqvWTgR9" alt=""><figcaption></figcaption></figure>

The **Available rewards** view lists all rewards that are currently active and available for redemption by the member.

For each reward, you can see:

* **Name** – the reward name.
* **Status** – indicates if the reward is active.
* **Active from / Active to** – defines the reward’s availability period.
* **Availability** – shows how many redemptions are still possible (e.g., `19,975/20,000`).

This view helps to quickly verify what rewards a member can currently access.

***

### Redeemed Rewards

The **Redeemed rewards** view shows rewards that the member has already redeemed.

<figure><img src="/files/fv2vPNUE5rZo30Rf016X" alt=""><figcaption></figcaption></figure>

For each redeemed reward, you can see:

* **Reward name** – the name of the redeemed item.
* **Active to** – expiration date of the reward.
* **Reward type** – such as coupon or material reward.
* **Redemption date** – when the reward was redeemed.
* **Redeemed reward ID** – unique system identifier for tracking.
* **Reward status** – current state (e.g., *Issued*).
* **Coupon status** – whether the coupon is *Used* or *Unused*.
* **Cancellation date** – cancellation date of the reward (if it has been cancelled).

***

### Context Menu Options

Each redeemed reward entry has a context menu (`⋮`) with the following actions:

* **Cancel redemption** – revoke the redemption.
* **Change status** – manually update the reward’s status.
* **Mark as used/unused** – flag the coupon as redeemed, or reverse the action.
* **See details** – open detailed information about the reward instance.
* **See reward** – navigate to the reward configuration.
* **Show coupon** – display coupon code.

***

To find out more about the rewards module, please refer to this section of the User Guide:

{% content-ref url="/pages/-MZBsgxfYxB177ii8Wzr" %}
[Rewards](/rewards-redemption/rewards)
{% endcontent-ref %}


# Referrals

The **Referrals** tab allows you to view and manage referral relationships associated with a specific member. This section displays details of referees (people invited by the member into the program) and provides tools for adding, viewing, or removing referees.

<figure><img src="/files/A96GN6HuVE059hmP34o3" alt=""><figcaption></figcaption></figure>

***

### Referrals list

The main table displays all referees linked to the member. For each entry, you can see:

* **Referee name** – the name of the invited person.
* **Created on** – the date and time when the referral was recorded.

***

### Adding a referee

<figure><img src="/files/s1XdX9iK9wlo1UEGQ0Xz" alt=""><figcaption></figcaption></figure>

You can manually add a referee to the member’s account:

* Click **Add referee**.
* In the popup, select a referee from the dropdown list of existing members.

{% hint style="warning" %}
A referee cannot be linked if they are already assigned to another referrer.
{% endhint %}

* Click **Save** to confirm.

This action creates a referral relationship between the member (as referrer) and the selected referee.

***

### Managing referees

Each referee entry has a context menu with available actions:

* **Remove referee** – deletes the referral link between the member and the selected referee.
* **See full profile** – opens the full profile of the referee in a new view.

***

### Key notes

* Referrals are permanent unless manually removed.
* Referral rewards or campaign triggers tied to referrals are handled automatically by the system once the relationship is created.
* Manual management (adding or removing referees) should be used carefully to avoid inconsistencies in reporting or campaign logic.

***

To find out more about the referrals, please refer to these sections of the User Guide:

{% content-ref url="/pages/Lywj6gE33DaBkknwW3HW" %}
[Referral Programs](/faq/referral-programs)
{% endcontent-ref %}

{% content-ref url="/pages/cZWRhDrCnzhts1bUxARY" %}
[Referred Members](/members-and-activity/members/referred-members)
{% endcontent-ref %}

{% content-ref url="/pages/2TMM68lFVeTp1OgMW7Gf" %}
[Referral Campaign](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/referral-campaign)
{% endcontent-ref %}


# Badges

The **Badges** tab displays all the badges that a member has earned within the loyalty program. Badges are often tied to achievements and are automatically granted when the related achievement is completed.

<figure><img src="/files/xJRaBAIQliylFWVGExfw" alt=""><figcaption></figcaption></figure>

***

### Key Elements

* **Badge name** – the name of the badge earned by the member.
* **Badge count** – shows how many times the member has earned the same badge.
* **Badge reached date** – the date and time when the badge was awarded.

### Editing Badge Count

From the context menu, you can select **Edit badge count** to manually adjust the number of times a member has received a badge.

<figure><img src="/files/epLgcBSgbKgAfbsfW8K3" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Adjusting the badge count does not change the completion status of the related achievement.
{% endhint %}

This function is useful if you need to correct inconsistencies or grant badges outside of the automated rules.

***

To find out more about the badges module, please refer to this section of the User Guide:

{% content-ref url="/pages/yBcD53lYm7f4UWFdejlD" %}
[Badges](/gamification/badges)
{% endcontent-ref %}


# Leaderboards

The **Leaderboards** tab shows how a member is performing within ranking lists defined in the system. It provides transparency into the member’s current standing, score, and tracked metrics compared to other participants.

<figure><img src="/files/3V5WUmkwouyz9kYibpYj" alt=""><figcaption></figcaption></figure>

***

### Viewing Member Leaderboards

Each leaderboard entry includes:

* **Leaderboard name** – the specific ranking the member participates in (e.g., *Ranking Top Earners*).
* **Tracked metric** – the metric used to calculate the ranking (e.g., *cumulative earned units in a wallet*).
* **Member position** – the member’s current place in the leaderboard.
* **Promotion date** – when the leaderboard ranking was last recalculated or updated.
* **Current score** – the score the member has accumulated according to the tracked metric.

***

### Leaderboard Table

The leaderboard table displays the ranking context:

* **Position** – order in the leaderboard.
* **Full name** and **Email** – participant’s details.
* **Loyalty card number** and **Phone number** – identifiers if applicable.
* **Score** – points or other values contributing to the leaderboard ranking.

This lets you see both the member’s current position and how they compare to others.

{% hint style="warning" %}
If a leaderboard has been completed, it disappears from this view.
{% endhint %}

***

To find out more about the leaderboards module, please refer to this section of the User Guide:

{% content-ref url="/pages/wHVTSZMkf9uLN1xBLObm" %}
[Leaderboards](/gamification/leaderboards)
{% endcontent-ref %}


# Custom Fields

The **Custom fields** tab allows you to view and manage additional information collected about a member. These fields extend the standard profile data (such as email, phone number, or date of birth) and let you tailor the program to specific business needs.

<figure><img src="/files/b3k5WtHQgzdOAW1e3aMu" alt=""><figcaption></figcaption></figure>

***

### Viewing Custom Fields

In this tab, you can see all custom fields defined at the tenant level and their current values for the selected member.

Each field includes:

* **Custom field name** – the label given during setup (e.g., *Fav stores*, *Shoe size*).
* **Value** – the member’s saved response (e.g., *California Store*, *39*).

If a field is set as *required*, it must be filled when creating or updating the member profile.

***

### Editing Custom Fields

Administrators can update custom fields by clicking **Edit custom fields**.

* When updating, you’ll see input fields corresponding to the defined custom field types (e.g., text field, dropdown list from predefined values).
* Required fields must be completed before saving changes.
* Once saved, updates appear immediately in the member’s profile.

***

To find out more about the custom fields module, please refer to this section of the User Guide:

{% content-ref url="/pages/KgmV2yRaVf9Feivip98n" %}
[Custom Fields](/members-and-activity/members/custom-fields)
{% endcontent-ref %}


# Removing Members

In this section, you will discover various methods for removing members' data.

You can handle member removal in three ways. Choose the option that fits the outcome you need.

* **Deactivate** a member to block activity temporarily.
* **Anonymize** a member to remove personal data but keep analytics.
* **Remove** a member to delete the profile completely.

***

## Deactivate or activate a member

Use this option when a member may return later. The available action depends on the current account status.

{% stepper %}
{% step %}
Go to **Members → List of Members** or open a single member profile.
{% endstep %}

{% step %}
Open the context menu or click **ACTIONS**.

<figure><img src="/files/m2Etzu2DEyEw0R08sQJX" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Select **Activate account** or **Deactivate account**.

<figure><img src="/files/JI2nGCkdBPujVDNSkmjs" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Confirm with **YES**.
{% endstep %}
{% endstepper %}

### What still works for inactive members

{% tabs %}
{% tab title="Supported" %}

* Add or deduct units.

<figure><img src="/files/lO93kFSpHA9tsmfbRviX" alt="" width="169"><figcaption></figcaption></figure>

* Assign rewards.

<figure><img src="/files/ckPnZwQgQEnYBa4BlGoa" alt="" width="375"><figcaption></figcaption></figure>

* Change reward status.

<figure><img src="/files/qV9rEoI9LUGz0GKRD7Tg" alt=""><figcaption></figcaption></figure>

* Edit the member profile.

<figure><img src="/files/V5JuVJEECSxRgkiXpALx" alt="" width="180"><figcaption></figcaption></figure>

* Trigger internal profile update events.
  {% endtab %}

{% tab title="Not supported" %}

* Transactions and custom events do not match inactive members.
* Purchase, return, redemption, achievement, tier, and time-based campaigns do not trigger.
* Tier updates do not run when the member meets the tier condition.
  {% endtab %}
  {% endtabs %}

***

## Anonymize a member

Use this option when you need to remove personal data but keep non-PII records for reporting and analytics.

When you anonymize a member, the system removes profile details such as name, email, phone number, date of birth, address, and company data. Transactional data remains available for analysis.

{% stepper %}
{% step %}
Go to **Members → List of Members** or open a single member profile.
{% endstep %}

{% step %}
Open the context menu or click **ACTIONS**.

<figure><img src="/files/YG1og2645AOJP0XKAozB" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Select **Anonymize Profile**.

<figure><img src="/files/i9bTZsCNblNuvA6yNYA4" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Confirm with **YES**.
{% endstep %}
{% endstepper %}

{% hint style="danger" %}
Anonymization is permanent. You cannot restore the original profile data.
{% endhint %}

***

## Remove a member

Use this option when you need to delete the member profile completely.

After removal, the member disappears from the member list and no longer counts toward the total number of members.

{% stepper %}
{% step %}
Go to **Members → List of Members** or open a single member profile.
{% endstep %}

{% step %}
Open the context menu or click **ACTIONS**.

<figure><img src="/files/pDi1Gf3c0swFpXoU7rZO" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Select **Remove Profile**.

<figure><img src="/files/TtnDuFjR2dvqrl5sQ7M0" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Confirm with **YES**.
{% endstep %}
{% endstepper %}

{% hint style="danger" %}
Removal is permanent. You cannot restore the member account.
{% endhint %}


# Segments

In this section, you will learn how segmentation works in Open Loyalty. How to configure Member Segments according to your preferences, how to create new Segments, and assign Members to existing ones.

Members can be grouped into Segments based on their data, transactional data, or loyalty program behavior. Segments can be configured by the Administrator in the Segments module or sourced from external 3rd party systems [through API](https://apidocs.openloyalty.io/). Users are added to Segments automatically after meeting the requirement of being in a given Segment. Thanks to this, you can automate the processes of loyalty program management and those related to personalizing loyalty offers and facilitating marketing communication.

***

## Segments module overview

The Segments module contains all the functions related to segmentation. In this section, you can create Segments to which your Members will be assigned, change the Segment configuration, or download a list of Members assigned to a Segment.\
This is one of the main functionalities of our service, based on which you can add e.g. marketing activities.

<figure><img src="/files/wPzJrGPDhF32xBolRYfp" alt=""><figcaption></figcaption></figure>

***

## Browsing the Segment list

In the main-view table which contains the list of all Segments, you will find data with basic information about them.

<figure><img src="/files/wPzJrGPDhF32xBolRYfp" alt=""><figcaption></figcaption></figure>

* **Name** - Name of the Segment
* **Members** - number of added customers
* **Avg. transaction value** - average Transaction amount
* **Avg. number of transactions** - average Transactions
* **Avg. spending** - average spending
* **Created on** - the date when the Segment was created

For a more detailed overview of all Segments, you can search via name and/or use filters. They will help you find the Segment which has the data you are looking for.

#### Table Search by name:&#x20;

<figure><img src="/files/Gy6vdbFngOOTJqA7WCSH" alt=""><figcaption></figcaption></figure>

Once you start typing the name, the results will change automatically.&#x20;

#### Filters you can use:

* Active
* Avg. CLV
* Avg. number of transactions
* Avg. transaction value
* Created on
* Description
* Members
* Name

You can use one filter, or create and use several filters at the same time.

<figure><img src="/files/torRY9bVnf9IN62Wo5oX" alt=""><figcaption></figcaption></figure>

#### Sorting the Segment list

Sorting data is used when you (an Admin) would like to sort the Segments by specific data. This includes:

* **Name**
* **Members**
* **Avg. transaction value**
* **Avg. number of transactions**
* **Avg. CLV**
* **Created on**

#### As an Administrator, you can perform certain actions on the Segments. The actions you can take:

* Activate/deactivate Segment
* Edit Segment
* Remove Segment
* Download Members list


# Creating Segments

Learn how to create dynamic or static segments and import a custom member list into a static segment.

Segments let you group members for targeting, reporting, and automation. You can create a **dynamic segment** that updates automatically, or a **static segment** based on an imported CSV file.

## Step-by-step instructions

Follow these steps to create a new segment in your Open Loyalty environment:

{% stepper %}
{% step %}
**Open the Segments section**

In the left-hand navigation, go to **Members** and click **Segments**.
{% endstep %}

{% step %}
**Add a new segment**

Click **Add segment** in the top-right corner.

![](/files/XvNN1TeShZ9OR7EvAibL)
{% endstep %}

{% step %}
**Choose the segment type**

Select one of the available options:

* **Dynamic segment** — updates automatically when members meet the selected conditions.
* **Static segment** — uses a fixed member list imported from a CSV file.
  {% endstep %}

{% step %}
**Fill in the segment details**

Enter the required basic information for the segment.

Then click **Add condition** to define who should belong to it.
{% endstep %}

{% step %}
**Set the condition logic**

Choose how multiple conditions should work together:

* **AND** — a member must meet all conditions.
* **OR** — a member must meet at least one condition.

{% hint style="info" %}
Use **AND** when the segment should stay narrow. Use **OR** when it should stay broad.
{% endhint %}

![](/files/LdaAUiV97cDiFY40sims)

![](/files/Phyr9eOGZ8WLzKRiojl7)
{% endstep %}

{% step %}
**Activate the segment**

Switch the segment status to **Active**.
{% endstep %}

{% step %}
**Save the segment**

Click **Add segment** to finish.
{% endstep %}
{% endstepper %}

### Import a custom member list into a static segment

Use a static segment when you want to upload a fixed list of members from a CSV file.

{% stepper %}
{% step %}
**Create a static segment**

Start by creating a new segment and selecting **Static segment** as the type.
{% endstep %}

{% step %}
**Start the CSV import**

Open the static segment and click **Import .CSV**.

The import supports up to **500,000 customers**.

![](/files/wBsDfHe1iiLat2FanpAU)
{% endstep %}

{% step %}
**Select the identification factor**

Choose the value that will identify members in the file.

This must match the data included in your CSV.

![](/files/bOxlWbW1GwRUXXwtWm4G)
{% endstep %}

{% step %}
**Upload the file**

Import the CSV file using the identification factor selected in the previous step.
{% endstep %}

{% step %}
**Check the import status**

Track the upload under **Admin Panel** → **Imports/Exports**.

The segment usually updates in about **10 minutes**.
{% endstep %}
{% endstepper %}

## Final tips

{% hint style="warning" %}
Uploading a new CSV replaces the current list in the static segment. Include existing members again if you want to keep them.
{% endhint %}

{% hint style="warning" %}
Activate the segment before uploading the CSV file.
{% endhint %}


# Managing Segments

Edit segments, activate or deactivate them, export member lists, and remove unused segments.

## Overview

Use the **Segments** list to manage existing segments in your environment.

From this view, you can activate or deactivate segments, edit them, export member lists, and remove segments you no longer need.

### What you can do

From the segment row or its **⋯ (more)** menu, you can:

* **Activate or deactivate** a segment
* **Edit** segment details and conditions
* **Export members list** as a CSV file
* **Remove** an unused segment
* **Open** a segment to review assigned members

<figure><img src="/files/dgO7AqrMmgtLOffkWKOR" alt=""><figcaption></figcaption></figure>

***

### Activate or deactivate a segment

Use this when you want a segment to start updating again or stop being used temporarily.

Inactive segments appear grayed out in the list.

<figure><img src="/files/fuhEltFTI6bLt27Cq2YN" alt=""><figcaption></figcaption></figure>

{% stepper %}
{% step %}
**Open the Segments list**

In the left-hand navigation, go to **Members** and click **Segments**.
{% endstep %}

{% step %}
**Open segment actions**

Find the segment you want to update and open the **⋯ (more)** menu.
{% endstep %}

{% step %}
**Change the status**

Click **Activate Segment** or **Deactivate Segment**.
{% endstep %}

{% step %}
**Confirm**

Click **YES** to apply the change.
{% endstep %}
{% endstepper %}

***

### Edit a segment

Edit a segment when you need to update its name, logic, or conditions.

{% stepper %}
{% step %}
**Open the Segments list**

Go to **Members** → **Segments**.
{% endstep %}

{% step %}
**Open segment actions**

Find the segment and open the **⋯ (more)** menu.
{% endstep %}

{% step %}
**Start editing**

Click **Edit**.
{% endstep %}

{% step %}
**Update the segment**

Change the required fields or conditions.
{% endstep %}

{% step %}
**Save changes**

Click **SAVE CHANGES**.
{% endstep %}
{% endstepper %}

{% hint style="info" %}
The computation time is shown only after a segment has been calculated at least once.

Segments recalculate every **10 minutes** or after editing.
{% endhint %}

***

### Export a members list

Export the segment members when you need the list outside the Admin Panel.

The file downloads in **CSV** format.

{% stepper %}
{% step %}
**Open the Segments list**

Go to **Members** → **Segments**.
{% endstep %}

{% step %}
**Open segment actions**

Find the segment and open the **⋯ (more)** menu.
{% endstep %}

{% step %}
**Start the export**

Click **Export Members list**.
{% endstep %}

{% step %}
**Confirm**

Click **EXPORT** in the pop-up window.
{% endstep %}
{% endstepper %}

***

### Remove a segment

Remove a segment when you no longer need it and do not plan to use it again.

{% stepper %}
{% step %}
**Open the Segments list**

Go to **Members** → **Segments**.
{% endstep %}

{% step %}
**Open segment actions**

Find the segment and open the **⋯ (more)** menu.
{% endstep %}

{% step %}
**Remove the segment**

Click **Remove Segment**.
{% endstep %}

{% step %}
**Confirm**

Click **YES** to delete it.
{% endstep %}
{% endstepper %}

***

### View members assigned to a segment

Open a segment to review which members currently belong to it.

{% stepper %}
{% step %}
**Open the Segments list**

Go to **Members** → **Segments**.
{% endstep %}

{% step %}
**Open the segment**

Click the segment row.
{% endstep %}

{% step %}
**Review assigned members**

Check the member list shown for that segment.
{% endstep %}
{% endstepper %}


# Segment Conditions

In this section, you will find a list of conditions that you can base your segments on.

## Segment conditions

Conditions can be added separately in a specific Segment or mixed to create a Segment with a more advanced group. In this article, we'll briefly describe the differences between them, what data they need, and how to use them.

***

### Customer profile recurring dates:

* Birthday in X number of days
* Registration date in X number of days

Create a Segment for Members who have had birthdays or signed in on a certain number of days.

For example:

The Segment to which Members who have birthdays within 14 days of today or who registered will be assigned.

***

### Age

A Segment of members in a specific age group is calculated based on the member's birthday.

For example:\
Members in the age group between 35 and 65

***

### Country

A Segment of members located in a specific country.

For example:\
Members from France

***

### City

A Segment of members located in a specific city.

For example:\
Members from London

***

### Province

A Segment of members located in a specific province.

For example:\
Members from Birmingham

***

### Postal code

A Segment of members located in a specific province.

For example:\
Members from BT22 1AZ

***

### Achievement completion

The condition that allows for grouping the members who have completed the specific achievement.

***

### **Achievement progression overall rules**

The condition that allows for grouping the members who have progressed the specific achievement for overall rules.

***

### Achievement progression last x days rules

The condition that allows for grouping the members who have progressed the specific achievement in the last x days rules.

***

### Avg. purchase transaction value range

A Segment of Members whose average Transaction value is within the defined range.

For example:

A Segment with assigned Members whose average value of all Transactions is in the range 1750 - 2500.

***

### Bought in a specific channel

The Segment with Members who have purchased a specific channel (at least once).

For example:

A Segment with Members who purchased in your online store or one of the offline stores.

***

### Bought products with custom attributes

The Segment of Members who purchased products with a label on the product, which is on the label list. Tags are key-value pairs that can be attached to products.

For example:

A Segment with assigned Members who bought trousers(key) - jeans(value).

***

### Bought specific brands

The Segment of Members who have purchased products from a specific brand, which is on the list of brands.

For example:

A Segment with Members who bought a product from the brand Bosch.

***

### Bought specific SKU

The Segment of Members who have purchased products with a specific SKU.

For example:

A Segment with Members who bought products with a specific SKU “123QWE” or “ZXC321”.

***

### Custom members list

The Segment of Members who were added by an admin user.

For example:

A Segment with the most active Members. The admin can search via e-mail or member ID to add the custom list. The example below presents the list with the member IDs:

<figure><img src="/files/CDDA4b7TghdygjJwS7ES" alt="" width="293"><figcaption></figcaption></figure>

***

### Daily gross value in a given period

A Segment of Members who have spent a specified gross value per day in a specified period.

For example:

A Segment of Members who spent between 20 and 400 gross value per day from 01-01-2021 to 01-10-2021.

***

### Daily gross value in last x days

The Segment contains Members who spent a certain gross value per day in the last x days.

For example:

A Segment of Members who spent between 20 and 400 gross value per day in the last three days.

***

### Gender

Member Segment that is set to a specific gender.

For example:

A Segment with Members who have set their gender to female.

***

### Last purchase transaction/Custom event within the x and y days

The segment of members who have had a transaction or Custom events between the last x and y days.

***

### Members tier

This condition allows for grouping the members based on the tier the member is in.

***

### Members have such custom attribute values

The Segment of Members who have tags value are the same as on the list. Tags are key-value pairs that you can attach to Members while [creating](broken://pages/-MYHFBJLQ3ZSl-0xSqZq#adding-new-members) or [editing](broken://pages/-MYHFBJLQ3ZSl-0xSqZq#editing-a-member) an account.

For example:

A Segment of wholesale or individual Members (Key – member type, Value – wholesale or Key – Member type, Value – individual)

***

### Members who have such custom attributes

The Segments of Members who have tags value are the same as on the list. Tags are key-value pairs that you can attach to Members during [creating](broken://pages/-MYHFBJLQ3ZSl-0xSqZq#adding-new-members) or [editing](broken://pages/-MYHFBJLQ3ZSl-0xSqZq#editing-a-member) an account.

For example:

Create a Segment of Members belonging to Key - Member type: group

***

### Number of purchase transactions in a given period

A Segment of Members with specific transactions in the selected timeframe (calendar dates).

***

### Number of purchase transactions

A Segment of Members with the number of Transactions within the specified range.

For example:

A Segment of Members whose Transactions count is between 10-20

***

### Purchase transaction within the last X number of days

The Segment with Members who made the last purchase in the last x days.

For example:

A Segment with Members who last purchased in the 5 days.

***

### Purchase transaction date range

The Segment with Members who made a purchase (at least one) within the specified date range.

For example:

A Segment with Members who made purchases in the first two weeks of March.

***

### Purchase transaction value range

The Segment of Members whose overall amount of Transactions is within the range.

For example:

A Segment of Members whose value of Transactions is between $100 - $200.&#x20;

***

### Total spending in a given period

The Segment with Members who have spent a specified total gross value in a specified period.

For example:

A Segment with Members who spent between 2000 and 3000 total gross value from 01-02-2021 to 02-03-2021.

***

### Total spending in last x days

The Segment contains Members who spent a certain total gross value in the last x days.

For example:

A Segment of Members who spent between 250 and 400 total gross value in the last three days.

***

### % of purchase transactions in channel

The Segment of Members whose number of Transactions in a specified channel is within a specific percent value.

For example:

A Segment of Members whose 18% of all Transactions were carried out in a specific channel.

***

### **Specific custom events in last x days / last specific custom event**

The group of members who have received the specific custom event in the last x days.


# Referred Members

In this section, you will find detailed information about the Referee and Referrer members, which will help you manage the Referral System in Open Loyalty.

Use **Referred Members** to manage relationships between referrers and referees. This view helps you track referral connections, add them manually, and review how members are linked in your program.

{% hint style="success" %}
**Referrer** — member sending the invitation.

**Referee** — person invited to the program.
{% endhint %}

<figure><img src="/files/VlMm6bzLhwFlU3DUllOT" alt=""><figcaption></figcaption></figure>

***

### Key functionalities

* View all referral connections in one place.
* Add a referred member manually.
* Remove an existing referral connection.
* Open the invited member profile directly.
* Review referrals from the **Single Member View**.

{% hint style="success" %}
You can search, filter, and adjust the table layout with **Manage Columns**.
{% endhint %}

***

### What you see in the list

Navigate to **Members → Referred Members** to open the list of referral connections.

The table includes:

* **Referrer name** — the member who sent the invitation.
* **Referrer token** — the referral token used to create the link.
* **Referee name** — the member who joined through the referral.
* **Created on** — the date and time when the referral was recorded.

***

### Adding a referred member

{% stepper %}
{% step %}
Navigate to **Members → Referred Members**.
{% endstep %}

{% step %}
Click **Add referred member**.
{% endstep %}

{% step %}
Select the **Referrer** and the **Referee** in the modal.

<figure><img src="/files/fpqkJHXLBUBEA8eYahlw" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Save the new referral connection.
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
One referee can be linked to only one referrer. If the selected referee is already connected, you cannot save the new link.
{% endhint %}

***

### Managing referrals

Use the context menu next to a record to manage a referral:

* **Remove referred member** — delete the referral connection.
* **See full profile** — open the referee's member profile.

Removing a referral does not delete the member profile or previously granted referral benefits.

***

### Referrals in Single Member View

Each member profile includes a **Referrals** tab. Use it to review referees linked to that member.

From this view, you can:

* Add new referees.
* Remove existing ones.
* Open referee profiles directly.

{% hint style="info" %}
Learn more in [Referrals](/members-and-activity/members/member-list/single-member-view/referrals).
{% endhint %}

***

### Referral levels

Open Loyalty supports **multi-level referral programs**. This lets you reward both the original referrer and later members in the same referral chain.

A **referral level** shows how far a referred member is from the original referrer:

* **Level 1** — the direct referral.
* **Level 2** — a referral made by the Level 1 referee.
* **Level 3** — a referral made by the Level 2 referee.

You can configure rewards for each level based on your program rules and campaign setup.

{% hint style="info" %}
Learn more in [Referral Campaign](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/referral-campaign#multi-level-campaign-configuration).
{% endhint %}

***

### Key Notes

* Referrals can be created automatically when a member registers with a referral token.
* You can also create referrals manually from **Referred Members**.
* Referral creation and management are also available through the API.
* Removing a referral breaks the connection only. It does not delete the member profile or previous benefits gained through referral campaigns.


# Custom Fields

This article explains how custom fields can be created and used in your loyalty program.

The **Custom Fields** feature allows you to extend member profiles with additional information specific to your program needs. These fields make it possible to capture structured data beyond the default attributes, helping you personalize campaigns, segment members more precisely, or store business-specific identifiers.

<figure><img src="/files/Yoabap04XzQQw0gtnnkf" alt=""><figcaption></figcaption></figure>

***

### Key Functionalities

* ➕ **Add custom fields** — create new attributes with a name, type, and optional description.
* 🛠️ **Define field properties**:
  * **Type** – choose between text and predefined values.
  * **Required field** – make the field mandatory when creating or editing a member.
  * **Predefined values** – restrict inputs to a fixed list of acceptable values (via collections).
  * **Status** – activate or deactivate fields.
* 👤 **Visibility** — once active, the field appears in all member profiles.
* 🔄 **Manage existing fields** — edit properties or deactivate a field if it’s no longer needed.

{% hint style="warning" %}
You can create and activate up to **6 custom fields** at a time.
{% endhint %}

***

### Creating a Custom Field

{% stepper %}
{% step %}
Navigate to **Configuration → Custom Fields**.

<figure><img src="/files/HYrdEFwsbydhYqL4zXWu" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Click **Add custom field**.

<figure><img src="/files/M614k1s7ls3Z2voqfEOY" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Enter the field name and (optionally) a description.

<figure><img src="/files/eFKhvNb8J8n8EC9fmntN" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Select the **Type** (Text or another type).

<figure><img src="/files/y7dUscdhTKSl20Y9nd5N" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
(Optional) Mark the field as **Required**.

<figure><img src="/files/v08A6tp0Ap2dWQMnJczz" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
If using predefined values, select a **Collection**.

<figure><img src="/files/rPPpYGw6IaWIB5GXXbxa" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Set the **Status** to *Active*.

<figure><img src="/files/X95wY5YP3Iqm34W3D1BM" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
Click **Add custom field** to confirm.

<figure><img src="/files/kk4oXjjYQO8ohbVAKlOX" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

***

### Managing Custom Fields

* **Edit a field** — adjust its configuration by selecting *Edit custom field* from the context menu.
* **Deactivate a field** — switch the status to inactive to hide it from member profiles.
* **Filter & search** — use the search bar or filters to find fields quickly.

***

### Editing Members with Custom Fields

When creating or editing a member profile, required custom fields are displayed as mandatory inputs. For example:

* **Fav stores** (required dropdown with predefined values).
* **Shoe size** (optional free text field).

<figure><img src="/files/LOPzpEqNN3vtsDO8DP5L" alt=""><figcaption></figcaption></figure>

Administrators must complete all required fields before saving changes to the profile.

***

### Displaying Custom Fields in Single Member View

Custom fields are also visible in the **Single Member View** under the *Custom Fields* section. Here you can see:

* The **field name** (e.g., Fav stores, Shoe size).
* The **value** selected or entered for that member (e.g., “California Store”, “36”).

This ensures that all extended attributes are accessible directly from the member’s profile, alongside general info, transactions, and wallet data.

<figure><img src="/files/zJJ2DcY1qXwhpLrJA6gO" alt=""><figcaption></figcaption></figure>

***

### Example Use Cases

* 📦 **Supplier or partner code** — track which supplier a member is linked to.
* 🏪 **Favorite store** — capture the member’s preferred location for redemptions or pickups.
* 🏷️ **Customer category** — e.g., B2B vs. B2C, VIP status, or special program flags.


# Configuration

In this section, you will learn how to manage the loyalty program configuration.

The **Member Identifier Configuration** section defines how Open Loyalty distinguishes between members in your database. This configuration plays a key role in maintaining data quality, avoiding duplicates, and ensuring proper member-event matching.

<figure><img src="/files/W3fDcsyXwo0z4rwczKUu" alt=""><figcaption></figcaption></figure>

## Purpose

Each member must be **uniquely** identified to:

* Match events (like transactions and custom events) correctly.
* Avoid duplicates in the system.
* Ensure consistent member experiences across integrations.

***

## Configuration Options

You can choose from the following identifiers:

* **Email**
* **Phone number**
* **Loyalty card number**

Each of these identifiers can be configured in the following ways:

| Configuration Option | Description                                                                                     |
| -------------------- | ----------------------------------------------------------------------------------------------- |
| **Required field**   | The identifier is mandatory during registration. Only one identifier can be marked as required. |
| **Event matching**   | Used to match incoming events (e.g., transactions, custom events) with members.                 |
| **Unique field**     | Must be unique across the entire tenant (e.g., no two users can share the same email).          |

{% hint style="success" %}
**Tip:** The **Loyalty card number** is often used as an external UUID to map members between systems.
{% endhint %}

The system follows a **top-to-bottom** order when matching incoming data with member identifiers. You can **drag and drop** identifiers in the table to change the priority.

***

## Important Rules

* Once an identifier is set as **non-unique**, it:
  * **Cannot** be required,
  * **Cannot** be used for event matching,
  * **Cannot** be used in integrations,
  * **Cannot** be reverted to **unique** option.
* **Required registration fields must be unique.**
* **Only unique identifiers** can be used for event matching.
* This configuration is **tenant-based**.

***

## Autogenerate loyalty card numbers

<figure><img src="/files/3pWN24wgRH2ISufydTY7" alt=""><figcaption></figcaption></figure>

Enable **Autogenerate loyalty card number** to assign a loyalty card number to every new member automatically.

Existing members are not affected.

Configure the generated number with the following options:

| Option                 | Description                                                                            |
| ---------------------- | -------------------------------------------------------------------------------------- |
| **Card number format** | Choose **Alphanumeric (A-Z, 0-9)**, **Letters only (A-Z)**, or **Numbers only (0-9)**. |
| **Card number length** | Set the generated part to between 4 and 64 characters. The prefix is excluded.         |
| **Prefix**             | Add a fixed prefix to every generated number. A prefix can contain up to 8 characters. |

For example, a prefix of `VIP` and generated value `A9F7K2` creates `VIPA9F7K2`.

{% hint style="info" %}
Generated loyalty card numbers apply only after you enable the setting and save the changes.
{% endhint %}

***

## Active Member Settings

In this section, you can define conditions to determine whether a member is considered **active**.\
By default, the condition is:

* A **transaction** has been made in the last **X days** (e.g., 30 days).

You might change the configuration to:

* Track the **custom events** (selected or all of the custom event types)
* Change the time period you are looking at (e.g., last 7 days)
* Use the combination of events that define a member as active.

{% hint style="info" %}
**Note**: It might take up to 24 hours for changes to be reflected in the dashboard, as recalibration occurs once per day.
{% endhint %}

***

## Final Steps

After configuring the settings, click **Save changes**.

{% hint style="warning" %}
Please review carefully — some settings, such as setting an identifier to non-unique, **cannot be undone**.
{% endhint %}


# Transactions

In this section, you will learn everything about Transactions. We will show you how to create Transactions, match them with customers, and many more important and helpful features.

## Overview

The **Transactions** module lets you manage, review, and analyze all customer transactions recorded in the loyalty program.\
Each transaction can be linked to a member, earn loyalty units (points), trigger rewards or achievements, and belong to a specific sales channel (e.g., eCommerce, POS, or mobile app).

Transactions can be:

* Imported manually or automatically from external systems.
* Created directly in the Admin Panel.
* Matched with members using loyalty identifiers (email, card number, phone, etc.).

{% hint style="info" %}
Use this section to verify if transactions were correctly matched and if points, rewards, and achievements were properly assigned.
{% endhint %}

<figure><img src="/files/1fza2QfP0BohfqVB8htk" alt=""><figcaption></figcaption></figure>

***

## Learn more about

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Transaction List</strong></td><td>View, filter, and manage all recorded transactions. Check their status, values, and matching results, and access detailed records for verification.</td><td><a href="/pages/I9afoNN8F9kgzIYqs8tX">/pages/I9afoNN8F9kgzIYqs8tX</a></td></tr><tr><td><strong>Transaction Channels</strong></td><td>Create and manage transaction channels that define where transactions originate — such as eCommerce, POS, or mobile app environments.</td><td><a href="/pages/hL3gefQnFml165MUnMdj">/pages/hL3gefQnFml165MUnMdj</a></td></tr><tr><td><strong>Transaction Details</strong></td><td>Explore complete information about a single transaction, including customer details, products, earned points, rewards, and achievements.</td><td><a href="/pages/UoJUkCjpSC6Rs4FqWkGY">/pages/UoJUkCjpSC6Rs4FqWkGY</a></td></tr><tr><td><strong>Add or Import Transactions</strong></td><td>Learn how to create new transactions manually or import them in bulk. Review supported formats and mapping requirements.</td><td><a href="/pages/KfUR0OJQUrRBbtfGAc8S">/pages/KfUR0OJQUrRBbtfGAc8S</a></td></tr><tr><td><strong>Matching Transactions</strong></td><td>Understand how transactions are linked with members automatically or manually to ensure loyalty points and rewards are assigned correctly.</td><td><a href="/pages/t9GVcnOzM2bKY9lB1FwH">/pages/t9GVcnOzM2bKY9lB1FwH</a></td></tr></tbody></table>


# Transaction List

The **List of Transactions** view displays all transactions imported or created in the system.\
From here, you can verify if transactions are correctly matched with members, check their values, and access detailed data.

<figure><img src="/files/t4lHGGF5TES3p8WX19gz" alt=""><figcaption></figcaption></figure>

Each transaction includes:

* **Document number and type** (e.g. purchase, return)
* **Date and value**
* **Matched status** — whether it’s linked with a member
* **Member data** (full name, email, phone number, loyalty card number)

{% hint style="warning" %}
Member data is based on the details passed in the transaction, not on the member profile.

The details refer to the customer engaged in the transaction and can vary from the information of an existing member in the system.
{% endhint %}

* **Transaction value**&#x20;

{% hint style="info" %}
💡 **Tip:** Use filters to quickly find transactions by date, type, or matching status.
{% endhint %}

***

### Actions available

From this view, you can:

* Open transaction details
* Add new transactions manually
* Import transactions in bulk
* Import matches
* Match transactions with members

***

### Add transaction menu

Click the **Add transaction** button to choose from four options:

| Action                              | Description                                                                                      |
| ----------------------------------- | ------------------------------------------------------------------------------------------------ |
| **Add transaction manually**        | Create a new transaction directly in the Admin Panel by entering transaction and member details. |
| **Import matches**                  | Upload a file containing matches between transactions and members.                               |
| **Import transactions**             | Bulk import multiple transactions from an external source (e.g. POS, eCommerce).                 |
| **Match transaction with a member** | Link existing transactions with members based on selected identifiers.                           |

***

#### Columns

Each row represents a single transaction. The main columns are:

| Column                                       | Description                                                                |
| -------------------------------------------- | -------------------------------------------------------------------------- |
| **Document number**                          | Unique transaction identifier from the source system.                      |
| **Document type**                            | Type of document — *Purchase* or *Return*.                                 |
| **Document date**                            | Date and time when the transaction occurred.                               |
| **Full name / Email / Phone / Loyalty card** | Data of the member associated with the transaction.                        |
| **Matched**                                  | Indicates if the transaction is already linked to a member (*Yes* / *No*). |
| **Transaction value**                        | Monetary value of the transaction (in tenant’s currency).                  |

{% hint style="info" %}
💡 You can customize visible columns using the **Manage Columns** button at the bottom of the list.
{% endhint %}

***

#### Example

A typical transaction list might show:

| Document number | Date        | Matched | Transaction value |
| --------------- | ----------- | ------- | ----------------- |
| 6lkgwm0qzb      | 04 Nov 2025 | Yes     | 1,206.88 CAD      |
| ujryw337c8      | 04 Nov 2025 | Yes     | 1,287.13 CAD      |
| i8vk60u7sr      | 04 Nov 2025 | Yes     | 1,098.78 CAD      |

***

#### Next steps

➡️ Go to [Transaction Details](/members-and-activity/transactions/transaction-details) to explore what information is available for each transaction.


# Channels

In this section, you will learn how to set up sales channels and manage their data.

**Transaction Channels** define where transactions originate — for example, from an online store, mobile app, or in-store POS.\
They help you organize, segment, and analyze transactions from different sales environments.

Each channel has its own **name**, **code**, and optional **description**, and can be used when importing or manually creating transactions.

{% hint style="info" %}
💡 **Tip:** Configuring separate channels for each sales source makes it easier to track program performance by channel (e.g., eCommerce vs. POS).
{% endhint %}

<figure><img src="/files/NpqFMzflURhfNyE1pXfw" alt=""><figcaption></figcaption></figure>

***

### Accessing transaction channels

In the **Admin Panel**, go to:\
**Transactions → Transaction channels**

You’ll see a list of all existing channels with their identifiers.

***

### Channel list

The list includes two main columns:

| Column         | Description                                                                              |
| -------------- | ---------------------------------------------------------------------------------------- |
| **Name**       | The display name of the channel (e.g., *eCommerce 1*, *POS 2*).                          |
| **Identifier** | The unique system code used in imports or API integrations (e.g., *ecommerce1*, *pos2*). |

***

### Adding a new channel

Click **Add channel** to create a new transaction channel.\
You’ll be asked to provide:

<table><thead><tr><th width="207">Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Channel name</strong>*</td><td>The visible name used in the admin interface.</td></tr><tr><td><strong>Channel code</strong>*</td><td>A unique identifier used when importing transactions or integrating via API.</td></tr><tr><td><strong>Channel description</strong></td><td>(Optional) Short note describing the purpose or location of the channel.</td></tr></tbody></table>

<figure><img src="/files/U5GYU5huwO4hSXwjQ1ve" alt=""><figcaption></figcaption></figure>

After completing the form, select **Add channel** to save.

***

#### Finding the Channel ID

The **Channel ID** is a UUID required for API calls and certain integrations. It is not currently shown in the channel list — there are two ways to retrieve it:

**Via the Admin Panel URL**

Open the channel's detail or edit view by clicking into it. The Channel ID appears in the browser URL:

```
/transactions/channels/edit/{channelId}
```

Copy the UUID segment from the URL — that is your Channel ID.

**Via the API**

Use the [List Channels](http://apidocs.openloyalty.io/#tag/Channels/operation/channelGetList) endpoint:

```
GET /api/{storeCode}/channel
```

Each channel object in the response includes an `id` field containing the Channel ID.

{% hint style="info" %}
The Channel ID (id) is different from the Channel code (Identifier). The code is a human-readable slug you define; the ID is a system-generated UUID.
{% endhint %}

***

### Editing a channel

To modify a channel, click the **⋯ (three dots)** menu next to it and select **Edit channel**.\
You can change:

* Channel name
* Channel code
* Description

<figure><img src="/files/8IoBB0cjEPMlaEk7qxSC" alt=""><figcaption></figcaption></figure>

Click **Save changes** when done.

***

### Best practices

* Use short, clear **codes** — avoid spaces or special characters.
* Keep **names** human-friendly for admin users.
* Align channel identifiers with your source systems (e.g., use the same code as in your eCommerce platform).
* Avoid duplicate codes — each must be unique within a tenant.

***

#### Next steps

➡️ Learn how to [Add or Import Transactions](/members-and-activity/transactions/add-or-import-transactions).


# Transaction Details

he **Transaction Details** page displays all information related to a single transaction.\
It combines system data, customer details, earned units, rewards, achievements, and related transactions — all in one place.

This view helps you:

* Verify if a transaction was correctly matched with a member
* Review earned points, rewards, and triggered achievements
* Check which products were included in the purchase
* Confirm data imported from external systems (e.g., POS, eCommerce)

<figure><img src="/files/g0M72gtERBjX1yfDfWEd" alt=""><figcaption></figcaption></figure>

***

### Transaction information

<figure><img src="/files/poBscGmFeaAa2HidYmsa" alt=""><figcaption></figcaption></figure>

At the top of the page, you’ll find **Transaction Details**, including:

<table><thead><tr><th width="209">Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Document number</strong></td><td>Unique transaction identifier (e.g., from POS or eCommerce system).</td></tr><tr><td><strong>Document type</strong></td><td>Type of document — <em>Purchase</em> or <em>Return</em>.</td></tr><tr><td><strong>Document date</strong></td><td>Date and time of when the transaction occurred.</td></tr><tr><td><strong>Channel</strong></td><td>Source of the transaction (e.g., <em>eCommerce1</em>, <em>POS2</em>).</td></tr><tr><td><strong>Purchase place</strong></td><td>Optional field describing the physical or digital sales location.</td></tr><tr><td><strong>Transaction value</strong></td><td>Total purchase value in the tenant’s currency.</td></tr><tr><td><strong>Status</strong></td><td>Indicates if the transaction is <em>Matched</em> or <em>Not matched</em> with a member.</td></tr><tr><td><strong>Transaction system ID</strong></td><td>Internal identifier generated by OL.</td></tr><tr><td><strong>Custom attributes</strong></td><td>Any additional data imported with the transaction.</td></tr></tbody></table>

***

### Customer details

<figure><img src="/files/1PRXK8RDd2kPiqfq91Ky" alt=""><figcaption></figcaption></figure>

This section displays customer data provided by the source system.\
It can include:

* Full name
* Email address
* Phone number
* Loyalty card number
* Street, postal code, city, state, and country

{% hint style="warning" %}
💡 **Note:** If these fields are empty, the data may not have been included in the transaction payload.
{% endhint %}

***

### Matched member

<figure><img src="/files/YPeCFlP7zKCDEKBhjAFp" alt=""><figcaption></figcaption></figure>

If the transaction is successfully linked to a loyalty member, you’ll see:

| Field                            | Description                                |
| -------------------------------- | ------------------------------------------ |
| **Member name**                  | The name of the matched member.            |
| **Email / Phone / Loyalty card** | Identifiers used to match the transaction. |

{% hint style="danger" %}
If no member is found, the status will show as **Not matched**.
{% endhint %}

***

### Earned units

<figure><img src="/files/Ma0SqIL4UErcn0A08Pwb" alt=""><figcaption></figcaption></figure>

Displays the number of loyalty units (points) awarded for this transaction.

<table><thead><tr><th width="208">Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Wallet name / code</strong></td><td>Name of the wallet the points were added to.</td></tr><tr><td><strong>Type</strong></td><td>Indicates if points were <em>added</em> or <em>deducted</em>.</td></tr><tr><td><strong>Value</strong></td><td>Number of units earned or deducted.</td></tr><tr><td><strong>Comment</strong></td><td>Explanation of how points were calculated, usually containing the campaign name.</td></tr></tbody></table>

***

### Products

<figure><img src="/files/NHWvEg2E50zkiSPDKP8Y" alt=""><figcaption></figcaption></figure>

Lists all purchased products, their categories, and values.

<table><thead><tr><th width="236">Column</th><th>Description</th></tr></thead><tbody><tr><td><strong>Product name / SKU</strong></td><td>Product details imported from the source.</td></tr><tr><td><strong>Category / Brand</strong></td><td>Product classification and manufacturer.</td></tr><tr><td><strong>Quantity</strong></td><td>Number of units purchased.</td></tr><tr><td><strong>Product value</strong></td><td>Total value of that product line.</td></tr></tbody></table>

At the bottom, you’ll find the **Total transaction value** (sum of all products).

***

### Earned Rewards

<figure><img src="/files/Q4NQCrdpTJmykTgH20gs" alt=""><figcaption></figcaption></figure>

If a member redeemed a reward during this purchase, the reward details will be listed here.

<table><thead><tr><th width="248">Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Reward name / type</strong></td><td>The name and type of reward (e.g., <em>Dynamic value coupon</em>).</td></tr><tr><td><strong>Redemption date</strong></td><td>When the reward was redeemed.</td></tr><tr><td><strong>Status</strong></td><td>Indicates current status of the reward.</td></tr><tr><td><strong>Member details</strong></td><td>The person who redeemed the reward.</td></tr></tbody></table>

***

### Triggered achievements

<figure><img src="/files/i0IhnTxE6v8TmecBMfrI" alt=""><figcaption></figcaption></figure>

If this transaction triggered any achievement (e.g., *Spend $1000 in a month*), it will appear here along with the rule name and ID.

***

### Related transactions

<figure><img src="/files/iSyrDd6PUJKrFYzMg7Hz" alt=""><figcaption></figcaption></figure>

If there are any linked documents (e.g., original purchase transaction), they are shown in this section with:

* **Document number**
* **Type** (Purchase, Refund, Correction)
* **Date**
* **Member name / email**

***

#### Next steps

➡️ Learn how to manage and configure [Transaction Channels](/members-and-activity/transactions/channels).


# Add or Import Transactions

In this article, you will learn how to add or import transactions.

The **Add or Import Transactions** section allows you to record transactions in the system manually or in bulk.\
This feature is useful when:

* Importing historical transactions from external systems,
* Adding test transactions for debugging or demo purposes,
* Re-importing corrected data,
* Or matching existing transactions with members after import.

All added or imported transactions will appear in the **List of Transactions** view.

***

### Adding or importing a transaction

From the **Transactions → List of Transactions** view, click the **Add transaction** button.

<figure><img src="/files/c9iYAvfBsgF238zMQBft" alt=""><figcaption></figcaption></figure>

A dropdown menu will appear with the following options:

<table><thead><tr><th width="293">Option</th><th>Description</th></tr></thead><tbody><tr><td><strong>Add transaction manually</strong></td><td>Create a single transaction directly from the Admin Panel.</td></tr><tr><td><strong>Import matches</strong></td><td>Upload a file containing existing transactions and matched members.</td></tr><tr><td><strong>Import transactions</strong></td><td>Bulk import new transactions from an external system.</td></tr><tr><td><strong>Match transaction with a member</strong></td><td>Link already imported transactions with members.</td></tr></tbody></table>

***

### ➕ Add transaction manually

Use this option to create a single transaction directly from the admin interface.

<figure><img src="/files/VVZRoFnn6fWar2xrEjlz" alt=""><figcaption></figcaption></figure>

You’ll be asked to provide:

| Field                   | Description                                                              |
| ----------------------- | ------------------------------------------------------------------------ |
| **Document number**\*   | Unique transaction ID (e.g., invoice number).                            |
| **Document type**\*     | Type of transaction (*Purchase*, *Return*).                              |
| **Document date**\*     | Date and time of the transaction.                                        |
| **Channel**\*           | Select from the available transaction channels.                          |
| **Transaction value**\* | Monetary value of the transaction.                                       |
| **Customer data**       | Member identifiers (email, phone, loyalty card number).                  |
| **Products**            | Optional: add items purchased, including name, SKU, quantity, and value. |
| **Custom attributes**   | Optional: any additional fields specific to your integration.            |

After entering all required information, click **Add transaction**.

{% hint style="info" %}
💡 **Note:** If the transaction matches a member, points and achievements will be assigned automatically according to the active campaigns.
{% endhint %}

***

### 📥 Import transactions

This option lets you upload a file with multiple transactions.

#### Supported formats

* **XML, JSON**
* Maximum file size: **100 MB**

To find out more about the import file and how to create an import file, please refer to the article below:

{% content-ref url="/pages/-MZBtStiJdMqbAd-5BMa" %}
[Broken mention](broken://pages/-MZBtStiJdMqbAd-5BMa)
{% endcontent-ref %}

#### Import process

1. Click **Import transactions**
2. Select the file
3. Confirm import

<figure><img src="/files/Vli8rH6bzYvUujZmSyi8" alt=""><figcaption></figcaption></figure>

Once uploaded, the system validates the file and adds transactions to the database.\
If validation fails, you’ll see detailed error messages describing incorrect or missing fields.

***

#### Best practices

* Always include a **channel identifier** in imports to avoid data ambiguity.
* Keep **document numbers unique** per source system.
* Verify that your member data (emails, phone numbers, card numbers) exist in the system before import.
* Use **test imports** on smaller files to confirm the format.

***

#### Next steps

➡️ Continue to [Matching Transactions with Members](/members-and-activity/transactions/matching-transactions) to learn how to automatically link transactions with members using identifiers.


# Matching Transactions with Members

In this article, you will learn how transactions are matched

The **Matching Transactions with Members** process connects each transaction with the correct loyalty program member.\
This step ensures that members receive loyalty units, rewards, and achievements based on their purchases.

Matching can happen automatically (during import or via API) or manually (from the Admin Panel).\
If a transaction is not matched, it will appear in the list with the status **Not matched**.

{% hint style="warning" %}
Matching is crucial for calculating points and triggering campaign or achievement rules.
{% endhint %}

***

#### How matching works

When a transaction is added or imported, the system looks for an existing member using defined identifiers such as:

* **Email address**
* **Phone number**
* **Loyalty card number**
* **Custom identifiers** (if configured)

If a match is found → the transaction is linked automatically.\
If not → it remains unmatched until linked manually or via import.

{% hint style="info" %}
You can define which member identifier should be used for mapping.

To find out more, please refer to [Configuration](/members-and-activity/members/configuration)
{% endhint %}

***

#### Automatic matching

Automatic matching happens when:

* The transaction file or API payload contains valid member identifiers.
* The corresponding member exists in the system.
* No conflicts (e.g., duplicate identifiers) are detected.

If all conditions are met, the transaction is automatically linked, and any active campaign or achievement rules are triggered.

***

#### Manual matching

You can manually match a transaction that was not linked automatically.

**To match manually:**

1. Go to **Transactions → List of Transactions**
2. Locate a transaction with the status **Not matched**
3. Click **⋯ (three dots)** and select **Match transaction with a member**
4. Choose how to search for the member:
   * Email address
   * Phone number
   * Loyalty card number
5. Confirm your selection

If a match is successful, the status will change to **Matched**, and loyalty units will be added to the member’s wallet if applicable.

***

### 📎 Import matches

If you have a file containing transaction–member pairs, use this option to match them in bulk.

| Required columns            | Example             |
| --------------------------- | ------------------- |
| Transaction document number | 6lkgwm0qzb          |
| Member email                | <example@email.com> |

To find out more about the import file and how to create an import file, please refer to the article below:

{% content-ref url="/pages/-MZBtStiJdMqbAd-5BMa" %}
[Broken mention](broken://pages/-MZBtStiJdMqbAd-5BMa)
{% endcontent-ref %}

#### Steps

1. Click **Import matches**
2. Upload your file (XML)
3. Confirm import

Matched transactions will update automatically, and new points will be calculated if applicable.

***

#### Troubleshooting unmatched transactions

If some transactions remain unmatched:

* Verify that the identifiers used in the transaction (email, phone, card number) exist in the member database.
* Check for typos or mismatched formats.
* Ensure the identifier field used for matching is active in your tenant configuration.
* Confirm that you have access to the Members module — restricted access can also result in seeing “Not matched” status.

***

#### Best practices

* Use **consistent identifiers** across all systems (POS, eCommerce, CRM).
* Avoid duplicate member profiles with the same email or card number.
* Regularly export unmatched transactions to review and fix manually.
* When possible, automate matching via API to reduce manual work.

***

#### Next steps

You’ve completed the Transactions module documentation ✅\
You can now continue with related areas, such as [**Campaigns**](/campaigns/campaigns) or [**Rewards**](/rewards-redemption/rewards), to understand how transactions affect loyalty logic.


# Custom Events

In this section, you will learn about adding and managing custom events in Open Loyalty.

## Sending Custom Event

The Custom Event is a specific event that can be sent only via API, but **first,** you need to create [Custom event schemas](/members-and-activity/custom-events/custom-event-schemas#adding-custom-event-schema) in which you can specify conditions. However, to send the custom Event via API, use request: '[POS&#x54;*/api/{storeCode}/customEvent*](https://apidocs.openloyalty.io/#operation/customEventPost)*',* and here you need to specify:

* Type - in here we must pass 'event system identifier', from 'Custom event schemas',
* Customer data - data that will connect the event to the Member,
* Body - with your condition from the schema, where you need to put value for the *Attribute system identifier* that you previously described.
* Event date - creation date of the Event,

After sending a valid request, you will get a '200 OK' response with a created custom event ID. Also, such an Event now should appear in the 'Custom Events' tab.&#x20;

***

## Custom Events Overview

After finding yourself on the 'Custom Events' table view, you will have all sent Events present here. You can browse through them, or customize the view e.g. by picking how many rows per page you would like to see.&#x20;

<figure><img src="/files/pQeDdakmAeSgYwN1X0aA" alt=""><figcaption></figcaption></figure>

***

### Browsing through the Custom events

As mentioned above, you can see all Events present as a table, which can be browsed not only via scroll but also by using a search table or filters.

Table Search by name:&#x20;

<figure><img src="/files/IbDNMgawVDrSwajqXkSX" alt=""><figcaption></figcaption></figure>

Once you start typing the name, the results will change automatically. &#x20;

Available filters, which can be picked from the list or via the search field:

* Email
* Custom Event date
* Custom Event name
* Loyalty card number
* Member ID
* Phone number
* Type

To use filters, click on the **+ADD FILTER** button and a popup screen will show up, then you can pick 'Property' > 'Condition' > 'Value' and after picking the needed data just click on the 'Add Filter' purple button.&#x20;

Conditions:

* equals - where the name needs to be exact as a typed value
* contains - in this case, there must be a partial match to the value

<figure><img src="/files/zB8aZizdoAvUGRSFFlqM" alt=""><figcaption></figcaption></figure>

After that only matching records will be present. Also, the graphic presented as the pie chart will show the percentage and number of filtered records. If you would like to dismiss the filter just click on the 'X' button.

<figure><img src="/files/3rWrMpgQGGwn0Mwy7Zpl" alt=""><figcaption></figcaption></figure>

***

## Custom Event Details

To access the selected record's details, click on it or the overflow button and from the list, pick the "see details" option. In the Details view, you have data like Custom event date, Custom event name, and assign Member's data passed during creation before. To dismiss details, click on the '**<** 'button, on the top, next to the Event ID.

<figure><img src="/files/C8fMK27BeL9DYU8kLvK5" alt=""><figcaption></figcaption></figure>


# Custom Event Schemas

In this section, you will learn how to manage the custom event schemas.

## Custom Event Schemas

Custom event schemas define events for [event-based campaigns](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/custom-event). Each schema provides an event name and optional attributes for campaign conditions.

### Add a custom event schema

Follow these steps to create an event schema:

{% stepper %}
{% step %}
**Open Custom Event Schemas**

In the **Members** menu, select **Custom Events**. Then select **Custom Event Schemas**.
{% endstep %}

{% step %}
**Start a new schema**

Click **Add Event Schema**.

<figure><img src="/files/IxrmiTUKPZsTxn2L472A" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Complete the basic settings**

Enter an **Event system identifier** and an **Event name**.

Use the system identifier when sending the event. For example, for `bike_ride`, send `"type": "bike_ride"` in the request body.

The event name appears in the **Event name** list when creating an event-based campaign.
{% endstep %}

{% step %}
**Add attributes, if needed**

Attributes let you build campaign conditions and reward members. They are available in the campaign **Conditions type** list.

Select one of these attribute types:

* **Boolean** — `true` or `false`
* **Datetime** — for example, `2024-03-08T02:02:08+01:00`
* **Number** or **Text**

<figure><img src="/files/BacLlICUjfmuLkSjucWT" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Activate and create the schema**

Set the schema status to **Active**. Then click **Add Event Schema**.
{% endstep %}
{% endstepper %}

### Filter custom event schemas

Use **Add Filter** to narrow the schema list. You can filter by:

* **Active**
* **Create date**
* **Event name**
* **Event system identifier**

<img src="/files/fdRC8yONxgZ4UA67TqXn" alt="" width="375">

Choose a property, condition, and value. Then click **Add filter**. Only matching schemas appear.

Use the search field above the table to find a schema by name. Use the table control below the list to change rows per page.

<figure><img src="/files/xUtWxEluZ5MpTNIj4kVv" alt=""><figcaption></figcaption></figure>

### Edit a custom event schema

{% stepper %}
{% step %}
**Select the schema**

Find the event schema in the list.
{% endstep %}

{% step %}
**Open the editor**

Open the context menu and select **Edit**.
{% endstep %}

{% step %}
**Save your changes**

Make the required updates, then click **Save**.

<figure><img src="/files/ADCxgmLHa7WbbjyWuoBE" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}


# Wallets

Learn how wallets work in Open Loyalty, how to configure wallet types, and how to manage unit transfers.

## Overview

Wallets store the loyalty units used in your program.

You can use them to separate balances by business case, reward model, or accounting logic.

<figure><img src="/files/rpIB6PFQfJJBEx8P0lwU" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Each program needs one default wallet.

You can add any number of additional wallet types.
{% endhint %}

***

### What you manage in wallets

Use the **Wallets** section to:

* Create wallet types with their own names, codes, and unit labels
* Define expiration, pending rules, balance limits, and availability
* Review and manage unit transfers across member balances

### Common use cases

Wallets help you:

* Separate points, cashback, stamps, or other unit balances
* Apply different lifecycle rules to different earning models
* Audit every balance change made by admins or the system

***

## Learn more about

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Wallet Types and Configuration</strong></td><td>Create wallet types, define unit rules, set limits, and manage imports or exports.</td><td><a href="/spaces/cNVX03KZzmrGwJihLiEx/pages/Mu0h4UOWGQiGXpCPr2bU">/spaces/cNVX03KZzmrGwJihLiEx/pages/Mu0h4UOWGQiGXpCPr2bU</a></td></tr><tr><td><strong>Unit Transfers</strong></td><td>Review wallet activity, create manual adjustments, and manage transfer lifecycles.</td><td><a href="/spaces/cNVX03KZzmrGwJihLiEx/pages/pmoK12YbxUSx4qMwSSSf">/spaces/cNVX03KZzmrGwJihLiEx/pages/pmoK12YbxUSx4qMwSSSf</a></td></tr></tbody></table>


# Wallet Types and Configuration

Create wallet types and configure how units behave, expire, and stay available in your program.

## Overview

Wallet types define how balances work in your loyalty program.

Each wallet can have its own unit names, expiration rules, pending logic, limits, and status.

<figure><img src="/files/kyd93SUYOsHPAJz0xUJx" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Each program needs at least one active wallet.

The default wallet cannot be deactivated.
{% endhint %}

***

### Create a wallet type

{% stepper %}
{% step %}
Go to **Wallets** -> **Types of Wallets**.
{% endstep %}

{% step %}
Click **ADD NEW WALLET TYPE**.
{% endstep %}

{% step %}
Fill in the required fields.
{% endstep %}

{% step %}
Set the Wallet Type status to **Active**.
{% endstep %}

{% step %}
Click **ADD WALLET TYPE**.
{% endstep %}
{% endstepper %}

***

### What you can configure

Wallet types let you define:

* Basic wallet details, translations, and internal code
* Unit labels, expiration rules, pending time, and balance limits
* Wallet availability, negative balance support, and import or export operations

### Basic settings

Use **Basic settings** to define the wallet identity and labels.

<figure><img src="/files/n3jVJljCKA3uZq7JmiGt" alt=""><figcaption></figcaption></figure>

* **Wallet name** — Display name of the wallet
* **Wallet description** — Short internal or customer-facing description
* **Add translation** — Additional language versions for the name and description
* **Wallet code** — Internal wallet identifier

### Unit settings

Use **Unit settings** to define how wallet units behave.

<figure><img src="/files/BUgJahHsnX7hu7gd2X2h" alt=""><figcaption></figcaption></figure>

* **Unit singular name** — Singular unit label, for example `Star`
* **Unit plural name** — Plural unit label, for example `Stars`
* **Unit expiration method** — When granted units expire
* **Unit pending method** — How long granted units stay locked
* **Global units limitation** — Maximum units granted across the whole program
* **Member units limitation** — Maximum units granted to one member

### Wallet type status

<figure><img src="/files/UU227XHrJY9CxT5xkb5w" alt=""><figcaption></figcaption></figure>

Use **Active** to control whether the wallet is available.

{% hint style="info" %}
After you create a wallet, activation can take a few minutes.
{% endhint %}

{% hint style="info" %}
The **Active** toggle is not available for the default wallet.
{% endhint %}

***

### Unit lifecycle rules

This section controls when units become available and when they expire.

#### Unit expiration method

Choose when granted units expire.

<figure><img src="/files/MXVN0zc4ntD8DYrmxDJB" alt="" width="563"><figcaption></figcaption></figure>

* **No expiration** — Units never expire
* **After X days** — Units expire after a fixed number of days
* **At the end of the month** — Units expire on the last day of the month
* **At the end of the X-th year** — Units expire at the end of the selected year
* **Annual expiration on a chosen date** — Units expire every year on the selected date

#### Unit pending method

Use pending to delay unit availability.

Pending units stay locked until the waiting period ends.

<figure><img src="/files/7AgKZ4BAeZhm9pHUHBhS" alt="" width="563"><figcaption></figcaption></figure>

* **No pending** — Units are available immediately
* **Pending for X days** — Units stay locked for a defined period

After the pending period ends, units become active automatically.

{% hint style="info" %}
**Pending affects expiration differently depending on the method:**

<img src="/files/8xq4K7CWgvta0xb6fLdN" alt="" data-size="original">

* **After X days** — The pending period extends the total time before expiration
* **At the end of the month or year** — Pending does not change the final expiration date
  {% endhint %}

***

### Transfer limits

Use limits to control how many units can be granted automatically.

You can configure:

* **Global units limitation** — Max units granted across all members
* **Member units limitation** — Max units granted to one member

If both limits are enabled, both are enforced.

The transfer is rejected if it exceeds either one.

These limits apply to automatic transfers, such as campaign effects.

You can still adjust units manually when needed.

{% hint style="info" %}
If an automatic transfer is canceled, the units return to the pool.
{% endhint %}

### Negative points balance

You can optionally allow a wallet balance to go below zero.

<figure><img src="/files/3SLfZP1jeNg0COAOoukO" alt=""><figcaption></figcaption></figure>

This lets members spend units even without enough available balance.

In practice, they borrow units from the business.

{% hint style="danger" %}
Use this option carefully! Negative balances can create financial exposure and abuse risk.
{% endhint %}

{% hint style="success" %}
**Good practices for negative balances:**

* Review all campaigns that grant units
* Set accrual limits to reduce abuse risk
* Monitor wallet balances for unusual negative spikes
  {% endhint %}

***

### Import, export, and copy wallet types

You can export and import wallet types as `.json` files.

#### Export wallet types

{% stepper %}
{% step %}
Go to **Wallets** -> **Types of Wallets**.
{% endstep %}

{% step %}
Click **SELECT TO EXPORT**.
{% endstep %}

{% step %}
Select the wallet types to export.
{% endstep %}

{% step %}
Click **EXPORT TO .JSON FILE (X)**.
{% endstep %}
{% endstepper %}

#### Import wallet types

{% stepper %}
{% step %}
Go to **Wallets** -> **Types of Wallets**.
{% endstep %}

{% step %}
Click **ADD WALLET TYPE** -> **Import wallet types**.
{% endstep %}

{% step %}
Upload the `.json` file in the popup window.
{% endstep %}

{% step %}
Click **IMPORT**.
{% endstep %}

{% step %}
Review the import results.
{% endstep %}
{% endstepper %}

#### Copy wallet types to another tenant

{% stepper %}
{% step %}
Go to **Wallets** -> **Types of Wallets**.
{% endstep %}

{% step %}
Click **SELECT TO EXPORT**.
{% endstep %}

{% step %}
Select the wallet types to copy.
{% endstep %}

{% step %}
Click **Export wallets to 'Different tenant' ->** Select the targeted tenant.
{% endstep %}

{% step %}
Click **Copy `Wallets and view the target tenant`**.
{% endstep %}

{% step %}
Review the copied wallet types in the target tenant.
{% endstep %}
{% endstepper %}


# Unit Transfers

Review wallet activity, create manual unit adjustments, and manage the lifecycle of unit transfers.

## Overview

**Unit transfers** show how loyalty units move in and out of member wallets.

They include both **manual admin actions** and **system-generated wallet events**.

Use this section to review wallet history and manage the full transfer lifecycle.

Unit transfers help you:

* See every change to a member’s wallet balance over time
* Audit and troubleshoot unit balance changes
* Add, deduct, or block units manually
* Cancel, expire, or block transfers when needed

{% hint style="warning" %}
**Permissions:** To view and manage unit transfers, your admin role must include the **Wallets → Unit Transfers** permission.
{% endhint %}

***

### What unit transfers include

Unit transfers are not limited to manual corrections.

They can include:

* **Manual changes** created by admins
* **Spending events** from reward redemption
* **System events** such as peer-to-peer transfers
* **Expired or blocked units** that are no longer available

***

### Why this matters

Because unit transfers represent the full wallet history, they help you:

* Track everything that affected a member’s balance
* Understand why a wallet changed over time
* Take corrective action when needed
* Investigate unusual balance behavior or data issues

***

## Learn more about

<table data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Unit Transfers List</strong></td><td>Browse transfer history, filter results, and inspect wallet activity across members.</td><td><a href="/spaces/cNVX03KZzmrGwJihLiEx/pages/jJcXrQlYEKbSbRxHHW9C">/spaces/cNVX03KZzmrGwJihLiEx/pages/jJcXrQlYEKbSbRxHHW9C</a></td></tr><tr><td><strong>Creating Unit Transfers</strong></td><td>Create manual transfers to add, deduct, or block units for a member.</td><td><a href="/spaces/cNVX03KZzmrGwJihLiEx/pages/TEWhEuKP803kAX6rtPvQ">/spaces/cNVX03KZzmrGwJihLiEx/pages/TEWhEuKP803kAX6rtPvQ</a></td></tr><tr><td><strong>Importing Unit Transfers</strong></td><td>Upload many transfers at once with supported import formats.</td><td><a href="/spaces/cNVX03KZzmrGwJihLiEx/pages/qwA7UHhCc9ItQJPvYZkP">/spaces/cNVX03KZzmrGwJihLiEx/pages/qwA7UHhCc9ItQJPvYZkP</a></td></tr><tr><td><strong>Managing Unit Transfers</strong></td><td>Cancel, expire, block, and run bulk actions on existing transfers.</td><td><a href="/spaces/cNVX03KZzmrGwJihLiEx/pages/0vktycVSsvypUQ5vjtkr">/spaces/cNVX03KZzmrGwJihLiEx/pages/0vktycVSsvypUQ5vjtkr</a></td></tr></tbody></table>


# Unit Transfers List

Learn how to browse all unit transfers, use filters, and adjust the view.

## Overview

The **Unit Transfers List** shows a complete history of all unit events (e.g., points) across members’ wallets. This includes both **manual actions** (such as add/deduct/block units) and *system-generated events* like spending, expiration, and peer-to-peer transfers.

This view gives you a full audit trail of how units have moved or changed over time, helping you understand, troubleshoot, and manage wallet balances across your program.

***

## What you see in the list

<figure><img src="/files/4EYiEQ5UisqhOGHVIwxD" alt=""><figcaption></figcaption></figure>

Each row in the Unit Transfers List shows key information about a single unit transfer. Typical fields include, but are not limited to:

* **Member details** – Name, email, phone, loyalty card number
* **State** – Current status of the transfer (e.g., cancelled, pending)
* **Type** – What kind of event it is (e.g. adding, spending, blocked)
* **Value** – Number of units involved
* **Wallet type** – Which wallet the transfer belongs to
* **Comment** – Any note attached during creation
* **Custom attribute** – Any labels (tag) added to a unit transfer
* **Created on** – When the transfer was created
* **Expires at / Locked until** – Dates showing expiration or pending status where applicable
* **Transfer ID** – Unique identifier of the transfer
* **Issuer / Source** – The source of the transfer (e.g. campaign, transaction, manual)

{% hint style="info" %}
If there is no Campaign assosiacted with a transfer, it signifies it is a unit transfer genereted&#x20;
{% endhint %}

This data helps you quickly understand what happened, when it happened, and why it was recorded.

***

## Search and filters

Use the **search box** and **Add filter** option to narrow down the list to the transfers you care about.

<figure><img src="/files/uBgmaQ9t1NwFDLHGPILl" alt=""><figcaption></figcaption></figure>

Common filters include:

* Member identifiers (email, phone number, loyalty card)
* Transfer state (active, cancelled, expired)
* Transfer type (adding, spending, blocked, etc.)
* Wallet type
* Transfer ID
* Date ranges (created, expires, locked until)

Filters make it easy to find transfers for a specific member, period, or type of event.

***

## Customizing the view

Click **Manage columns** to show or hide fields in the list. You can tailor the list to display the most relevant data for your workflow.&#x20;

<figure><img src="/files/cyixqGiLxMT7AJhdBVVU" alt=""><figcaption></figcaption></figure>

Typical columns you might include:

* Member name
* Email
* Transfer type
* Wallet
* Value
* Comment
* Dates (Created on, Expires at, Locked until)

Showing only the fields you need helps you scan the list faster.

***

## How the list relates to wallets

Unit transfers you see here also appear in the **Member’s wallet view** on the member profile page. There, each transfer shows:

* Transfer ID
* Type
* Status
* Value
* Dates (created, performed, registered, expires, unlocked)
* Comment

This gives you consistency between the global list and individual member history.

***

## When to use this list

Use the Unit Transfers List to:

* **Audit unit activity** across members
* **Review specific transfer events** before taking action
* **Troubleshoot balance discrepancies**
* **Prepare filtered subsets** for bulk actions (e.g., cancel or expire transfers)
* **Understand trends** in unit usage, expiration, or blocking

***

## Notes

* The list includes both manual and system-generated transfer events.
* Some columns may require special permissions to view, depending on your admin role.
* Filters and search help you narrow large lists to specific workflows.


# Creating Unit Transfers

Create a unit transfer in the Admin Panel to add or deduct units for a specific member.

## Overview

A *unit transfer* adjusts loyalty units in a member’s wallet. Use it when units don’t come from a purchase or campaign. This is useful for corrections, bonuses, and manual deductions.

Unit transfers appear in the **Unit Transfers List** and become part of the member’s unit history.

### When to use unit transfers

You might create a unit transfer to:

* Give bonus units to a member
* Correct balances after a data or integration issue
* Deduct units for policy compliance
* Apply rewards or penalties manually

### Transfer types

You can choose between:

* **Add units** — Increases a member’s balance
* **Deduct units** — Decreases a member’s balance

{% hint style="info" %}
Unit values support fractional amounts up to six decimal places.
{% endhint %}

### Step-by-step instructions

Follow these steps to create a unit transfer in the Admin Panel:

{% stepper %}
{% step %}
**Open Unit transfers**

Go to **Wallets → Unit transfers**.

<figure><img src="/files/IbCmlLEUrslMdrB9qCGl" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Start a new transfer**

Click **Add units**. (alternatively, click **Deduct units**)

<figure><img src="/files/vQ0vNPtc7OpqQ5XiwoTG" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Fill in transfer details**

Required fields:

* **Wallet type** — Select the wallet to apply units to
* **Member** — Find the member by email, phone, or loyalty card
* **Transfer type** — Choose **Add units** or **Deduct units**
* **Value** — Enter the unit amount

<figure><img src="/files/KNMlNOTwydore7ia1LHO" alt=""><figcaption></figcaption></figure>

Optional fields:

* **Comment** — Add context for audits and support
* **External transfer ID** — Add a unique reference for sync and deduplication
* **Override unit settings rules** — Bypass expiry or locking for this transfer only. This does not change global wallet configuration.
* **Custom attributes** — Add key-value metadata, like `reason` or `orderId`

<figure><img src="/files/zqyRtRmwyZmRaCkaRUmZ" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Confirm the transfer**

Click **Add units** (or the equivalent button for deduction). You’ll see the transfer in the **Unit Transfers List**.
{% endstep %}
{% endstepper %}

### Tips

* Use **comments** to make transfers easy to understand for other admins.
* Set a unique **External transfer ID** if syncing with external systems to prevent duplicate imports.
* **Custom attributes** are great for tagging transfers with extra context (e.g., promotional campaigns or internal references).
* Transfers created by campaigns inherit the campaign's custom attributes, so you can report on manual and automatic transfers using the same keys.


# Importing Unit Transfers

In this article, you’ll learn how to import unit transfers into Open Loyalty.

## Overview

Importing unit transfers lets you **upload many unit adjustments at once** rather than entering them one by one.\
This is especially helpful when you’re working with large volumes of changes — for example when syncing data from another system, applying historic adjustments, or correcting many accounts in&#x20;

bulk.

***

## Why use imports

Importing gives you:

* Faster processing of a large number of transfers
* Reduced manual effort and human errors
* Consistent, repeatable updates to member balances

It’s a practical way to manage many units at once without having to create individual transfers manually.

***

## Prerequisites

Before you begin, make sure you have the following:

1. **Open Loyalty Admin Access**\
   You must be logged into the Admin Panel with permission to import data.
2. **Correct File Format: JSON or XML**\
   Only JSON and XML are accepted by OpenLoyalty for importing unit transfers.
3. **Sample File Structure**\
   Review the structure of JSON and XML files provided below to understand how to format your adding or spending (deducting) transfers. You can find these files under the link below.

{% content-ref url="/pages/-MZBtStiJdMqbAd-5BMa" %}
[Broken mention](broken://pages/-MZBtStiJdMqbAd-5BMa)
{% endcontent-ref %}

***

## Types of imports

You can import two main kinds of unit transfers:

* **Adding units** — Used when you want to award points or credits
* **Spending / Deducting units** — Used when removing units from member wallets

Make sure your file clearly identifies which transfers are additions and which are deductions.

***

## Understanding the Import File

OpenLoyalty supports two key scenarios when importing unit transfers:

1. **Adding Units (e.g., awarding units)**
2. **Spending or Deducting Units (e.g., redeeming units)**

Your JSON or XML file needs to include fields such as:

* **Customer ID** (required)\
  The unique identifier of the loyalty account to which the transfer applies.

{% hint style="warning" %}
Use the identifier generated by Open Loyalty.&#x20;

First, you might need to match your internal identifier (such as email, phone number, or loyalty card number) to the corresponding member ID in Open Loyalty.
{% endhint %}

* **Units (points)** (required)\
  The number of units that need to be added or deducted.
* **Wallet (walletTypeCode)** (required)\
  The code of the wallet the units need to be added to or deducted from.
* **Date (registeredOn)** (optional)\
  The date of the transfer, typically in `YYYY-MM-DD HH:mm:ss` format.\
  If not specified, the **registeredOn** date will be saved as the date of unit transfer creation.
* **Expire Date** (optional)

  You can define the expiry date for units in two ways:

  * **expireAt**: Specifies the exact date and time of expiry.
  * **expiresInDays**: Indicates how many days from the registration date the units will remain available.
* **Pending Date** (optional)

  You can define the pending (lock) date for units in the following way:

  * **lockedUntilDays**: Indicates how many days from the registration date the units will remain pending (locked).
* **Comment** (optional)\
  Any additional text or comments about this unit transfer.

For detailed structures, please refer to the JSON and XML example files above.

***

## How to Import Unit Transfers

Below is a step-by-step guide on how to import your unit transfers:

#### 1. Navigate to the Import Section

1. In the **OpenLoyalty Admin Panel**, go to **Wallets**, then **Unit transfers.**
2. Select the down arrows next to the **Unit transfers** and select the relevant **Import transfers** option.

<figure><img src="/files/yg2mYpnj3nD3vwQAPhUK" alt=""><figcaption></figcaption></figure>

3. Click **Click to upload** or drag and drop a file.
4. Click on **Import units transfers**.

<figure><img src="/files/zpaAWEMTv7qpiQfKzzgi" alt=""><figcaption></figcaption></figure>

#### 2. Check the Import Results

1. You can find the list of imported files under **Imports / Exports** menu option, in the **Imports** tab.
2. If there are errors, you can filter them out and validate the results.

***

## Troubleshooting and Common Issues

* **Invalid File Format**\
  If you attempt to upload a non-supported file type (like CSV), the system will likely reject it. Make sure you only upload **JSON** or **XML**.
* **Date/Time Format**\
  Ensure your dates are in a format OpenLoyalty accepts (often `YYYY-MM-DD HH:mm:ss`).
* **Invalid Account IDs**\
  The import will fail if an account ID doesn’t exist in the system. Make sure the correct accounts are set up, or update your file to reflect valid IDs.
* **Insufficient Permissions**\
  Only users with the right roles (e.g., Admin or specific Import/Export permissions) can perform imports. Check your user role if you don’t see the import option.

***

## Best practices

To make your imports reliable:

* **Always map member identifiers correctly** before importing.
* Start with a **small test import** to confirm everything is formatted properly.
* Use **unique external transfer IDs** when relevant to avoid duplicates.
* Include meaningful **comments or custom attributes** in the import data so it’s easy to identify why transfers were created.

***

## After the import

Once the import completes:

* You can view the newly created unit transfers in the **Unit Transfers List**
* Use filters to check specific members, dates, or wallet types
* Review the logs for the import in **Imports/Export** section.
* Perform management actions (cancel, expire, block) as needed in the managing sub-article


# Managing Unit Transfers

Cancel, expire, block, and review unit transfers from the Admin Panel.

## Overview

The **Managing Unit Transfers** page lets you take actions on existing unit transfers — whether they were generated by the system or created manually — and inspect detailed history for audit or correction purposes.\
From here, you can cancel, expire, block, or update information attached to unit transfers.

***

## What you can do

From this view or the member’s wallet view, you can:

* **Activate a pending transfer** — make a pending transfer live before its scheduled time
* **Cancel a transfer** — reverse its impact, if possible
* **Expire a transfer** — mark it as expired early when an expiration date exists
* **Block units** — reserve units without deducting balance
* **Unblock units** — cancel a blocked transfer
* **Edit custom attributes** — add or update metadata attached to the transfer
* **Show details** — view complete audit information
* **Run bulk actions** — apply activate, cancel, or expire actions to all filtered transfers

***

### Activate pending transfers

Some unit transfers are created in a **pending** state — meaning they are scheduled and not yet applied to a member’s available balance.

* Pending transfers appear with **Pending: Yes** in the list.
* **Pending transfers do not affect available balance** until activated.
* You can activate a pending transfer manually via the **⋯ (more)** menu when needed.

To activate a pending transfer:

{% stepper %}
{% step %}
**Find the pending transfer**

In the list, look for transfers with **Pending: Yes**.
{% endstep %}

{% step %}
**Open actions**

Open the **⋯ (more)** menu for the transfer.

<figure><img src="/files/YF2nlt9Guy1DAvqLxhmj" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Activate**

Click **Activate**.
{% endstep %}

{% step %}
**Confirm**

Confirm the action.
{% endstep %}
{% endstepper %}

Activating a transfer makes the units available immediately, overriding the scheduled activation.

This is useful when you need to apply transfers sooner than originally planned.

***

### Cancel a transfer

Canceling removes the effect of a transfer **only if the member still has enough units available to reverse it**.

To cancel a transfer:

{% stepper %}
{% step %}
**Find the transfer**

Locate the transfer in the list.
{% endstep %}

{% step %}
**Open actions**

Open the **⋯ (more)** menu for that row.
{% endstep %}

{% step %}
**Cancel**

Select **Cancel**.

<figure><img src="/files/I5i7j8fHnq5pbbjXpk7z" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Confirm**

Confirm the action.

<figure><img src="/files/5WlWTXKMBydta6PTQ0pC" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

{% hint style="warning" %}
**Note:** If a transfer has already been **partially spent or used**, and the wallet doesn’t have sufficient free units to reverse it fully, **cancellation may fail**. The system prevents cancellation in such cases to maintain correct balances.
{% endhint %}

***

### Expire a transfer

Use this when a transfer has an **Expires on** date and is still active.

{% stepper %}
{% step %}
**Find the transfer**

Locate an active transfer with an **Expires on** date.
{% endstep %}

{% step %}
**Open actions**

Open the **⋯ (more)** menu.
{% endstep %}

{% step %}
**Expire**

Click **Expire**.

<figure><img src="/files/ZtaMaRniWcFIASLdnGNC" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Confirm**

Confirm the action.

<figure><img src="/files/nZKXLwpinsahWw8azzeO" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

Expired transfers no longer influence available wallet units.

***

### Block and unblock units

**Block units** to reserve them (they remain in the balance but cannot be spent).

#### Block units

{% stepper %}
{% step %}
**Open Unit transfers or a member wallet**

Go to *Unit transfers* or open a specific member’s wallet view.
{% endstep %}

{% step %}
**Start blocking**

Open **Actions** and choose **Block units**.

<figure><img src="/files/nsw7lDaTRsMkwRY1UjXk" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Fill in details**

Enter the member, wallet, and amount.

<figure><img src="/files/7rFZrOu7orsdIO7VhZDg" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Confirm**

Confirm the action.
{% endstep %}
{% endstepper %}

#### Unblock units

To **unblock units**, cancel the blocked transfer.

{% stepper %}
{% step %}
**Find the blocked transfer**

Locate a transfer with type/state **blocked**.
{% endstep %}

{% step %}
**Cancel the block**

Open the **⋯ (more)** menu and select **Cancel**.
{% endstep %}

{% step %}
**Confirm**

Confirm the action.
{% endstep %}
{% endstepper %}

***

### Edit custom attributes

**Custom attributes** let you attach extra metadata to a unit transfer — like reasons, external references, or internal tags — without affecting core fields.

To edit custom attributes:

{% stepper %}
{% step %}
**Find the transfer**

Select the unit transfer in the list.
{% endstep %}

{% step %}
**Open actions**

Open the **⋯ (more)** menu.
{% endstep %}

{% step %}
**Edit custom attributes**

Choose **Edit custom attributes**.

<figure><img src="/files/qOZRT7RbKE2x967w2ner" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Update key-value pairs**

Add or update attributes (for example `reason: "data correction"` or `sourceSystem: "CRM"`).

<figure><img src="/files/01oIug5yGOfHr5RYG5nU" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Save**

Save your changes.
{% endstep %}
{% endstepper %}

Custom attributes are useful for tracking business context, reporting insights, or external integrations.

***

### Bulk actions

You can apply operations to multiple transfers simultaneously using the **Actions** menu located at the top of the transfer list.

{% stepper %}
{% step %}
**Filter the list (Crucial Step)**

Before triggering a bulk action, you **must** refine your view. Since mass actions apply to the entire filtered result set, precision is key to avoiding unintended changes.

* **Establish a Point of Reference:** Use specific criteria to isolate your target data. Common anchors include a specific **Date Range**, a unique **Campaign Name**, or a **Member ID**.
* **Verify the Count:** Always check the total record count after filtering to ensure it matches your expectations before proceeding.

<figure><img src="/files/fhhYSgbGfujl74FuiANo" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Run an action**

Click the **Actions** button and select the required operation:

* **Activate filtered transfers**: Moves all pending transfers to an active state.
* **Cancel filtered transfers**: Cancels all transfers within the filtered parameters.
* **Manage filtered transfers**: Opens a detailed menu to adjust expiration settings for the filtered set:
  * *Expire units transfers immediately:* Forces an instant expiration.
  * *Expire units transfers on a chosen date:* Sets a custom expiration date/time that overrides default rules.
  * *Do not expire:* Disables expiration for the selected records.

<figure><img src="/files/0pxdI3ylodRb0gt0SwUK" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Confirm and Audit**

After selecting an action, you can add an optional **comment** to the action for the audit trail. Once you click **Confirm** (or **Adjust expiration**), the system will process the changes in the background.

<figure><img src="/files/WkIT2XILUcyj7dGRUNpb" alt=""><figcaption></figcaption></figure>

* **Tracking**: You can monitor the progress and history of these tasks in the **Mass Actions Log** located under **Imports/Exports.**
  {% endstep %}
  {% endstepper %}

***

## Unit transfer types and states

Common types you’ll see in the list include:

* `adding` — units added
* `spending` — units spent
* `blocked` — units reserved
* `expired` — units that have expired
* `p2p_adding` / `p2p_spending` — peer-to-peer moves

Understanding the type helps interpret the event and decide which action (like cancel or expire) is appropriate.

***

## Tips

* When editing custom attributes, use clear key names and descriptive values for easier reporting and audit trails.
* Always filter before running bulk actions to avoid unintended changes.
* If cancellation fails, check whether the member’s wallet still has enough available units to cover the reversal.


# Campaigns

In this section, you will get to know everything related to Campaigns.

## Campaigns Overview

Campaigns in Open Loyalty enable you to automate personalized marketing efforts by setting up rewards and incentives based on time, customer actions, or referrals. Campaigns are organized into three distinct types:

* **Automation Campaigns** – time-based (daily, weekly, monthly), birthday, or membership anniversary triggers
* **Direct Campaigns** – triggered by customer behavior such as purchases, returns, or specific events
* **Referral Campaigns** – incentives for both referrers and referees, based on user actions

This mechanism enables rewarding customers who satisfy the criteria outlined in a campaign.

***

### 🔗 Structure at a Glance

<table><thead><tr><th width="157">Campaign Type</th><th>Triggered By</th><th>Key Use Cases</th></tr></thead><tbody><tr><td><strong>Automation</strong></td><td>Schedule (e.g., daily/weekly/monthly), birthdays, anniversary</td><td>Regular engagement reminders, milestone rewards</td></tr><tr><td><strong>Direct</strong></td><td>1. Purchase transaction<br>2. Return transaction<br>3. Internal event<br>4. Custom event<br>5. Achievement earned<br>6. Redemption code used</td><td>Trigger promotions instantly after customer actions</td></tr><tr><td><strong>Referral</strong></td><td>Same six triggers as Direct; two rule sets: Referrer &#x26; Referee</td><td>Reward both parties for successful referrals</td></tr></tbody></table>

***

### 🚀 What You’ll Learn in This Section

* Discover the different campaign categories and appropriate scenarios
* Explore a unified workflow: Creating → Managing → Analyzing → Troubleshooting campaigns
* Access shared resources on audience segmentation, rewards, cloning, and more

***

## Learn more about

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Automation Campaigns</strong></td><td>Learn more about automation campaigns and how to create one.</td><td></td><td><a href="/pages/iyIxJA45X0KF9ppibCqy">/pages/iyIxJA45X0KF9ppibCqy</a></td></tr><tr><td><strong>Campaigns &#x26; Referral Campaigns</strong></td><td>Learn how to manage campaigns.</td><td></td><td><a href="/pages/KlZdOCB5E9ZmkmVXaZ62">/pages/KlZdOCB5E9ZmkmVXaZ62</a></td></tr><tr><td><strong>Campaign Simulation</strong></td><td>Learn how you can check the expected campaing outcome.</td><td></td><td><a href="/pages/kNF1QsocBs7SQFNcqyPk">/pages/kNF1QsocBs7SQFNcqyPk</a></td></tr><tr><td><strong>Monitoring and Analytics</strong></td><td>Learn more about how to monitor campaigns and analyse their engagement and budgets.</td><td></td><td><a href="/pages/bcEN516g7WiwElql1slQ">/pages/bcEN516g7WiwElql1slQ</a></td></tr></tbody></table>


# Automation Campaigns

In this section, you will learn about Automation Campaigns.

## What are Automation Campaigns?

**Automation Campaigns** (formerly known as time-based campaigns) let you schedule loyalty initiatives to run automatically - triggered by a date or a recurring schedule - without manual intervention.

{% hint style="info" %}
**Automation Campaigns** run after midnight according to the timezone configured for the tenant.
{% endhint %}

{% hint style="warning" %}
**Performance limitations**

* **Automation Campaigns** can be triggered for audiences equal to or lower than 200,000 (limit does not apply to Birthday Campaigns and Membership Anniversary Campaigns).&#x20;
* The maximum number of **Automation Campaigns** is 4 (active and inactive) in the loyalty program (in one tenant).
  {% endhint %}

***

### 🚀 What Automation Campaigns Do

They’re designed to automatically reward members at key times:

* **Triggers** include recurring schedules (daily, weekly, monthly), birthdays, and membership anniversaries.
* **Rules** specify conditions (member segment, tier, custom attributes) and effects (awarding points, coupons, balance adjustments).
* **Limits & Budgets** control how many rewards can be issued overall or per member.
* **Visibility & Status** settings decide who sees the campaign and when it becomes active.

***

### 🎯 Summary Table

<figure><img src="/files/j4j7OCe7DadLovaShqPq" alt=""><figcaption></figcaption></figure>

| Trigger Type    | Fires On                            | Audience Options                                       | Common Use Cases                    |
| --------------- | ----------------------------------- | ------------------------------------------------------ | ----------------------------------- |
| **Daily**       | Every day at 00:00                  | <p>Everyone / Segment / Tier<br>Rule-based filters</p> | Streak rewards for active members   |
| **Weekly**      | Chosen weekday(s) at 00:00          | Same as above                                          | Weekend promotions, weekly gifts    |
| **Monthly**     | Chosen date(s) or last day at 00:00 | Same as above                                          | Subscription reminders, updates     |
| **Birthday**    | Member birth date                   | Same as above                                          | Birthday bonuses, celebratory perks |
| **Anniversary** | Membership signup date              | Same as above                                          | Loyalty anniversary bonuses         |

Additional filters can be applied in Rule Conditions—even if not selectable at the audience level.

***

### ✅ Best Practices

* **Schedule thoughtfully**: Use appropriate frequency and timing (e.g. birthdays vs monthly).
* **Segment wisely**: Target specific audiences to increase relevance.
* **Rate-control your rewards**: Set sensible per-member and total limits before launching.
* **Monitor engagement**: Use dashboard analytics to identify spikes or drops.
* **Iterate using duplicates**: Copy campaigns for A/B testing.
* **Clean responsibly**: Deactivate and export before deleting, ensuring historical reward data remains accurate.

***

## Learn more about

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Creating Automations</strong></td><td><a href="/pages/X7y3Jfl1upf29W8EO08D">/pages/X7y3Jfl1upf29W8EO08D</a></td></tr><tr><td><strong>Managing Automations</strong></td><td><a href="/pages/FN9tYubBmM5jXCsKIrwx">/pages/FN9tYubBmM5jXCsKIrwx</a></td></tr><tr><td><strong>Deleting Automations</strong></td><td><a href="/pages/KGv5b5ZpUJfa5iKV31Ch">/pages/KGv5b5ZpUJfa5iKV31Ch</a></td></tr></tbody></table>


# Creating Automations

In this article, you will learn how to create automation campaigns.

Automation campaigns in Open Loyalty allow you to automatically reward members based on scheduled triggers - daily, weekly, monthly, birthdays, or membership anniversaries.

## 🛠️ Step-by-Step Setup

Follow these steps to set up a new leaderboard in your Open Loyalty environment:

{% stepper %}
{% step %}

### Navigate to Automation Campaigns

* From the left-hand menu, go to **Automations**
* Click **Add automation campaign** (or use the ▼ to **Import** existing automation configuration)
  {% endstep %}

{% step %}

### Choose Your Trigger

Select the timing that best fits your automation campaign goal:

* **Daily** – runs every day
* **Weekly** – choose specific weekday(s)
* **Monthly** – pick exact date(s) or “Last day of month”
* **Member’s birthday** – runs on each member’s birthday
* **Membership anniversary** – runs on the join date anniversary

<figure><img src="/files/tR79uESOLqzgOQjglrUh" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
Automation campaigns run at 00:00 (according to the configured tenant timezone)
{% endhint %}
{% endstep %}

{% step %}

### Define Target Audience

Who should participate in the automation campaign?

* **Everyone**
* A single **Segment**
* A single **Tier**

<figure><img src="/files/QcWzSEvxyRKi9BsFuGDO" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Basic Settings

Fill in these core details:

* **Name & Description** – Choose a distinctive name and optionally add the description. \
  If you added another language in the settings, you will be able to add translations.
* **Start & End Dates** – Start date is required; the end date is optional but must be after the start date.
* **Display Order** (optional)
* **Visibility** – Choose who sees the campaign: Everyone, specific Segments/Tiers, or Hidden.

{% hint style="warning" %}
**Campaign visibility** only determines to whom the challenge is presented. If you want to target given audience, the condition must be specified in the rules.

* **Visibility** - displaying the campaign, e.g. for a given segment or tier
* **Conditions** - being able to earn points, e.g. for a given segment or tier

Therefore, the precise targeting of the campaigns depends on the conditions specified in the rules section.
{% endhint %}

<figure><img src="/files/388JUkEb7tX2Of7cubUD" alt=""><figcaption></figcaption></figure>

Optionally define **custom attributes** (key:value pairs) to tag or filter the automation campaign in APIs and UI

<figure><img src="/files/0mbGLQ0imEMCST3dYVGp" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Add Rules: Conditions & Effects

* Click **Add new rule**<br>

  <figure><img src="/files/TRiewtGdSYA0tY2oKUVt" alt=""><figcaption></figcaption></figure>
* **Conditions**: e.g., membership tier, purchase history, custom attributes
* **Effects**: e.g., “Add units” (e.g., 10 points), coupons, or “Deduct units”
* Use multiple rules to cover diverse scenarios

<figure><img src="/files/oUUierwsf2X9YNYpCjS4" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Set Limits & Budget

Control how often a member can receive the automation campaign's reward:

**Automation Campaign Limit**

* **Per‑member limit**: per hour/day/week/month/year or total
* **Global budget**: total units issued, and per‑member units cap

<figure><img src="/files/xyU7f797821KL9TyIrIG" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Toggle Campaign Status&#x20;

* Use the **Active** switch to enable or pause the campaign
* Only active campaigns trigger at their scheduled times

<figure><img src="/files/ce6RIblycyq4Bj7mkaA6" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

***

## ✅ Best Practices

* Prefer longer-term triggers for special events (birthday, anniversary)
* Use automatic audience segments/tier filters in **Basic Settings**
* Scale gradually - fine-tune limits and budgets as you assess performance

***

## 🔍 Troubleshooting Tips

* **No effect?** \
  Check campaign status, scheduling, and rule conditions
* **Zero units issued?** \
  Review your per-member limits and global budget caps
* **Birthday/anniversary misfires?** \
  Validate member data - missing or future dates won’t trigger at 00:00


# Managing Automations

In this article, you will learn how to manage automation campaigns.

Automation Campaigns can be edited, cloned, deleted, and migrated across tenants.&#x20;

This article guides you through each operation.

## 🔎 Overview of Actions

<table><thead><tr><th width="159">Action</th><th>Steps (⋮ overflow menu)</th><th>Notes</th></tr></thead><tbody><tr><td>Edit</td><td>Select <em>Edit campaign</em></td><td>Modify existing campaign</td></tr><tr><td>Deactivate / Activate</td><td>Deactivate/Activate automation</td><td>Pause or resume scheduled runs</td></tr><tr><td>Duplicate</td><td>Select <em>Duplicate campaign</em> → Edit copy → Add campaign</td><td>Create a copy of the campaign within the same tenant</td></tr><tr><td>Export</td><td>Select multiple → <em>Export to .JSON</em></td><td>Export configuration to another environment</td></tr><tr><td>Import</td><td>Add campaign → <em>Import campaigns</em></td><td>Import configuration from another environment</td></tr><tr><td>Migrate tenant</td><td>Export → <em>Export to Different tenant</em> → Import</td><td>Export configuration to another tenant within the same environment</td></tr><tr><td>Delete</td><td>Select <em>Delete campaign</em> → Confirm</td><td>Delete the unused or old campaign</td></tr></tbody></table>

### ✍️ Editing an Automation Campaign

1. Navigate to **Automation** and locate the desired automation campaign in the list.
2. Click the **⋮ (overflow menu)** next to it and choose **Edit campaign**.
   1. Alternatively: Click on the automation campaign, then click on **Actions → Edit Automation Campaign**
3. Make adjustments to scheduling, rules, visibility, or budget.
4. Click **Save changes** to apply the changes.
5. To duplicate parts of a campaign, use the **Copy Rules, Conditions, and Effects** button in the editor.

***

### 🔄 2. Activate / Deactivate an Automation Campaign

1. Open the **⋮** menu on any campaign row.
2. Choose **Deactivate automation campaign** or **Activate automation campaign** (depending on its current state).
3. The campaign will immediately pause or resume triggering.

***

### 📄 Duplicating an Automation Campaign

Cloning is ideal for testing variations or launching similar campaigns:

1. Open the ⋮ overflow menu on the automation campaigns list.
2. Select **Duplicate automation campaign**.
3. You'll be redirected to the editor with a new inactive copy.
4. Update details (e.g., timing, audience) and click **Add automation campaign**.

{% hint style="info" %}
By default, the copies of the configuration are disabled. Remember to enable the automation campaigns!
{% endhint %}

***

### 🗂️ Exporting & Importing Automation Campaigns

* Bulk export campaigns to a `.json` file via **Bulk Actions → Selecting the automation campaigns  → Download to .JSON file**.
* Re-import via **Add automation campaign → Import automation campaigns**.

***

### 🔄 Migrating Across Tenants

To migrate campaigns:

* Click on **Bulk Actions** and select the automation campaigns you want to copy
* Click on **Copy to different tenant**, select the destination, and complete the import.
* The system guides you through any conflicts as you proceed.

You will be redirected to the target tenant you chose.

{% hint style="warning" %}
Only the configuration of the automation campaign is migrated.&#x20;

The history of the automation campaign, along with previously issued units or rewards, is not migrated.
{% endhint %}

***

### 🗑️ Deleting an Automation Campaign

1. In the campaign list, use the **⋮ menu → Delete automation campaign** option.
2. Confirm the deletion; the campaign is removed from the tenant you are working on.

{% hint style="danger" %}
Deleting a campaign removes it from the UI but **does not delete any reward or engagement data** generated by that campaign. These remain in analytics and member records.
{% endhint %}

For detailed information, please refer to the article below:

{% content-ref url="/pages/KGv5b5ZpUJfa5iKV31Ch" %}
[Deleting Automations](/campaigns/campaigns/automation-campaigns/deleting-automations)
{% endcontent-ref %}

***

## ✅ Additional Notes

* **Deactivate** before editing large changes to avoid unintended triggers.
* **Duplicate** to create campaign variations for A/B testing across segments or timings.
* Archive functionality is not currently supported - **deleted** campaigns are permanently removed.


# Deleting Automations

In this article, you will learn how to delete automation campaigns.

Deleting a campaign removes it from the UI but **does not delete any reward or engagement data** generated by that campaign. These transactions remain in analytics and member records.

***

## 🧭 When to Delete

* Campaign is outdated or no longer relevant
* You've exported or archived it manually (via JSON)
* You want to clean up unused campaign configurations or free up the limit

***

## 🗓️ How to Delete

1. Go to **Automation Campaigns**
2. Find the target campaign
3. Click the **⋮ menu → Delete automation campaign**
4. Confirm deletion in the dialog box
5. Automation campaign disappears from the list

***

## 📌 Important Notes

* **Reward transfers, unit logs, and analytics** remain in system records.
* Historical reports and dashboards might still show data related to the deleted campaign.
* Deletion does **not revoke rewards** nor remove them from member balances.

***

## ✅ Post-Deletion Considerations

* Deleted campaigns cannot be restored—use duplicates or exports for backups.
* For audit or regulatory compliance, retain logs of deleted campaigns.
* Ensure that team members understand that deletion doesn’t erase campaign impact.


# Campaigns & Referral Campaigns

Learn how to configure and monitor your campaigns.

Open Loyalty lets you create flexible and powerful **campaigns** that reward your members based on specific actions or achievements. These campaigns can drive engagement, incentivize behavior, and grow your program through both **direct interaction** and **referrals**.

This article gives you an overview of how **Direct Campaigns** and **Referral Campaigns** work, and links out to their configuration guides.

***

### 🧾 Types of Campaigns

There are two main types of campaigns in this section:

#### 🔹 Direct Campaigns

These campaigns are triggered directly by a member’s action, such as making a purchase, achieving a milestone, or redeeming a code. You can configure a wide range of conditions and effects based on:

* **Transaction triggers** (e.g., purchases, returns)
* **Custom and internal events**
* **Achievements**
* **Redemption codes**

#### 🔹 Referral Campaigns

Referral Campaigns reward **referrers** (existing members) based on the activity of the **referees** (newly invited members). These campaigns are ideal for viral program growth.

The logic is triggered when the referred member performs a defined action (such as a transaction or event), and the campaign delivers a reward to the referring member.

You can configure:

* Triggers and conditions based on the referee’s activity
* Multi-level reward structures (1st, 2nd, 3rd level referrers)
* Reward types and limits

***

### ⚙️ Trigger Types

Campaigns are activated by a variety of **event triggers**, each of which supports its own set of conditions and variables. These include:

* [Purchase Transaction](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/purchase-transaction)
* [Return Transaction](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/return-transaction)
* [Internal Event](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/internal-event)
* [Custom Event](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/custom-event)
* [Achievement](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/achievement)
* [Redemption Code](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/redemption-code-campaign)

Each trigger has its own article with details on available attributes, best practices, and example configurations.

***

### 🔧 Configuring Campaigns

Creating and managing campaigns includes several key building blocks:

* **Campaign Effects**: Define how members are rewarded (e.g., add units, give reward).
* **Conditions & Filters**: Apply custom filters based on member attributes, transaction item details, or achievement progress.
* **Limitations**: Control how many times a campaign can issue rewards globally or per member.
* **Expressions & Variables**: Use dynamic formulas and member data to fine-tune your logic.
* **Templates with Autocomplete**: Simplify the configuration with smart autocomplete for variables.
* **Custom Attributes**: Use member-specific custom data in filters or expressions.
* **Distribution Rules**: Define how many units to distribute using static or percent-based logic.

See the campaign creation guide for a complete walkthrough:<br>

{% content-ref url="/pages/HQuxPjB52QWPOej7zG7G" %}
[Creating Campaigns](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns)
{% endcontent-ref %}

***

### ✅ Best Practices

* **Schedule thoughtfully**: Use appropriate frequency and timing.
* **Segment wisely**: Target specific audiences to increase relevance.
* **Rate-control your rewards**: Set sensible per-member and total limits before launching.
* **Monitor engagement**: Use dashboard analytics to identify spikes or drops.
* **Iterate using duplicates**: Copy campaigns for A/B testing.
* **Clean responsibly**: Deactivate and export before deleting, ensuring historical reward data remains accurate.

***

## Learn more about

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Creating Campaigns</strong></td><td><a href="/pages/HQuxPjB52QWPOej7zG7G">/pages/HQuxPjB52QWPOej7zG7G</a></td></tr><tr><td><strong>Managing Campaigns</strong></td><td><a href="/pages/CBoxyQP6CGolLXwUSHYn">/pages/CBoxyQP6CGolLXwUSHYn</a></td></tr><tr><td><strong>Deleting Campaigns</strong></td><td><a href="/pages/PmVfciITeoL9AnaOEJBQ">/pages/PmVfciITeoL9AnaOEJBQ</a></td></tr><tr><td><strong>Trigger Types</strong></td><td><a href="/pages/49q24QdBkVP1LBiauWNv">/pages/49q24QdBkVP1LBiauWNv</a></td></tr><tr><td><strong>Referral Campaigns</strong></td><td><a href="/pages/2TMM68lFVeTp1OgMW7Gf">/pages/2TMM68lFVeTp1OgMW7Gf</a></td></tr><tr><td><strong>Campaign Limitation</strong></td><td><a href="/pages/uZgkuToQPBFwtVSmVzwv">/pages/uZgkuToQPBFwtVSmVzwv</a></td></tr></tbody></table>

### 🧠 Related Articles

{% content-ref url="/pages/bcEN516g7WiwElql1slQ" %}
[Monitoring & Analytics](/campaigns/campaigns/monitoring-and-analytics)
{% endcontent-ref %}

{% content-ref url="/pages/kNF1QsocBs7SQFNcqyPk" %}
[Campaign Simulation](/campaigns/campaigns/campaign-simulation)
{% endcontent-ref %}

{% content-ref url="/pages/uUCidbYe2emZ99wJq0Jg" %}
[Custom Units Expiration & Pending Settings](/campaigns/campaigns/custom-units-expiration-and-pending-settings)
{% endcontent-ref %}

{% content-ref url="/pages/AuZ2WANdc34mx304POYB" %}
[Using Expressions](/campaigns/campaigns/using-expressions)
{% endcontent-ref %}

{% content-ref url="/pages/xhRn42iGj5amwW8V9wKI" %}
[Transaction Item Filters](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/transaction-item-filters)
{% endcontent-ref %}


# Creating Campaigns

Learn more about campaign types and how to create one.

Craft your campaign by following these core steps—triggers are handled separately, so this covers the universal setup.

## 🛠️ Step-by-Step Setup

Follow these steps to set up a new leaderboard in your Open Loyalty environment:

{% stepper %}
{% step %}

### Navigate to Campaigns

* From the left-hand menu, go to **Campaigns** or **Referral Campaigns**
* Click **Add campaign** (or use the ▼ to **Import** existing configuration)
  {% endstep %}

{% step %}

### Choose Your Trigger

Now you need to select the campaign trigger. There are three options available:

* [**Purchase Transaction**](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/purchase-transaction)\
  Purchase transaction matched with a member
* [**Return Transaction**](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/return-transaction)\
  Return transaction matched with a member
* [**Internal Event**](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/internal-event)\
  Event that happens in Open Loyalty e.g., tier updated, member registered/activated, etc.
* [**Custom Event**](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/custom-event)\
  Events sourced from an external system or application
* [**Achievement**](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/achievement)\
  Achievement completed by the member
* [**Redemption Code**](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/redemption-code-campaign)\
  Events based on redeeming generated redemption codes

<figure><img src="/files/sjKe9GOkP1USz1ECwBQH" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
For more information on each of the trigger, please refer to this section of the User Guide: [Trigger Types](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types)
{% endhint %}
{% endstep %}

{% step %}

### Campaign Info - Basic Settings

Fill in these core details:

* **Name & Description** – Choose a distinctive name and optionally add the description. \
  If you added another language in the settings, you will be able to add translations.
* **Display Order** (optional) – Type campaign number on the list (if you use it for ordering)

<figure><img src="/files/bMynuU4UleMScCkDeOpY" alt=""><figcaption></figcaption></figure>

* **Start & End Dates** – Start date is required; the end date is optional but must be after the start date.

<figure><img src="/files/PCBHJrfW0cRCtgj77wQq" alt=""><figcaption></figcaption></figure>

* **Visibility** – Choose who sees the campaign: Everyone, specific Segments/Tiers, or Hidden.

{% hint style="warning" %}
**Campaign visibility** only determines to whom the challenge is presented. If you want to target given audience, the condition must be specified in the rules.

* **Visibility** - displaying the campaign, e.g. for a given segment or tier
* **Conditions** - being able to earn points, e.g. for a given segment or tier

Therefore, the precise targeting of the campaigns depends on the conditions specified in the rules section.
{% endhint %}

<figure><img src="/files/1XX4eFe3BLCKW8iFETQs" alt=""><figcaption></figcaption></figure>

* (Optionally) Define **custom attributes** (key:value pairs) to tag or filter the automation campaign in APIs and UI

{% hint style="info" %}
For more information on how to use campaign custom attributes, please refer to this section of the article: [Custom Attributes in Campaigns](/campaigns/campaigns/custom-attributes-in-campaigns)
{% endhint %}

<figure><img src="/files/ZVX2mM6Sln8vF5i3Wd31" alt=""><figcaption></figcaption></figure>

* **Campaign Status** – The campaign will start only if it is active.

<figure><img src="/files/zEki0Lf7p4rldWmbOVjw" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Transaction Item Filters *(for Purchase or Return Triggers)*

Transaction filters are powerful tools that allow you to refine the products in customers' transactions. By applying specific criteria, such as size, quantity, price, and other relevant factors, you can effectively narrow down the selection to meet your needs.

{% hint style="info" %}
For more information on how to create and use a transaction item filter, please refer to this section of the User Guide: [Transaction Item Filters](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/transaction-item-filters)
{% endhint %}
{% endstep %}

{% step %}

### Add Rules: Conditions & Effects

* Click **Add new rule**<br>

  <figure><img src="/files/F9vC2PZI7UXCHDhfrSlr" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
You can set a maximum of 6 rules in one campaign.&#x20;
{% endhint %}

* **Conditions**: e.g., membership tier, purchase history, custom attributes

{% hint style="danger" %}
You can set a maximum of 30 conditions in one campaign.
{% endhint %}

* **Effects** - you can choose one of the following options:

  * **Deduct Units**\
    Select formulas to add, divide, multiply, and subtract your values and deduct units based on the calculation
  * **Add Units**\
    Select formulas to add, divide, multiply, and subtract your values and add units based on the calculation
  * **Give Reward**\
    Select the Reward that the Member who fulfils the conditions will receive
  * **Set Member Custom Attribute**\
    Set a custom attribute that the Member who fulfils the conditions will get
  * **Remove Member Custom Attribute**\
    Set a custom attribute that will be removed when the Member fulfils conditions
  * **Grant Badge**\
    Award the [Badge](/gamification/badges) of your choice to the Member who fulfils the conditions
  * **Assign a Tier**\
    Manually move the Member who fulfils the conditions to a selected Tier. \
    The member can still advance further based on standard tier criteria after being manually assigned — once they qualify for a higher tier on their own, the manual assignment no longer applies.<br>

    <div data-gb-custom-block data-tag="hint" data-style="info" class="hint hint-info"><p>This effect is only available for campaigns triggered by <strong>Purchase Transaction</strong> or <strong>Custom Event</strong>.</p></div>

* Use multiple rules to cover diverse scenarios

{% hint style="warning" %}
**Keep in mind:** within a single rule, **all** its conditions must be met for the reward to trigger.&#x20;

But if you define **two or more separate rules**, satisfying **all conditions within one rule** will activate its own effect—since each rule operates independently.
{% endhint %}

<figure><img src="/files/CJnOBi7HRsPdaGpsfHVO" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
For more information on how to use autocomplete options for the effects, please refer to this section of the User Guide: [Effects Autocomplete](/campaigns/campaigns/effects-autocomplete)
{% endhint %}
{% endstep %}

{% step %}

### Set Limits & Budget

Control how often a member can receive the campaign's reward:

**Campaign Limit**

* **Per‑member limit**: per hour/day/week/month/year or total
* **Global budget**: total units issued, and per‑member units cap

<figure><img src="/files/GCHomWaIut9Fst53JWR3" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
For more information on how to set up limitations, please refer to this section of the User Guide: [Campaign Limitation](/campaigns/campaigns/campaign-limitation)
{% endhint %}
{% endstep %}

{% step %}

### Summary

* Review the campaign configuration and amend if needed.
* Click on **Add Campaign**

<figure><img src="/files/BSz7awF8Epq1rWYoVtGh" alt=""><figcaption></figcaption></figure>
{% endstep %}
{% endstepper %}

***

## ✅ Best Practices

* **Use clear naming & tags** for easy tracking via admin or API.
* **Localise content** if running multi-language campaigns.
* **Set smart limits** before launch to control issuance.
* **Test rules early**, using test accounts or sandbox environments.
* **Monitor post-launch**, adjusting rules, budgets, or targeting as needed.
* **Scale gradually** - fine-tune limits and budgets as you assess performance.

***


# Trigger Types

Learn more about campaign trigger types and which one to choose for your campaigns.

## Trigger Events

When a relevant event occurs, the system evaluates **all active campaigns with the same trigger** to determine if conditions are met.

<table><thead><tr><th width="255">Trigger Type</th><th>Description</th></tr></thead><tbody><tr><td><strong>Purchase Transaction</strong></td><td>Fires on a successful, member-associated purchase transaction.</td></tr><tr><td><strong>Return Transaction</strong></td><td>Fires on a successful, member-associated return linked to a prior purchase.</td></tr><tr><td><strong>Internal Event</strong></td><td>System-internal actions (e.g., tier change, member activation, profile update, achievement progress).</td></tr><tr><td><strong>Custom Event</strong></td><td>Externally pushed events via API, based on a pre-defined custom event schema.</td></tr><tr><td><strong>Achievement</strong></td><td>Fires when a member completes an achievement (e.g., "First Purchase" milestone).</td></tr><tr><td><strong>Redemption Code</strong></td><td>Fires when a generated code (coupon, QR, etc.) is redeemed by a member.</td></tr></tbody></table>

***

## Learn more about triggers

<table data-view="cards"><thead><tr><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Purchase Transactions</strong></td><td><a href="/pages/IsdbKqY3DREzsCifF1rB">/pages/IsdbKqY3DREzsCifF1rB</a></td></tr><tr><td><strong>Return Transactions</strong></td><td><a href="/pages/tF02RJHopYvKMvWypApc">/pages/tF02RJHopYvKMvWypApc</a></td></tr><tr><td><strong>Internal Event</strong></td><td><a href="/pages/9LNylynq1TnWAU9efBvw">/pages/9LNylynq1TnWAU9efBvw</a></td></tr><tr><td><strong>Custom Event</strong></td><td><a href="/pages/-MhwU9vuj9jlFAx19huA">/pages/-MhwU9vuj9jlFAx19huA</a></td></tr><tr><td><strong>Achievement</strong></td><td><a href="/pages/3GzRr5h9LrApZKWH1p0Y">/pages/3GzRr5h9LrApZKWH1p0Y</a></td></tr><tr><td><strong>Redemption Code</strong></td><td><a href="/pages/SRo81A5dFHGeogQiRBKA">/pages/SRo81A5dFHGeogQiRBKA</a></td></tr></tbody></table>


# Purchase Transaction

This trigger activates a campaign each time a member completes a purchase transaction that is successfully matched in Open Loyalty. Unlike automation campaigns, this trigger is **event-driven**—it reacts to real-time purchase activity and processes applicable campaigns immediately.

***

### 🎯 When This Trigger Fires

This trigger activates when:

* A **purchase transaction** is received (manually or via API), matched to a registered member.
* The system evaluates all active campaigns with this trigger type for that member.
* The campaign’s **conditions are checked**, and upon meeting them, the campaign’s defined **effects are executed**—such as awarding points, issuing coupons, or performing other reward actions.

Effects are applied **only** when the transaction satisfies the campaign’s conditions (e.g., minimum spend, specific SKUs, time-based qualifiers).

***

### 🛠️ Step-by-Step Setup

{% stepper %}
{% step %}
**Add Campaign**

Go to **Campaigns** or **Referral Campaigns** → ***Add campaign*** → select **Purchase Transaction** trigger.
{% endstep %}

{% step %}
**Set Basic Campaign Details**

* Name, Description, Translations
* Start/End Date, Display Order, Visibility (Everyone / Segment / Tier)
* **Campaign Status** – The campaign will start only if it is active
  {% endstep %}

{% step %}
**Add Transaction Item Filer**

Use filters to refine which items in the transaction count toward campaign conditions or effects.

* Select filters such as brand, category, SKU, and custom item attributes.
* In the next step, you will be able to refer to these items only in the campaign rules.

{% hint style="info" %}
For more information on how to create and use a transaction item filter, please refer to this section of the User Guide: [Transaction Item Filters](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/transaction-item-filters)
{% endhint %}
{% endstep %}

{% step %}
**Add Rules**

* **Condition**: (optional) e.g.,
  * *Transaction.grossValue* ≥ 50
  * Includes product filters: brand, category, SKU
  * Date/time qualifiers: weekday, purchase hour
  * Quantity / gross value of the filtered transaction items
* **Effect**: e.g., "Add units: 1 × grossValue", "Add 100 fixed points", "Issue coupon".
  {% endstep %}

{% step %}
**Set Limits & Budget**

* Per-member frequency (e.g., once per month)
* Campaign-level spending caps (total units)
  {% endstep %}

{% step %}
**Summary**

* Review the campaign configuration and amend if needed
* Click on **Add Campaign**
  {% endstep %}
  {% endstepper %}

***

### 📈 Example Use Cases

* **Universal Earn**: 1 point per USD spent (no conditions).
* **Time-Sensitive Bonus**: 2× points on Monday mornings (Condition: weekday = Monday, hour between 9–11).
* **Targeted Product Reward**: Purchase ≥2 of “Acme Drink” → 100 fixed points.<br>

***

### ✅ Best Practices

* *Filter conditions* to ensure rewards align with campaign goals and budget.
* *Apply budget limits* to control issuance.
* *Clone campaigns* to test variants (e.g., different segments, times).
* *Simulate transactions* via API or Campaign Simulator to ensure rules work as expected.<br>

***

### 🧩 What Happens Next

* When a matched transaction arrives, conditions are evaluated, and effects are executed if passed.
* Effects include awarding points, issuing coupons, or adjusting balances.
* Related webhooks are triggered for unit transfers.


# Return Transaction

The **Return Transaction** trigger fires when a return related to a member’s previous purchase is recorded in Open Loyalty. This campaign behaves independently—it does **not** mirror or revert original reward campaigns, but lets you configure a **separate reward or penalty flow** specifically for returns.&#x20;

***

### 🎯 When This Trigger Fires

This trigger activates when:

* A return transaction is submitted via API or admin interface, and
* The return is matched to an existing purchase associated with a member.

***

### ✅ Why Use This Trigger

* **Account Accuracy**: Automatically deducts points or balances when items are returned.&#x20;
* **Fraud Prevention**: Prevents exploitation by reversing rewards on returns.&#x20;
* **Program Integrity**: Ensures return-based adjustments don’t affect member tiers or campaign counters from the original purchase campaign.&#x20;

***

### 🛠️ Step-by-Step Setup

{% stepper %}
{% step %}
**Add Campaign**

Go to **Campaigns** or **Referral Campaigns** → ***Add campaign*** → select **Return Transaction** trigger.
{% endstep %}

{% step %}
**Set Basic Campaign Details**

* Name, Description, Translations
* Start/End Date, Display Order, Visibility (Everyone / Segment / Tier)
* **Campaign Status** – The campaign will start only if it is active
  {% endstep %}

{% step %}
**Add Transaction Item Filer**

Use filters to refine which items in the transaction count toward campaign conditions or effects.

* Select filters such as brand, category, SKU, and custom item attributes.
* In the next step, you will be able to refer to these items only in the campaign rules.

{% hint style="info" %}
For more information on how to create and use a transaction item filter, please refer to this section of the User Guide: [Transaction Item Filters](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/transaction-item-filters)
{% endhint %}
{% endstep %}

{% step %}
**Add Rules**

* **Condition**: (optional) e.g.,
  * *Transaction.grossValue* ≥ 50
  * Includes product filters: brand, category, SKU
  * Date/time qualifiers: weekday, purchase hour
  * Quantity / gross value of the filtered transaction items
* **Effect**: e.g., "Deduct units: 1 × grossValue", "Deduct 100 fixed points", "Issue coupon".
  {% endstep %}

{% step %}
**Set Limits & Budget**

* Per-member frequency (e.g., once per month)
* Campaign-level spending caps (total units)
  {% endstep %}

{% step %}
**Summary**

* Review the campaign configuration and amend if needed
* Click on **Add Campaign**
  {% endstep %}
  {% endstepper %}

***

### 👥 Use Case Examples

* **Reversal Rule**: \
  Deduct the exact number of points earned for returned items.
* **Return Penalty**: \
  Subtract 100 loyalty units for returns over $50.
* **Return Bonus**: (Use case-dependent) \
  Provide a coupon instead of deducting units—for example, redeemable against future purchases.

***

### 📌 Important Notes

* This campaign operates **independently**—it doesn’t affect original purchase campaigns, member tiers, or purchase-based counters.
* Returns must be matched with a member to trigger effects.&#x20;
* Transaction items must be manually added to the return transaction.
* You can configure multiple return campaigns (e.g., tiered deductions for different return reasons or values).

***

### 📊 Best Practices

* **Test Configuration**: \
  Use the **Campaign Simulator** or API to ensure return rules work as expected.
* **Monitor Regularly**: \
  Check engagement and deduction rates to avoid overcharging members.
* **Maintain Transparency**: \
  Clearly communicate return-based deductions in your policy to maintain member trust.


# Internal Event

An **Internal Event** trigger activates when built-in member lifecycle changes occur in Open Loyalty—such as tier updates, account activation, profile modifications, or achievement progress. This allows you to reward or penalize based on system-generated events without external input.&#x20;

***

### 🔔 Supported Internal Events

When creating a Direct or Referral campaign and selecting **Internal Event** as the trigger type, you can choose among:

* **Achievement Progressed**
  * If you want to reward the members based on the progression of the achievement (e.g. once they reach 50% of the goal), please refer to the article below for more guidance on the setup.\
    [Achievement Progressed](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/internal-event/internal-event-achievement-progressed)
* **Member Address Details Updated**
* **Member Company Details Updated**
* **Member Profile Details Updated**
* **Member Tier Updated**
  * You can differentiate between tier moves using the following expressions in rule conditions. For more information, please refer to the article below.\
    [Tier Upgrade or Downgrade](/integrations-and-data-exchange/expressions/sample-use-cases/tier-upgrade-or-downgrade)
* **Member Was Activated**&#x20;

***

### ✅ Why Use This Trigger

* Automates rewards based on system-defined member milestones.
* Separates internal-event-based campaigns from other types for clarity and goal isolation.
* Keeps full control through conditions, effects, and limits.

***

### 🛠️ Step-by-Step Setup&#x20;

{% stepper %}
{% step %}
**Add Campaign**

Go to **Campaigns** or **Referral Campaigns** → ***Add campaign*** → select **Internal Event** trigger.

* Select the type of internal event.
  {% endstep %}

{% step %}
**Set Basic Campaign Details**

* Name, Description, Translations
* Start/End Date, Display Order, Visibility (Everyone / Segment / Tier)
* **Campaign Status** – The campaign will start only if it is active
  {% endstep %}

{% step %}
**Add Rules**

* **Condition**: (optional)
* **Effect**: e.g., "Add units: 1 × grossValue", "Add 100 fixed points", "Issue coupon".
  {% endstep %}

{% step %}
**Set Limits & Budget**

* Per-member frequency (e.g., once per month)
* Campaign-level spending caps (total units)
  {% endstep %}

{% step %}
**Summary**

* Review the campaign configuration and amend if needed
* Click on **Add Campaign**
  {% endstep %}
  {% endstepper %}

***

### 👥 Use Case Examples

* **Tier-Up Bonus**: \
  Award 500 points whenever a member moves up a tier.
* **Welcome Gift:** \
  Add 100 points when a member is activated.
* **Profile Update Reward:** \
  Add 50 points when a member updates their profile.
* **Achievements:** \
  Grant token rewards when progress milestones are reached.

***

### 📊 Best Practices

* **Test Configuration**: \
  Use the **Campaign Simulator** or API to ensure return rules work as expected.
* **Monitor Regularly**: \
  Check engagement and deduction rates to avoid overcharging members.
* **Control Reward Frequency:** \
  Set clear frequency limits to avoid repeated rewards.


# Achievement Progressed

Learn more about the campaign based on the achievement progression.

{% hint style="danger" %}
Please note this is an advanced use case. Contact Open Loyalty Support team if in doubt.

**Make sure to test any configuration thoroughly.**
{% endhint %}

The **Achievement Progressed** internal event allows you to trigger a campaign **each time a member makes progress** within a defined achievement—before they even complete it. This enables more granular reward logic such as **progress-based cashback** or **tiered rewards**.

Use this trigger when you want to **reward members incrementally**, rather than only after an achievement has been fully completed.

***

### 📌 When It’s Useful

This trigger is ideal when you want to:

* Incentivize **ongoing activity** (e.g., monthly spend, visits, transactions).
* Implement **advanced reward distribution** based on how much a member contributes during a given period.
* Combine achievements with campaigns to **distribute units based on thresholds**.

***

### 📥 Available Attributes

When using the `Achievement Progressed` event, you can access both achievement configuration values and the member’s real-time progress.

#### 🔧 Achievement Configuration Attributes

* `periodGoal` – Goal for the current period.
* `consecutivePeriods` – Remaining periods (for achievements based on consecutive goals).

#### 📊 Progress Attributes

* `currentPeriodValue` – Current progress in this period (e.g. amount spent).
* `completedConsecutivePeriods` – Number of completed periods so far.
* `progressChanges` – Change in value since the last progress (i.e. what triggered the event).

{% hint style="info" %}
The complete list of available attributes can be found in the article below:

[Attributes List](/integrations-and-data-exchange/expressions/attributes-list#achievement-progress)
{% endhint %}


# Custom Event

A Custom Event trigger activates when your external system sends a predefined event to Open Loyalty via API. You must first create a **Custom Event Schema**, which defines event names and optional attributes. Once the schema is in place, you can launch a **separate campaign** that responds to those custom events—fully independent from other campaign types.

***

### 🛠️ Step-by-Step Setup

{% stepper %}
{% step %}
**Create Custom Event Schema**

* Navigate to **Custom Events → Custom Event Schemas**
* Add optional  attribute (e.g., `steps`) that can be used later on in the campaign rules.
* Save the schema status to **Active**

{% hint style="info" %}
For more information on how to create a custom event schema, please refer to this section of the User Guide: [Custom Event Schemas](/members-and-activity/custom-events/custom-event-schemas)
{% endhint %}
{% endstep %}

{% step %}
**Add Campaign**

* Go to **Campaigns** or **Referral Campaigns** → ***Add campaign*** → select **Custom Event** trigger.
* Choose your event name from the schema dropdown. Attributes defined in the schema become available for use in rule conditions.&#x20;
  {% endstep %}

{% step %}
**Set Basic Campaign Details**

* Name, Description, Translations
* Start/End Date, Display Order, Visibility (Everyone / Segment / Tier)
* **Campaign Status** – The campaign will start only if it is active
  {% endstep %}

{% step %}
**Add Rules**

* Add **Conditions** using `event.body.<attribute>` (e.g., filtering where `event.body.steps ≥ 5000`)&#x20;
* **Effect**: e.g., "Add units: 1 × amount of steps", "Add 100 fixed points", "Issue coupon".
  {% endstep %}

{% step %}
**Set Limits & Budget**

* Per-member frequency (e.g., once per month)
* Campaign-level spending caps (total units)
  {% endstep %}

{% step %}
**Summary**

* Review the campaign configuration and amend if needed
* Click on **Add Campaign**
  {% endstep %}

{% step %}
**Test Campaign - Send Event via API**

Use `POST /api/{storeCode}/customEvent` with payload:

```json
{
  "event": {
    "type":"app_login",
    "eventDate":"2025-07-15T11:26:46.299Z",
    "customerData": { "email":"email@example.com" },
    "body": { "key":"value" }
  }
}
```

Successful sends return status 200.&#x20;
{% endstep %}
{% endstepper %}

***

### ⚙️ Why Use Custom Event Campaigns

* **Flexibility**: Trigger campaigns on any behavior tracked externally—app usage, fitness milestones, third‑party integrations, and more.&#x20;
* **Precision Targeting**: Use schema attributes in conditions to segment and personalize campaigns.
* **De-coupled Execution**: Events and campaigns are independent—no side effects on other systems.

***

### ✅ Best Practices

* **Define Schemas Thoughtfully**: Include only necessary attributes needed for campaign logic.
* **Test End-to-End**: Send test events via API and verify they appear under **Custom Events** in the admin UI.
* **Limit Rewards**: Use per-member and campaign-wide limits to prevent over-issuing.
* **Track Engagement**: Monitor event-driven campaign metrics to understand response rates.


# Achievement

The **Achievement** trigger initiates a campaign when a member completes a predefined achievement within Open Loyalty. These campaigns are separate from **Achievement** definitions—they activate only when an achievement is completed and operate independently, letting you deliver rewards like points, coupons, or badges.&#x20;

***

### **🆚 What is the difference between Achievement and Campaign?**

Main difference between achievements and campaigns can be summarized to these two points:

1. **Achievements** define and track long-term member goals.
2. **Campaigns** deliver the actual reward when those goals are met—offering full control over reward type, timing, and limits.

For a full breakdown, please refer to the table below:

<table><thead><tr><th width="133">Aspect</th><th>Achievement</th><th>Campaign  (Triggered by Achievement)</th></tr></thead><tbody><tr><td><strong>Purpose</strong></td><td>Tracks member progress across multiple triggers over time (e.g., 5 purchases, 7 logins).</td><td>Awards rewards when an achievement is completed, operating independently.</td></tr><tr><td><strong>Execution</strong></td><td>Monitors cumulative conditions (time-based, streaks, aggregated values).</td><td>Fires on a single event: achievement completion. </td></tr><tr><td><strong>Rewards</strong></td><td>Does <strong>not</strong> directly award units or rewards. Assign badges only.</td><td>Issues points, coupons, or rewards when the linked achievement is triggered.</td></tr><tr><td><strong>Granularity</strong></td><td>Manages multi-step or combined goals (e.g., purchases + custom events).</td><td>Runs per-achievement and per-member—customizable via conditions.</td></tr><tr><td><strong>Independence</strong></td><td>Requires an associated campaign to issue any rewards.</td><td>Fully functional standalone campaign once linked to an achievement.</td></tr><tr><td><strong>Use Cases</strong></td><td>Challenge-based engagement (e.g., loyalty milestones, fitness goals).</td><td>Reward upon completion: e.g., “First Purchase” bonus, “Summer Challenge” prize.</td></tr><tr><td><strong>Lifecycle Control</strong></td><td>Changes in the achievement reset progress across all members.</td><td>Can be paused, duplicated, or deleted independently of the achievement logic.</td></tr></tbody></table>

***

### 🎯 When This Trigger Fires

A campaign with this trigger activates when:

* A member completes an achievement defined in the **Achievements** module.
* Conditions in the campaign match the achievement completion event.&#x20;

{% hint style="danger" %}
If you want to create a campaign to reward a member based on the achievement progress, not the completion, please refer to this section of the User Guide: [Achievement Progressed](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns/trigger-types/internal-event/internal-event-achievement-progressed)
{% endhint %}

***

### 🛠️ Step-by-Step Setup

{% stepper %}
{% step %}
**Set up Achievements**

Under **Achievements**, define your achievement with rules, limits, and goals (e.g., “Buy 5 times in June–August”).

{% hint style="info" %}
For more information on how to create achievements, please refer to this section of the User Guide: [Achievements](/campaigns/achievements)
{% endhint %}
{% endstep %}

{% step %}
**Add Campaign**

Go to **Campaigns** or **Referral Campaigns** → ***Add campaign*** → select **Achievement** trigger.
{% endstep %}

{% step %}
**Set Basic Campaign Details**

* Name, Description, Translations
* Start/End Date, Display Order, Visibility (Everyone / Segment / Tier)
* **Campaign Status** – The campaign will start only if it is active
  {% endstep %}

{% step %}
**Add Rules**

* **Condition**: (optional) e.g., only trigger for members in a specific tier.
* **Effect**: e.g., "Add units: 1 × grossValue", "Add 100 fixed points", "Issue coupon".
  {% endstep %}

{% step %}
**Set Limits & Budget**

* Per-member frequency (e.g., once per month)
* Campaign-level spending caps (total units)
  {% endstep %}

{% step %}
**Summary**

* Review the campaign configuration and amend if needed
* Click on **Add Campaign**
  {% endstep %}
  {% endstepper %}

***

### 👥 Use Case Examples

* **Milestone Bonus**: \
  Reward 100 units when a member completes “First Purchase.”
* **Seasonal Campaign**: \
  Give 200 points for completing the “Summer Buyer” achievement (e.g., 5 purchases during June–August).&#x20;
* **Multi‑Stage Reward**: \
  Award escalating bonuses for multi-step achievements like a login streak followed by purchase behavior.

***

### ✅ Why Use This Trigger

* Encourages ongoing member participation by rewarding multi-step goals.
* Offers flexibility—award based on tiers, segments, or specific attributes at completion time.
* Keeps reward logic separate—achievements track progress, campaigns deliver rewards, simplifying audit and control paths.

***

### 📊 Best Practices

* **Configure Achievements First:**\
  Campaign triggers only based on completed achievements.
* **Test Configuration**: \
  Use the **Campaign Simulator** or API to ensure return rules work as expected.
* **Monitor Regularly**: \
  Check engagement and deduction rates to avoid overcharging members.


# Redemption Code

Learn more about campaign based on the redemption codes.

The **Redemption Code** trigger allows you to run campaigns based on codes entered by members. Codes can be delivered in multiple formats (alphanumeric, QR, barcode) and redeemed via mobile apps, websites, or admin interfaces.

This campaign type requires:

* a **custom event schema** with a code attribute
* properly configured **code source (generated or imported)**

<figure><img src="/files/xGPCH1pkIV84LGPkYEyl" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
The statuses of the codes will dynamically change each time the code is used.
{% endhint %}

***

### Code Sources

Redemption codes can be provided in two ways:

#### 1. Generated Codes (System-based)

The system automatically creates a pool of unique codes during campaign setup. Additional codes can be generated later on.

<figure><img src="/files/ug4gHB5DS5yJS1nEiNJu" alt=""><figcaption></figcaption></figure>

You can configure:

* number of codes
* code length
* prefix
* character set (numeric, alpha, alphanumeric)

This option is recommended when:

* you don’t need predefined codes
* codes are distributed dynamically (e.g. via API, app, email)

#### 2. Imported Codes (CSV upload)

You can upload your own predefined codes using a `.csv` file.

<figure><img src="/files/UtCnxLuV2OXpSYhdK0nP" alt=""><figcaption></figcaption></figure>

This option is recommended when:

* codes are printed externally (e.g. on products, flyers)
* codes come from another system
* you need full control over the code list

{% hint style="info" %}
For more information on the sample import file for redemption codes upload, please refer to this section of the User Guide: [Broken mention](broken://pages/-MZBtStiJdMqbAd-5BMa#redemption-codes)
{% endhint %}

#### Import Process (Asynchronous)

Code import is processed **asynchronously**.

What this means in practice:

* After uploading the CSV, codes are **not immediately available**
* Import is queued and processed in the background
* Progress and results can be monitored in 👉 **Imports / Exports section**

Until the import is completed, codes **cannot be used in campaigns**.

#### Using Imported vs Generated Codes

Once available, **both imported and generated codes behave identically**:

* they are stored in the same pool
* they follow the same lifecycle (e.g. usage status updates)
* they trigger campaigns in the same way
* they are validated against the same event attribute

There is **no difference at runtime** between:

* a system-generated code
* an imported code

***

### 🛠️ Step-by-Step Setup

{% stepper %}
{% step %}
**Create a Custom Event Schema**

{% hint style="warning" %}
It is a one-step activity. The same schema can be reused for multiple campaigns.
{% endhint %}

* Navigate to **Custom Events → Custom Event Schemas**
* Add a text-type attribute (e.g., `promo_code`) for your redemption codes.
* Save the schema status to **Active**

{% hint style="info" %}
For more information on how to create a custom event schema, please refer to this section of the User Guide: [Custom Event Schemas](/members-and-activity/custom-events/custom-event-schemas)
{% endhint %}
{% endstep %}

{% step %}
**Add Campaign**

* Go to **Campaigns** or **Referral Campaign → Add campaign**
* Under **Trigger**, select **Redemption Code**
  {% endstep %}

{% step %}
**Choose Code Source**

**Option A — Generate codes (system-generated)**

* **Quantity**: Number of initial codes to distribute (you can add more later)
* **Length**: Number of characters per code
* **Prefix**: Optional fixed text added before each code
* **Character set**: Choose numeric, alpha, or alphanumeric

<figure><img src="/files/HvHtzBxEXpMwp0vp1BLp" alt=""><figcaption></figcaption></figure>

**Option B — Import codes (CSV upload)**

* Select **Import**
* Finish campaign creation first
* Upload your `.csv` file in the **Redemption Codes** section

<figure><img src="/files/0kLSGcqDuAqXlbbhwSJF" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Set Basic Campaign Details**

* Name, Description, Translations
* Start/End Date, Display Order, Visibility (Everyone / Segment / Tier)
* **Campaign Status** – The campaign will start only if it is active
  {% endstep %}

{% step %}
**Add Rules**

* **Condition**: (optional) e.g., only trigger for members in a specific tier.
* **Effect**: e.g., "Add 100 fixed points", "Issue coupon".
  {% endstep %}

{% step %}
**Set Limits & Budget**

* Per-member frequency (e.g., once per month)
* Campaign-level spending caps (total units)
  {% endstep %}

{% step %}
**Summary**

* Review the campaign configuration and amend if needed
* Click on **Add Campaign**
  {% endstep %}
  {% endstepper %}

***

### 📋 Managing Codes

* **View or export codes**:\
  In the campaign list, click the **⋮ menu → Show**, then optionally **Export to CSV** to extract the generated codes and their statuses. Statuses include **used** and **unused**.&#x20;
* **Track code usage**:\
  Dashboard metrics show total codes redeemed versus remaining codes left&#x20;

<figure><img src="/files/dpQRw4svk2cdAUTnoT9n" alt=""><figcaption></figcaption></figure>

***

### ✅ Why Use Redemption Code Triggers

* **Offline-to-Online engagement**: Scanable codes from receipts, email, or in-store collateral.
* **Limit control**: Pre-generate and manage set code counts to control campaign scale.
* **Flexible targeting**: Conditions on the event attribute (`promo_code`) allow personalization (e.g., VIP-only codes).
* **Full autonomy**: Campaign logic is separate, ensuring your code campaigns don’t impact other campaign types.

***

### 🧠 Best Practices

* **Keep schemas simple**—only include attributes needed for matching or personalization.
* **Test thoroughly**: Generate a small set of codes, import them into your schema attribute, and test redemption scenarios.
* **Monitor redemption trends** via the overview to adjust issuance or messaging.
* **Rotate prefixes** for limited-time campaigns to avoid reuse or confusion.


# Referral Campaign

Learn more about referral campaigns.

Referral campaigns enable you to reward both **existing members (referrers)** and **newly recruited ones (referees)** when a successful referral occurs, or based on the actions after the referral. These campaigns are an effective tool to encourage organic program growth and build community engagement.

***

### 🧠 How It Works

A referral campaign is a special campaign type that grants rewards **when a referred member completes a defined activity** (e.g. a purchase). The campaign logic is tied to the **referrer–referee relationship** and executes based on the referee's actions.

***

### 🛠️ Configuring a Referral Campaign

To configure a referral campaign, you can follow the steps outlined in the article below:

{% content-ref url="/pages/HQuxPjB52QWPOej7zG7G" %}
[Creating Campaigns](/campaigns/campaigns/campaigns-and-referral-campaigns/creating-campaigns)
{% endcontent-ref %}

The main difference is - the 'Rules' section is divided into the 'Rules for Referrer' and 'Rules for Referee' sub-sections. There, you can create conditions you would like to apply respectively for Referrer, for Referee, or for both, and reward them accordingly.

***

### 🔗 Multi-level Campaign Configuration

The **multi-level referral** feature allows you to create referral campaigns that reward **multiple levels of the referral chain**.

<figure><img src="/files/uXOx6BNUr6xklb27GAZb" alt=""><figcaption></figcaption></figure>

Instead of rewarding only the direct referrer, you can configure additional effects for second-level, third-level, or further referrers. This helps you:

* Expand reach by incentivizing deeper referral networks.
* Encourage viral growth and word-of-mouth promotion.
* Customize reward amounts for each referral level.

For example:

* Level 1 referrer receives 100 points.
* Level 2 referrer receives 50 points.
* Level 3 referrer receives 20 points.

This tiered incentive structure boosts both **sales** and **member engagement**, motivating participants to actively grow your program.

***

### 🎯 Example Scenario

Let’s say you want to reward members who refer others to your program. Here’s how a simple setup might look:

* **Trigger**: Purchase transaction by the referee.
* **Condition**: Transaction value exceeds $20.
* **Effect**: Grant 100 points to the referrer.
* **Limit**: Max 5 successful referrals per referrer.

When a referee (a newly joined member) completes a purchase over $20, their referrer automatically receives 100 points—up to the defined limit.

***

### ⚙️ Additional Notes

* You can define different reward structures based on conditions met by the referred member.
* The referral relationship is based on the **referrerId** field in the referee’s member profile.

***

### ✅ Summary

Referral campaigns are a powerful way to expand your loyalty program through peer-to-peer promotion. By configuring rewards based on referee activity, you create a meaningful incentive for members to spread the word, driving both engagement and growth.

### Related articles:

{% content-ref url="/pages/Lywj6gE33DaBkknwW3HW" %}
[Referral Programs](/faq/referral-programs)
{% endcontent-ref %}

{% content-ref url="/pages/VB6OPrZdiWJP1G4CNdAX" %}
[Broken mention](broken://pages/VB6OPrZdiWJP1G4CNdAX)
{% endcontent-ref %}


# Transaction Item Filters

Transaction Item Filters enable precise targeting within loyalty campaigns by allowing you to isolate specific products in a customer's purchase.

Transaction item filters are a powerful tool in Open Loyalty that allow you to **narrow down the list of products** included in a transaction before applying rules and effects. These filters work on the **line-item level** within a transaction - letting you isolate products based on attributes like category, price, quantity, brand, or custom values.

## How to Add a Transaction Item Filter

{% stepper %}
{% step %}
In the **Rules & Effects** step of campaign creation, click the **Transaction filters** tab.\
![](/files/p01bNg6ylFbmjxQM3zlI)
{% endstep %}

{% step %}
Select **Add first transaction filter**.\
![](/files/DHOYevKrXWSRfjlCBfeK)
{% endstep %}

{% step %}
Choose the filter type — for example:

* Item category
* Item SKU
* Item name
* Item price
* Item custom attribute
* Item brand

<div align="left"><figure><img src="/files/vBmL5RAUVi8u9mbDyGjL" alt=""><figcaption></figcaption></figure></div>
{% endstep %}

{% step %}
Define your condition or multiple conditions.
{% endstep %}

{% step %}
Save the filter. It will be saved under a label like `Scenario 1` (you can rename it for clarity).
{% endstep %}
{% endstepper %}

***

## How to Use Transaction Filters in Campaign Rules

Once you have defined a transaction filter, you can reference it in both **Conditions** and **Effects**:

### **In Conditions**

You can use the filter to define conditions such as:

* **Quantity of filtered transaction**
* **Value of filtered transaction**

<figure><img src="/files/HllMPXNFOWqPQuMfm2Wp" alt=""><figcaption></figcaption></figure>

For example, set a rule to apply only if:

> Quantity of filtered transaction in *Scenario 1* is greater than 3\
> Value of filtered transaction in *Scenario 1* is at least 100 PLN

This allows for precise rule targeting.

<figure><img src="/files/S0xyMHdBIkA9DYYbMuyp" alt=""><figcaption></figcaption></figure>

### **In Effects**

You can reference filtered items when defining custom effects using expressions like:

```javascript
agg(filter(transaction.items,'scenario_1')).sumBy('grossValue')
agg(filter(transaction.items,'scenario_1')).sumBy('qty')
```

These expressions:

* **Sum the gross value** or **quantity** of the items in the transaction that match the selected filter (`scenario_1`).
* Allow you to create advanced effects based on only a subset of items.

{% hint style="warning" %}
`scenario_1` is a dynamic identifier generated based on the filter name.&#x20;

Always ensure the name you reference in your expression matches the transaction filter’s label.
{% endhint %}

For example, set a rule to reward based on the following criteria:

> Give 1 point for every currency unit (e.g., for every dollar) spent.

<figure><img src="/files/C8qTpRR37HHFPMwL1W3i" alt=""><figcaption></figcaption></figure>

You can also limit how much value or quantity is counted from each matching transaction item using a **cap**.

```javascript
(filter(transaction.items,'scenario_1')).sumBy('grossValue', 1)
(filter(transaction.items,'scenario_1')).sumBy('qty', 1)
```

**Examples:**

* `agg(filter(transaction.items,'filter_name')).sumBy('grossValue', 100)`\
  → Sums up `grossValue` per item, but caps each one at 100
* `agg(filter(transaction.items,'filter_name')).sumBy('qty', 2)`\
  → Counts quantity but caps it at 2 units per item

Use this when you want to prevent unusually high item values or quantities from impacting campaign conditions disproportionately.

## Summary

Transaction item filters help you build smarter, more targeted campaigns by focusing only on specific products within a transaction. You can:

* Define them once and reuse them in multiple rule conditions or effects.
* Create precise campaign logic based on filtered item sets.
* Use them to ensure bonuses or effects only apply to relevant items.


# Percent Value Distribution

Learn more about campaign based on the percent value distribution.

{% hint style="danger" %}
Please note this is an advanced use case. Contact Open Loyalty Support team if in doubt.

**Make sure to test any configuration thoroughly.**
{% endhint %}

The **Percent Value Distribution** function is a powerful tool used in campaign effects to calculate rewards based on **tiered value thresholds**. It enables you to dynamically apply different reward percentages depending on how much value a member has accumulated over time—commonly used for cashback-style or volume-based reward campaigns.

This function works in combination with **Achievements**, which allow you to track ongoing member progress (e.g., monthly spend), and issue campaign rewards based on the configured percentage ranges.

***

### ⚙️ How the Function Works

```plaintext
percent_value_distribution(
  event.body.progressChanges[0], 
  [thresholds], 
  [percentValues], 
  event.body.progressStatuses[0].currentPeriodValue - event.body.progressChanges[0]
)
```

#### Breakdown of Parameters:

| Parameter                                                                           | Description                                                       |
| ----------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
| `event.body.progressChanges[0]`                                                     | Value of the current achievement progress (incremental progress). |
| `[thresholds]`                                                                      | An array defining cumulative value ranges.                        |
| `[percentValues]`                                                                   | An array of percentage values (as decimals) to apply per range.   |
| `event.body.progressStatuses[0].currentPeriodValue - event.body.progressChanges[0]` | Total accumulated value **before** the current progress.          |

***

### 💡 Example Use Case: Tiered Cashback

You want to give members cashback based on their monthly spending:

* **0–5,000** → 1%
* **5,000–7,500** → 1.2%
* **7,500–10,000** → 1.5%
* **10,000+** → 0%

To achieve this, use the following expression in your campaign effect:

```plaintext
percent_value_distribution(
  event.body.progressChanges[0], 
  [5000, 7500, 10000], 
  [0.01, 0.012, 0.015, 0], 
  event.body.progressStatuses[0].currentPeriodValue - event.body.progressChanges[0]
)
```

***

### 🧱 Step-by-Step Setup

#### 1️⃣ Create an Achievement

This tracks total member spend over a defined period.

* **Type**: Direct → Transaction
* **Occurrence**: Consecutive month
* **Goal**: Set a high goal (e.g., 10,000,000) to allow continuous tracking
* **Achievement counting**: Sum of event attributes

This ensures member progress is calculated on **monthly spend** using transaction value.

***

#### 2️⃣ Create a Campaign

This campaign will apply the tiered reward logic using the data from the Achievement.

* **Trigger**: Internal event → `Achievement progressed`
* **Condition**: **Achievement is one of -** select the achievemnt
* **Effect**: Add Units\
  Formula:

  ```plaintext
  percent_value_distribution(
    event.body.progressChanges[0], 
    [5000, 7500, 10000], 
    [0.01, 0.012, 0.015, 0], 
    event.body.progressStatuses[0].currentPeriodValue - event.body.progressChanges[0]
  )
  ```

***

#### 3️⃣ How It Works in Practice

Each time a member makes a transaction:

* The **Achievement** updates their total monthly spend.
* If the progress event is triggered, the **Campaign** evaluates the correct percentage range.
* Units are issued based on that portion of value:

  Example: If a member spends $10,000 in one month:

  * First $5,000 → 1% = **50 units**
  * Next $2,500 → 1.2% = **30 units**
  * Next $2,500 → 1.5% = **37.5 units**
  * Above $10,000 → 0% = **0 units**

  ✅ **Total reward: 117.5 units**

***

### 📝 Summary

**Percent Value Distribution** allows you to dynamically scale rewards based on accumulated value thresholds. Combined with Achievements, it supports advanced use cases like tiered cashback or progressive bonuses—unlocking highly personalized loyalty experiences.


# Managing Campaigns

In this article, you will learn how to manage campaigns.

Campaigns can be edited, cloned, deleted, and migrated across tenants.&#x20;

This article guides you through each operation.

## 🔎 Overview of Actions

<table><thead><tr><th width="159">Action</th><th>Steps (⋮ overflow menu)</th><th>Notes</th></tr></thead><tbody><tr><td>Edit</td><td>Select <em>Edit campaign</em></td><td>Modify existing campaign</td></tr><tr><td>Deactivate / Activate</td><td>Deactivate/Activate campaign</td><td>Pause or resume campaigns</td></tr><tr><td>Duplicate</td><td>Select <em>Duplicate campaign</em> → Edit copy → Add campaign</td><td>Create a copy of the campaign within the same tenant</td></tr><tr><td>Export</td><td>Select multiple → <em>Export to .JSON</em></td><td>Export configuration to another environment</td></tr><tr><td>Import</td><td>Add campaign → <em>Import campaigns</em></td><td>Import configuration from another environment</td></tr><tr><td>Migrate tenant</td><td>Export → <em>Export to Different tenant</em> → Import</td><td>Export configuration to another tenant within the same environment</td></tr><tr><td>Delete</td><td>Select <em>Delete campaign</em> → Confirm</td><td>Delete the unused or old campaign</td></tr></tbody></table>

### ✍️ Editing an Campaign

1. Navigate to **Campaigns** or **Referral campaigns** and locate the desired automation campaign in the list.
2. Click the **⋮ (overflow menu)** next to it and choose **Edit campaign**.
   1. Alternatively: Click on the automation campaign, then click on **Actions → Edit Campaign**
3. Make adjustments to rules, visibility, or budget.
4. Click **Save changes** to apply the changes.
5. To duplicate parts of a campaign, use the **Copy Rules, Conditions, and Effects** button in the editor.

***

### 🔄 2. Activate / Deactivate a Campaign

1. Open the **⋮** menu on any campaign row.
2. Choose **Deactivate campaign** or **Activate campaign** (depending on its current state).
3. The campaign will immediately pause or resume triggering.

Campaigns can also be deactivated automatically. If your tenant has **Autodeactivate campaigns** enabled, a campaign is switched off a set number of days after its end date. Campaigns without an end date are unaffected.

***

### 📄 Duplicating a Campaign

Cloning is ideal for testing variations or launching similar campaigns:

1. Open the ⋮ overflow menu on the automation campaigns list.
2. Select **Duplicate campaign**.
3. You'll be redirected to the editor with a new inactive copy.
4. Update details (e.g., timing, audience) and click **Add campaign**.

{% hint style="info" %}
By default, the copies of the configuration are disabled. Remember to enable the campaigns!
{% endhint %}

***

### 🗂️ Exporting & Importing Campaigns

* Bulk export campaigns to a `.json` file via **Bulk Actions → Selecting the campaigns  → Download to .JSON file**.
* Re-import via **Add campaign → Import (referral) campaigns**.

***

### 🔄 Migrating Across Tenants

To migrate campaigns:

* Click on **Bulk Actions** and select the campaigns you want to copy
* Click on **Copy to different tenant**, select the destination, and complete the import.
* The system guides you through any conflicts as you proceed.

You will be redirected to the target tenant you chose.

{% hint style="warning" %}
Only the configuration of the campaign is migrated.&#x20;

The history of the campaign, along with previously issued units or rewards, is not migrated.
{% endhint %}

***

### 🗑️ Deleting a Campaign

1. In the campaign list, use the **⋮ menu → Delete campaign** option.
2. Confirm the deletion; the campaign is removed from the tenant you are working on.

{% hint style="danger" %}
Deleting a campaign removes it from the UI but **does not delete any reward or engagement data** generated by that campaign. These remain in analytics and member records.
{% endhint %}

For detailed information, please refer to the article below:

{% content-ref url="/pages/PmVfciITeoL9AnaOEJBQ" %}
[Deleting Campaigns](/campaigns/campaigns/campaigns-and-referral-campaigns/deleting-campaigns)
{% endcontent-ref %}

***

## ✅ Additional Notes

* **Deactivate** before editing large changes to avoid unintended triggers.
* **Duplicate** to create campaign variations for A/B testing across segments or timings.
* Archive functionality is not currently supported - **deleted** campaigns are permanently removed.


# Deleting Campaigns

In this article, you will learn how to delete campaigns.

Deleting a campaign removes it from the UI but **does not delete any reward or engagement data** generated by that campaign. These transactions remain in analytics and member records.

***

## 🧭 When to Delete

* Campaign is outdated or no longer relevant
* You've exported or archived it manually (via JSON)
* You want to clean up unused campaign configurations or free up the limit

***

## 🗓️ How to Delete

1. Go to **Campaigns** or **Referral campaigns**
2. Find the target campaign
3. Click the **⋮ menu → Delete campaign**
4. Confirm deletion in the dialog box
5. Campaign disappears from the list

***

## 📌 Important Notes

* **Reward transfers, unit logs, and analytics** remain in system records.
* Historical reports and dashboards might still show data related to the deleted campaign.
* Deletion does **not revoke rewards** nor remove them from member balances.

***

## ✅ Post-Deletion Considerations

* Deleted campaigns cannot be restored—use duplicates or exports for backups.
* For audit or regulatory compliance, retain logs of deleted campaigns.
* Ensure that team members understand that deletion doesn’t erase campaign impact.


# Monitoring & Analytics

Once a campaign is active, it’s essential to track its performance. The **Campaign Overview** (Single Campaign View) provides clear, actionable insights into how well your campaign is engaging members.

<figure><img src="/files/KFXAfTeYndyuDyhuJfmA" alt=""><figcaption></figcaption></figure>

***

### 📊 Dashboard Metrics

At the top of the overview page, two key metrics are displayed:

* **Total Engagement** – total number of times the campaign has awarded points or actions to members during the selected period
* **Engaged Members** – number of unique members who received rewards at least once in that timeframe

Beneath the summary, a line chart illustrates these metrics over time, helping you identify peaks and trends.

***

### ⏱️ Timeframe Selection & Comparison

* You can adjust the period (e.g., last 7, 30, or 90 days)
* A dashed line indicates metrics for a previous comparison period, enabling performance benchmarking (e.g., month-over-month)

Use this to assess whether engagement is increasing, plateauing, or declining.

***

### 💰 Limits & Budget Section

A lower panel tracks campaign usage and network capacity:

* **Units issued by campaign**: number of points or coupons granted
* **Remaining units**: budget left before hitting limits
* **Per-member limitations**: counts issued per individual (e.g., total or per period)
* **Completion count per member**: how many times each member can engage

This section helps you monitor whether your limit/budget settings are being reached.

<figure><img src="/files/NN73ZqiwPSmsaNQa5bfK" alt=""><figcaption></figcaption></figure>

***

### 🔍 Interpreting Data

* 📈 **Engagement Spikes**: \
  Peaks suggest objectives are resonating—check if they align with trigger events (e.g., start of the campaign, birthday, achievement completion).
* ⚠️ **Zero Engagement**: \
  Indicates possible misconfiguration - check trigger schedule, type, active status, and rule conditions.
* 🔄 **Budget Alerts**: \
  If “Remaining units” nears zero, consider increasing budget or pausing the campaign to adjust.

***

### ✅ Best Monitoring Practices

1. **Set Alerts**: Monitor daily and weekly engagement trends to spot anomalies.
2. **Compare Periods**: Use the comparison feature to evaluate campaign tweaks.
3. **Watch Budgets**: Prevent early exhaustion or over-delivery of rewards.
4. **Use for Informed Iteration**: Adjust rules, visibility, or timing based on analytics.


# Campaign Simulation

Learn how you can check the expected campaing outcome.

This function allows you to simulate the Reward effect that will be returned when the Member meets the Campaign conditions. The simulation helps to check whether the Campaign you have created contains the correct conditions and whether the Reward is returned correctly.&#x20;

You can simulate Direct or Referral Campaigns. If you would like to simulate the Referral Campaign, please note that you need to fill in the Member and Referrer details steps to simulate rewards for both sides.

<figure><img src="/files/1GNQI1xg0rLE1GycH6il" alt=""><figcaption></figcaption></figure>

In the Campaign simulator, you need to go through these steps to simulate a campaign:

1. **Trigger** -  will simulate campaigns with the selected option
2. **Member details -** This step allows for simulating matching transactions/custom events. Additionally, filling in the specific member details allows for simulating the campaigns that require the specific member information that needs to be fulfilled to receive the campaign effect.
3. **Referrer details** - This step allows to simulate the results for the referrer (available for the referral campaigns)
4. **Transaction / Event details** - Depending on the trigger selected, this step allows you to enter more details related to the transaction or the event.

{% hint style="danger" %}
Please be aware that member details like Address details, Transactional History, Points Balance, and Consents are automatically imported from the system into the campaign simulator **only** when you provide **Member ID**. The same applies to the referrer details.

For the requests sent through the API, you can retrieve the result based on the member details stored in OpenLoyalty by including the `customerId` in the payload.
{% endhint %}

Once all the details are entered, click on **Resimulate campaign** and check the results.

<figure><img src="/files/W3yvOLi4m3AeVyWbLjao" alt=""><figcaption></figcaption></figure>

After running the simulation 'Simulated campaigns' and 'Simulated results' will appear. Here you may notice which Campaign criteria were met along with who and what Reward may receive.

{% hint style="info" %}
When several campaigns are activated by the same trigger, they are executed in order of their Campaign Start Date, with the earliest one being executed first.
{% endhint %}


# Campaign Limitation

Learn how you can enforce campaign limitations to set a campaign budget or prevent fraud.

Campaign limitations are an essential tool to control reward distribution, prevent abuse, and maintain the integrity of your loyalty program. These limits allow you to define boundaries for how many times a campaign can be triggered and how many units can be distributed—globally or per member—within a specific time frame.

***

### 🔒 Types of Limits

You can configure three main types of campaign limitations:

<figure><img src="/files/fF9dKCU93hg6Kj9NL0sQ" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="157">Limit Category</th><th width="268">Limit Type</th><th>Description</th></tr></thead><tbody><tr><td><strong>Limit</strong></td><td><strong>Per member limit (triggers)</strong></td><td>The number of times a campaign can be completed by an individual member.</td></tr><tr><td><strong>Budget</strong></td><td><strong>Global limit (units)</strong></td><td>The total number of units that can be issued across the entire campaign.</td></tr><tr><td><strong>Budget</strong></td><td><strong>Per member limit (units)</strong></td><td>The maximum number of units that an individual member can receive within the campaign.</td></tr></tbody></table>

***

### 📦 Example

Let’s say you set:

* A **global limit** of 10,000 units,
* A **per-member limit** of 100 units.

This ensures that at least 100 different members can benefit from the campaign. Once a member reaches their individual cap (100 units), they won’t receive any additional rewards, even if the campaign is still active, and the event that triggers the campaign meets all the condition. If the campaign reaches 10,000 units in total, it stops rewarding entirely, regardless of individual member activity.

{% hint style="info" %}
If a unit transferissued by the campaign is canceled, those units are automatically returned to the available pool.
{% endhint %}

***

### ⏲️ Time-Based Enforcement

Limits can be configured for specific time intervals.&#x20;

You can apply each limit using one of the following periods:

<table><thead><tr><th width="177">Time Period</th><th>Behavior</th></tr></thead><tbody><tr><td><strong>No limit</strong></td><td>The limit is not time-bound; it's enforced across the campaign lifetime.</td></tr><tr><td><strong>Daily</strong></td><td>Enforces the limit over every X calendar days.</td></tr><tr><td><strong>Weekly</strong></td><td>Enforces the limit every X calendar weeks.</td></tr><tr><td><strong>Monthly</strong></td><td>Enforces the limit every X calendar months.</td></tr><tr><td><strong>Yearly</strong></td><td>Enforces the limit every X calendar years.</td></tr><tr><td><strong>In total</strong></td><td>One-time limit for the entire campaign duration.</td></tr></tbody></table>

#### 🔍 Examples

**Daily Limit**

* Time window: Every 1 calendar day
* Units issued per member: 230\
  Each member can earn **up to 230 units** every 1 calendar day.

**Weekly Limit**

* Time window: Every 1 calendar week
* Max units: 150\
  Each member can earn **up to 150 units** every 1 calendar week.

**Monthly Limit**

* Time window: Every 1 calendar month
* Max units: 15\
  Each member can earn **up to 15 units** every 1 calendar month.

**Yearly Limit**

* Time window: Every 1 calendar year
* Max units: 1,500\
  Each member can earn **up to 1,500 units** throughout the calendar year.

**In Total Limit**

* Time window: Lifetime (as long as the campaign is active)
* Max units: 1,000\
  Each member can earn **up to 1,000 units** throughout the activity of the campaign.

***

### 🔄 Limit Enforcement Logic

Time-based limits are always enforced using the **business date of the event**, such as the purchase or custom event date.

#### 📌 Example:

If a campaign allows up to 1,000 points per day, and an admin sends:

* One transaction dated **today**, and
* One transaction dated **two days ago**,\
  The member can receive up to **2,000 points total**—1,000 for each day—because the system evaluates limits based on the business date value aligned with the event’s business date.

***

### 🧠 Best Practices

* Use **global limits** to prevent over-distribution of units in case of system misuse.
* Apply **per-member limits** to ensure fair reward allocation.
* Combine limits with **time windows** for campaigns that run over long periods.
* Pair limits with **conditions and expressions** for added flexibility (e.g., issue rewards only for certain transactions or custom events).
* Always test limit behavior in a staging environment before deploying campaigns at scale.


# Custom Attributes in Campaigns

Learn how you can use custom attributes in campaigns

### **Overview**

Campaign attributes, organized in a *key:value* format, serve as versatile data containers. These attributes offer multifaceted functionalities:

1. **Filtering in Admin Panel/API:** Enables filtering campaigns based on specific criteria, aiding efficient campaign management and targeted audience segmentation.
2. **External Application Integration:** Allows utilization of attribute data in external applications, enhancing management and filtering capabilities across various platforms.

For instance, an attribute like `"new_member_campaign": "true"` could be utilized to specifically display campaigns to new members. This attribute facilitates targeted campaign display solely to new members, ensuring personalized and relevant engagement strategies tailored to specific user segments.

### **How to use them**

* Access the **Basic Settings** section of your campaign.
* Click **Add Custom Attribute** and enter pairs like `season:summer` or `channel:email`.
* You can include multiple attributes per campaign.

### **Best practices**

* Stick to standard naming conventions (e.g., `lower_snake_case`).
* Use tags to categorize by theme, launch period, or audience.
* Query and filter campaigns with these attributes via API or admin tools.

### **Attributes on campaign-generated unit transfers**

When a campaign awards units, the resulting unit transfer carries the campaign's custom attributes. They are applied as the transfer is created, so points earned through a campaign can be reported on and reconciled using the same keys you filter campaigns by.

This matches the custom attributes available on manually created unit transfers.

Available from version 5.171.0.


# Custom Units Expiration & Pending Settings

Learn more how you can set custom expiration and pending setting for the units awarded in the campaign.

### **Why Customize This**

By enabling this option, you can create dynamic expiration or pending dates based on a variety of conditions, ensuring that the campaign's incentives align with strategic business objectives such as encouraging quicker customer spending or rewarding long-term loyalty. These methods let you create urgency or tie expirations to loyalty milestones.

{% hint style="info" %}
Advanced settings override [default wallet settings](/members-and-activity/wallets/wallet-types-and-configuration#unit-settings), making it possible to customize campaigns at a very detailed level.&#x20;
{% endhint %}

### **How to Configure**

<figure><img src="/files/pf0a6E7zwAnBhdnYRiHf" alt=""><figcaption></figcaption></figure>

* Select effect **Add Units**
* In **Override units settings**, enable **Expiration settings** or **Pending settings**.
* Use templates to set expiration (e.g., fixed date, X days from transaction).<br>

  <figure><img src="/files/X0cJ21a77Y9UScrKZdaB" alt=""><figcaption></figcaption></figure>
* Use variables to reference system timestamps, transaction dates, or member attribute dates.\
  The list of available variables depends on the campaign trigger.<br>

  <figure><img src="/files/jWR0twGdkMrN5v9dYNj2" alt=""><figcaption></figcaption></figure>

### Examples

The example: `add_days_to_date(executionContext.processedAt, 15)`. The transaction got into the OL on the 1st of Feb, 2024, so the expiration date of the points will be 16.02.2024 (+15).

* **Transaction document date** - e.g `add_days_to_date(transaction.purchasedAt, 5)`.
* **Member custom attribute** - points will expire on the date of what’s in the member custom attribute value. (`to_date` - converts the key to date). Example custom attribute:

<figure><img src="/files/wvoajaxgV97sRx70allj" alt=""><figcaption></figcaption></figure>

\
If you use the variable below, the points will expire on 2025-08-24.

<figure><img src="/files/rnIxMsnj49vY0OheP3T3" alt=""><figcaption></figcaption></figure>

* But if you want to add days to the point expiration to the end date of the custom attribute, you can use one of the templates and the following formula: `add_days_to_date(to_date(agg(customer.labels).getLabelValue('subscription_end_date)),6)`. Then the expiration date of points will be on 30.08.2025.
* e.g. transaction took place at transaction date 2024-03-01 16:30 → formula days: add\_days\_to\_date(transaction.purchasedAt, 3) → points expire at (2024-03-04 16:30)&#x20;

→ IMPORTANT: it’s not by the end of the day, it’s always the same time as the event/ transaction date


# Effects Autocomplete

Learn more about available autocomplete options for the effects, and how to use templates and variables.

### **What It Does**

Open Loyalty provides powerful autocomplete support when building campaign formulas—whether for calculating rewards, setting pending or expiration dates, or referencing balances. You can access both **templates** (common formulas) and **variables** (context-specific data) through dropdown suggestions.

***

### 🧰 Overview

* The dropdown appears when you click into any formula field (e.g., *Add units*, *Expiration date*, *Pending units*).
* It’s divided into **Templates** (pre-defined formula snippets) and **Variables** (data fields you can insert).

***

### 🔄 Trigger‑Specific Variables

{% hint style="success" %}
The list below is not complete - it is supposed to give you an overview of the available options.
{% endhint %}

Depending on the campaign trigger you chose, the dropdown will surface different context variables:

**For Purchase or Return campaigns:**

* `transaction.grossValue` – total value of the entire purchase/return
* `transaction.qty` – total item count
* **Item-level filters** create expressions like:
  * `transaction.sku('ABC123').qty` or `.grossValue`
  * `transaction.category('Beverage').grossValue`
  * `transaction.maker('BrandX').qty`

These allow precise designs such as “Give 10 points for each specific SKU purchased” or “Deduct units only for returns above $100 worth of electronics.”

<figure><img src="/files/7nfzJpNHZrqEpGEfm0UJ" alt=""><figcaption></figcaption></figure>

**For Custom Event and Redemption Code campaigns:**

* Variables map to schema-defined attributes.\
  For example, if your schema includes an integer `steps` attribute:
  * `event.body.steps` becomes available.

This enables expressions like:

```
1 * event.body.steps
```

to award 1 point per step counted in the event payload.

<figure><img src="/files/3qSdlHXzYPF1Emt4GgqU" alt=""><figcaption></figcaption></figure>

***

### 💳 Wallet Balance Variables

<figure><img src="/files/fXm4zrMVHR5FSBNaZsxU" alt=""><figcaption></figcaption></figure>

Under the **Variables** tab, you'll also find wallet-related data that can be used in conditions:

* `customer.getWallet('<walletType>').activeUnits`
* `customer.getWallet('<walletType>').blockedUnits`
* `customer.getWallet('<walletType>').pendingUnits`

Use these to set effects like “Give triple points for all active points” or “Deduct all currently active points”

***

### 🎯 Templates

<figure><img src="/files/E3m3B9eRhut09k6rd5iD" alt=""><figcaption></figcaption></figure>

Common formula templates are available under **Templates**, such as:

* Fixed rewards (e.g., `100` for 100 points)
* Multipliers tied to transaction or event data:

  ```
  10*transaction.sku('ABC123').qty
  20*transaction.maker('BrandX').qty
  1*transaction.grossValue
  ```

Selecting a template inserts proper syntax without manual typing, saving time and reducing errors.

***

### 🛠 Building Custom Expressions

Once a template or variable is inserted, you can further refine using supported operations and functions:

* Math operators: `+ - * /`
* Date functions:

  ```
  add_days_to_date(executionContext.processedAt, 15)
  add_days_to_date(transaction.purchasedAt, 5)
  ```
* Member custom attribute conversions:

  ```
  add_days_to_date(
    to_date(agg(customer.labels).getLabelValue('subscription_end_date')),
    6
  )
  ```

These can set dynamic expiration/pending dates or attribute-based caps.

***

### ✅ Benefits

* **Speed & accuracy**: Avoid typing errors and learn variable options as you go
* **Context awareness**: Only relevant templates and data appear based on the selected trigger
* **Advanced logic at your fingertips**: Combine templates and variables for powerful conditional logic

***

### 📌 Tips & Best Practices

* **Explore both categories** in the dropdown—templates and variables each serve a role.
* For **transaction campaigns**, item-level filters enable fine-grained logic (e.g., deduct only for high-value returns).
* For **custom events**, verify the schema matches your attribute names so variables appear correctly.
* Use **wallet variables** to manage campaign eligibility or prevent over-issuing rewards.
* **Test formulas** using the campaign simulator to ensure values are computed as expected.


# Using Expressions

Expressions in Open Loyalty campaigns allow you to build flexible and dynamic logic for controlling when effects are applied. One of the most powerful features is the ability to reference **custom attributes** of members to tailor campaign behavior based on specific data stored in their profiles.

***

### 🧩 What Are Member Custom Attributes?

Member custom attributes—also referred to as **labels**—are member-specific fields used to store additional information. These can be dates, numbers, or strings, such as:

* `post_date` – a custom date stored for a member
* `posts_number` – a count of submitted posts
* `membership_level` – a string indicating tier

You can reference these values inside expressions using Open Loyalty’s expression syntax.

***

### ✅ Supported Data Types

Custom attributes support the following value types:

| Type     | Example                       |
| -------- | ----------------------------- |
| DateTime | `"2022-12-20T14:15:22+01:00"` |
| Number   | `"10.2"`                      |
| String   | `"featured"`                  |

***

### 🛠️ How to Use Custom Attributes in Expressions

To retrieve and use custom attribute values inside campaign rules, you can use the `agg(customer.labels).getFirstLabelValue('key')` function. Here's how to apply this in practice:

#### 1. Retrieve a Label Value

```plaintext
agg(customer.labels).getFirstLabelValue('post_date')
```

Returns the value of the label `post_date` as a string.

#### 2. Parse a Label to a Date

```plaintext
to_date(agg(customer.labels).getFirstLabelValue('post_date'))
```

Converts the string to a date format for further operations.

#### 3. Compare with a Timestamp

```plaintext
timestamp(to_date(agg(customer.labels).getFirstLabelValue('post_date')))
```

Converts the value to a UNIX timestamp for time-based comparisons.

***

### 📌 Real Example: Reward Within 5 Days of a Custom Date

If you want to grant points **only if the transaction happened within 5 days of a custom date**, you can use the following condition:

```plaintext
(timestamp(transaction.purchasedAt) - timestamp(to_date(agg(customer.labels).getFirstLabelValue('post_date')))) <= 432000
```

> **Important:** To ensure the campaign only runs if the attribute is present, always include a null-check condition:

```plaintext
agg(customer.labels).getFirstLabelValue('post_date') != null
```

***

### 🔢 Comparing Numeric Custom Attributes

When comparing numeric values stored as custom attributes, you do not need additional parsing—just ensure you use a **dot (.) separator** for decimals:

```plaintext
agg(customer.labels).getFirstLabelValue('posts_number') > 10
```

***

### 🔁 Rounding Point Values

When campaign expressions produce point values based on division or multiplication, the result is often a **floating-point number** (e.g. `1.053333333333`). Open Loyalty provides two numeric functions to control this:

* `round_down(value)` — rounds **down** to the nearest integer (floor)
* `round_up(value)` — rounds **up** to the nearest integer (ceiling) These are particularly important in multiplier-based campaigns where fractional points would accumulate in wallets and cause precision issues.

**🔽 Round Down — Award Whole Points Per Currency Spent**

Use `round_down()` when you want members to earn only full points, never fractions. For example, to award 4 points per dollar spent, rounded down:

```plaintext
round_down(transaction.grossValue) * 4
```

> For a transaction of $101.23, this awards **404 points** (based on $101, not $101.23).

This ensures members receive clean, discrete point values rather than fractional amounts like `404.92`.

**🔼 Round Up — Favour the Member**

Use `round_up()` when you want to err in the member's favour — always awarding the next full point rather than truncating:

```plaintext
round_up(transaction.grossValue * 1.5)
```

> For a transaction of $10.33, this awards **16 points** (`10.33 * 1.5 = 15.495`, rounded up to `16`).

***

### ✨ Combine with Other Expressions

Custom attributes can be used in combination with other expression elements such as:

* `transaction.sku`
* `customer.getWallet().activeUnits`
* `transactionItemFilters`
* `campaignContext`

To learn more about general expression syntax, supported operators, and context, visit:

{% content-ref url="/pages/EJF1lsX7ihcOfJy6MhS7" %}
[Expressions](/integrations-and-data-exchange/expressions)
{% endcontent-ref %}

***

### 🔍 Summary

Using custom attributes in campaign expressions allows you to:

* Personalize reward logic
* Set campaign conditions based on member behavior
* Handle complex use cases like anniversary dates, member segmentation, or activity limits

Whether you're working with dates, numbers, or string attributes, Open Loyalty's expression engine helps you build sophisticated rules for smarter, more contextual campaigns.


# Follow-up Campaigns

Create campaign chains where completing one campaign unlocks the next. Visibility and availability controls are supported in Campaigns, Referral Campaigns, and the new feature, Challenges.

Follow-up campaigns let you build a **campaign chain**. Completing one campaign unlocks the next.

{% hint style="info" %}
The **Visibility** and **Availability** concepts described here are supported across **Campaigns**, **Referral Campaigns**, and **Challenges** (new feature).
{% endhint %}

### Overview

A follow-up campaign is a loyalty campaign that becomes **available/visible** only after a member completes a previous campaign.

Unlocking the next campaign is the reward for finishing the previous one.

### Business goals

Use follow-up campaigns to:

* Drive repeat purchases with progressive rewards.
* Create onboarding journeys (first purchase → second purchase → subscription).
* Build multi-step gamification without running campaigns in parallel.

### How it works

1. A member completes **Campaign A**.
2. The member qualifies for a **segment** based on that completion.
   * **Campaign completion** segments support a rolling time window (for example: *completed in the last X days*).
   * **Challenge completion** segments are **not** time-scoped (completion is treated as *ever completed*).
3. **Campaign B** is configured with that segment in its conditions and/or visibility.
4. When the member joins the segment, Campaign B becomes available.

{% hint style="warning" %}
Segment membership can take \~10 minutes to update after campaign completion.
{% endhint %}

### Example setup (A → B → C, with a fallback D)

Example scenarios:

* Member completes **Campaign A** → can see/unlock **Campaign B**
* Member completes **Campaign B** → can see/unlock **Campaign C**
* Member does **not** complete A–C → can see and complete **Campaign D**

{% stepper %}
{% step %}

### Create Campaign A

Go to **LOYALTY MODULES → Campaigns**.

Create **Campaign A** with the start/end date (example: 22.10.23 – 28.10.23).

In this example, customers who spend **€100+** receive **50 points**.

![](/files/hGELkBIjvA7ROIzAQEi2)
{% endstep %}

{% step %}

### Create a segment for “completed Campaign A”

Go to **GENERAL → Members → Segments**.

Create a segment with condition **Campaign completion** (example: complete campaign **1** time over the last **15** days).

Select **Campaign A**.

![](/files/REAcikEnxwP942JvV01Q)
{% endstep %}

{% step %}

### Create Campaign B for members in the segment

Go to **LOYALTY MODULES → Campaigns**.

Create **Campaign B** with the next start/end date (example: 29.10.23 – 04.11.23).

Use condition **Member segment** and select the segment from the previous step.

Set rewards/effects for your use case.

<img src="/files/JoePAIvppOvPMnCPYiX1" alt="" data-size="original">
{% endstep %}

{% step %}

### Create a segment for “completed Campaign B”

Go to **GENERAL → Members → Segments**.

Create a segment with condition **Campaign completion** for **Campaign B**.

![](/files/acRz7Rf7YUEnzDYphQ2Q)
{% endstep %}

{% step %}

### Create Campaign C

Go to **LOYALTY MODULES → Campaigns**.

Create **Campaign C** (example: 05.11.23 – 11.11.23).

Use condition **Member segment(s)** and select the segment from the previous step.

Set rewards/effects for your use case.

![](/files/j5shWr4Z9odJo5nOE4kU)
{% endstep %}

{% step %}

### Create a segment for “did not complete Campaign A”

Go to **GENERAL → Members → Segments**.

Create a segment with condition **Campaign completion** (example: complete campaign **0** times over the last **7** days).

Select **Campaign A**.
{% endstep %}

{% step %}

### Create Campaign D (fallback)

Go to **LOYALTY MODULES → Campaigns**.

Create **Campaign D** with a timeframe that covers A, B, and C (example: 29.10.23 – 11.11.23).

In campaign conditions:

* Include the “did not complete Campaign A” segment.
* Exclude segments for members who completed Campaign B and Campaign C.

In campaign visibility:

* Restrict visibility to the “did not complete Campaign A” segment.

Use different conditions in A vs D, so members can’t complete both unintentionally.
{% endstep %}
{% endstepper %}

### Tips and gotchas

{% hint style="info" %}
**Segments and “Last X days”**

This applies to segments based on **Campaign completion**.

* Same timeframe for all follow-ups: set **Last X days** to match the full chain (start of A → end of D).
* Different timeframes: set **Last X days** to cover the relevant past window for the segment.
* Segment completion count must be `<=` the campaign limitation per member.
* Prefer an end date for every follow-up campaign.
  {% endhint %}

{% hint style="info" %}
**Campaign completion vs Challenge completion segments**

Both **Campaigns** and **Challenges** support visibility for a given **segment** or **tier**.

The key difference is segment membership timing:

* **Campaign completion**: can be limited to *completion in the last X days/weeks/months*.
* **Challenge completion**: not limited by time (member stays “completed” once they finish it).
  {% endhint %}

{% hint style="info" %}
**Fallback campaign safety (A vs D)**

If the member doesn’t complete Campaign A, they might unlock Campaign D immediately.

To avoid overlap:

* Use different conditions in A and D.
* In D, set visibility to the “completed A 0 times” segment.
* In D conditions, exclude segments for members who completed A and B.
  {% endhint %}

### “Last X days/weeks/months” examples

Examples for the field **Member completed the campaign in the last X days/weeks/months**.

{% hint style="info" %}
To include completions **only** from the current day/week/month, set **X = 0**.
{% endhint %}

<figure><img src="/files/zL6V27jnsyD7J7gJh6wk" alt="" width="375"><figcaption></figcaption></figure>

**Current time: 2023-09-29 13:30:00 (days)**

* `0` → 2023-09-29 00:00:00 – 2023-09-29 13:30:00
* `1` → 2023-09-28 00:00:00 – 2023-09-29 13:30:00

**Current time: 2023-09-29 13:30:00 (weeks, week starts Monday)**

* `0` → 2023-09-25 00:00:00 – 2023-09-29 13:30:00
* `1` → 2023-09-18 00:00:00 – 2023-09-29 13:30:00

**Current time: 2023-09-29 13:30:00 (months)**

* `0` → 2023-09-01 00:00:00 – 2023-09-29 13:30:00
* `1` → 2023-08-01 00:00:00 – 2023-09-29 13:30:00


# Challenges

This section explains how Challenges can be created and used in your loyalty program.

{% hint style="info" %}
**🚀 Challenges is a new feature!**

Challenges are being gradually rolled out to all clients. If you don't see Challenges in your sidebar yet, don't worry — we'll reach out to you directly to help with the migration.

In the meantime, if you have any questions, feel free to contact our [support team](mailto:support@openloyalty.io).
{% endhint %}

### Challenges Overview

Challenges in Open Loyalty let you define goals that members work toward by completing specific actions — such as making purchases, logging custom events, or referring friends. Each challenge is built from **milestones** (individual tasks a member must complete) and **rules & effects** (the rewards or actions triggered when progress is made or the challenge is finished).

Admins can also manually update a member’s challenge progress or completion status from the member profile. This is useful for support, corrections, migrations, or exceptional cases where progress needs to be adjusted outside the standard trigger flow.

#### 🚀 What You'll Learn in This Section

* How to **create a challenge** step by step — from basic info through milestones, rules, and budget controls.
* How to **manage challenges** — view analytics, edit settings, activate or deactivate, and duplicate.
* How to **delete challenges** — individually or in bulk.

### Learn more about

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Creating Challenges</strong></td><td>Walk through the five-step wizard to set up a new challenge with milestones, rules, effects, and budget controls.</td><td><a href="/pages/F8tukxU4msFtV4szmOD2">/pages/F8tukxU4msFtV4szmOD2</a></td></tr><tr><td><strong>Managing Challenges</strong></td><td>View challenge analytics, edit configuration, activate or deactivate, and duplicate challenges.</td><td><a href="/pages/0F1qTKfR8YM5SQL7UzUh">/pages/0F1qTKfR8YM5SQL7UzUh</a></td></tr><tr><td><strong>Deleting Challenges</strong></td><td>Remove challenges individually from the detail view or in bulk from the list.</td><td><a href="/pages/jC7YuBDPt2ZoHySHrpGY">/pages/jC7YuBDPt2ZoHySHrpGY</a></td></tr></tbody></table>


# Creating Challenges

To create a challenge, navigate to **Loyalty Modules → Challenges** in the sidebar and click the **Create Challenge** button in the top-right corner.&#x20;

The challenge creation wizard allows you to configure the full challenge experience in one flow, including basic settings, triggers, milestones, rules, effects, limits, and completion behavior.

The wizard includes the following areas:

1. Challenge Info
2. Milestones
3. Limitation & Budget
4. Summary

***

### Step 1: Challenge info

The first step collects the challenge's basic information. It is divided into six collapsible sections.

#### 1.1. Title and description

<figure><img src="/files/60L1dqecOmt1QhKM0GV8" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="165">Field</th><th width="107">Required</th><th>Description</th></tr></thead><tbody><tr><td><strong>Name (en)</strong></td><td>Yes</td><td>The challenge name displayed to members. Supports multiple languages via <strong>+ Add translation</strong>.</td></tr><tr><td><strong>Description (en)</strong></td><td>No</td><td>An optional description of the challenge.</td></tr><tr><td><strong>Display order</strong></td><td>No</td><td>A numeric value that controls the sorting position of the challenge in lists.</td></tr></tbody></table>

#### 1.2. Start & end date

Define the period when the challenge is active in the system.

<figure><img src="/files/qhJOUQ1GGv18rHke0aeq" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="173">Field</th><th width="106">Required</th><th>Description</th></tr></thead><tbody><tr><td><strong>Start at</strong></td><td>Yes</td><td>The date and time when the challenge becomes active.</td></tr><tr><td><strong>End at</strong></td><td>No</td><td>The date and time when the challenge ends. If no end date is set, the challenge stays active all the time.</td></tr></tbody></table>

#### 1.3. Availability

Define when members can make progress toward completing the challenge — for example, limiting it to certain days of the week or a specific date range.

<figure><img src="/files/dNdk27ElS12KWclXnC0n" alt=""><figcaption></figcaption></figure>

The **Timeframe** dropdown offers the following options:

<table><thead><tr><th width="222">Option</th><th>Description</th></tr></thead><tbody><tr><td><strong>Always available</strong></td><td>No time restrictions; members can progress at any time.</td></tr><tr><td><strong>Is after</strong></td><td>Members can progress after a selected date.</td></tr><tr><td><strong>Is before</strong></td><td>Members can progress until a selected date.</td></tr><tr><td><strong>Is day of week</strong></td><td>Progress counts only on selected days of the week.</td></tr><tr><td><strong>Is nth day of the month</strong></td><td>Progress counts only on a specific day of the month (e.g., the 1st or 15th).</td></tr><tr><td><strong>Is month of year</strong></td><td>Progress counts only during selected months.</td></tr><tr><td><strong>Is between</strong></td><td>Progress counts only between two specific dates.</td></tr><tr><td><strong>Is not between</strong></td><td>Progress counts at any time <em>except</em> between two specific dates.</td></tr><tr><td><strong>Is time between</strong></td><td>Progress counts only during a specific time-of-day window.</td></tr></tbody></table>

#### 1.4. Visibility

Choose which member groups will be able to see this challenge.

<figure><img src="/files/iWiRvVYMk5dPK8WjpdFH" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="273">Option</th><th>Description</th></tr></thead><tbody><tr><td><strong>Visible for everyone</strong></td><td>All members can see the challenge.</td></tr><tr><td><strong>Visible for a specific segment</strong></td><td>Only members in the selected segment can see it.</td></tr><tr><td><strong>Visible for a specific tier</strong></td><td>Only members in the selected tier can see it.</td></tr><tr><td><strong>Hidden</strong></td><td>The challenge is not visible to any member.</td></tr></tbody></table>

{% hint style="warning" %}
Visibility only affects who can **see** the challenge. It does not prevent other members from progressing. To restrict who can progress, use trigger conditions in the Milestones step.
{% endhint %}

#### 1.5. Custom attributes

Custom attributes are data fields used to store additional details about the challenge. Click **New custom attribute** to add key-value pairs.

<figure><img src="/files/JxFf40mEcgMvm3jXiTeE" alt=""><figcaption></figcaption></figure>

#### 1.6. Status

A member can progress only when the challenge is active. Use the toggle to activate or deactivate the challenge.

<figure><img src="/files/VtI4v2LNKGYEx4qYGkET" alt=""><figcaption></figcaption></figure>

Once you have filled in the basic information, click **Next: Milestones** to proceed.

***

### Step 2: Milestones

Milestones are the individual tasks a member must complete within the challenge. A challenge can have up to **six milestones**, each with its own conditions, triggers, and types representing a unique goal. Each milestone is tracked independently, and members can complete milestones in any order.

Click **+ Add milestone** to add additional milestones. Use the three-dot menu (⋮) on a milestone tab to rename or remove it.

Each milestone is configured through six sections:

#### 2.1. Title and description

<figure><img src="/files/twk5hCK8WM5fbFMOFfx6" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="212">Field</th><th width="122">Required</th><th>Description</th></tr></thead><tbody><tr><td><strong>Milestone name</strong></td><td>No</td><td>A descriptive name for the milestone.</td></tr><tr><td><strong>Milestone description</strong></td><td>No</td><td>An optional description.</td></tr></tbody></table>

#### 2.2. Type and trigger

This section determines **who** can progress the milestone and **what event** triggers it.

<figure><img src="/files/xrel0DnDSW7xGyhw81eO" alt=""><figcaption></figcaption></figure>

**Type** defines who can progress a milestone. There are two options:

<table><thead><tr><th width="208">Type</th><th>Description</th></tr></thead><tbody><tr><td><strong>Direct milestone</strong></td><td>The member themselves progresses the challenge by performing the trigger action.</td></tr><tr><td><strong>Referral milestone</strong></td><td>A referee (a user referred by a member) progresses the member's challenge.</td></tr></tbody></table>

**Trigger** defines which event will activate the milestone. There are two trigger types:

<table><thead><tr><th width="210">Trigger</th><th>Description</th></tr></thead><tbody><tr><td><strong>Purchase transaction</strong></td><td>The milestone is triggered automatically based on purchase transactions matched with a member.</td></tr><tr><td><strong>Custom event</strong></td><td>The milestone is triggered by a custom event performed by a member. When selected, an <strong>Event type</strong> dropdown appears to choose the specific custom event schema.</td></tr></tbody></table>

#### 2.3. Trigger conditions *(Optional)*

Set detailed conditions for the chosen trigger to determine when the milestone progresses. If no conditions are set, all transactions or selected custom events will count toward challenge progress.

* **For transactions**, conditions are based on attributes such as where the purchase was made, transaction value, item categories, and more.
* **For custom events**, conditions depend on your custom event's specific parameters.
* Conditions related to **members** are available for both triggers.
* You can also use **Expressions** to create more tailored setups.

Click **Add condition** to define one or more conditions.

<figure><img src="/files/nQlygWGm589uAxnLYbfS" alt=""><figcaption></figcaption></figure>

#### 2.4. Progress tracking

<figure><img src="/files/vygcBRj3zmauSP5ZFXKz" alt=""><figcaption></figcaption></figure>

Select how progress is tracked toward completing the milestone. There are two methods:

<table><thead><tr><th width="273">Method</th><th>Description</th></tr></thead><tbody><tr><td><strong>Number of event occurrences</strong></td><td>Tracks how many times the trigger event happens. Examples: "place 5 transactions above $50", "add 10 product reviews", "place 5 transactions in June".</td></tr><tr><td><strong>Value of event attributes</strong></td><td>Tracks the value of a specific attribute. Examples: "spend $10 in February", "spend $100 on 'ACME' products", "walk 1,000 steps".</td></tr></tbody></table>

#### 2.5. Goals

Set the target to complete this milestone. The goal configuration depends on the **Occurrence** type you select:

**Overall** — The member must reach the goal target at any time, with no streak requirement.

<table><thead><tr><th width="180">Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Goal</strong></td><td>The target number of events or attribute value.</td></tr></tbody></table>

**Streak** — The member must reach the goal consistently over consecutive time periods.

<table><thead><tr><th width="219">Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Streak type</strong></td><td>Daily streak, Weekly streak, Monthly streak, or Yearly streak.</td></tr><tr><td><strong>Goal (per period)</strong></td><td>The target number per streak period (e.g., events per week).</td></tr><tr><td><strong>Streak period (Value)</strong></td><td>How many consecutive periods the member must maintain the goal (e.g., "3 weeks in a row").</td></tr></tbody></table>

When the streak type is selected, the system displays a summary sentence: *"The member must log X events every \[period], for Y \[period] in a row."*

**Count only unique custom event attributes** — An optional toggle available for both occurrence types. When enabled, progress increases only for unique values. For example, when considering the attribute "brand": a member purchasing products from three different brands advances progress three times, while purchasing three products from the same brand advances progress only once.

#### 2.6. Event limit

Restrict how many times an event can count toward progress within a specified timeframe.&#x20;

<figure><img src="/files/hERSvfZ8g9Feex0xM9cC" alt=""><figcaption></figcaption></figure>

The **Timeframe** dropdown offers:

<table><thead><tr><th width="156">Option</th><th>Description</th></tr></thead><tbody><tr><td><strong>Unlimited</strong></td><td>No restriction; every qualifying event counts.</td></tr><tr><td><strong>Per hour</strong></td><td>Only a set number of events count per hour.</td></tr><tr><td><strong>Per day</strong></td><td>Only a set number of events count per day.</td></tr><tr><td><strong>Per week</strong></td><td>Only a set number of events count per week.</td></tr><tr><td><strong>Per month</strong></td><td>Only a set number of events count per month.</td></tr><tr><td><strong>Per year</strong></td><td>Only a set number of events count per year.</td></tr><tr><td><strong>In total</strong></td><td>A fixed total number of events that can ever count.</td></tr></tbody></table>

***

### Rules & Effects Inside Milestones

Rules and effects are now configured as part of the milestone setup.

This allows admins to define what should happen when a member progresses through a specific milestone without switching to a separate Effects step.

For each milestone, you can configure:

* the effect that should be applied after the rule is satisfied,
* additional conditions connected with the selected trigger.

If no rules have been created yet, the section displays **No rules created yet**. Use **Add rule** to define the milestone logic.

<figure><img src="/files/t3o2P5RhQ3Hjceidem2x" alt=""><figcaption></figcaption></figure>

Click **+ Add rule** to create additional rules. Each rule has a name, description, and three components:

Optional conditions that further refine when the rule applies.&#x20;

Click **+ Add condition** to add criteria such as member attributes, spending thresholds, or other data.

{% hint style="info" %}
A rule with no conditions will fire every time the challenge is completed.

Every time a member progresses through the milestone, or the challenge is completed, the relevant rule is triggered. If there are no conditions, it will automatically reward the member. That is why it is important to specify when you want to reward the member - e.g., when a progress is only halfway through, or only reward with points on first completion, and a badge on subsequent completions.
{% endhint %}

#### Trigger type (optional) There are two options:

#### **Conditions&#x20;*****(optional)***

Optional conditions that further refine when the rule applies. Click **+ Add condition** to add criteria such as member attributes, spending thresholds, or other data.

One particularly useful condition is **Challenge completion count** — the number of times a member has already completed the challenge. Because a challenge can be completed multiple times (depending on the limit set in Step 3), you can use this condition to apply different effects at different completion thresholds.

**Example:** You want to reward members more generously for their first few completions, then switch to a smaller reward afterward:

* Rule A with condition `completion count ≤ 3` → grants 100 bonus points
* Rule B with condition `completion count > 3` → grants 50 bonus points If no condition is set, the rule fires **every time** the challenge is completed.

#### **Trigger type&#x20;*****(optional)***

Defines when the rule fires relative to challenge progress. If left blank, the rule fires every time the trigger event occurs.

There are two options:

<table><thead><tr><th width="236">Trigger type</th><th>Description</th></tr></thead><tbody><tr><td><strong>Challenge completion</strong></td><td>The rule fires only after the <strong>entire challenge</strong> is completed — meaning all required milestones are finished.</td></tr><tr><td><strong>Milestone progression</strong></td><td>The rule fires each time a member reaches a <strong>specific milestone</strong>, even if the challenge is not yet completed.</td></tr></tbody></table>

**Example**:

A challenge has one milestone - **Make 5 purchases.**

**Milestone progression** example: \
If a challenge requires 5 purchases, you can grant a reward after 2 purchases while progress continues.

**Challenge completion** example: \
If a challenge requires 5 purchases, the reward is granted only after all 5 purchases are made.

{% hint style="info" %}

### **The power of multiple rules**

A single challenge can have multiple rules. For example, consider:\
\
Rule 1:\
**Condition**: Empty (meaning it always applies)\
**Effect**: add *100 units* to Default Wallet.\
\
Rule 2:

**Condition**: Challenge completion is `greater or equal` than 3.\
**Effect**: give the reward *$50 voucher*.

As a result, the user would receive:

* **First and second completion**: 100 units.
* **Third and subsequent completions**: 100 units and $50 units.
  {% endhint %}

#### Effects

Click **+ Add effect** to define what happens when the rule triggers. Effects can include adding or removing units from a wallet, granting a reward, or assigning/removing custom member attributes.

{% hint style="info" %}
If at least one effect is triggered — for example, one out of five possible effects — the challenge is counted as completed.
{% endhint %}

***

### Step 3: Limitation & Budget

This step controls how often members can complete the challenge and the total reward budget.

#### 3.1. Effect application limit

Defines how many times the challenge effects can be applied per member within a selected timeframe.

<table><thead><tr><th width="328">Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Effect applications per member</strong></td><td>How many times the challenge effects can be applied for a single member.</td></tr><tr><td><strong>Timeframe</strong></td><td>The period for the application limit (see below).</td></tr></tbody></table>

The **Effect applications per member** dropdown and the **Timeframe** dropdown both offer the same options: **Unlimited**, **Per hour**, **Per day**, **Per week**, **Per month**, **Per year**, and **In total**.

For example, setting a limit of **2 per month** means the challenge effects can be applied no more than twice per month for each member.

{% hint style="info" %}
How completion is counted depends on the trigger type used in the challenge rule:

* If the rule uses **milestone progression**, each reached milestone triggers the configured effects and increases the challenge completion count.
* If the rule uses **challenge completion**, the completion count increases only after all required milestones in the challenge are completed.
  {% endhint %}

#### 3.2. Challenge budget

Controls the total availability of rewards issued by the challenge.

<figure><img src="/files/8Jud0aMXpInfNqK8w8Vj" alt=""><figcaption></figcaption></figure>

<table><thead><tr><th width="263">Field</th><th>Description</th></tr></thead><tbody><tr><td><strong>Units issued by the challenge</strong></td><td>The maximum total units that can be distributed across all members. Options: Unlimited, or a cap with a timeframe (Per hour / Per day / Per week / Per month / Per year / In total).</td></tr><tr><td><strong>Units issued per member</strong></td><td>The maximum units a single member can receive. Same timeframe options as above.</td></tr></tbody></table>

***

### Step 4: Summary

The final step presents a read-only review of the entire challenge configuration, organized into collapsible sections:

* **Basic info summary** — Challenge name, description, start and end date, availability, visibility, and status.
* **Milestones summary** — For each milestone: title, description, type, trigger, progress tracking method, goal, and event limit.
* **Rules summary** — Each rule with its trigger type, conditions, and effects.
* **Limitations summary** — Challenge limit and budget settings.

Each section has an **edit** (pencil) icon that takes you back to the relevant step to make changes.

{% hint style="warning" %}
Editing certain challenge settings after activation will reset member progress.
{% endhint %}

{% hint style="info" %}
After creating a challenge, you can **duplicate** it to quickly create a similar one with minor adjustments.
{% endhint %}

Once you are satisfied with the configuration, confirm to save the challenge. If the status is set to **Active**, it becomes available to members immediately based on the configuration you've set.


# Managing Challenges

### Challenges list

All challenges are listed under **Loyalty Modules → Challenges** in the sidebar. The list displays the following columns:

<table><thead><tr><th width="209">Column</th><th>Description</th></tr></thead><tbody><tr><td><strong>Name</strong></td><td>The challenge name.</td></tr><tr><td><strong>Status</strong></td><td>Current status: <strong>Active</strong> or <strong>Inactive</strong>.</td></tr><tr><td><strong>Unit limit (member)</strong></td><td>The maximum units a single member can receive, or "Unlimited".</td></tr><tr><td><strong>Unit limit (total)</strong></td><td>The maximum total units the challenge can distribute, or "Unlimited".</td></tr><tr><td><strong>Availability</strong></td><td>The availability timeframe (e.g., "After 08 Feb, 2026 12:00 AM").</td></tr><tr><td><strong>Created on</strong></td><td>The date and time the challenge was created.</td></tr></tbody></table>

You can **search** challenges using the search bar, **add filters** to narrow the list, and click **Manage columns** to show or hide columns.

***

### Challenge detail view

Click on any challenge in the list to open its detail view. The detail page contains:

#### Challenge overview

The overview section at the top shows engagement analytics:

| Metric               | Description                                                                    |
| -------------------- | ------------------------------------------------------------------------------ |
| **Total engagement** | The total number of times the challenge has been completed across all members. |
| **Engaged members**  | The number of distinct members who have participated in the challenge.         |

Below the metrics, a **time-series chart** plots engagement over time. Use the dropdown to switch between time ranges (e.g., **Last 30 days**). The chart includes a solid line for the selected period and a dashed line for the comparison period.

You can track member progress directly from the member profile to see how close they are to completing the challenge.

#### Status and Limitations

A summary table shows the current limitation settings:

| Field                               | Description                                    |
| ----------------------------------- | ---------------------------------------------- |
| **Units issued**                    | Total units distributed so far vs. the cap.    |
| **Remaining units**                 | Units still available for distribution.        |
| **Member units limitation**         | Per-member unit cap.                           |
| **Challenge completion per member** | How often a member can complete the challenge. |
| **Challenge limit**                 | The timeframe-based completion restriction.    |

#### Details

The Details section mirrors the Summary step from the creation wizard, showing all configured settings in read-only format:

* **Basic settings** — Name, description, display order, start and end date, availability, visibility, and custom attributes.
* **Milestones** — Each milestone with its type, trigger, progress tracking method, goal, and event frequency limit. Rules are shown with their trigger type, conditions, and effects.

***

### Actions

Click the **Actions** button in the top-right corner of the challenge detail view to access:

| Action                              | Description                                                                                                        |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| **Deactivate / activate challenge** | Toggles the challenge status. When inactive, members will no longer be able to progress. You can reactivate later. |
| **Edit challenge**                  | Opens the challenge in the creation wizard so you can modify any step.                                             |

{% hint style="info" %}
Single challenges can’t be deleted at the moment. Use **Deactivate challenge** to disable a challenge without losing its configuration.

To remove challenges, use **Bulk Actions → Delete challenges** from the challenges list.
{% endhint %}


# Deactivating and Deleting Challenges

You can **deactivate** a challenge individually.

You can **delete challenges only in bulk** from the challenges list.

### Deactivating a single challenge

1. Navigate to **Loyalty Modules → Challenges**.
2. Click the context menu on the right-hand side.
3. Select **Deactivate challenge**.
4. Confirm when prompted.

<figure><img src="/files/yQqa4ZaJy0VuGE5cCded" alt=""><figcaption></figcaption></figure>

### Reactivating a challenge

1. Navigate to **Loyalty Modules → Challenges**.
2. Click the context menu on the right-hand side.
3. Select **Activate challenge**.
4. Confirm when prompted.

{% hint style="info" %}
Deactivation keeps the challenge configuration and reporting available in the Admin Panel. Inactive challenges don’t accept new member progress.
{% endhint %}

### Deleting challenges in bulk

1. Navigate to **Loyalty Modules → Challenges**.
2. Click on **Bulk actions** in the top-right area. The count of selected challenges appears next to the button.
3. Select one or more challenges by clicking the checkbox next to each challenge name. You can also click the checkbox in the column header to select all visible challenges.
4. Select **Delete challenges** from the dropdown.
5. Confirm when prompted.

<figure><img src="/files/UpL3Af5EJzQREDUKSgyh" alt=""><figcaption></figcaption></figure>

To cancel the selection without deleting, click **Close**.

{% hint style="danger" %}
Bulk deletion is permanent and can’t be undone.
{% endhint %}


# Achievements

In this section, you will learn how Achievements work in Open Loyalty, as well as how to configure them according to your preferences; how to create new Achievements, and assign them to your Campaign.

{% hint style="warning" %}
**Achievements will be replaced with Challenges!**

Challenges replace and extend the previous Achievements feature, combining milestone tracking with the ability to define effects directly — such as adding or removing units, updating member attributes, and granting rewards — all in one place.

**What this means for existing Achievements:** \
Your previously configured Achievements are still available and continue to work. They are now presented in a new structure that supports more advanced configuration.

To find out more about **Challenges**, please refer to this article: [Challenges](/campaigns/challenges)
{% endhint %}

## **Overview**&#x20;

The Achievements module allows members to participate in campaign-based challenges, which, once completed, give users additional benefits in the form of extra units, coupons, and other rewards.

<figure><img src="/files/RITSbKXx8gEJK2wZfkt9" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
You can have a maximum of 50 active achievements per tenant.
{% endhint %}

Achievement-based rules can be especially effective in boosting buying frequency and delighting your customers. This feature enables loyalty managers to define different types of achievements and configure campaigns using a new set of conditions and triggers.&#x20;

Examples of challenges for users to complete include:

* *Finalizing 4 transactions per month 4 months in a row with a minimum transaction value of $20.*
* *Transactions/actions done in a row e.g. logging into the mobile application seven days in a row, or purchasing a product every day of the weekend;*
* *Reaching a specific milestone e.g. placing five orders above $100 or adding a minimum of 10 product reviews.*
* *Buy 10 products from your favorite brands ( Quantity of products with given Custom Attribute)*
* *Spend a total of 100$ on products with the given SKU*
* *Track a workout of at least 30 minutes every day for 5 days in a row*

***

### &#x20;Difference between Achievement and [Campaign](https://help.openloyalty.io/main-features/campaigns)

|                                                          Campaign                                                          |                                                       Achievements                                                       |
| :------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------: |
|      Processes and makes decisions based on only one trigger - Transaction/ Internal event/ Custom event/ Achievement.     |                        Processes and makes decisions based on multiple triggers spread over time.                        |
| Example: A transaction is sent to the system. Once the conditions are met, the system assigns units to the member account. | Several transactions are sent to the system over the month. If the final condition is met, the achievement is completed. |

{% hint style="info" %}
It’s worth noting that the Achievements module itself doesn’t assign units to members’ accounts. For Achievements to be able to issue units to an account, it has to be assigned to at least one campaign. Customers then receive rewards after completing the set challenge.

The achievements module supports cases where we want to aggregate event attributes, rather than the event itself. e.g:&#x20;

* Buy 10 products from your favorite brands ( Quantity of products with given Custom Attribute)
* Spend a total of 100$ on products with the given SKU
  {% endhint %}

***

### Assigning achievements to campaigns

Assigning Achievements to campaigns is done in the ‘Campaign trigger’ section of the [Campaign ](https://help.openloyalty.io/main-features/campaigns/creating-campaigns)editor. To do so, select Achievements from the list of different triggers.

<figure><img src="/files/WqTfKaBqXc3dRKaQNAJo" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
If we assign an achievement to a referral campaign, the trigger will always be the action of a new member.
{% endhint %}

***

### Multi-dimensional Achievements

The Achievements module provides the ability to create, monitor, and award members for completing specific challenges. One of the unique features of the Achievements module is the capability to define multi-dimensional achievements. These achievements are composed of several rules and each can be based on different types of actions - triggers. Members must satisfy all of these conditions over time to complete the achievement and get the badge, units, or reward.

An example of multi-dimensional achievement:&#x20;

*A member must walk 10 kilometers and purchase 3 products in the sports category (The custom event is sent with a distance attribute).*

* This achievement combines two actions - physical exercise tracked via the custom event, and shopping behavior tracked via the transactions sent to the system.
* To transform the achievement into a multi-dimensional achievement simply click the **+ADD RULE** button.

<table><thead><tr><th width="149">Settings</th><th width="293" align="center">RULE #1</th><th align="center">RULE #2</th></tr></thead><tbody><tr><td><strong>Achievement type</strong></td><td align="center">Direct</td><td align="center">Direct</td></tr><tr><td><strong>Achievement trigger</strong></td><td align="center">Transaction</td><td align="center">Custom event (walk)</td></tr><tr><td><strong>Achievement counting</strong></td><td align="center">Number of specific event attributes</td><td align="center">Number of specific event attributes</td></tr><tr><td><strong>Achievement goal</strong></td><td align="center"><p><strong>Occurrence:</strong> Overall</p><p> <strong>Target attribute:</strong> transaction.category('sport').qty</p><p><strong>Goal:</strong> 3</p></td><td align="center"><p></p><p><strong>Occurrence:</strong> Overall</p><p><strong>Target attribute</strong>: event.body.distance_km</p><p><strong>Goal:</strong> 10</p></td></tr></tbody></table>

## Learn more about

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Creating achievement</strong></td><td>Learn how to create achievements in Open Loyalty</td><td></td><td><a href="/pages/pMt2cpXbWGehlsBZavMf">/pages/pMt2cpXbWGehlsBZavMf</a></td></tr><tr><td><strong>Sample achievements</strong></td><td>Discover how basic scenarios may look in the loyalty program</td><td></td><td><a href="/pages/6dtfvLyXyxjrlin88Jar">/pages/6dtfvLyXyxjrlin88Jar</a></td></tr></tbody></table>


# Creating Achievement

In this section, you will learn how to create achievement in the Admin Panel, and what are the meanings of the elements.

***

## Adding achievement

In order to create the achievement, follow the following steps:

{% stepper %}
{% step %}
Go to the **Achievements** module
{% endstep %}

{% step %}
Click **ADD ACHIEVEMENT** in the top right corner
{% endstep %}

{% step %}
Choose **Start from Scratch,** **Use a template** or **Import achievements**
{% endstep %}

{% step %}
Define **Basic information, RULE (or Rules),** and set **Limit** (optional)
{% endstep %}

{% step %}
Set **Achievement status** to **Active**
{% endstep %}

{% step %}
Click on ADD ACHIEVEMENT.
{% endstep %}
{% endstepper %}

### Start from scratch

<figure><img src="/files/Hb8rgeiRplSc0b57UpJT" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="success" %}
**Start from scratch achievement how-to**

1. Fill in [**Basic information**](#basic-information) in the <mark style="color:purple;">**①**</mark> **Achievement info** (remember to set Status to Active)
2. Click **Continue**
3. Set the <mark style="color:purple;">**②**</mark> **Rules** of your Achievement
4. Click **Continue** to review the configuration **in the** <mark style="color:purple;">③</mark> **Summary**
5. Press **Add Achievement.**
   {% endhint %}

### **Use a template**

In this option, you can choose a predefined configuration for internal testing, a specific use case for your loyalty program, or inspiration for the future scenario. You can edit then if you need minor changes of goals, achievement counting, limits etc.

<figure><img src="/files/zSCQwEWdAUrEldU63zQd" alt="" width="563"><figcaption></figcaption></figure>

### Import achievements

With this option, you can import achievements to Open Loyalty in a JSON file. For more reference, please visit [Achievement export/import.](/campaigns/achievements/managing-achievements#achievement-export-import)

{% hint style="success" %}
**Importing achievement/s how-to**

<img src="/files/70BIwffO3SzfjfVkZOxl" alt="" data-size="original">

1. Go to **Achievements**&#x20;
2. Click **Add achievements -> Import achievements**

After clicking this button you will see the pop-up window to upload the JSON file

<img src="/files/cScZofkz7Vmm8L2TYc5Z" alt="" data-size="original">

3. Follow the instructions from the popup window.
4. Click **IMPORT** to download the file with achievements
5. After importing, the achievement you will see the list of all successful and/or achievements that require the action to edit.
   {% endhint %}

***

## Achievement elements

### Basic information

<figure><img src="/files/rxk1I6SchO4qiLnVBuZl" alt=""><figcaption></figcaption></figure>

* **Name** - Name of the achievement.&#x20;
* **Short description** - Description of the achievement.
* **Timeframe** - Timeframe of the achievement activity. Conditions available in this section are based on the Open Loyalty Language. If None is selected, the achievement is always active (If the Active field is set to True). With Timeframe, you can set the achievement to be active only on certain days of the week, such as Monday, Wednesday, and Friday.

***

### Rules

<figure><img src="/files/xMIQV8rQdiYFdDF0zaza" alt="" width="563"><figcaption></figcaption></figure>

{% hint style="info" %}
You can set up to 6 rules in the achievements.

![](/files/ZZ3CtLKLisGAQNaKIGg7)
{% endhint %}

<figure><img src="/files/uQnaZUfLDyLhKVTOlKkl" alt=""><figcaption></figcaption></figure>

#### **Rule basic settings:**

<figure><img src="/files/yIGnuvtshMNAip1o6yEx" alt=""><figcaption></figcaption></figure>

#### **Achievement type:**

|            Direct achievement            |                                                Referral achievement                                               |
| :--------------------------------------: | :---------------------------------------------------------------------------------------------------------------: |
| Achievement directed to a single member. | Achievement directed to a member (referrer) and friend (referee). The rules are set for the referrer and referee. |

#### **Achievement trigger**:

|                           Transaction                           |                                   Custom event                                   |
| :-------------------------------------------------------------: | :------------------------------------------------------------------------------: |
| Achievement responds to system events based on the transaction. | Achievement responds to custom events based on a predefined custom event schema. |

#### **Achievement counting:**&#x20;

|                                    Number of event occurrences                                    |                                 Number of specific event attributes                                |
| :-----------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------: |
| Determines the number of occurrences of the trigger required to achieve/complete the achievement. | Determines the value of the attribute of the trigger required to achieve/complete the achievement. |

#### **Event frequency limit -** determines how the goal will be counted.&#x20;

<figure><img src="/files/AeL7qlkXP8y8M7zDa39w" alt=""><figcaption></figcaption></figure>

Example: The member needs to place 4 transactions over 1 month, but only one order per week.&#x20;

<figure><img src="/files/0z5g2vEXv0Nu8wQWFrom" alt="" width="563"><figcaption></figcaption></figure>

#### **Achievement goal -** determines the goal of the achievement

<figure><img src="/files/zrcfaFPSmaV0piu6WntV" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}

* **Occurrence** - determines the time interval/manner in which the trigger should occur Overall,  Last X days, or Consecutively.
  * **Overall** - The events that can occur at any occurrence.
  * **Last X days -** events that occurred in the last  X days.
  * **Streak (day, week, month, year) -** Sequential events in a period. If the achievement has a goal with consecutive days/weeks/months, the Open Loyalty also checks the actual date when the event ends up in the Admin Panel. It’s crucial to send custom events from the oldest to the current date for correct achievement progression.
* **Goal -** determines the goal of the achievement.
  * *Example: "Need to perform an action at least 2 times per week for 2 consecutive weeks."*
  * In the **Referral achievement**, the goal corresponds to the number of referees. Each referee needs to complete one transaction - this section allows you to define whether the goal applies to the single referred user.
    {% endhint %}

#### **Track Unique Values**

You can track unique values of custom event attributes.\
For example, if you're monitoring progress based on 5 new events, you can choose to track only unique values from a specific attribute (included in the custom event data).\
There’s no need to predefine the list of possible values — progress will be counted only when a new, previously untracked value appears. This tracking is done separately for each member.

<figure><img src="/files/oLHTSoLI8z2BGKpjefBb" alt=""><figcaption></figcaption></figure>

#### **Trigger Condition**

The section allows you to define additional conditions for a given achievement trigger. For Transactions, these are conditions limited to the transaction context object. e.g. transaction.purchasePlace. For CustomEvent, these are the parameters specified in the custom event schema. [`Expressions`](/integrations-and-data-exchange/expressions) can also be used to set the condition.

<figure><img src="/files/CQNsDmNod28UTYNCxS6d" alt=""><figcaption></figcaption></figure>

***

### Limits&#x20;

This option sets a limit on the amount of completion of an achievement.

The limit can be set by:

<figure><img src="/files/J9qLkeVuFgIOFLRXaUoV" alt=""><figcaption></figcaption></figure>

* Unlimited
* Periods (per hour, day, week, month year),&#x20;
* In total&#x20;

The periods in the limit are counted on a calendar basis, this means that:

* Days are counted from 00:00:00 to 23:59:59
* Weeks are counted from Monday to Sunday
* Months are counted from the first to the last day of the month
* Years from January 1 to December 31<br>

### Achievement status

For the achievement to work, it's crucial to activate it before saving settings.

<figure><img src="/files/nUyX1ERCOFAwdzFM8NiA" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
If you want to edit the settings after members start participating we advise you to create a new Achievement. In the case of editing any of the rule sets, all member progress will be lost.
{% endhint %}

***

## Learn more about

<table data-view="cards"><thead><tr><th></th><th></th><th></th></tr></thead><tbody><tr><td><a href="/pages/xU2wDylOPG6iOXt1RvJ6"><strong>Achievement progressed campaign</strong></a></td><td>Discover how to set a campaign based on achievement progress</td><td></td></tr></tbody></table>


# Managing Achievements

In this article, you will get familiar how to manage the achievements in Open Loyalty

## Editing achievements

{% hint style="success" %}
**To edit the Achievement:**

1. Go to **Achievements**
2. Click the context menu of the selected Achievement
3. Click **Edit**
4. After making changes click **SAVE ACHIEVEMENTS**

{% hint style="danger" %}
Changing core achievement settings or rules can reset member progress. Segments using this achievement will also stop working and need to be recreated. Only basic achievement settings and trigger conditions can be updated without resetting member progress.

![](/files/Jn12BmbdKOAQyzaKB8xJ)
{% endhint %}
{% endhint %}

***

## Duplicating achievement

{% hint style="success" %}
**To duplicate the Achievement:**

1. Go to **Achievements**
2. Click the context menu of the selected Achievement
3. Click **Duplicate achievement**
4. Click **SAVE ACHIEVEMENTS**
   {% endhint %}

***

## Duplicating rule in the achievement

{% hint style="success" %}
**To duplicate a rule the Achievement:**

1. Go to **Achievements ->** specific **Achievement**
2. Scroll down to the **Rules** click the context menu of the rule
3. Click **Duplicate rule**

<img src="/files/1dmLiqTplVdoQN4fWAyN" alt="" data-size="original">

1. Click **SAVE ACHIEVEMENT**

{% hint style="danger" %}
If the achievement already has members, duplicating a rule can reset member progress. This may also impact segments that depend on achievements. A warning appears before you save.

![](/files/7IqRLTPU2yqQ0ezZjZZX)
{% endhint %}
{% endhint %}

## Achievement export/import

In the Achievements section, you can export and import achievements. These actions require a file in a `.json` format.

{% hint style="info" %}
You can export/import up to 50 achievements at once (in one file).
{% endhint %}

### Exporting achievements

{% hint style="success" %}
**Exporting achievement/s how-to**

<img src="/files/IagUIgMq1OWkOkYXMvv6" alt="" data-size="original">

To export a single achievement or several achievements:

1. Go to **Achievements**&#x20;
2. Click **SELECT TO EXPORT**

After clicking this button you will see the checkboxes next to the achievement name.

<img src="/files/7EKiUdRVs8cbxoQftr7l" alt="" data-size="original">

3. Select the achievements you want to export to the JSON file&#x20;
4. Click **EXPORT TO .JSON FILE (X)** to download the achievement file
   {% endhint %}

### Importing achievements

{% hint style="success" %}
**Importing achievement/s how-to**

<img src="/files/70BIwffO3SzfjfVkZOxl" alt="" data-size="original">

1. Go to **Achievements**&#x20;
2. Click **Add achievements -> Import achievements**

After clicking this button you will see the pop-up window to upload the JSON file

<img src="/files/cScZofkz7Vmm8L2TYc5Z" alt="" data-size="original">

3. Follow the instructions from the popup window.
4. Click **IMPORT** to download the file with achievements
5. After importing, the achievement you will see the list of all successful and/or achievements that require the action to edit.
   {% endhint %}

### Duplicating Achievements to a different tenant

{% hint style="success" %}
**Exporting achievements to a different tenant how-to:**

<img src="/files/IagUIgMq1OWkOkYXMvv6" alt="" data-size="original">

To export achievement(s):

1. Go to **Achievements**&#x20;
2. Click **SELECT TO EXPORT**

After clicking this button you will see the checkboxes next to the achievement name.

<img src="/files/7EKiUdRVs8cbxoQftr7l" alt="" data-size="original">

3. Select the achievements you want to export to the different tenant
4. Click **Export achievements to 'Different tenant' ->** Select the targeted tenant

![](/files/7KinfE8nfiPQHwAwSXw5)

5. To complete the action click **Copy achievement(s) and view target tenant.**

![](/files/t8cBoFCwnVFdBO2LqDN4)

6. After importing the achievement(s) you will see the list of all successful and/or campaigns that require the action to edit.
   {% endhint %}


# Follow up Achievements

## What is a follow-up achievement?

It refers to a type of loyalty achievement in which a member needs to fulfill specific conditions before unlocking a next/following achievement. Once members have completed one achievement, they can embark on the journey of unlocked achievement.

In other words, unlocking achievement is a reward for completing previous ones.

***

## What is the business goal of a follow-up achievement?

Creating a follow-up achievement enables you to design advanced gamification scenarios that can engage members on multiple levels. The primary goal of this type of achievement is to increase customer retention and sales by providing rewards to members who complete specific conditions. Additionally, it allows you to set achievements as milestones in the loyalty journey.

Unlocking campaigns as a reward for completing previous ones encourages members to keep returning and further engage with your business.

***

### How does a follow-up achievement work?

Once one achievement is completed, it unlocks the next achievement for a member. Depending on different scenarios. When achievement has similar rules, only one can progress until it is completed and after the second one is unlocked.

***

## How to set up a follow-up achievement?

Examples of follow-up achievement configuration based on the scenario:

* The member completes Achievement "Login 5 days in a row" > can see/unlock Achievement B&#x20;
* Use Case: A member has completed the achievement "Login 5 days in a row". When this achievement is fulfilled, the new achievement "Login 10 days in a row" begins. These challenges do not overlap. Therefore, the second login challenge should start with 0 steps and should not have 5 steps already fulfilled because the first one has been completed. The first achievement gives 50 pts and the second 150 pts.&#x20;

{% hint style="success" %}
**Follow-up achievement how-to**

1. Go to  **GENERAL -> Members -> Custom events ->  Custom event schema -> Add event. schema**&#x20;

*Create a* [*custom event schema*](/members-and-activity/custom-events/custom-event-schemas) *to check log-in events. Example: `LogInCheck.`*

2. Go to **LOYALTY MODULES** -> **Achievements** -> **Add Achievement** "Login 5 days in a row"

***Type:** Direct*

***Trigger:** Custom event*

***Achievement Counting:** Number of event occurrences*

***Limits:** 1 in total*

<img src="/files/ESqQYX9q6BnkVPgzVasN" alt="" data-size="original">

3. Go to **LOYALTY MODULES** -> **Campaigns** -> Create the first Campaign for completing Achievement "Login 5 days in a row":

***Type:** Direct*

***Trigger:** Achievement "Login 5 days in a row" completion*

***Effects:** Adds 50 units*

4. Go to  **GENERAL -> Members -> Segments -> Add segments**

*Create a* [*dynamic segment*](broken://pages/-MYHFB9eGVOoFFe5u6Vf#segments-module-overview) *based on "Login 5 days in a row" achievement completion.*&#x20;

<img src="/files/NqH4N9VHYWqov0lDaerL" alt="" data-size="original">

5. Go to **LOYALTY MODULES** -> **Achievements** -> **Add Achievement** "Login 5 days in a row"

***Type:** Direct*

***Trigger:** Custom event*

***Achievement Counting:** Number of event occurrences*

***Limits:** 1 in total*&#x20;

**Trigger Condition:** Member segment Log in 5 days in row  completion

<img src="/files/G4XpHDxbwG8qxhc8h34v" alt="" data-size="original">

6. Go to **LOYALTY MODULES** -> **Campaigns** -> Create the second Campaign for completing Achievement "Login 10 days in a row" and add effect with an addition of 150 pts.
   {% endhint %}


# Leaderboards

In this section, we will cover everything related to Leaderboards.

Leaderboards in Open Loyalty are dynamic ranking systems designed to display your members in order of their performance based on a specific metric.&#x20;

<figure><img src="/files/GaX5fKBGpW0VEcBGF7dy" alt=""><figcaption></figcaption></figure>

By showcasing how members compare to each other, leaderboards can motivate participants to achieve higher scores or more activity.&#x20;

{% hint style="info" %}

* **Currently, you can have up to 3 active leaderboards within an environment.**
* Members with the same tracked metric value will tie and appear in the same position on the leaderboard.
* Leaderboards are recalculated **every 4 hours.**
* Future updates will expand leaderboard capabilities, including the ability to target specific segments or tiers and introduce additional conditions.
  {% endhint %}

***

### How leaderboards drive engagement

Leaderboards add an exciting, competitive element to your loyalty program. They are effective because they:

* **Spark Healthy Competition**: Members will strive to earn more points to see their name at the top of the list.
* **Encourage Specific Actions**: They create a clear incentive for members to repeat profitable behaviors to climb the rankings.
* **Reward Top Members**: They give you a simple and public way to identify and reward your most active and valuable customers.
* **Build Community**: A shared contest or ranking creates a sense of community and friendly rivalry.

### What you can do with leaderboards (common use cases)

Leaderboards are flexible and can be used to achieve many different goals. For example, you can:

* **Run Monthly Contests**: Create a short-term leaderboard for the "Top 10 Point Earners of the Month" and offer a bonus prize to the winners. This creates urgency and repeat visits.
* **Incentivize Referrals**: Run a month-long "Top Referrer" leaderboard to see which of your members are bringing in the most new customers and reward them accordingly.
* **Promote New Products**: Launch a leaderboard that tracks points earned *only* from the purchase of a new product or category.

## Learn more about

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><strong>Creating Leaderboards</strong></td><td>Find out how to create your first leaderboard.</td><td><a href="/pages/shZmlsOl3iJNCSdg43kT">/pages/shZmlsOl3iJNCSdg43kT</a></td></tr><tr><td><strong>Managing and Viewing Rankings</strong></td><td>Check how to manage leaderboards and view global rankings.</td><td><a href="/pages/o0cta7sDq0kkuEffhGPc">/pages/o0cta7sDq0kkuEffhGPc</a></td></tr><tr><td><strong>Rewarding Cycle</strong></td><td>Check how to reward members based on how they perfrom in a leaderboard.</td><td><a href="/pages/wLlaGxOsSpPa0Fnge5ZK">/pages/wLlaGxOsSpPa0Fnge5ZK</a></td></tr><tr><td><strong>Single Member Ranking</strong></td><td>Check how to view rankings for a single member.</td><td><a href="/pages/LzYKVI2XhURNzio7SgUs">/pages/LzYKVI2XhURNzio7SgUs</a></td></tr><tr><td><strong>Common use cases</strong></td><td>Check our examples on leaderboards.</td><td><a href="/pages/PDHvpjwuN43rvFiUUDGD">/pages/PDHvpjwuN43rvFiUUDGD</a></td></tr></tbody></table>


# Creating Leaderboards

This article explains how leaderboards can be created and used in your loyalty program.

Adding a new leaderboard allows you to define the rules, timeframe, and visibility for how members will be ranked in your loyalty program. This process involves setting up basic information, choosing the duration, determining who can see it, and specifying the metric that will be tracked.

## Step-by-step instructions

Follow these steps to set up a new leaderboard in your Open Loyalty environment:

{% stepper %}
{% step %}
**Go to the Leaderboards section**

In the left-hand navigation, under **Modules**, click on **Leaderboards**.

<figure><img src="/files/eVvuRABSV3YL95TFvpH6" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Add a new leaderboard**

On the Leaderboards page, click the **Add leaderboard** button (located in the top right corner).

<figure><img src="/files/Q793jJGEOFUDF3l9OMwE" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Basic Info**

* **Title and description:** Enter a clear Leaderboard name (e.g., "Top Spenders," "Most Active Members") and an optional Leaderboard description to explain its purpose.

<figure><img src="/files/8KdqajFdrezEnuO7J4ZD" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Timeframe**

* **Start date:** Select the date when the leaderboard should begin tracking member activity.&#x20;
* **End date (optional):** Choose an end date if you want the leaderboard to stop tracking activity after a specific period.

{% hint style="danger" %}
Leaderboards will not do a retroactive calculation, even if you set a date in the past!
{% endhint %}

<figure><img src="/files/qnKRmsXtpEi650Y6wK7w" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Custom Attributes**

This section allows you to include custom data fields for additional details. For now, you can leave this as default unless you have specific custom attributes to add.

<figure><img src="/files/cAo3bwZgeaDGjlZrOIvN" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Tracked Metric**

* Select the type of activity you want to measure and rank members by from the Metric dropdown (e.g., "Cumulative earned units in a wallet").
* If applicable, select the Wallet type.

<figure><img src="/files/Kx6XYy8b8aO83mcPrUNP" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Status**

Toggle the Active switch to enable or disable the leaderboard. An active leaderboard will collect data.

<figure><img src="/files/cm1FZidWrlslCRKuomXt" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Leaderboard Grouping**

Optionally divide participants into independent sub-leaderboards based on a member attribute. Each group maintains its own Top-1000 ranking and, if a rewarding cycle is configured, its own reward distribution.

{% hint style="info" %}
Members with a missing or blank value for the selected grouping field will be filtered out from the leaderboard entirely.
{% endhint %}

Select one of the three grouping options:

**No grouping&#x20;*****(default)***

All members compete together in a single unified ranking. No sub-groups are created.

**Custom attribute**

Group members by the value of a free-form attribute key stored in their profile.

* Enter the **Key** — the custom attribute key whose values define the groups. Members sharing the same value for this key are placed in the same sub-group.

<figure><img src="/files/cdn4MyjBEgTK0vCNQCiG" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
We recommend selecting a grouping with fewer than 500 groups (default limit), including active ones. If you exceed this, not all groups will be rewarded when you enable rewarding.
{% endhint %}

**Address fields**

Group members by a standard address field from their member profile. Select the **Profile field** to group by:

* **Postal code**
* **City**
* **State**
* **Country**

<figure><img src="/files/SuZii5Bs1WSuUuFRs0zE" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
We recommend selecting a grouping with fewer than 500 groups (default limit), including active ones. If you exceed this, not all groups will be rewarded when you enable rewarding.
{% endhint %}
{% endstep %}

{% step %}
**Rewarding Cycle (optional)**

You can enable the rewarding cycle for top ranking members.

<figure><img src="/files/e7qWTg1ryjucZYc4UDQN" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
For more information on the rewarding cycle, please refer to this section of the User Guide: [Rewarding Cycle](/gamification/leaderboards/rewarding-cycle)
{% endhint %}
{% endstep %}

{% step %}
**Summary**

Review all your settings. If everything looks correct, click **Add leaderboard**.
{% endstep %}
{% endstepper %}

## Final tips

* **Currently, you can have up to 3 active leaderboards within an environment.**
* Members with the same tracked metric value will tie and appear in the same position on the leaderboard.
* Leaderboards are recalculated **every 4 hours.**
* Future updates will expand leaderboard capabilities, including the ability to target specific segments or tiers and introduce additional conditions.


# Rewarding Cycle

The **Rewarding Cycle** is an additional step in the leaderboard setup that allows you to automatically reward members based on their **final ranking positions**. Rewards are distributed at the end of each monthly cycle.

***

## 📌 How It Works

* Rewards are always issued **monthly**, at the **end of the month**.
* If a leaderboard **spans across months** (e.g. *15 Sep – 15 Oct*), rewards will be issued **twice**:
  * On **1 Oct** (start of the new cycle).
  * On **15 Oct** (end of leaderboard).
* If a leaderboard **starts and ends within the same month**, members will only be rewarded **once**, at the end of the leaderboard.
* If a leaderboard has **no end date**, rewards are distributed **every month** at the end of the cycle.

{% hint style="danger" %}
After the end of the month, the system waits **1 hour** for all events to flow in (e.g., points for the previous month’s activity).

Rewards may take up to **2 hours** to be fully calculated and issued.
{% endhint %}

***

## Step-by-step instructions

Follow these steps to add a rewarding cycle:

{% stepper %}
{% step %}
**Enable Rewarding Cycle**

Check the box during the final step of leaderboard setup.

<figure><img src="/files/tNyuRuYBW8Jimf7q6bvO" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}
**Define Reward Logic**

* Define conditions:
  * **Position range** (e.g., positions 1–3).
  * **Exact position** (e.g., position 1 only).
  * And any additional conditions (e.g. member's segments, custom attribute etc.)

<figure><img src="/files/wLcD9wIsDX6w22GxUUeB" alt=""><figcaption></figcaption></figure>

* Add one or more **rewards**:
  * Add units
  * Deduct units
  * Give reward
  * Set/Remove member custom attributes

<figure><img src="/files/uc1Jfp0icaqaSu7kparI" alt=""><figcaption></figcaption></figure>

{% hint style="danger" %}
When using **Add Units -** if points are added to the wallet used for the Leaderboard tracking, the member can artificially increase their rank.
{% endhint %}
{% endstep %}

{% step %}
**Set Leaderboard Budget**

Limit how many units can be rewarded:

* Unlimited
* Per month
* In total

<figure><img src="/files/sBxBhsJBBQgjBdmjX2Yl" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Limitations of the rewards redemption are set up in each reward's configuration.
{% endhint %}
{% endstep %}

{% step %}
**Save and Confirm**

The reward logic is applied automatically at the end of each cycle.
{% endstep %}
{% endstepper %}

***

## 📖 Example

* **Leaderboard Duration:** 1 Sep – 30 Sep
* **Reward Rule:** Top 3 members each month receive 100 points.
* **Outcome:** On 30 Sep, the top 3 members receive 100 points each.

If the leaderboard was extended to **15 Oct**, the top 3 would also receive rewards on 1 Oct (monthly cycle) and again on 15 Oct (leaderboard end).

***

## ✅ Summary

The **Rewarding Cycle** lets you automate reward distribution for leaderboard participants, ensuring fair recognition for top performers each month. With flexible rules for **positions, ranges, and reward types**, it supports everything from **monthly competitions** to **long-term leaderboard challenges**.




---

[Next Page](/llms-full.txt/1)

