What the railway wrote down before the day began
Before a single train moves, the railway has already written down what it intends to do — in far more detail than any public timetable shows, and in a form that expects to be overruled.
The timetable you see at a station is a simplified view of something much larger. The underlying plan for one day covers roughly 551,000 schedules, about 82,000 associations between them, and some 12,000 named places. Most of it is not about passengers at all.
The working timetable and the public one
Every schedule is a list of timing points, and each point carries times of two kinds. The public times are the ones printed for passengers. The working times are what the railway actually operates to, and they are not the same.
Working times are booked to the half minute. A train shown as departing at 09:48 may be booked at 09:48½, which is why our detailed view writes it that way rather than rounding it into a lie. Rounding the other direction — down — is worse: it would show a train leaving before it is booked to.
The bigger difference is that most timing points are not stations at all. Across a full extract, 44% of all points are passing points — junctions, loops and signal boxes the train runs through without stopping. They carry a pass time and no public times at all. A search for a place will therefore turn up all sorts of things you cannot board at, which is covered in one station, five different codes.
Padding, written down as padding
A booked journey time is not an estimate of how long the train takes. It is that, plus allowances that are recorded separately and by name:
- Engineering allowance — extra time for known works or conditions.
- Pathing allowance — time the train spends waiting for other traffic, because the route is shared.
- Performance allowance — deliberate slack to absorb small delays.
Because these are itemised, you can see how much of a slow booking is the railway being honest about congestion rather than the train being slow. It also explains a phenomenon that otherwise looks like a fault: a train can be several minutes behind at an intermediate point and still arrive exactly on time, having eaten allowance that was put there for the purpose. We show these on the detailed view of a service, because they are the difference between a schedule and a promise.
Three versions of the same train
A schedule is not a single record. The same train can exist several times over with different validity, and the railway picks between them by rule rather than by date order.
There is a permanent schedule — the base timetable, written months ahead — and then short-term plan variants that overlay it: an overlay that changes the train, or a cancellation of it for particular dates. On any given day the right answer is the most specific variant in force, not the newest record.
This is why a train can appear to depart at two different times depending on how you search for it, and why our guide to finding a train insists on the planning ID: the identifier is what pins you to a particular train, and the variant is what pins you to the version of it that ran.
The plan that is made on the day
The daily extract is written the night before. Anything arranged after that — a diversion, a special, an extra to move empty stock — arrives through a separate short-notice channel instead.
These short-notice schedules are real trains and they run, but they carry much less detail. We found this the hard way while checking allocation data against the timetable: of the records that failed to match a stored schedule, the misses were dominated by class 5 and 9 headcodes — empty stock and similar — precisely the traffic a daily extract does not hold.
So “no schedule found” for a real train is usually not an error. It is a train that was planned after the plan was published.
Trains that become other trains
The last piece is the one that makes a national timetable a network rather than a list. An association records that two schedules are connected at a place, and there are three kinds:
- Next working (about 60,000 a day) — the unit that arrives as one train departs as another. The rolling stock continues; the train identity does not.
- Divide (about 2,600) — one train splits into two, each half going somewhere different. Standing in the wrong half is a genuine hazard on some routes.
- Join (about 2,400) — two trains couple and continue as one.
Associations have a detail that took us real effort to get right. Each one carries a days-run mask and a validity window, and those are read against the main train's date — not the associated one. Come at the same association from the other train and the date indicator inverts. A next working commonly runs the following day, so getting this backwards moves a connection twenty-four hours.
We settled it by checking the real schedules behind a single record rather than reasoning from the specification, which is the approach that has saved us most often on this site.
What it does not contain
Two absences are worth knowing. The extract we use carries no activity codes — the markers saying a stop is request-only, or set-down only, or a crew change. Those reach us from the real-time feed instead, which means they are attached to the running train rather than the plan.
It also carries no track geometry and no mileages. The timetable knows a train calls at Leicester; it does not know where Leicester is, or which physical line the train takes to get there. Everything on our maps comes from separate sources entirely, described on the data page.
That separation is the reason a route drawn on this site is an inference rather than a reading. The plan says where and when; the geography has to be joined on afterwards.