/ Pricing and inventory

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