Skip to main content
Achievements are cumulative goals that customers reach by interacting with a brand in predetermined ways. They bring a gamification element to the incentive program, customers progress through levels as they accumulate counts, unlocking rewards or benefits at each milestone.

Key characteristics

  • A customer cannot lose an Achievement Level: unlike Tiers, achievement progress only goes forward
  • Customers can hold multiple Achievements simultaneously
  • Achievements are attached to a profile for the lifetime of their relationship with the brand
  • Achievements can operate independently or in conjunction with the broader incentive suite

Structure: counts and levels

An Achievement is made up of: Counts: increments that go up by 1 each time a qualifying event occurs. Counts are tracked automatically via Omneo events or via the Achievements API. Levels: thresholds defined within an Achievement. When a Count crosses a Level threshold, the customer “levels up.” Levelling up can trigger other incentives (Rewards, Benefits).

Level strategies

Brands can structure achievements in different ways:

Achievement visibility

Achievements can be configured with different visibility modes:

Campaign dates and what actually gates earning

An achievement definition carries starts_at and ends_at. They are commonly read as the campaign’s operating window. They are not — they are a presentation window, deciding when the achievement is offered to customers alongside is_published. Earning is decided somewhere else entirely: Nothing binds the first row to the second. A reaction with no date condition increments on every qualifying event from the moment it is activated, whatever the definition’s dates say, and a level crossed that way issues its rewards or benefits for real.
Setting starts_at on the definition does not stop a campaign earning early, and ends_at does not stop it earning late. Put the date test in the reaction — see Date-gating a campaign.

Why batched transactions make this worse

The dangerous case is not a customer shopping a few minutes early. It is trade that arrives late. A POS batch can land hours or days after the sales it contains, and an eCommerce resync can replay months of history in one pass. The reaction fires on arrival, so a campaign activated today can immediately award progress — and issue rewards — for trade that happened before it started. Two consequences worth designing for:
  • Gate on the transaction’s transacted_at, never on when Omneo ingested it.
  • Apply the same gate to every reaction for the campaign. Earn reactions are usually paired with a transaction.sync or transaction.resent twin; a gate on only one of them leaves the other free to backfill.
Because achievement progress only ever goes up, there is no automatic correction. Cleaning up after an early earn means finding the affected profiles and unwinding the rewards by hand.

Achievements vs tiers

When to use achievements

Achievements are most effective when:
  • You want to reward engagement beyond spending (profile completion, referrals, event attendance)
  • Your tier program is getting overly complex: Achievements can handle non-financial milestones separately
  • You want to create a sense of discovery and progress for customers

Displaying achievements

Achievements can be shown in CX Manager, Clienteling, Profile Portal, and via the Omneo SDK for embedded experiences.