The Booking Engine

One checkout, one payment, far less reconciliation

Take a single payment for the whole trip and give your ops team one record to manage instead of five. Underneath the agent sits a hardened booking engine: a single plan becomes a single payment becomes a single Booking with line items for every component — then idempotent jobs confirm each supplier with retries and partial-confirmation handling.

Plan → pay → confirm

From finalised plan to confirmed trip

Every component the agent picked flows through one engine — so the traveller pays once and your ops team manages one record.

1

One plan

The agent finalises a single plan_state holding every picked component, fully priced with your markup.

2

One checkout

A unified checkout via Stripe or Square takes a single payment for the whole package.

3

One Booking

A single Booking record is created with a line item for every component in the trip.

4

Per-component confirm

Idempotent jobs transact each supplier — hotels, flights, cars, activities, transfers — with retries.

Post-payment confirmation

Idempotent jobs that don't double-book

After payment, a dedicated confirmation job runs per component, transacting that supplier and writing the result back to the booking. Jobs are idempotent — a retry never books twice — and they retry on transient failures.

Partial confirmation is handled, not ignored. If the flight confirms but a transfer supplier times out, the engine records exactly what's confirmed, retries what isn't, and surfaces the state to ops — no silent half-bookings.

It pairs with the agent's false-"booked" guard: nothing is ever presented as booked until these jobs actually confirm it.

ops · Booking #VY-10293
Fulfilment
Per-component confirmation
Partial
Flight ✓ Hotel · Paris ✓ Hotel · Lyon ✓ Hotel · Nice ✓ Rail pass ✓ Transfer · pending
Flight NCE→LHR · PNR JK4F2P
Hôtel des Archives · Paris · ref HB-88421
Cour des Loges · Lyon · ref HB-88422
Hôtel La Pérouse · Nice · ref HB-88423
Interrail Global pass · 1st class · issued
Transfer · Nice · retrying 2/4

5 of 6 confirmed · 1 retrying · booking held in partial state until resolved. Idempotent — a retry never books twice.

Engine capabilities

Less admin overhead around every booking

Unified checkout

One payment for the whole package via Stripe or Square — no five-card juggling.

One Booking, many line items

A single record with a line item per component, prices and supplier refs in one place.

Refunds & modifications

Amend or refund at the component level against the same booking, with supplier policies respected.

Admin & ops console

See bookings, confirmation status, partial states and incident telemetry in one view.

Pricing rules & margin

Set markup per component and per install — the quoted price is always your sell price.

Component toggles

Enable any subset of the six components per install via ComponentSetting.

Bring your own credentials

Plug in your own Duffel, HotelBeds, AllAboard and other supplier accounts.

White-label

Run the whole engine under your own brand for your agents or your customers.

Telemetry & audit

Every guard trip, correction and confirmation logged for ops, audit and support.

Component toggles

Configure the platform to your business

A flights-only OTA, a rail-led tour operator, a full multi-modal DMC — each runs the same engine with a different ComponentSetting profile. Flip components on or off; the agent only ever sells what's enabled.

Bring your own credentials, set your margins, ship under your brand — Voyage is the engine, your business is the storefront.

admin · ComponentSetting
Components & suppliers
5 enabled
Flights Duffel · Live PNR
Hotels HotelBeds + Duffel Stays · Rate keys
Rail passes AllAboard · Compliance engine
Cars
Activities Local DMC feeds · Per destination
Transfers Ground network · Auto-linked

Cars disabled — the agent won't search or sell them. Bring your own supplier credentials per component.

The hardened engine behind the agent

Book a demo and we'll walk you through checkout, confirmation, refunds and the ops console on your own configuration.