Skip to content

HowTo: Night Train Potential Analysis

Back-on-Track has some experience in the feasibility analysis of nigh train connections. This description is a collection of our best practice when doing this research work, so it might not exactly apply to all past research as we permanently update this collection. If you would however like to join our endeavour defining potential routes, this is your best starting point.

Introduction: The Target Network Project

Our plan is to present the Target Network (more info here) using the same tools with which we present the current network, with web pages for each proposed train. The idea is that people find our proposal – and the reasons why it does not yer exist wand what they could do to make it a realit, like signing a petition or by supporting our network. This is why we are working with a Google Sheet that contains a couple of tables which are aligned with the GTFS standard, which we also use in the Open Night Train Database.

Colour scheme:
Letters: Black: Info according to the GTFS standard. Blue: additional infos for Back-on.Track purposes.
Cell Background: White: Needs input , Grey: doesn’t need input, gets info from elsewhere (if it doesn’t, just copy cell content with formula from above)

Some fields contain a select function, e.g. station names. As we have 35.000 entries to check, please e patient, this takes a while. For most station names you can enter a few letters, and it will reduce the selection to a few possibilities. Unfortunately entering special Characters doesn’t work with in Google Sheets. So, for “Břeclav” you must either enter “Bř” or scroll through all the entries starting with B.

Getting started

You need a Google account and editor access rights to the Target Network Google sheet.
Once you have read this HowTo, contact Juri (backontrack@jurimaier.de)

Then open the first sheet, poposals. Read through the proposals and the comments, then pick a line which you would like to add to the Target Network. Add your name but not yet a checkbox. Don’t pick a line where there is already a name. Someone else is working on that one. If you would like a new proposal which has not yet been proposed in a similar form on the same route, add it at the end of the list with your name.

1. Enter the Route

The fist thing the nigh train needs is one (ore multiple) route number in the routes sheet. Each endpoint-to-endpint combination is a separate route. So, if you are working on an I type line (column E in proposals) one row will be enough, for Y type connections you’ll need two rows and for X type connections you’ll need four rows. (for more info on I/Y/X route types see below -> 5. Optimising the operational model)

If you are working on a new line (see column F in proposals) add rows in the green NEW section where the route_id is in the 2000-2999 block. If you are working on an enhanced version of an existing line (see column F in proposals) add rows in the blue EXISTING section where the route_id is in the 1000-1999 block, please look in the list above for the the exsiting train’s route_id and add +1000 to its route_id value.

Now ad the other values. agency_1 is always “N.N.” as we don’t know yet who should operate the line, route_type is always “2” and is_active is always “N” – as long as this is a proposal and not yet reality.

route_type is always 2 (=train).

Now, please look up and enter the route distance with the help of https://signal.eu.org/osm/. When entering the station names of the two ends of the route make sure (by zooming in) it found the station and not the city centre. Also make sure we can work with the intended night train configuration by checking all three options “electrified only”, “normal gauge” and “avoid high-speed-lines”.

Enter the countries with their two-Letter ISO Code.
Copy “seat, couchette, sleeper” in classes and https://www.back-on-track.com/booknow/ in source

Now choose the configuration_id. You’ll find all type on configurations with old rolling stock, the possible options when using to-be -built rolling stock you will find at the end of the list indicated with an understroke. Our standard configuatrion is “SIM-14.1“. You may change this later on.

2. Enter the Trips

in the next step you now add for each route two trips, one for each direction. Add two new rows with the route_id of your train route. Add two direction_id, “0” in the first row and “1” in the second. Then add the trip_short_name. If you are re-desogning an existing route, use the existing trains number as trip_short_name. If it is a new proposal, create a new train number with “EN”, the route_id and the direction_id

Now configure a service_id from the 2032 service IDs (at the end of the selection list). Typically we want to see night trains running every day. For some touristic destinations running a night. train only in the summer holiday or winter season might be useful. Also combining a weekend- (Sat, Sun) with a commuter route (Mon-Fri) could in some cases be useful.

wheelchair_accessible and bikes_allowed, should be 1 (=yes). Our proposals include space for 3 hung bikes per 7 car train.

3. Edit the Itinerary (in stop_times)

This is where you finally may enter the origin and destination. This is a very long list, you might have to scroll down for a moment. Find an empty row at the bottom. Them first select the outward trip_id in column B.

Then enter a “0” for the origin in stop_sequence in column C, and select the origin station of your night train as stop_id in column D.
Then enter a “99” for the destination in stop_sequence in column C, and select the destination station of your night train as stop_id in column D.

Now this is a non-stop trip. This will be enough to start examinig the passenger potential. Only if the passenger potential is sufficient you should to add details like stops inbetween and travel times. -> Continue to Step4

Adding intermediate stops:

You might like to add some stops inbetween these two stops. We should only add stops at both ends of the trip, which can be reached by the night train within 4 hours from either origin or destination. This is because we have a limited time frame of 4 hours for attractive departure times (06:00 – 10:00).

Which stops we add:

  • Other major stations in big cities (e.g. Budapest-Kelenföld, when it starts in Budapest-Keleti, going westwards)
  • Major cities with > 100.000 inhabitants
  • Important stops which connect to branch lines (e.g. Hässleholm)
  • Minor cities with < 100.000 inhabitants only if large regions would otherwise not be served
  • Border stops only when leaving the Schengen area (we do not assume these silly Intra-Schengen border checks will continue until 2032)

Congested main stations:
We know that finding slots in the commuter rush hours (07:00-10:00) is very difficult for night trains. This will remain difficult in 2032, as there is an increased interest in trains altogether and these stations in the city centre cannot easily be extended. It is not ideal, but unlike commuter trains night trains could do with a secondary station which has a good enough connection to the Metro / suburban traffic network. So, to avoid discussions on slots we choose
as origin/destination: Roma Tiburtina, Berlin-Gesundbrunnen, …
as stop: München Ost, Københavns Lufthavn, Frankfurt Süd, …

Adding stop_times:

To examine the travel times we have added a function in columns J-O. You can find it at the first extended train proposal (N.N. EN 40425). Add a departure_time in column F, e.g. 20:00 for the first stop. Then copy the first row of a stop sequence (the one with :0) to your departure station in columns J-O. Then add more. Then copy the second row of the stop sequence (the one with :1) to all stops including the destination (the one with :99). This should calculate the travel times. The tool we use is again https://signal.eu.org/osm/ which is sometimes imprecise. For that reason the distance and the cruise speed are displayed in columns L and M. If you think > 2h travel time for 23km at a cruise speed of 11 km/h is a bit much beween Bruxelles/Brussel-Midi/Zuid and Bruxelles/Brussel-Nord/Noord, then rectify the value by overwriting the formula in column K (Estimate highlighted in light blue and italic).
Our formula already includes a 10% time buffer and 5 minutes per stop (2 Minutes stop time and 3 minutes net delay for braking and acceleration).

Overnight buffers:
If you think the train is too quick and should take it slow between the last departure station and the first arrival station you may add some minutes in the Formula in column J. Please not that Google Sheets calculates time values fraction of a day. So 1 hour si a 1/24 day and 1 minutes is a 1/1440 day. So, to add 150 minutes as in our example add +(180/1440) to the formula (brackets only for visibility, of course) (Changed foumula highligted bold).
We recommend to add a minimum buffer of 1h to compensate for unavailable slots and other service interruptions.

Screenshot 1: The helper tool for the itinerary

If your want to be on the safe side you can cross-check how much time an existing intercity train needs on that track. Withdraw 5 minutes for each stop you would omit.

High-speed or not?
The formula contains calls which includes high-speed tracks (TRAVELTIMEHS, TRAINDISTANCEHS) and which exclude HS tracks (TRAVELTIME, TRAINDISTANCE). In our target network 2032 study we’ll assume new, pressure-resistant standard rolling stock which can run with speeds up to 230 km/h, which could run on high-speed-lines, except most french LGV lines, which have a weight limit of 17t per axis (most locomotives have 80-90t, 20-22 per axis, too much for these lines). So TRAVELTIMEHS, TRAINDISTANCEHS should be o.k. unless the HS tracks are in France. Some high-speed lines are currently closed for passenger traffic in the night in Germany. We assume that the unjustified closure is lifted for slower trains by 2032. However, in the night you may not assume travel cruise speeds of more than 100 km/h as passenger trains would use slots between cargo trains. If you calculate a night train using a German HS track, adjust the cruise speed_km_h accordingly in column M.

4. Estimate the shift potential (flight_route):

First we looked at public passenger airports that serve cities on the route. Then we are looking for flights between these cities. You can find the passenger volumes between two airports (latest fully reported year 2023 from Eurostat) in the table flights_2023. Once you found a flight, add a new row in the table flight_route, enter the route_id in Column A. If the number is correct and the stop_times set correctly the route_description (city pair) will appear in column B (if the formular was already pasted). Now copy the flightrelation_id of the flight you found in the flights_2023 Table in column C. The flight_description (airport pair) will appear in column D.

Make sure you added all relevant flights. The flights_2023 table should be ordered by the flighhtrelation_id. This ID uses the IAO codes, which are sorted by gegraphical region, this should help when searching. As there is only one flightrelation_id per airport pair you will find the route assigned to the country which two-letter ISO Code comes first in alphabetical order. BTW, this is the reason why at the end it seems as if Istanbul (TR) only serves international flights – all European destinations are allocated to the other city.

Once you have all the flights:
Sum up the potential in column G (sum_passengers). If you copy the =SUM function from another cell, make sure the area summed up dos not contain values which belong to other trains. Then calculate the share of each flight of sum_passengers in column H. Now write these values in coumn J (allocation), Make sure the allocations sum up to 100% in column K (test). You may adjust these values if you think that for some aiport connection the night train is a less attractive alternative. For example: Bergamo is quite far form Milano, so the night train is presumably only half ass attractive as for passengers departing from Malpensa or Linate. Another example: Vienna-Brussels stops in Munich, but with an arrival time beyond the attractive timeframe (05:43) you might deduce 10% from the regular potential (with ideal departure and arrival times).

Now you will get feedback:
Column N (flight_potential_used) will indicate how much of that flights potential has been allocated to the train. If its more than 100% the cell will turn red.
Column O (air_potential_used) will indicate how much of all flights potential has been allocated to the train. If its more than 100% the cell will turn red. If it is below 50% it turns green, indicating you might like to add capacity, e.g. by running another train along that line.
Column P (flights_allocated) will indicate how much a flight’s potential was used fill night trains. If its more than 100% the cell will turn red. This means: This flights potential was already used elsewhere. You can check if the share of that flight can be reduced for that/these other train(s). However make sure the overall share remains 100% and that the train remains feasible.

Screenshot 2: For Proposal 1246 is indicated that the night train serves less than half of the potential. It would be possible to offer two night trains, an early one and a later one – if Toulouse wasn’t the HQ of Airbus. For Proposal 2001 you can see that the air passenger potential for the chosen 700-place train is insufficient. However on the route are Rotterdam, Antwerpen, Brussels and Paris. Possibly the train could serve these connections, too.

From Bus services:

We ignore shifting potential form Coach/Bus services. This is a price sensitive passenger whcih could only be attracted to high density offers such as seat coaches. Also the GHG saving potential is quite low. And when the train runs on diesel enginges, Bus services are environmentally even better.

From Car:

We ignore shifting potential form Coach/Bus services for now. There is a method to estimate the car passenger traffic, which might be shifted, described in the Ramboll study (2025). However, according to the study this applies to shorter distances only (800km was the reference distance in this study). On distances beyond 1000km the study assumes that the car is used for a reasons which wouldn’t allow a shift to rail anyway (e.g. baggage).

5. Optimising the proposal

When optimising the night train offer you have two options.

  • Optimise the Itinerary (-> 3. Edit the Itinerary)
  • Change the train composition (choose a different model in column U in the routes table) You may also configure a new one in the compositions table, however we need to discuss and justify each new proposal, so better stick to the suggested models.
  • Change the operational model (see below)

Operational models:

Point to Point (I Model): You would choose this model if you have a large enough metropolitan area (or multiple metropolitan areas which are not further apart than 3 hours) on both ends of the route.

X-Shape: This shape is used when you don’t have sufficient potential for a point-to-point connection. It is four connections altogether. It is cost-optimised as you have the full length on each leg of the shape (e.g. Gothenburg/Stockholm = Umeå/Duved). However if you choose a shape that resembles rather a Plus than an “X” (e.g. Vienna/Berlin = Brussels/Paris) over a more direct alternative you have to face higher track access charges and slower connection times than necessary. This model is also quite sensitive to delays as 4 trains have to arrive within a given time frame, which should be at least an hour. Your should additionally have access to a spare loco and driver at your shunting point.

Y-Shape: This shape is used when you have sufficient traffic on one end but need to split the traffic to different areas on the other end (and when these areas cannot be aligned into one route as you would arrive too late in one of the areas). It could be two ends (e.g. London = Glasgow/Edinburgh) three (e.g. London Fort William/Inverness/Abedeen) or even four ends (e.g. Bucharest = Bistrita/Cluj/Satu Mare/Sighetu Marmatiei) This shape is not cost-optimised as traction cost and track access charges fully apply for each leg on the split end. So this type of route is typically chosen by operators who can attach the night services to some of their own morning/evening intercity services. This model is also quite sensitive to delays in relation to the number of ends.

6. Estimating operational cost

For the estimation of the operational we will basically use the cost model in the spreadheet for our 2023 TAC study. We want to apply this cost model as a function to the data of our night train proposal later on. But before doing that we are still collecting feedback in order to provide a more robust cost model.

Video:

Please accept YouTube cookies to play this video.
By accepting you will be accessing content from YouTube, a service provided by an external third party.

YouTube privacy policy

If you accept this notice, your choice will be saved and the page will refresh.

Screencast from tutorial on 05th August, 2025