The 15 leaves on time. The 14 does not wait.

This is a piece about a complaint that happens to be checkable. Somebody stands at Mihaljevac, looks at the timetable, watches the tram pull out before the timetable said it would — and asks what exactly that buys anyone. We have eleven days of ZET vehicle positions, and a terminus is the one place where a departure can be timed almost to the second. Short answer: they are right that it leaves early, wrong that it is two minutes, and the most interesting part is that the tram sharing the platform does not do it at all.

The question

At Mihaljevac (and I suspect elsewhere too) the number 14 trams persistently leave exactly two (2) minutes before the scheduled time. Can anyone tell me what the secret is — what is achieved in those 2 minutes?

It is a well-posed question, because it can be answered. Mihaljevac is where line 14 starts — the tram does not pass through, it stands there and then leaves. That distinction is what makes this measurable at all: at an intermediate stop you cannot tell whether a tram even opened its doors, but at a terminus you can see precisely when a vehicle stopped standing still and left.

How you time a departure from a terminus

ZET’s GTFS-Realtime feed reports every vehicle’s position. While a tram stands at the platform it reports less often — there is no new position to report — so a departure cannot simply be read off "the last fix". Instead we take three things per run:

Why the measure is deliberately generous. A tram pulling away needs ten-odd seconds to cover those 50 m, so the real moment the doors shut is earlier than every number here. Wherever a claim has to be airtight — "the tram was already gone" — no interpolation is used at all, only the third measure, the first fix at 100 m. The median gap between the two fixes that bracket a departure is 11 seconds, which is also the scale of the measurement error.

The answer: early yes, two minutes no

Over 11 days, 7 to 17 September 2026, we measured 1,123 departures of line 14 from Mihaljevac. The median is 44 seconds early. The earliest quarter leave 1:41 or more ahead of the timetable; the latest quarter leave essentially on time.

So: 65.3 % of departures really do go before the timetabled time, and that is the rule rather than the exception. But "exactly two minutes" is not what the data says — two minutes or more early happens on 14.9 % of departures, roughly one in six. Somebody catching the same tram every day would meet that about once a week, not every morning.

How early the tram actually leaves Mihaljevac

Share of departures by 30-second band against the timetable. Left is early, right is late. Same stop, same tracks, two lines.

The shape of that curve is really the answer to "persistently". If line 14 systematically left two minutes early, the peak would sit at −2:00. The peak sits at half a minute, with a long tail to the left. The tram is not consistently early — it is consistently early by a random amount, which is worse for a passenger, because there is nothing to adapt to.

No individual timetabled departure escapes that. The worst is the one at 15:24, with a median of 4:10 early, but across 7 days its runs range from 33 seconds to 6:08 early. The spread is wider than the effect itself.

So how early do you have to get there?

The practical question for anyone standing at Mihaljevac each morning is how much of a head start to give themselves. This is the share of departures that are no longer on the platform — measured strictly, meaning the tram is already at least 100 m away:

Share of departures already gone, by how early you arrive

Arriving before the timetableLine 14Line 15
exactly on time65.3 %27.9 %
0:30 early47.5 %6.4 %
1:00 early34.5 %0.5 %
1:30 early22.4 %0.1 %
2:00 early14.9 %0.0 %
2:30 early8.7 %0.0 %
3:00 early5.9 %0.0 %
4:00 early2.8 %0.0 %
5:00 early1.3 %0.0 %

To miss the 14 less than one time in ten you have to be on the platform two and a half minutes before the time printed in the timetable. For the 15, a minute early is enough and you will essentially never miss it.

Not the stop, not the GPS, not the feed

Before blaming anybody, the measurement has to be ruled out. An early departure can appear in the data because a vehicle clock is wrong, because the timetable in the feed is shifted, because GPS jitters at a terminus. All of those share one convenient property: they would hit every tram leaving that platform.

The lines that start at Mihaljevac

LineDeparturesMedianEarlyTwo minutes or more
141,123−0:4465.3 %14.9 %
8741−0:3965.2 %9.6 %
15980+0:0727.9 %0.0 %

Line 15 leaves on time. Its median is seven seconds behind the timetable, it goes early in 27.9 % of cases, and two minutes early — not once in 980 measured departures. Line 8 behaves like line 14. Same platform, same rails, same feed, same clocks: whatever separates the 14 from the 15, it is not the instrument.

A second check: ZET sees it too. Everything above is derived from vehicle positions. In the same feed ZET also publishes its own estimate of deviation from the timetable per stop, which we use nowhere in the figures above. For the same stop and the same runs, ZET itself reports a median of 51 seconds early, with 65.3 % negative values across 1,174 departures. Our measure says 44 seconds and 65.3 %. Two independent signals out of one feed, the same conclusion.

Not Mihaljevac either

The same measure applied to every tram terminus in the city produces a result that will probably not comfort the person who asked: Mihaljevac is among the best-behaved. Line 14 out of Mihaljevac is the 5th most punctual of the 36 measured starting points in the tram network.

Median head start by tram terminus

LineTerminusDeparturesMedianTwo minutes or more
4Kvaternikov trg195−4:4763 %
6Zapruđe111−2:0544 %
9Borongaj1,012−2:0232 %
5Park Maksimir886−1:5844 %
12Savski most146−1:5539 %
17Borongaj1,288−1:5025 %
3Savišće749−1:4938 %
2Savišće1,133−1:4434 %
1Borongaj559−1:4025 %
2Selska142−1:3837 %
5Selska140−1:3733 %
12Dubrava1,071−1:3726 %
2Črnomerec1,148−1:3428 %
3Ljubljanica802−1:3425 %
9Ljubljanica1,148−1:3125 %
13Žitnjak543−1:3132 %
1Zapadni kolodvor567−1:3125 %
4Savski most919−1:2525 %
17Selska175−1:2430 %
7Dubrava1,053−1:2419 %
6Črnomerec1,322−1:2026 %
6Sopot1,174−1:1926 %
14Črnomerec122−1:1520 %
7Savski most1,192−1:157 %
12Ljubljanica1,477−1:1421 %
14Zapruđe1,227−1:1220 %
11Dubec987−1:0819 %
17Prečko1,375−1:0720 %
5Prečko993−1:0122 %
4Dubec818−0:5918 %
11Črnomerec1,257−0:5317 %
14Mihaljevac1,119−0:4515 %
13Kvaternikov trg552−0:4318 %
8Mihaljevac739−0:3810 %
15Gračansko dolje976+0:010 %
15Mihaljevac967+0:070 %

At the top of the list is line 4 out of Kvaternikov trg, with a median of 4:47 early — and 63 % of its departures go two minutes or more before the timetable. That is the line on which the opening question would have been literally true. At the bottom sit both of line 15’s starting points, the only two in the whole network that on average leave after the timetable.

What it buys

Now to the real question. If a tram leaves half a minute early, where does that half minute end up? Nowhere — because line 14’s timetable already allows more time than the journey takes.

Measured from each tram’s own actual departure rather than from the timetable, line 14 beats its own schedule at every stop we measured. The timetable gives it 2 minutes 11 seconds to Jandrićeva; the trip takes a minute. To Frankopanska it gives 18:57 against an actual median of 14:52 — 4:05 of slack, and none of it has anything to do with whether the tram left early.

How long the journey takes, and how long the timetable allows

Time from the actual departure at Mihaljevac to each stop, against what the timetable allows for the same stretch. In the order the stops are served.

The gap peaks at Frankopanska and then narrows: by Utrina the tram is only 1:14 ahead. So the timetable did not get the total journey wrong — it got the distribution wrong. The northern half of the line was handed four spare minutes, and the southern half takes them back. A tram standing at Mihaljevac has no need of that extra half minute: it will have it by Frankopanska anyway.

So where do the seconds in the timetable come from? From the fact that it is not written against the clock but against a spacing. The morning departures from Mihaljevac look like this:

The gap between them is 7 minutes 15 seconds, every time. The timetable is generated by adding that interval over and over, so the times land where they land — on :17, :32, :47, :02. The board at the stop shows whole minutes, so a passenger is comparing their watch against something that has already been rounded. That accounts for a few tens of seconds. It does not account for a tail two minutes long.

What it actually costs

A surprising finding: early departures do not wreck the spacing. The gap between consecutive trams at Mihaljevac averages 539 seconds by the timetable and 551 seconds in reality. The spread is somewhat wider (165 against 130 seconds), but it is not a collapse.

For a passenger who turns up without consulting anything, the expected wait goes from 4.75 to 5.00 minutes — about fifteen seconds. The entire cost of early departures falls on the person who goes by the timetable. Turn up at random and you notice nothing; turn up on time and you lose the tram two times out of three. Which is, in the end, the answer to what is achieved: nothing defensible, and the loser is whoever behaves as though the timetable meant something.

How this was calculated

Median per day, so the pooled figure need not be taken on trust

DayDeparturesMedian
7 Sep111−0:58
8 Sep95−0:49
9 Sep113−0:48
10 Sep110−0:42
11 Sep98−1:04
12 Sep111−0:22
13 Sep103−0:46
14 Sep110−0:43
15 Sep111−0:33
16 Sep103−1:00
17 Sep58−0:28

Data and sources. Vehicle positions and timetable: ZET GTFS-Realtime and GTFS Schedule, published as open data by the City of Zagreb under the Open Licence. Every figure in this piece is derived from our own store of that feed and can be reproduced from the queries printed alongside. This is not an official ZET site, and nothing here claims to know why any particular driver leaves when they do — vehicle positions say nothing about intent.