thetrainline.com
Ranks Overall #5 Trainline #1
Data from Oct 30, 2026, 10:14 PM UTC old Measured once a day Β· 1 run since Oct 30, 2026
Elsewhere:
PageSpeed Insights Β·
Calibre Β·
Treo Β·
CrUX Vis Β·
Tame the Bots Β·
Scoring Calculator Β·
Wayback Machine
Lab data is measured using Lighthouse, Mobile mode unless otherwise specified. Field data is reported from Chrome UX Report (using p75 measurements).
Stack
Filmstrip LAB Throttled
How the page drew during the measured load, at 9 points across 15.84 s. Compare this filmstrip against another site.
-
1.98 s
-
2.51 s
-
5.94 s
-
7.92 s
-
8.41 s
-
9.90 s
-
11.88 s
-
13.86 s
-
15.84 s
Lighthouse Scores LAB Simulated
Metrics LAB FIELD
Field figures are the p75 across real Chrome users over a 28-day trailing window (2026-10-01 → 2026-10-28), url-level.
| Metric | Lab Simulated | Field | |||
|---|---|---|---|---|---|
| Value | Change / range | Trend | p75 | Distribution | |
| LCP CWV Largest Contentful Paint | 10.35 s poor | — 10.35 s – 10.35 s | 1.68 s good | 86.6% 7.3% 6.1% | |
| INP CWV Interaction to Next Paint β field only, no lab run can measure it | n/a | — | 488 ms needs work | 31.1% 45.3% 23.7% | |
| CLS CWV Cumulative Layout Shift | 0 good | — 0 – 0 | 0 good | 96.7% 0.5% 2.8% | |
| TBT Total Blocking Time | 930 ms poor | — 930 ms – 930 ms | n/a | — | |
| FCP First Contentful Paint | 2.17 s needs work | — 2.17 s – 2.17 s | 1.45 s good | 82% 10.4% 7.5% | |
| Speed Index | 5.91 s poor | — 5.91 s – 5.91 s | n/a | — | |
| TTFB Time to First Byte | 637 ms good | — 637 ms – 637 ms | 656 ms good | 81.7% 13.3% 5% | |
LCP Subparts LAB Throttled
The subparts attribute LCP to your server, resource discovery, download, or rendering. They come from one throttled load, the same one as the filmstrip, so they add up to that load’s LCP rather than the simulated Lab LCP above.
LCP LAB Simulated vs LCP FIELD
The lab LCP is 6.15Γ the field p75 β real users likely have above-average hardware or network connectivity.
Page weight
| Metric | Value | Change / range | Trend |
|---|---|---|---|
| Page Weight | 2.98 MB | — 2.98 MB – 2.98 MB | |
| Requests | 78 | — 78 – 78 | |
| Third-party Weight | 1.19 MB | — 1.19 MB – 1.19 MB | |
| Third-party CPU | 142 ms | — 142 ms – 142 ms | |
| Unused JS | 1.06 MB | — 1.06 MB – 1.06 MB | |
| Unused CSS | 77.5 kB | — 77.5 kB – 77.5 kB |
By resource type
| Type | Transfer | Share | Size | Requests |
|---|---|---|---|---|
| script | 76% | 2.27 MB | 26 | |
| other | 8.8% | 263 kB | 33 | |
| image | 7.7% | 231 kB | 11 | |
| document | 3.8% | 114 kB | 1 | |
| stylesheet | 2.2% | 66.5 kB | 4 | |
| font | 1.4% | 41.0 kB | 1 | |
| Total | 2.98 MB | 78 |
Third parties 9 entities
| Entity | Transfer | Size | Main thread Simulated |
|---|---|---|---|
| Google Tag Manager | 402 kB | 70 ms | |
| Optanon | 384 kB | 22 ms | |
| Google/Doubleclick Ads | 284 kB | 34 ms | |
| New Relic | 38.4 kB | 8 ms | |
| Branch Metrics | 35.1 kB | 5 ms | |
| All 9 | 1.19 MB | 142 ms |
Without JavaScript
The same load, photographed twice at 412×823: once with scripts disabled, once as rendered.
88.1% of pixels differ — the page changes substantially. A shifted layout counts as difference, so a <noscript> banner alone can account for a large figure.
Page health
| Metric | Value | Change / range | Trend |
|---|---|---|---|
| Main Thread Work | 3.35 s | — 3.35 s – 3.35 s | |
| Long Tasks | 12 | — 12 – 12 | |
| DOM Elements | 2,013 | — 2,013 – 2,013 | |
| Axe Violations Violating nodes from a full Axe CLI run (more than Lighthouse reports) | 11 | — 11 – 11 | |
| A11y Failures | 3 | — 3 – 3 | |
| A11y Failing Nodes | 4 | — 4 – 4 |
Main thread work
| Task | Time | Share | Duration Simulated |
|---|---|---|---|
| script evaluation | 57% | 1.91 s | |
| script parse compile | 17% | 554 ms | |
| other | 14% | 462 ms | |
| style layout | 5% | 184 ms | |
| garbage collection | 4% | 127 ms | |
| parse HTML | 2% | 70 ms | |
| paint composite render | 1% | 47 ms | |
| Total | 3.35 s |
Axe violations axe-core 4.13.0, full rule set
11 violating nodes across 5 rules, 1423 passing. This is a standalone Axe CLI run and is stricter than the subset Lighthouse already includes.
-
minor
aria-allowed-roleβ ARIA role should be appropriate for the element 5 nodesOffending elements
-
#bubble-interactive-basket-info<button class="diRbA4TQ88TVDwhpwYyh DgsbYRvKgbafDf2tY3up NEp2ZGi1POkm4u7i2kfQ OWeK8cJHVyJWHVb2MaVO y7CxfX1vFjeDcuk3FGuL sRJQVl2fyDNmEMRQQ14Q" data-testid="interactive-element" type="button" role="pre⦠-
#jsf-origin-input<input data-testid="jsf-origin" aria-label="Departure station, n..." placeholder="From city or station" id="jsf-origin-input" aria-labelledby="jsf-origin-label" aria-expanded="false" readonly="" role⦠-
#jsf-destination-input<input data-testid="jsf-destination" aria-label="Arrival station, non..." placeholder="To city or station" id="jsf-destination-inpu..." aria-labelledby="jsf-destination-labe..." aria-expanded="false"β¦ -
#jsf-outbound-time-input-toggle<input type="text" name="outboundTime" value="Fri 30 Oct β’ 22:15" aria-invalid="false" aria-current="false" aria-expanded="false" aria-haspopup="dialog" data-testid="jsf-outbound-time" placeholder=" β¦ -
#jsf-passengers-input-toggle<input type="text" name="passengers" aria-invalid="false" aria-current="false" aria-expanded="false" aria-haspopup="dialog" data-testid="jsf-passengers" aria-label="Add passenger" id="jsf-passengers-β¦
-
-
serious
nested-interactiveβ Interactive controls must not be nested 3 nodesOffending elements
-
.ubYJEXpGpyG0DNmIYrvg<div class="qfLoyTPCJfzAfrEclZnc ubYJEXpGpyG0DNmIYrvg" role="option" tabindex="0"> -
.qfLoyTPCJfzAfrEclZnc[role="option"]:nth-child(2)<div class="qfLoyTPCJfzAfrEclZnc" role="option" tabindex="0"> -
.qfLoyTPCJfzAfrEclZnc[role="option"]:nth-child(3)<div class="qfLoyTPCJfzAfrEclZnc" role="option" tabindex="0">
-
-
moderate
heading-orderβ Heading levels should only increase by one 1 nodeOffending element
-
.XbtqcA5Bd6k3Z3_M6w_g<h4 class="XbtqcA5Bd6k3Z3_M6w_g"><span>Tickets</span></h4>
-
-
minor
presentation-role-conflictβ Elements marked as presentational should be consistently ignored 1 nodeOffending element
-
#bubble-interactive-basket-info<button class="diRbA4TQ88TVDwhpwYyh DgsbYRvKgbafDf2tY3up NEp2ZGi1POkm4u7i2kfQ OWeK8cJHVyJWHVb2MaVO y7CxfX1vFjeDcuk3FGuL sRJQVl2fyDNmEMRQQ14Q" data-testid="interactive-element" type="button" role="preβ¦
-
-
serious
scrollable-region-focusableβ Scrollable region must have keyboard access 1 nodeOffending element
-
._1quk65v<div class="_1quk65v" data-test="travel-safe-sections">
-
Accessibility failures 3 of 36 audits
-
label-content-name-mismatchβ Elements with visible text labels do not have matching accessible names. 2 nodes -
heading-orderβ Heading elements are not in a sequentially-descending order 1 node -
presentation-role-conflictβ Elements with `role="none"` or `role="presentation"` have conflicts 1 node
Best Practices failures 2 of 19 audits
-
errors-in-consoleβ Browser errors were logged to the console 1 item -
valid-source-mapsβ Missing source maps for large first-party JavaScript 3 items
SEO failures 1 of 10 audits
-
link-textβ Links do not have descriptive text 1 item
Hygiene
Measurement log
Field history 25 weeks
Weekly p75 from the CrUX History API, backfilled in a single request.
| Week ending | LCP | INP | CLS | FCP | TTFB |
|---|---|---|---|---|---|
| 2026-10-24 | 1.68 s | 486 ms | 0 | 1.45 s | 656 ms |
| 2026-10-17 | 1.68 s | 480 ms | 0 | 1.44 s | 656 ms |
| 2026-10-10 | 1.68 s | 477 ms | 0 | 1.44 s | 653 ms |
| 2026-10-03 | 1.68 s | 477 ms | 0 | 1.43 s | 644 ms |
| 2026-09-26 | 1.67 s | 478 ms | 0 | 1.41 s | 633 ms |
| 2026-09-19 | 1.68 s | 479 ms | 0 | 1.40 s | 629 ms |
| 2026-09-12 | 1.67 s | 478 ms | 0 | 1.40 s | 623 ms |
| 2026-09-05 | 1.67 s | 476 ms | 0 | 1.39 s | 618 ms |
| 2026-08-29 | 1.67 s | 471 ms | 0 | 1.39 s | 621 ms |
| 2026-08-22 | 1.67 s | 465 ms | 0 | 1.39 s | 613 ms |
| 2026-08-15 | 1.69 s | 458 ms | 0 | 1.39 s | 606 ms |
| 2026-08-08 | 1.69 s | 449 ms | 0 | 1.38 s | 599 ms |
Runs
Every stored run for this URL, newest first.
| When | Scores | Perf | LCP | CLS | TBT | Weight | Runs | Spread | Bench | Took | Archive |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Oct 30, 2026, 10:14 PM UTC | 47 | 10.35 s | 0 | 930 ms | 2.98 MB | 3/3 | Β±9 | 2,106 +1% | 69.5s |
|