{% extends "base.html" %} {% block title %}{{ departure_station_name }} to {{ destination }} via Eurostar{% endblock %} {% block og_title %}{{ departure_station_name }} to {{ destination }} via Eurostar{% endblock %} {% block og_description %}Train options from {{ departure_station_name }} to {{ destination }} on {{ travel_date_display }} via Paddington, St Pancras, and Eurostar.{% endblock %} {% block twitter_title %}{{ departure_station_name }} to {{ destination }} via Eurostar{% endblock %} {% block twitter_description %}Train options from {{ departure_station_name }} to {{ destination }} on {{ travel_date_display }} via Paddington, St Pancras, and Eurostar.{% endblock %} {% block content %}

{{ departure_station_name }} → {{ destination }}

← Prev {{ travel_date_display }} Next →
{% for destination_slug, destination_name in destinations.items() %} {% if destination_slug == slug %} {{ destination_name }} {% else %} {{ destination_name }} {% endif %} {% endfor %}

{{ gwr_count }} GWR service{{ 's' if gwr_count != 1 }}  ·  {{ eurostar_count }} Eurostar service{{ 's' if eurostar_count != 1 }} {% if from_cache %}  ·  (cached) {% endif %}

{% if error %}
Warning: {{ error }}
{% endif %} {% if no_prices_note %}
{{ no_prices_note }}
{% endif %}
{% if trips or unreachable_morning_services %}
{% if trips %} {% set best_mins = trips | map(attribute='total_minutes') | min %} {% set worst_mins = trips | map(attribute='total_minutes') | max %} {% set priced_trips = trips | selectattr('total_price') | list %} {% if priced_trips | length > 1 %} {% set min_price = priced_trips | map(attribute='total_price') | min %} {% set max_price = priced_trips | map(attribute='total_price') | max %} {% endif %} {% endif %} {% for row in result_rows %} {% if row.row_type == 'trip' and row.total_minutes <= best_mins + 5 and trips | length > 1 %} {% set row_class = 'row-fast' %} {% elif row.row_type == 'trip' and row.total_minutes >= worst_mins - 5 and trips | length > 1 %} {% set row_class = 'row-slow' %} {% elif row.row_type == 'unreachable' %} {% set row_class = 'row-unreachable' %} {% elif loop.index is odd %} {% set row_class = 'row-alt' %} {% else %} {% set row_class = '' %} {% endif %} {% if row.row_type == 'trip' %} {% else %} {% endif %} {% endfor %}
{{ departure_station_name }} Paddington GWR Fare Transfer Depart STP {{ destination }} ES Std Total
{{ row.depart_bristol }} {% if row.headcode %}
{{ row.headcode }}{% endif %}
{{ row.arrive_paddington }} ({{ row.gwr_duration }}) {% if row.arrive_platform %}
Plat {{ row.arrive_platform }}{% endif %}
{% if row.ticket_price is not none %} £{{ "%.2f"|format(row.ticket_price) }}
{{ row.ticket_name }} {% else %} {% endif %}
{{ row.connection_duration }}{% if row.connection_minutes < 80 %} ⚠️{% endif %} {% if row.circle_services %} {% set c = row.circle_services[0] %}
Circle {{ c.depart }} → KX {{ c.arrive_kx }} {% if row.circle_services | length > 1 %} {% set c2 = row.circle_services[1] %}
next {{ c2.depart }} → KX {{ c2.arrive_kx }} {% endif %} {% endif %}
{{ row.depart_st_pancras }} {% if row.train_number %}
{% for part in row.train_number.split(' + ') %}{{ part }}{% if not loop.last %} + {% endif %}{% endfor %}{% endif %}
{{ row.arrive_destination }} (CET) {% if row.eurostar_duration %}
({{ row.eurostar_duration }}){% endif %}
{% if row.eurostar_price is not none %} £{{ "%.2f"|format(row.eurostar_price) }} {% if row.eurostar_seats is not none %}
{{ row.eurostar_seats }} at this price {% endif %} {% else %} {% endif %}
{% if row.total_minutes <= best_mins + 5 and trips | length > 1 %} {{ row.total_duration }} ⚡ {% elif row.total_minutes >= worst_mins - 5 and trips | length > 1 %} {{ row.total_duration }} 🐢 {% else %} {{ row.total_duration }} {% endif %} {% if row.total_price is not none %}
£{{ "%.2f"|format(row.total_price) }}{% if min_price is defined and max_price is defined %}{% if row.total_price <= min_price + 10 %} 🪙{% elif row.total_price >= max_price - 10 %} 💸{% endif %}{% endif %} {% endif %}
{{ row.depart_st_pancras }} {% if row.train_number %}
{% for part in row.train_number.split(' + ') %}{{ part }}{% if not loop.last %} + {% endif %}{% endfor %}{% endif %}
{{ row.arrive_destination }} (CET) {% if row.eurostar_duration %}
({{ row.eurostar_duration }}){% endif %}
{% if row.eurostar_price is not none %} £{{ "%.2f"|format(row.eurostar_price) }} {% if row.eurostar_seats is not none %}
{{ row.eurostar_seats }} at this price {% endif %} {% else %} {% endif %}
Too early

Paddington → St Pancras connection: {{ min_connection }}–{{ max_connection }} min. GWR walk-on single prices from gwr.com. Eurostar Standard prices are for 1 adult in GBP; always check eurostar.com to book.  ·  {{ departure_station_name }} departures on RTT  ·  Paddington arrivals on RTT

{% else %}

No valid journeys found.

{% if gwr_count == 0 and eurostar_count == 0 %} Could not retrieve train data. Check your network connection or try again. {% elif gwr_count == 0 %} No GWR trains found for this date. {% elif eurostar_count == 0 %} No Eurostar services found for {{ destination }} on this date. {% else %} No GWR + Eurostar combination has at least a {{ min_connection }}-minute connection at Paddington/St Pancras. {% endif %}

{% endif %} {% endblock %}