{% 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 %}
{% endif %} {% if trips %} {% set best_mins = trips | map(attribute='total_minutes') | min %} {% set worst_mins = trips | map(attribute='total_minutes') | max %} {% 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 %}
National Rail
{{ departure_station_name }} → Paddington
Transfer
Paddington → St Pancras
Eurostar
St Pancras → {{ destination }}
Total
{{ row.depart_bristol }} → {{ row.arrive_paddington }} ({{ row.gwr_duration }}) {% if row.headcode or row.arrive_platform %}
{%- if row.headcode %}{{ row.headcode }}{% endif %} {%- if row.headcode and row.arrive_platform %} · {% endif %} {%- if row.arrive_platform %}Plat {{ row.arrive_platform }}{% endif %} {% 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 }} → {{ row.arrive_destination }} (CET) {% if row.eurostar_duration or row.train_number %}
{%- if row.eurostar_duration %}({{ row.eurostar_duration }}){% endif %} {%- if row.eurostar_duration and row.train_number %} · {% endif %} {%- if row.train_number %}{% for part in row.train_number.split(' + ') %}{{ part }}{% if not loop.last %} + {% endif %}{% endfor %}{% endif %} {% endif %} {% if row.eurostar_price is not none %}
£{{ "%.2f"|format(row.eurostar_price) }} Std{% if row.eurostar_seats is not none %} · {{ row.eurostar_seats }}{% endif %} {% else %}
{% endif %} {% if row.eurostar_plus_price is not none %}
£{{ "%.2f"|format(row.eurostar_plus_price) }} Plus{% if row.eurostar_plus_seats is not none %} · {{ row.eurostar_plus_seats }}{% endif %} {% 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 %} Too early {{ row.depart_st_pancras }} → {{ row.arrive_destination }} (CET) {% if row.eurostar_duration or row.train_number %}
{%- if row.eurostar_duration %}({{ row.eurostar_duration }}){% endif %} {%- if row.eurostar_duration and row.train_number %} · {% endif %} {%- if row.train_number %}{% for part in row.train_number.split(' + ') %}{{ part }}{% if not loop.last %} + {% endif %}{% endfor %}{% endif %} {% endif %} {% if row.eurostar_price is not none %}
£{{ "%.2f"|format(row.eurostar_price) }} Std{% if row.eurostar_seats is not none %} · {{ row.eurostar_seats }}{% endif %} {% else %}
{% endif %} {% if row.eurostar_plus_price is not none %}
£{{ "%.2f"|format(row.eurostar_plus_price) }} Plus{% if row.eurostar_plus_seats is not none %} · {{ row.eurostar_plus_seats }}{% endif %} {% endif %}

Paddington → St Pancras connection: {{ min_connection }}–{{ max_connection }} min. GWR walk-on single prices from gwr.com. Eurostar Standard and Plus 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 %}