LUNA CONTRACTING
LIVE
Two people cannot buy the same seat.
Seasons that always resolve the same way. Net or gross on every rate row. Night by night, day by day, leg by leg. And a lock taken by the database itself, so you can put your real allocation online instead of holding back a safety margin.
Two holds, one seat
Cardiff to Southampton · 1 left
Hold A · 12:00:00.412 · confirmed
1 seat claimed on both legs. Released in 30 minutes if the checkout is abandoned.
Hold B · 12:00:00.418 · refused
Availability changed. Nothing written, nothing half made.
WHERE THE LOCK LIVES
The database takes the lock, not application code. The second hold waits on the row and re-checks capacity.
Net or gross, on every rate row.
Net means you enter the cost and add a markup, a percentage or a fixed amount. Gross means you enter the sell price and record your commission inside it. Both are stored, so cost, sell and margin are always known.
Cost and margin never leave the engine. No API response, no voucher and no customer-facing surface has ever carried a cost figure.
One markup for a whole sheet, with a warning if rows use mixed settings
Extras across every family, compulsory or optional, prepaid or paid locally
Only Active contracts sell: draft, active, expired, archived
Rate basis
Villa Aegean · Peak
Row
Basis
You enter
Engine records
Double BB
Net
€162
+22% markup
Sell €198
cost, sell, margin
Twin HB
Gross
€217
12% commission
Cost €191
sell, commission
Validity
contract
1 May to 31 Oct 2027
Sell window
separate from validity
1 Nov 2026 to 31 Oct 2027
Status
only Active sells
Active
Seasons everywhere, and the most specific one always wins.
The choice is order-independent, so the app and the API can never disagree. Night by night on accommodation, day by day on car hire, leg by leg on transfers and flights. A stay crossing two seasons is billed at each season’s own money.
If a night was covered only by a wider season, the quote says so, in words, on the quote.
Children by real age band, then free, fixed or a percentage of the adult rate, per night
Supplements with four independent scopes at once
Date surcharges that apply before markup
Quote working
Blue Bay Resort · 5 nights · 2 adults
Wed 29 Apr · Shoulder
£118
Thu 30 Apr · Shoulder
£118
Fri 1 May · Peak
£162
Sat 2 May · Peak · weekend supplement
£182
Sun 3 May · wider season only
£140
Sell total
cost £590 · margin 22%
£720
Sunday 3 May fell back to the wider season
Load a Peak rate for it, or accept the wider price.
It cannot oversell. Three mechanisms, all in the database.
Chosen to suit how each family actually counts inventory, and enforced in the database rather than application code.
An advisory-locked inventory ledger
Accommodation, cars, transfers and dated tickets. Two simultaneous holds cannot both pass the capacity check. It counts peak concurrent usage on any single day, not a naive overlap sum, so a valid stay is never wrongly rejected.
A conditional update on the departure
Tours, coaches and trains. The second of two racing holds waits on the row lock and then re-checks capacity.
Per-seat holds
Flights, and coaches and trains with a seat map. A unique index means a race for the same seat loses cleanly.
Netted against everything at once
Accommodation availability nets the API holds, the property’s own in-app diary and room closures together.
Abandoned holds release themselves
A half-hour abandoned checkout puts the seats back on sale on its own.
Capacity semantics are explicit
Unset means unlimited, zero means sold out, a number is enforced.
Search it exactly like your customer will.
A search screen per product. Put in a date and a party and see what a customer would see: live prices, seats left, passenger type columns, the party total and a working Book button. Open the seat picker and choose a seat.
Price check on accommodation, car hire and transfers runs a real stay and shows the full working line by line, including the margin. Traveller preview shows a property exactly as it appears in a search.
The same engine your website uses
Spot an underprice or a missed child rate before anyone can buy it
You never have to guess whether it loaded correctly. You look.
Coach search
Sat 11 Oct · 2 adults, 1 child
Pick-up
Adult
Child
Seats left
Cardiff 06:15
£34.50
£22.00
18
Barry 06:40
£27.60
£18.00
18
Bristol 07:30
£24.20
£16.00
18
Party total from Cardiff
2 adults, 1 child
£91.00
Book
Questions people ask
What happens when two people book the last seat?
One gets it. The other gets a clean availability changed message. The lock is taken by the database, not by application code, so it cannot be got round.
Do we have to hold back a safety margin?
No. Put your real allocation online. Abandoned holds release themselves after half an hour.
How are children priced?
By real age band, then by a rule that can be free, a fixed amount or a percentage of the adult rate, recalculated per night. If no band covers a child, the loader tells you before it saves.
Does the engine convert currencies?
No. Each contract prices in its own currency and a single response can contain several. Live contracts in two currencies are flagged on the readiness panel.
Put your real allocation online.
Luna Contracting is live for Travelgenix customers. Contact your account manager to switch it on, or book a demo if you are new to Travelgenix.
More about Luna Contracting