Discover the new tram-train between Nantes and Châteaubriant: an asset for the region in 2025
Discover the new tram-train between Nantes and Châteaubriant: an asset for the region in 2025
The Nantes-Châteaubriant tram-train is poised to become a key mobility driver by 2025, strengthening service between the Nantes metropolitan area and northern Loire-Atlantique. With a significant increase in daily journeys, attractive fares, and rising ridership, this line is boosting travel and supporting sustainable regional development. Operated by SNCF and developed using Alstom technology, this new tram-train plays a central role in the Pays de la Loire Region’s strategy to improve public transport and promote green mobility. The gradual expansion of services reflects a clear commitment to adapting the infrastructure to growing needs while integrating with local networks such as the Nantes Métropole TAN network. This connection is also part of a broader context of cooperation with the Brittany Region and interregional TER (regional express train) projects.
A major upgrade to the Nantes-Châteaubriant tram-train service in 2025
Since the beginning of 2025, the number of daily journeys has increased significantly, reaching 50 trains on weekdays and 30 on weekends, thus boosting travel options for residents of the Pays de la Mée and Loire-Atlantique regions.
🛤️
8 daily round trips Nantes-Châteaubriant 🚉
12 round trips Nantes-Nort-sur-Erdre 🚈
5 round trips Nantes-Sucé-sur-Erdre
Extending service until 10:35 pm on Friday evenings facilitates connections to TGV trains towards Paris or Strasbourg, thereby increasing travel flexibility.
A service for everyday life and the local area
✅ Enhanced service to meet the challenges of sustainable mobility and the fight against private car use
✅ 64 km line serving seven strategic towns, including Châteaubriant and La Chapelle-sur-Erdre
✅ Integration with local networks and upcoming transport projects in the Pays de la Loire region
✅ Greater comfort and frequency thanks to the involvement of stakeholders like Keolis and Nantes Métropole
Day 🚆
Number of journeys 🕒
Last departure from Nantes 🕘
Monday to Thursday
50
8:00 PM
Friday
50
10:35 PM
Saturday and Sunday
30
8:00 PM Ridership is growing rapidly and fares are tailored to the local population.Ridership is showing remarkable positive growth, with over one million passengers expected in 2023, representing a 45% increase between 2021 and 2023.
This success illustrates the relevance of this line, although it has not yet met initial projections. SNCF emphasizes the crucial role of this service, which carries approximately 4,500 passengers daily.
📈 Strong growth driven by service quality
💼 Commuter pass at €45/month, widely supported by employers
🌱 Aligned with regional objectives for ecological transition and improved accessibility
This attractive pricing model promotes accessibility and encourages commuters to choose the tram-train over the car, thus helping to reduce road congestion and limit the region’s carbon footprint. Specific offers and local impact on mobility
🚌 Integration with the Nantes Métropole TAN network for seamless connections
📲 Effective communication via WhatsApp for real-time updates on schedules and construction work
🏢 Logistical support from local partners like La Poste, optimizing the transport chain
Future prospects: extension and interregional connection
The line is preparing for a new phase of expansion starting in December 2025 with:
🔄 Increase to 25 round trips between Nantes and Nort-sur-Erdre
📅 5 additional trips on Saturdays
🚆 8 round trips on Sundays
This expansion supports the increasing demand and paves the way for future interconnection with the Brittany region, notably with a direct TER (regional express train) link between Rennes and Nantes via Châteaubriant, an initiative that could transform regional mobility.
Extension 📈
Current routes
Planned routes December 2025
Nantes ↔ Nort-sur-Erdre
12 round trips
25 round trips
Saturday
–
5 additional trips
Sunday
–
At the same time, SNCF is continuing essential maintenance work to guarantee the longevity and reliability of the service, despite a slight disruption to the schedule that will continue until March 2025. Discover the new tram-train between Nantes and Châteaubriant: an asset for the region in 2025 Choose a data point to display: Train frequency
Number of daily trips Fares (€) Daily users /* * Interactive infographic on the Nantes-Châteaubriant tram-train 2025 * Fictitious data from the 2025 project * All strings are in French and easily editable in the variable ‘texts’ * Chart.js library used in CDN (version 4.3.0) * Accessible and efficient, without heavy additional dependencies. */ // French texts for easy internationalization const texts = { title: “Discover the new tram-train between Nantes and Châteaubriant: an asset for the region in 2025”, selectionLabel: “Choose a data point to display:”, frequentiel: “Train frequency per hour”, routes: “Number of daily trips”, fares: “Fares (€)”, users: “Daily users”, descriptionFrequency: “On average, a train passes every 15 to 45 minutes depending on the time of day, facilitating daily travel.”, descriptionRoutes: “The tram-train offers approximately 40 trips per day in each direction, ensuring regular and reliable service.”, descriptionFares: “Affordable fares for all travelers, with prices tailored to regular and occasional users.” descriptionUsers: “More than 3,000 daily users are expected, which helps reduce road traffic and pollution.” colors: { frequency: “#1f78b4”, routes: “#33a02c”, fares: “#e31a1c”, users: “#ff7f00” } }; / Structured simulated data for each category // 1) Frequency: trains per hour – dummy data simulating a daily schedule const dataFrequency = { labels: texts.TimeAxis, description: texts.FrequencyDescription, color: texts.colors.frequency, label: texts.frequency }; // 2) Number of daily trips – total in each direction const dataTrips = { description: texts.descriptionTrips, color: texts.colors.trips, label: texts.trips }; / 3) Fares in euros (€) const dataFares = { labels: texts.pricesCategories, description: texts.descriptionPrices, color: texts.colors.prices, label: texts.prices }; / 4) Estimated daily users const dataUsers = { description: texts.descriptionUsers, color: texts.colors.users, label: texts.users }; / Simple mapping for dynamic access const dataSets = { frequency: dataFrequency, trips: dataTrips, fares: dataFares, users: dataUsers }; const selectElement = document.getElementById(“choixInfo”); const descriptionEl = document.getElementById(“descriptionData”); const ctx = document.getElementById(“chartTramTrain”).getContext(“2d”); / Initial chart configuration (Bar chart) let chartInstance = null; / Function to create or update the chart based on the selection function afficherDonnees(type) { // Destroy the old instance to avoid layering if (chartInstance) chartInstance.destroy(); / Choose the chart type based on category for better readability let chartType = “bar”; let options = { responsive: true, animation: {duration: 700}, plugins: { legend: {display: false}, tooltip: { callbacks: { label: context => { let val = context.parsed.y !== undefined ? context.parsed.y: context.parsed.x; if(type === “rates”) return `${val} €`; if(type === “frequency”) return val + “trains/hour”; if(type === “users”) return val.toLocaleString(“fr-FR”) + “users”; if(type === “journeys”) return val + “journeys”; return val; } } }, title: { display: true, text: data.label, font: {size: 18, weight: ‘600’} } }, scales: {} }; // Adapt axes according to data type if(type === “frequency”) { options.scales = { y: { beginAtZero: true, title: {display:true, text:”Number of trains per hour”}, ticks: {stepSize:1} }, x: { title: {display:true, text:”Time of day”} } }; } else if(type === “journeys”) { options.scales = { y: { beginAtZero: true, title: {display:true, text:”Number of journeys”} }, x: { title: {display:true, text:”Direction”} } }; } else if(type === “tarifs”) { options.scales = { y: { beginAtZero: true, title: {display:true, text:”Price in €”}, ticks: { callback: val => val + “€” } }, x: { title: {display:true, text:”Tariff Type”} } }; } else if(type === “usagers”) { // Single use, simplified presentation, no multiple y-scale chartType = “bar”; options.scales = { y: { beginAtZero: true, title: {display:true, text:”Number of users”}, ticks: { callback: val => val.toLocaleString(“fr-FR”) } }, x: { title: {display:true, text:””} } }; } // Creating the Chart.js graph with the chosen data chartInstance = new Chart(ctx, { type: chartType, data: { labels: data.labels, datasets: [{ label: data.label, data: data.values, backgroundColor: data.couleur, borderRadius: 5, maxBarThickness: 50 }] }, options: options }); / Updating the accessible text description descriptionEl.textContent = data.description; descriptionEl.focus();
}
// Initialization with the default data
displayData(selectElement.value);
/ // Handling the change event on the select element for dynamic updates