Once a group has decided and booked, the trip starts drifting. A flight moves, a fare re-prices, a charge lands twice, a hotel never confirms. This is the engine that watches for it and repairs it — the Monitor and Adapt halves of Relay. It runs on the shared trip that coordination creates, which is why we are building that first.
Delay the first leg three hours and the connection is at risk, the transfer pickup is wrong, check-in is late and the dinner table is gone. Five reservations, five suppliers, five emails — and not one of them knows about the other four. Today the organiser is the integrity layer: they notice, they work out what else just broke, they ring round. That is the job this engine takes over. It can only do it because Relay already holds the trip as one object, with every booking and every dependency in one place.
What the group agreed to, what was actually charged, and what the supplier actually confirmed. Relay holds all three because it was in the room when the decision was made.
Compared across amount, currency, dates, route, passengers, fare rules and completeness — and against the rest of the trip, so one delay surfaces everything downstream of it.
Not an alert. A priced, specific proposal — rebook, refund, re-time the transfer — that goes to the people who have to agree, and executes once, within a ceiling they already set.
The thing that needs this isn't a person watching a dashboard — it's the agent that just booked. Relay calls it after every booking and on every supplier update, and registers it as a tool the agent can invoke itself when a traveller asks whether something came through.
{
"order_id": "ord_9F2k",
"agreed": { "amount": 2480.00, "currency": "USD",
"route": "SFO-NRT", "refundable": true },
"charged": { "amount": 2480.00, "processor": "stripe",
"charge_id": "ch_1P..." },
"confirmed": { "supplier": "duffel", "status": "failed" }
}
// → 200 OK
{
"verdict": "flagged",
"flags": [{ "code": "unissued_after_charge",
"severity": "critical" }],
"remediation": { "action": "stripe.refund_full",
"status": "proposed" }
}
{
"name": "check_order_integrity",
"description": "Verify a travel order
after checkout by comparing payment,
booking request, and supplier confirmation.",
"parameters": {
"order_id": "string",
"agreed": "object",
"charged": "object",
"confirmed": "object"
}
}
// any agent that can call a tool
// can call Relay after it books.
unissued_after_chargeThe card was charged; the ticket was never issued.
duplicate_chargeA retried call after a timeout books once and charges twice.
price_driftThe amount charged doesn't match what the group agreed to.
currency_mismatchCharged in a different currency than the one quoted.
fare_rule_driftA refundable fare quietly books as non-refundable.
route_mismatchThe confirmed flight isn't the route that was chosen.
date_mismatchConfirmed dates don't match the dates the group approved.
passenger_mismatchA name on the ticket isn't the traveller it was booked for.
partial_orderThe flight books; the hotel fails — or the reverse.
refund_not_landedMarked processed upstream, never arrives for the traveller.
Each version of Relay runs on the state the last one created. Coordination comes first, because without a real shared trip there is nothing to monitor and nothing to repair. This page describes V3 and V4. The engine is built and tested; what it is waiting for is the trip object that V1 produces.
Understand each traveller; help the group decide what to book. Shipping now.
Complete the bookings and hold the shared trip state.
Track reservations, prices, schedules and dependencies. This page.
Handle disruptions, coordinate approvals, execute the fix. This page.
Three things Relay has to own before Adapt works: the right to change a booking — almost every agent can place an order, almost none can amend one; group-shaped supply — adjacent rooms, five seats together, a table that survives a time change; and standing authority — who may act for whom, up to what amount, with how many yeses.
Planning a trip with friends right now? Join the waitlist.