Travel & Flight SearchField engagement

Adding a city should mean adding a row and never a release, which is a decision made on day one or not at all.

Architecture and delivery lead.
7 weeks
to delivery
88
airports at launch
19
candidate airports evaluated per search
0
rewrites required to expand
hard-coded corridor
add a city
change the code
deploy
regression pass
every city is a release
catalogue as data
add a city
add a row
every city is configuration
The thing certain to grow, the airport and corridor catalogue, lives in data. Adding a city is a row rather than a code change, a deployment and a regression pass, which is why 88 airports shipped without a rewrite.
What was at stake

A non-technical founder needed a working self-transfer product on one corridor, built so the list of corridors could grow without a rewrite. In this kind of engagement the first corridor is rarely the danger. The second one is, because the shortcut that ships the first corridor fastest is usually the thing that makes the second one expensive.

How this works

To a self-transfer engine, an airport is a bundle of rules about terminals, borders, bags and time.

On a map an airport is a code and a location. To a product that builds connections out of separate tickets, it carries much more. It has terminals, and some connections mean moving between them. It has a border, and some passengers have to cross it just to collect a bag. It has a minimum transfer buffer that reflects how long all of that really takes there. It is served by particular airlines, and it belongs to particular corridors where it makes sense as a stop between an origin and a destination. Each of those facts changes whether a connection through that airport can honestly be offered.

Those facts can live in one of two places. They can be written into the program, as conditions that say this airport needs a longer buffer or that one involves a terminal change. Or they can live in data, as entries in a catalogue that the engine reads. In the program, adding an airport means editing code, testing it and releasing it, with the risk that the edit breaks an airport that was already working. In data, it means adding an entry, and the engine, which already understands that kind of rule, applies it. The difference is invisible on launch day and decisive on every day after.

The other thing newcomers rarely expect is that flight data is not freely available. Live prices and schedules come from providers who decide who may connect, at what volume and on what commercial terms, and small operators are often turned away or priced out. For a new travel product, whether it can get the data at all is a larger risk than any engineering decision. That is why it is worth testing before anything else is built.

Identity and locationthe part a map already shows
Terminals and transfer pathswhether a connection means moving between buildings
Border and bag re-checkwhether a passenger has to go landside to collect a bag
Minimum transfer bufferhow long the whole transfer really takes here
Corridor membershipwhere this airport makes sense as a stop
A new city is a new set of these facts. The engine that reads them stays the same.
FigureWhat a single airport means to an engine that builds connections across separate tickets. Each layer is a kind of fact that decides whether a connection through that airport can be offered. Held as data, all of it can be added or corrected without touching the engine.
The constraint

Whether the product can grow is settled by an architecture decision on day one. Airports and corridor rules live in data, so adding a city means adding a row. Left until later, the same decision turns into a rewrite, because by then the launch corridor is threaded through the whole application.

Where it usually breaks

Early products usually break at their second market.

A first product is built to prove that one thing works, and under that pressure the specifics of the first market go straight into the code. The first city's quirks become conditions, its airports become constants, its rules become branches. It ships quickly and it works. Then the second market arrives, and every one of those shortcuts has to be found, generalised and retested, often by someone who did not write them.

The other early failure has nothing to do with code. A travel product depends on data it does not own. Teams build the interface, the engine and the brand, and then discover that the data they need is gated, expensive or simply not offered to a business of their size. Weeks of work end up resting on an assumption nobody tested.

01

The hard-coded launch market

The first corridor's airports and rules are written into the program, so every new city becomes a release.

02

Rules scattered through the code

Transfer rules live wherever they happen to be used, so nobody can see them in one place or update them safely.

03

The untested data assumption

The product is built before anyone confirms the flight data can be obtained, at a volume and on terms the business can live with.

04

Going wide before proving narrow

Many airports launch before the engine is checked on one, so an engine error cannot be told apart from a missing or wrong entry.

05

Progress the owner cannot see

Delivery has no visible milestones, so a non-technical founder learns whether the product works only at the very end.

Corridor written into code
New city requested
Engineering ticket and code change
find every place the old corridor was assumed
Deployment and regression pass
existing airports can break
Airports and rules as data
New city requested
Entries added to the catalogue
buffers, bag rules, corridor status
Engine applies rules it already knows
no release, no rewrite
same request
The choice between these is made before the first release, whether anyone notices it or not.
FigureThe same request, adding one city, under the two designs. With the corridor written into code, every expansion is an engineering project with a release and a regression risk. With airports and rules held as data, it is an entry in a catalogue that an engine already knows how to read.
The fork

The reflex, and the fix.

Road not taken

Hard-code the launch corridor

Pull

It ships the first corridor measurably faster, and the first corridor is the one being paid for.

Why not

Every later city becomes a code change, a deployment and a regression risk. Growth turns into engineering work, permanently.

Road taken

Model airports and rules as data

Accepted

More structure than the launch corridor needs, and a configuration surface to design before anything ships.

Bought

Eighty-eight airports at launch and no rewrites to expand the corridor set, because expansion is configuration.

Decision

Put the thing that will change into data. The launch corridor is the one certainty and the corridor list is the one variable.

How it was built
01Data-access test
›
02Airports as data
›
03Engine on one corridor
›
04Consumer surface
›
05Expand by configuration
01

A data-access test as the first milestone

Before any product work, confirm that the flight data can be obtained at all, on terms a small operator can accept. Flight data is gated, and for a small operator that is the risk that ends projects, so it is answered first and cheaply.

02

Airports and corridor rules as configuration

The catalogue that will grow lives in data. Transfer buffers, bag rules and corridor status are rows, which also keeps the viability rules in one place where they can be maintained, instead of scattered through the code.

03

Prove the engine on one corridor

The search and viability engine is validated on a single corridor, where its behaviour can be checked against what happens at real airports, before the catalogue widens.

04

Milestones a founder can see working

Delivery is staged so a non-technical founder watches each stage run, and never has to wait seven weeks to learn whether the whole thing holds.

Inside the key decisions

What each choice cost, and what it bought.

ATesting data access before building anything

The first milestone produced no product at all. It answered one question: can this business get the flight data it needs, on terms it can accept. That is hard to present to a founder as progress, because there is nothing to click. It is also the risk most likely to end a small travel project outright, and finding that out after the interface and engine were built would have wasted all of them. Answered first, it was cheap. Answered last, it could have been fatal.

BPutting airports and rules in data from day one

The launch corridor did not need a configuration surface, and designing one added structure before anything shipped. Hard-coding would have been measurably faster for the first corridor, which was the one being paid for. The data model is what made the next corridors cheap: the product launched with 88 airports and has needed zero rewrites to expand. It also kept the viability rules in one place, where they can be read, checked and corrected without touching the engine.

CProving the engine on one corridor first

The engine was checked against reality on a single corridor before the catalogue was widened. That meant holding back the breadth that a founder naturally wants to show. In return, a wrong answer during validation could be traced to its source, the engine or an entry, and fixed in the right place. Once the engine was trusted, widening the catalogue was a data exercise, with each search evaluating 19 candidate airports drawn from it.

DDelivering in milestones a founder can see

Each stage of the seven weeks ended in something that ran and could be shown. That costs some efficiency, because every stage has to be finished enough to demonstrate. It buys a founder who can make decisions on evidence as the work goes, and who is never asked to trust a long stretch of invisible engineering that might or might not hold together at the end.

  1. Confirm the data can be obtained
    the risk that ends small travel projects, tested first
  2. Model airports and rules as data
    the expansion decision, taken before launch
  3. Prove the engine on one corridor
    where answers can be checked against real airports
  4. Build the consumer surface
    each stage shown working to the founder
  5. Widen by configuration
    new airports as entries, not releases
Each step removes a risk the next one would otherwise have carried.
FigureThe order the work was done in, and why the order matters. The risk that could end the project was answered first, the decision that makes growth cheap was taken before any product existed, and the catalogue only widened once the engine had been proven on a single corridor.
How it was measured

A single headline number hides where a system fails. This work was scored on the dimensions that actually decide whether it holds in production, measured on real, held-out cases rather than the demo path.

Time from start to a working productAirports supported without a code changeCandidate airports evaluated per searchRewrites required to expand
The gate
Can a new airport be added as an entry in the catalogue?
Expand by configuration
0 rewrites
required to expand the corridor set
Code change, deployment, regression pass
the hard-coded path, for every new city
Delivered in 7 weeks. 88 airports at launch. 19 candidate airports evaluated per search.
FigureThe test that matters most for a product built to grow. The product was delivered in 7 weeks with 88 airports at launch, each search evaluating 19 candidate airports, and expanding the corridor set has required 0 rewrites.
figures

Timeline, airport count, candidates per search and the rewrite count are measured on the delivered system.

What it produces
Without this discipline

A product that ships the launch corridor quickly, then needs an engineering ticket, a deployment and a regression pass for every new city.

This system

A working self-transfer product delivered in seven weeks, covering 88 airports, evaluating 19 candidate airports per search, with zero rewrites required to expand the corridor set.

the catalogue lives in dataprove the engine narrowexpansion is configurationdata access proven first
The operating envelope

What it owns, and what it hands to a person.

Handled with confidence
New airports and corridors of the launched kind
Rule changes within the existing rule types
Flagged for review
Corridors whose rules do not fit the existing types
Out of scope by design
Itinerary structures the engine was not built for, such as multi-hub chains
The honest limit

Data-driven expansion covers airports and rules of the kind already built. A genuinely new itinerary type, such as a chain through several hubs in place of a single intermediate airport, is an engine change and is scoped as one. A corridor whose rules do not fit the existing rule types is flagged for the same reason. No configuration row can describe a kind of rule the engine does not understand.

What it generalizes to

A product that has to grow should put the thing that will change, the catalogue or the rules, into data, prove the engine on one narrow case, and then expand by configuration instead of by release.

What to take from this

To an engine that builds connections, an airport is a set of facts about terminals, borders, bags and transfer time, and those facts decide what can be offered.

Whatever will change after launch, such as the catalogue of places or the rules that apply to them, belongs in data the engine reads.

The decision that makes expansion cheap has to be taken before the first release. Taken afterwards, it costs a rewrite.

In travel, access to flight data is often the largest single risk in a project. Test it first, before any product work begins.

Prove an engine on one narrow case where its answers can be checked against reality, then widen by configuration.

How we engage

You have a system like this one.
Tell us where it stands.

Whether it is failing, not yet built, or about to meet a scale it has never seen, we can tell you what we see.

Start a conversation
mostafa@opulion.dev · Response within 24 hours · By inquiry