All work
Customer lifecycle engine
Automated customer decisions with a measurement strategy built in from the start.

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.
A control group from the beginning
Impact needs comparison with customers who were not exposed to the intervention.
TradeoffA portion of eligible customers does not receive the tested campaign.
Background workflow orchestration
Lifecycle messaging and data processing are asynchronous responsibilities.
TradeoffQueued work needs retries, observability, and consistent job handling.