All work

Customer lifecycle engine

Automated customer decisions with a measurement strategy built in from the start.

Customer lifecycle product website displayed on desktop and mobile
HoldoutsMeasurement design

A control-based architecture; no revenue increase is asserted.

pgvectorData foundation

Vector support alongside relational customer data.

The challenge.

A clicked campaign does not establish that a booking was caused by that campaign. Hospitality automation needed a way to separate attribution from incrementality.

The boundaries.

  • Model customer context in a queryable backend.
  • Coordinate background workflows and lifecycle decisions.
  • Keep holdout groups separate from campaign exposure.
  • Do not present architectural intent as measured revenue uplift.

How it fits
together.

A NestJS backend combines PostgreSQL, pgvector, Prisma, and BullMQ to coordinate customer data and lifecycle workflows. Holdout groups provide the comparison needed to assess incremental effects. No realized uplift result is claimed here.

The decisions
behind the details.

01

A control group from the beginning

Impact needs comparison with customers who were not exposed to the intervention.

Tradeoff
A portion of eligible customers does not receive the tested campaign.
02

Background workflow orchestration

Lifecycle messaging and data processing are asynchronous responsibilities.

Tradeoff
Queued work needs retries, observability, and consistent job handling.

Connected home platform

Next case study