Skip to content
All case studies

A loyalty platform that turns enterprise transactions into customer engagement

I led the architecture of a shared loyalty platform designed to absorb variation instead of forking: organization-specific enterprise systems feed a common transaction and loyalty engine, configurable rules drive points and rewards, and business events can trigger campaigns, challenges, and push engagement from the same core.

  • Software Architecture
  • Cloud & Platform Engineering
  • Data

Challenge

A loyalty platform looks simple if the requirement is only a points balance. Enterprise loyalty is an integration and transaction problem. Every organization arrives with different customer systems, transaction sources, authentication, protocols, request formats, earning and redemption rules, reward models, campaigns, reporting needs, and notification channels.

Some systems expose modern APIs; others rely on older contracts and SOAP/XML-style integrations. Some transactions are synchronous and customer-facing; others depend on external platforms that may be slow or temporarily unavailable. The loyalty state still has to remain explainable and correct.

Context

The platform needed to serve organizations whose businesses and loyalty programs were different enough that building a custom product for each one would have been the easy short-term answer. The architecture had to make those differences configurable without flattening everything into the lowest common denominator.

A single business event can touch several concerns. A transaction may change a balance, affect a category, award or consume a reward, advance a challenge, qualify a customer for a campaign, and trigger a push notification. Those actions have different dependencies and failure modes, but they have to behave as one coherent experience.

Architecture

The shared domain model separates organization-specific configuration from the core loyalty engine. Program differences such as earning behavior, categories, rewards, campaigns, templates, and integration behavior are represented as configuration and data wherever practical, allowing one core platform to support very different programs.

An integration layer adapts external enterprise systems to that common model. Different protocols and payload shapes are normalized at the boundary, with configurable request and response handling where appropriate. Integration attempts are observable and recoverable so an external failure does not become unexplained loyalty drift.

A trigger layer connects changes in loyalty state to customer engagement. Transactions and lifecycle events can award or redeem points, issue rewards, update challenges, select campaigns, and drive push notifications through the same platform rules rather than through unrelated systems.

Read-heavy experiences such as balances and catalogs can be cached aggressively, while transaction-changing paths retain authoritative persistent state. The performance model therefore reflects the difference between serving customer experiences quickly and preserving financial and loyalty correctness.

My role

I led the architecture and technical direction across the shared loyalty model, organization configuration, enterprise integration framework, transaction and points flows, rewards, campaign and notification triggers, performance, and the cloud and platform evolution behind the system. I also led the work of adapting the same core to organizations whose requirements were different enough that separate products would have been the easier answer.

Key decisions

  1. One configurable core instead of a fork per organization

    Why
    Forking solves the first customization quickly and makes every later security fix, feature, integration, and platform change more expensive. A common core keeps those investments shared.
    Trade-off
    The configuration model has to absorb meaningful variation, and genuinely new business models force the shared architecture to evolve.
  2. Put enterprise variation at the integration boundary

    Why
    The loyalty engine should reason about a consistent internal model even when upstream systems speak different protocols, schemas, authentication models, and transaction formats.
    Trade-off
    The adapter and mapping layer becomes an important product surface of its own and requires strong diagnostics when an external contract changes.
  3. Connect loyalty state to an explicit trigger engine

    Why
    A business event often needs to do more than update a points balance. Connecting loyalty rules, rewards, challenges, campaigns, and notifications makes engagement part of the same domain rather than a collection of disconnected side systems.
    Trade-off
    Trigger-driven workflows require careful handling of retries, ordering, duplicate execution, and partial failure.
  4. Treat external-system failure as an expected operating condition

    Why
    Large enterprise systems do not share the same availability window or failure behavior. Integration calls need enough logging, recovery, retry, and operational visibility that temporary failures can be diagnosed and reconciled rather than becoming silent data inconsistencies.
    Trade-off
    Recoverability introduces queues, state, reconciliation, and operational complexity that a simple synchronous integration would avoid.

Outcome

The platform can support multiple branded loyalty programs and very different enterprise ecosystems without turning every new organization into a new codebase. Core improvements ship once while integrations and program behavior adapt around them.

More importantly, transactions, loyalty state, and customer engagement live in one architecture. The same business activity can update customer value, change eligibility, issue a benefit, advance a challenge, and trigger the next customer interaction without stitching together a different product for every step.

Constraints

Client and brand names, program economics, transaction volumes, partner systems, integration contracts, notification logic, and infrastructure details are intentionally omitted.

Technologies

  • Node.js
  • PostgreSQL
  • Redis
  • AWS
  • React
  • REST
  • SOAP

This case study is sanitized. Client names, internal systems, and confidential detail are omitted; where specifics cannot be shared, the architecture is described as a pattern.