Work Hospitality benefits programme

From hotel booking to guest benefits, without manual steps

An event-driven platform that turns bookings in a host's property management system into guest passes, lets guests claim them in the member app, and keeps both sides in sync when a booking changes.

Sector
Hospitality
Our part
Integration architecture, Booking processing, Guest pass and claim API, Sync to the member app, Infrastructure and delivery pipeline
Built with
TypeScript, AWS Lambda, Amazon SQS, Aurora PostgreSQL, AWS CDK, GitHub Actions

See how it works

An interactive demo with sample data. Click through it to follow the flow.

Guest passes Booking events Sample data

Harbour View Apartments

12–16 Jun, 2 adults, 1 child

Passes
3
Claimed
1
Version
v1
  1. Webhook received Signature verified
  2. Booking stored Booking and outbox record committed together
  3. 3 passes prepared Version 1 · infants excluded
  4. Pass claimed in the member app 1 of 3 · idempotent request
  5. Synced to member app Delivered on first attempt
Interactive demo with sample data. The real platform runs as backend services without a screen like this; the console shows what it does with each booking.

The starting point

The client runs a guest benefits programme with local businesses: hotels and holiday rental hosts pay for passes their guests use during a stay. For that to work at scale, passes had to appear from real bookings automatically, reach guests through the member app, and stay correct when a booking is moved, resized or cancelled — with nobody re-typing data between systems.

What we were responsible for

Readymade designed and built the backend platform: the property management system integration, booking processing, the guest pass and claim API, delivery to the member app, the cloud infrastructure and the deployment pipeline. The member app itself is run by the client's own team.

What we built

  • Booking intake

    Signed webhooks from the host's property management system. Each booking is stored together with an outbox record in one transaction, so a booking can't be half-processed or lost between steps.

  • Guest pass preparation

    Passes are prepared from the booking — one per eligible guest — and date changes, guest count changes and cancellations flow through as versioned updates.

  • Claim API for the member app

    The member app looks up and claims passes through a small API with hashed codes, rate limiting and idempotent requests, so a retry never creates a second claim.

  • Sync back to the app

    A queue-driven worker delivers pass updates to the member app, with retries, dead-letter queues and a scheduled safety net that re-sends anything that didn't arrive.

Why it was hard

  • Bookings change after they are created

    Dates, guest numbers and cancellations must update passes without duplicating them.

  • Three systems fail independently

    The property system, the platform and the member app each have their own failures, so every hand-off is queued, retried and observable.

  • Guests are reached only through the client's app

    The platform never contacts guests directly; it serves the member app's backend.

The result

The booking-to-pass pipeline, the claim API and the sync to the member app were delivered with automated tests, separate development and production stages, and preview environments for every change.

  1. Booking in the host's system The property management system sends a signed webhook.
  2. Booking stored safely Booking and outbox record are committed together.
  3. Passes prepared One pass per eligible guest, versioned.
  4. Guest claims in the app Lookup and claim through the API, idempotent.
  5. App kept in sync Queued delivery with retries and a safety net.

Booking changed or cancelled The same path carries a new version of the passes.

How a booking becomes a guest benefit. Schematic; no client data.

Working on something similar?

Tell us about it. The form will note that you came from this case.

Discuss a similar project