Bookings
Backoffice path: backoffice/bookings
Available to roles: System Administrator, Administrator
Overview
The Bookings page lists all active flight bookings across the airline. Pilots create bookings by selecting flights from published schedules, reserving a specific aircraft and route for a defined window of time. Administrators use this page to monitor booking activity, identify bottlenecks, and understand fleet utilization in real time.
How Bookings Work
When a pilot books a flight from the schedule, the system:
- Requires email verification -- pilots must verify their email address before they can access the booking page. Unverified pilots are redirected to a verification notice.
- Validates restrictions -- checks that the pilot meets all requirements (rank, license, and any other configured restrictions) before allowing the booking.
- Deducts Points cost (if configured) -- bookings can optionally cost Points, charged as either a fixed amount or a per-mile rate. This is configured at the schedule or airline level.
- Assigns departure and arrival stands -- if the departure and arrival airports have stands configured, the system automatically assigns parking stands based on fleet, subfleet, and airline restrictions. The departure stand is the aircraft's current stand; the arrival stand is selected using a tiered matching algorithm that prefers empty stands. For multi-leg bookings, each leg's departure stand chains from the previous leg's arrival stand.
- Generates MEL items -- on booking creation, the system performs a probability roll to auto-generate Minimum Equipment List (MEL) items for the assigned aircraft, simulating real-world maintenance scenarios.
- Starts the expiration timer -- the booking becomes active and will expire if not flown within the configured window.
Booking Expiration
Bookings expire automatically after a configurable period, controlled by the BOOKING_EXPIRATION_HOURS setting (default: 48 hours). An hourly purge job runs in the background to clean up expired bookings. When a booking expires:
- The booking record is removed.
- The pilot receives a notification informing them of the expiration.
- The aircraft becomes available for other pilots to book.
Cancellation
Pilots can cancel all of their active bookings at once using the Cancel All Bookings button on the booking page. Cancellation incurs a single fixed Points penalty (regardless of the number of bookings) deducted from the pilot's balance. Individual booking cancellation is not available — the pilot either cancels their entire booking chain or keeps all of it. This discourages frivolous booking and cancellation cycles.
Booking Uniqueness
The system supports configurable uniqueness constraints to prevent resource conflicts:
- Unique schedule -- a pilot cannot book the same schedule more than once simultaneously.
- Unique aircraft -- only one active booking can exist for a given aircraft at any time.
These settings can be combined or used individually depending on your operational preferences.
Restrictions
All configured restrictions are enforced at booking time. If a schedule, fleet, or aircraft has restrictions tied to a specific license or rank, the pilot must hold the required qualification before the system allows the booking. Pilots who do not meet the criteria will be blocked with an appropriate error message.
Aircraft Availability Filters
The aircraft selection list automatically excludes aircraft that are not available for booking:
| Condition | Behavior |
|---|---|
| Grounded aircraft | Aircraft marked as grounded (e.g., for maintenance) do not appear in the aircraft list and cannot be booked. |
| Aircraft being repositioned | Aircraft with an active (in-progress) repositioning bounty are hidden from the aircraft list — another pilot is already flying the aircraft to its base. |
| Aircraft on a charter contract | Aircraft locked by an assigned or in-progress charter contract are hidden from the aircraft list until the contract completes, fails, is cancelled, or loses its pilot — the contract pilot needs the aircraft where each leg departs. The contract's own legs are still booked from the Contracts page. |
These filters apply to the booking map, the schedule browser, the directed schedules interface, and the Fly Together aircraft picker. As a defense-in-depth measure, the same checks are also enforced server-side when the booking is submitted.
Bookings Table
The bookings list displays the following columns:
| Column | Description |
|---|---|
| Flight Number | The schedule's flight number for the booked route. |
| Pilot | The pilot who created the booking. |
| Aircraft | The assigned aircraft registration. |
| Departure | Departure airport ICAO code. |
| Arrival | Arrival airport ICAO code. |
| Status | Current booking status (active, expired, etc.). |
| Created Date | Timestamp of when the booking was created. |
The table is searchable and sortable, allowing administrators to quickly locate specific bookings by pilot name, flight number, or airport.
Directed Schedules
Pilots can generate customized random routes from their current airport using the Directed Schedules flyout. This replaces the previous separate "Random", "By Fleet", and "By Aircraft" booking methods with a single, unified interface.
Available Filters
All filters are optional. Each active filter adds to the Points cost:
| Filter | Description |
|---|---|
| Subfleet | Restrict route generation to aircraft from a specific subfleet. |
| Aircraft | Restrict to a specific aircraft (overrides subfleet cost). |
| Final Destination | Force the last leg to arrive at a chosen airport. |
| Min Distance per Leg | Exclude schedules shorter than the specified distance (in nautical miles). |
| Max Distance per Leg | Exclude schedules longer than the specified distance (in nautical miles). |
| New Legs Only | Only include routes the pilot has never flown before. |
| Leg Count | Number of legs to generate (1 to 5). |
The min and max distance filters each independently add to the Points cost. If both are active, the distance cost is charged twice.
The running Points cost is displayed in real time as filters are toggled on and off.
Route Preview
After configuring filters, pilots click Generate to produce a route preview. Points are deducted at generation time (not on accept). The preview displays each leg (departure, arrival, flight number, distance) and the total cost.
If the requested number of legs cannot be generated, the system automatically tries fewer legs (down to 1). When a lower count is found, the leg count selector is updated and the pilot is notified — no points are deducted. The pilot can then click Generate again with the reduced count.
From the preview, pilots can:
| Action | Behavior |
|---|---|
| Accept & Book | Confirms the route and creates the bookings (no additional Points charge — already paid on generate). |
| Re-roll | Discards the current route and generates a new one with the same filters. When DIRECTED_REROLL_COSTS_POINTS is enabled (default), each reroll deducts the same Points cost as the initial generation. |
| Cancel | Closes the flyout without creating any bookings. |
Route Variety (Flight History Bias)
The algorithm tracks how many times each pilot has flown each airport pair. Routes the pilot has already flown receive a higher weight penalty, making them less likely to be selected. Unflown routes are naturally favored, encouraging pilots to explore new destinations across the network.
When the New Legs Only filter is active, previously flown routes are excluded entirely rather than just penalized.
Multi-Leg Sequence Detection
If a multi-leg sequence starts at the pilot's current airport and fits within the requested number of legs, the sequence is booked as a group. If the sequence has fewer legs than requested, the remaining legs are generated randomly from the sequence's final airport. Sequence detection is skipped when directed filters are active, as the constraints may conflict with the sequence route.
Fly Together
Pilots can invite other pilots to fly the same flight with them, each in an aircraft of their own. The feature is on by default and can be turned off with the FLY_TOGETHER_ENABLED setting; when it is off the button disappears and existing invitation links stop working.
Sending invitations
On the booking page, after picking a flight and an aircraft — on the map's flight panel or in the list's booking dialog — the pilot clicks Invite to Fly Together. A side panel opens where they:
- Pick the pilots to invite by name or callsign (up to 10 per flight). Pilots in invisible mode never appear in this search; they can only be invited by typing their full e-mail address, and are then shown by that address rather than by name.
- Choose who pays for aircraft repositioning — I will pay for aircraft repositioning or Invitees will pay for aircraft repositioning. This only matters when an invitee picks an aircraft that is not at the departure airport.
- Click Book and invite. The inviter's own flight is booked exactly as the Book button would book it (same cost and checks), and each invitee is notified by e-mail and in the notification bell.
An invitation can be answered for as long as the inviter's booking is there to fly alongside: it closes when that booking expires, is cancelled or is flown. It also closes if the inviter's schedule is deleted, since that schedule decides which aircraft may fly the route.
Inviting to a flight already booked
A pilot who already holds a booking can invite pilots to it from the briefing: the Invite to Fly Together button in the flight bar opens the same side panel, on the booked flight. It works the same way, except that nothing is booked or charged — the flight was paid for when it was booked — and the button reads Send invitations. The panel lists the pilots already invited and their answer (waiting, flying with you, declined), and more pilots can be added later the same way.
- Each pilot is invited once per flight: pilots already invited, including those who declined, do not appear in the search again.
- A flight takes up to 10 invited pilots in all, counting those who accepted or have not answered yet. A decline frees its place.
- The button only appears while the flight can still be joined: a booking on a schedule (not a charter or ferry) that has not expired and whose flight has not started.
Answering an invitation
The invitation screen is separate from the booking page and is only reached from the notification or the e-mail. Only the invited pilot can open it. There the pilot:
-
Picks an aircraft. Aircraft at the departure airport come first and cost nothing extra. Any other available aircraft can be chosen too: it is brought to the departure airport for the same price as a repositioning bounty from where it is parked to the departure airport (same pay brackets and route finding as the bounty board), charged to whoever the inviter chose. For example, picking an aircraft parked at SBEG for an SBGR → SBRF flight costs the equivalent of an SBEG → SBGR bounty. Aircraft held for maintenance, a contract or a ferry elsewhere cannot be brought over, and the inviter's aircraft (and those other invitees already took) are not offered.
Only aircraft that could fly the inviter's schedule are offered: its fleet, subfleet and aircraft allowlist is what keeps a type out of an airport it cannot serve (for example, an aircraft not allowed into SBRJ is never offered for a flight to SBRJ). This holds whichever booking the invitee ends up with — the same schedule, another schedule on the route, or a 9xxx booking without a schedule — and applies equally to aircraft that would be brought over from elsewhere. The usual booking restrictions apply too: those on the aircraft, its subfleet and fleet, and the licence or rank the schedule or the departure and arrival airports require of the pilot. When the route itself is closed to the invitee, the screen says what they are missing instead of listing aircraft.
-
Sees every cost and who pays it: the booking cost, the repositioning cost and its payer, and the cancellation penalty if they already hold bookings.
-
Accepts or declines. Accepting cancels any bookings the pilot already holds (charging the usual cancellation penalty), moves the pilot to the departure airport free of charge, brings the aircraft over if needed, and books the flight. The inviter gets an in-app notification either way.
Which flight the invitee is booked on
Schedules are used first, following the uniqueness rule:
- When
UNIQUE_SCHEDULE_BOOKINGis Off, the invitee is booked on the inviter's own schedule. - When it is On, the invitee is booked on another schedule flying the same route that nobody holds (the airline's own schedules before a partner's).
- When no such schedule exists, the invitee gets a booking without a schedule on the same route, under a 9xxx flight number that no current booking or schedule of the airline uses — so two pilots never file the same callsign.
Configuration Reference
| Setting | Description | Default |
|---|---|---|
BOOKING_EXPIRATION_HOURS | Hours before an unused booking expires and is purged. | 48 |
DIRECTED_DESTINATION_FILTER_COST | Points cost added when the pilot specifies a final destination in Directed Schedules. | 25 |
DIRECTED_DISTANCE_FILTER_COST | Points cost added for each distance filter (min or max) the pilot specifies. Charged independently per filter. | 15 |
DIRECTED_UNFLOWN_FILTER_COST | Points cost added when the pilot enables the "New Legs Only" filter. | 10 |
DIRECTED_REROLL_COSTS_POINTS | When enabled, each reroll of a directed schedule deducts the same Points cost as the initial generation. | On |
FLY_TOGETHER_ENABLED | Lets pilots invite other pilots to fly the same flight with them. | On |
| Points cost mode | Whether booking costs are fixed or calculated per mile. | Configured per schedule |
| Uniqueness rules | Whether bookings enforce unique schedule, unique aircraft, or both. | Airline-level setting |
| Cancellation penalty | Points deducted when a pilot cancels a booking. | Airline-level setting |