The Flight Booking Industrial Complex
Why buying a plane ticket became a psychological endurance test
Hi! Sinéad again, complaining enthusiastically about yet another industry! Enjoy!
It started for my pal Sam in the way that all modern odysseys do: with a simple goal of trying to buy a plane ticket.
But: whereas Odysseus faced sirens and sea monsters; Sam faced Skyscanner, cookies, and maze-like lies about seat availability and pricing.
“I feel like the third party prices are too good to be true. Is this legitimate?”
Ah. Airline pricing.
I’ve written and spoken extensively about my favorite airline before, Ryanair, so I’m not going to go into too much detail about that now. Suffice to say, one of the key reasons I am addicted to Ryanair is because its app has the most seamless booking experience.
This is true to the extent that within Europe, I try not to make journeys that are not covered on their route map. However, every now and again I cannot avoid it: work brings me to a country too boring for the hordes of tourists that justify Ryanair putting on a seasonal leg.
So in those instances, I do what Sam was in the middle of doing when he text me:
I open Skyscanner, and wish the Earth would swallow me whole.
Welcome to the Inception
Back in 2015, one of the research focuses of my portfolio was at MIT with a Professor called Peter Belobaba, in airline economics: a complex, grim and highly chaotic corner of capitalism.
My main project within this was moving from a “vibes”-based decision process for airline routes strategy to a quantitative one that included competitive response between the most aggressive airlines in the world: the Ultra Low Cost Carriers (ULCC).
A large part of this, rather unfortunately, was having to understand the question at the heart of Sam’s frustration: what the fuck is a third party travel site, and why do the prices look so strange?
I quickly came to understand aviation not as an industry, but as an ecosystem of competing incentives (Airlines! Airports! Regulators! Credit cards! Aircraft lessors! Fuel hedging!); each one trying to extract a little more yield from the same metal tube in the sky filled with the same sunburnt and drunk-at-5am passengers on their way back from Tenerife.
Today, that ecosystem generates over $800 billion a year in global revenue, a number large enough to give the illusion of there being some control amidst the chaos.
But if you’ve tried booking a ticket recently, you’ll know: no one is actually in charge. In fact, the process is what I can only describe as a hellish form of psychological warfare. (Insert something about enshittification and tech slop here).
Why? Because the airlines have fragmented, the intermediaries have multiplied (vastly), and what used to be a single, accountable transaction has metastasized into a labyrinth of competing platforms, each scraping, reselling, and repricing the same seat for lower and lower and lower margins.
Now, Michael Porter and I disagreed about many things indeed. But the one thing that we spent about an hour joyfully discussing the first time we met, before I would go to work for him, was how awful the airline industry was!
But back to booking flights. The process used to be quite simple: once upon a time, you booked flights directly with the airline, and you paid a clear price. The airline took responsibility if anything went wrong.
Then, prices were aggregated through a second party site like Skyscanner and you could suddenly compare prices in real-time from one website instead of ten. Amazing!
Except… Now? You’re entering a maze of more second and third parties and even fourth parties that can be counted on both hands. Aggregators, consolidators, resellers, meta-searches, and “partners.”
So by the time you’ve bought your ticket (if you’re lucky!!), everyone touches your money. And yet… nobody actually owns your ticket.
Here’s the basic taxonomy of the already-described chaos:
First party: The airline itself. Usually the least terrible option, and excellent if it’s Ryanair. You pay more, but at least you’re buying from someone who owns a plane.
Second party: Meta-search engines like Skyscanner, Kayak, or Google Flights. They don’t actually sell tickets, they just scrape fares and redirect you elsewhere, taking a cut for every click.
Third party: Online Travel Agencies (OTAs), or resellers, like Travel Junction, Gotogate, eDreams, or Kiwi, which actually take your payment, buy the ticket (sometimes from the airline, sometimes from another reseller!), and then hide behind layers of customer support insulation.
Fourth party (yes, really, shoot me): White-label sites reselling the inventory of third parties. Think of it as the matryoshka doll stage of travel e-commerce; except by the time you get to the smallest doll, you wish you had fallen out of a thirty-storey window.
So if all of this sounds painful and confusing, congratulations!
Because that’s precisely the point.
The entire system is designed to make it hard to know who you’re actually buying from. Every extra layer looks like “choice.” But what it really adds is distance between you and the entity legally responsible for getting you on a plane.
The Hidden Plumbing of Airline Prices
So if you’ve ever wondered how your £89 fare quietly becomes £217 somewhere between “search” and “checkout,” welcome to the underbelly of the industry.
Buckle up!
Because you’re about to enter a subterranean network of servers, legacy databases, and revenue-maximising algorithms older than most of the people using them, who have forgotten how to update said servers.
This is the grim, Rube-Goldbergian plumbing that moves hundreds of billions of dollars a year with all the technological capacity of a fax machine duct-taped to an Excel macro.
I love food, so let’s stick with a cooking analogy to pick through the mess; underneath every “Book Now” button sit three ancient systems stacked on top of each other. The cookbook, the kitchen, and the chef.
Step 1: The Cookbook (ATPCO)
Every airline on Earth publishes its fares, rules, and taxes into a central database called ATPCO (Air Tariff Publishing Company, whose own plumbing has barely been updated since its inception in 1958!!). Think of it as the global cookbook of aviation pricing ingredients: every base fare, every fuel surcharge, every obscure clause about “minimum stay requirements” lives here.
ATPCO’s job is to store hundreds of millions of lines of data. Kind of like a high frequency trading data stream. Each fare can have a dozen restrictions attached: advance-purchase limits, refundability codes, blackout dates, combinability rules, seasonality, routing permissions, currency exchange rates, and a partridge in a pear tree.
So the moment a fare is filed by the airline, it becomes part of this collective archive (from which every other system feeds).
It’s why you can see a Paris–London ticket for £142 and, seconds later, another site lists £439 for what appears to be the same thing. They’re both technically right, just different permutations, different rules, different API connection times. But same seat.
Step 2: The Kitchen (GDS)
Next comes the Global Distribution Systems (GDS), or the kitchen where all those ingredients get combined into something vaguely edible.
There are three main GDS providers (Amadeus, Sabre, and Travelport), and between them they handle roughly 90% of all flight bookings that aren’t made directly with an airline. These systems are the pipes that connect airlines to travel agents, corporate travel desks, and online booking platforms like Expedia or Travel Junction.
[Side note: this tweet thread does a pretty good job of outlining the insanity of how these systems, and dynamic revenue pricing, were started by a Professor I worked with at MIT on Amadeus’ pricing system
These systems are also, crucially, old. Amadeus was built in the 1980s. Sabre was written in COBOL, and some still use a messaging language called EDIFACT, which, based on the screenshot below, hasn’t had a tutorial written about it since the 90’s.
[Another side note: I briefly befriended a postdoc that I will not name, who specialized in COBOL-ing the Amadeus system and… let’s just say that he was the least fun person at any of my dinner parties… Nice guy though! But choosing to do this for a living? Yeah…]
And yet, these clunky dinosaurs still run the global distribution of flights, hotels, and car rentals, 24/7.
The GDS doesn’t decide prices, but it does assemble the ingredients from ATPCO (base fare, taxes, surcharges, exchange rates) and spits out something bookable.
However, because each GDS caches and updates at different intervals, two systems might price the same itinerary seconds apart and come back with entirely different results.
In essence: the kitchen’s old stove works, but the burners are uneven, and sometimes the gas leaks. So you never know what you’re actually going to end up cooking!
Step 3: The Chef (Revenue Management)
Oui, chef! Finally, the airline’s revenue management system, the algorithm deciding what to charge you specifically. (Because, again, who knows what someone else might get charged).
Every seat on every plane sits in a “fare bucket” (economy-light, economy-flex, semi-flex-but-you-still-can’t-change-it). The algorithm constantly opens and closes these buckets based on expected demand, competitor activity, and historical patterns.
This is known as O&D control (Origin and Destination logic). It means that a London → Paris seat might cost £80 on its own but drop to £40 if you’re continuing onward to Cape Town.
Why? Because the system isn’t pricing legs; it’s optimising journeys. It wants the highest overall yield per seat, across millions of combinations.
And… this is where I came in handy! Because my background is in extremely-high dimensional optimizations of billions and billions of factors.
[And, fun fact: mutli-dimensional optimization (MDO), the applied statistical domain that I called my own for probably-far-too-long, was mostly progressed in the lab where I first worked, because my lab was the first to create airline pricing optimization systems!]
^^ A Markov chain for combinatorial dynamic (ancillary) airline pricing
The result at this stage is an invisible, real-time auction happening every time someone, somewhere, searches for a flight. When you see the dreaded “Only 1 seat left at this price”, miraculously, it isn’t emotional blackmail from marketing.
It’s telling you the truth: one of those fare buckets is about to close… forever!
And if you refresh too slowly, the algorithm assumes demand just increased, so it raises the next available bucket.
(In effect, you aren’t choosing a fare; you’re only teaching the algorithm how much cost you’ll tolerate!)
Step 4: The Chaos (Everyone Else)
By the time all this data reaches a meta-search engine like Skyscanner or a reseller like Travel Junction, it’s already been scraped, cached, resold, and delayed a million times over.
Prices can be minutes, or increasingly hourrrrrs, out of date. In fact I have noticed through usage recently that some resellers deliberately “hold” a booking before ticketing, betting that fares might drop in the interim. (When I last booked on eDreams via Skyscanner via British Airways, they didn’t “confirm” my ticket for 23 hours, because eDreams has an automated agent running through millions of simulations of customers, to try to get a price lower than the one I paid for, to pocket the change!).
Other resellers take a long time because they simply can’t issue instantly given their access to the GDS is second-hand, and through another consolidator (who also gets paid somewhere).
So when you click that enticing “£89” fare and it jumps to £217 at checkout, nothing has malfunctioned. You’ve just arrived a few seconds late to a volatile, multi-party pricing shitshow.
I suppose perhaps the most optimistic way to think about all of this is that…
You are, inadvertently, participating in a Nobel-worthy auction of billions of dimensions and hundreds of millions of nodes, engineered by some of the world’s smartest people (most of whom can no longer explain how it actually works).
Enter NDC: The “Supposedly New” Pipes
So, why haven’t we tried to fix all of this fax-machine-meets-Excel-shitshow?
Well… I suppose… it’s complicated. The short version is that: they tried. The slightly less short version is:
Around 2012 the International Air Transport Association announced “NDC”, short for New Distribution Capability. The idea was sensible on paper (as are most bad ideas): replace the Cold-War plumbing with sleek modern APIs so airlines could sell directly, bundle ancillaries, and actually know who their customers were.
Right?
So, in theory, NDC would make flight booking feel like Amazon. And every now and again I read a VC investor press release to announce that they have just invested in “the Amazon of flight booking” and laugh.
What happened in practice was different to the dream: NDC made it feel like seventy different Amazons, all speaking mutually unintelligible dialects of JSON.
Every airline implemented NDC in its own way (this sounds like its rollout was Project Managed by the European Commission, I know…). Different schemas, endpoints, authentication rules, error codes, and definitions of “seat.” Some carriers pushed out half-baked versions to meet investor-relations deadlines; others decided to monetise exclusivity, locking certain fares behind “direct-connect” paywalls.
(If you remember a brief period when buying from airlines was actually easier and cheaper than aggregates, this was that period! And it was beautiful, while it lasted!)
So the result of all of the NDC shenanigans today? Travel sellers now have to juggle two incompatible universes at once. (Yes, this does sound truly European!).
The GDS: A 1980s fossil that still works but can’t really handle new airline offerings like… *checks notes*... WiFi.
The NDC API: A shiny new layer of a million different codebases where every airline reinvents the wheel, usually square, completely unable to function.
So, to Sam’s original question:
Why does this price seem like it’s outrageously cheap? Is this a red flag?
Yes and no. Sometimes it’s a real deal. Sometimes it’s a mirage produced by the world’s least interoperable software stack. Honestly, who the fuck knows.
Because here’s what actually happens under the hood the moment you click on that seductively low-priced link on Skyscanner:
You’re looking at cached (read: old) data. Skyscanner scrapes prices every few hours, or… days. That £89 might have been real at 4 a.m. in another time zone, but it’s long gone now. That flight could be fully booked.
The reseller runs a live repricing through either the GDS or NDC. Taxes change, fees appear, surcharges update. The number moves faster than your mouse. Yes, so unlike the point above, you are no longer too slow, your system is operating like a quantitative hedge fund on Wall Street.
The airline’s “married segment logic” might kill your combination. A London → Paris → Cape Town itinerary is legal as a journey, but not if you try to unpick it into single legs. This is honestly far too complex to get into on Substack, or even as a single semester grad school statistics class at MIT. All you need to know is: the algorithm doesn’t like this and deletes your seat.
The reseller may delay ticket issuance while it hunts for a cheaper “plating carrier” (the airline whose code goes on the ticket: for example, Aer Lingus and British Airways often codeshare the same flight!). If it finds one, it pockets the difference. If not, you’ll get a the following email, which makes me want to throw my computer out the window: “Your booking could not be confirmed. The new price is £217.”
And the best part? Everyone in the chain gets paid before you get your ticket!
Skyscanner gets a referral fee. Resellers pocket “service charges.” Payment processors skim their transaction cut for the privilege of handling this wonderful customer journey.
And after you’ve paid, and you’re wondering who to contact about the flight ticket that never arrived?
Take your pick of contacting the chatbots of the following, created by a beautiful system of misaligned incentives:
The airline (which offloaded customer support risk to online travel agents like eDreams). Meta-search engines (like Google Flights which profit per click, so advertise non-existent low fares). The online travel agencies (which squeeze margin from “flexibility” packages that make nothing flexible). Or the aggregators (like Kayak, which take affiliate cuts for every redirect).
Yes. The whole experience feels like Inception.
So… What To Do About This Shit Show?
Well, nothing. Because… capitalism.
But while you can’t fix the system, you can be a bit smarter about how to book. My top tip: fly Ryanair, always, everywhere. Failing that, the following:
Use meta-search sites like Kayak for research (but not buying!). Treat prices as indicative, not live. They’re weather forecasts, not guarantees.
Book direct when the price difference is really low (tens of dollars!). That extra amount you’re paying is essentially a stability tax, and I suggest using it if you like your mental health the way it is right now.
If you must use a third-party site, check for “instant ticketing.” This thing called same-day issuance means your ticket actually exists before the algorithm changes its mind. (Yes! We’re at that stage of capitalism where it’s hard to buy a thing that actually exists!)
Always, always, always pay with a real credit card. Ideally one that allows chargebacks. Because you may end up calling up the fraud team…
Screenshot everything. I admittedly never do this because I’m lazy. But do as I say, not as I do: Record cache timestamps, prices, confirmation pages, the exact phrasing of “Your booking is confirmed!” Because if (when?) you end up in dispute, that screenshot is pretty much the only artifact of truth in a parallel universe of pricing data that cannot be accurately searched.
Look, the whole thing sucks. And everyone is to blame. (Even if the airlines blame the resellers, and the resellers blame the APIs, and the APIs blame the legacy code).
And all you want to do, in the middle of this fucking horror movie, is get to Paris.








