Race Report: 2025 Ironman 70.3 Washington Tri-Cities

Guillermo Esteves September 25, 2025
Source
Last year, after driving ten hours from Jackson Hole to Richland for the inaugural Ironman 70.3 Washington Tri-Cities, I was certain it would be a one-and-done race—it was just too far, the drive too exhausting. After finishing the race, though, I knew I needed to come back. It's a phenomenal race in a great location, with a fast downriver swim, a beautiful bike course, and a fun, spectator-friendly run. So here I am again, a year later. My goal for this race was simple: Leave with no regrets. This year has been extraordinarily hard for me on a personal and professional level, and with this being my last triathlon of the year and a long, long wait until I can race again, I knew the post-race blues would hit me hard, so I didn’t want to leave Richland feeling like I could have or should have done more. If I could come up with a plan, execute it, and leave nothing on the table, I would be satisfied (and if that translated into a faster time than last year, that’d be the cherry on top). This race is also a milestone for me: It's my tenth Ironman 70.3 since I started racing triathlons three years ago, and I wanted to leave on a high note. So, without further ado, here's my last triathlon race report of this year. Arrival & Preparations Rather than driving straight from Jackson Hole, as I did last year, I split up the drive this time, spending a night in Boise on the way. This gave me an opportunity to run again on the Boise River Greenbelt, one of my favorite places to run, before continuing to the Tri-Cities region. I arrived in Richland on Thursday before the race and stayed at the Courtyard Richland Columbia Point, just a five-minute walk from the Ironman Village and transition. This race uses a shuttle system for race day, but if you can swing staying at one of the several hotels along the river, I can’t recommend it enough; nothing beats the convenience of being a short walk away from transition and the finish line. After checking into my room and unloading my gear, I went out on a shakeout run at race pace along the run course on the Riverfront Trail. I felt... like hot garbage. My legs felt heavy, and my heart rate and perceived exertion were through the roof. It was admittedly hot at 34ºC, but I should still have been heat-adapted, and I expected the lower altitude to help me—I live and train at 1,950 m, but Richland is at a mere 107 m above sea level. I finished that run worried I didn't have my run fitness as dialed in as I thought. I had planned on one last easy run on Friday, but decided to take an extra rest day, thinking the additional recovery would be more beneficial than another run. I spent the next two days relaxing, doing mobility work, and checking and double-checking my gear. The race organizers offered a couple of practice swims in the river, but I didn't bring a tow float to store my stuff and I knew what to expect from the swim, so I skipped them. Instead, I continued the tradition I started at Ironman Canada of hate-watching the most terrible movies on TV—this time I honed my mental endurance with a double feature of Batman v Superman: Dawn of Justice and Justice League. Absolute dogshit. My race gear, organized before the race. I checked in my bike on Saturday afternoon, and after that I spent a few minutes scoping out the transition layout, which was changed slightly from last year—the positions of the Ironman Village and the transition area were swapped, which meant a slightly longer run from the swim exit into T1. This race does a single transition, so you don’t get gear bags, as is typical for 70.3 races. You do get a morning clothes bag, though, since the swim start is 1.9 km away, in Howard Amon Park. You can put anything you carry to the swim start there, such as your phone, a coat, and your shoes, and hand it to the volunteers before lining up for the swim. It gets returned to you shortly after crossing the finish line. Shadowfax, racked and ready for race day. With my bike racked and nothing left to do, I went back to my room, packed the rest of my gear into my transition bag, had some dinner, and turned in for the night. Race Day I had trouble sleeping almost the entire time I was traveling for this race, so I was relieved to get five full hours of sleep the night before, with my Whoop indicating a whopping 89% recovery. I woke up at 3:00 AM, had a bagel and coffee, and checked all my gear one last time while I waited for transition to open. At 4:00 AM, I walked over to transition to finish setting things up. As soon as I stepped out of the hotel, I was surprised by how windy it was—when I got to the transition area, the bikes were rocking in their racks. I had flashbacks of Ironman 70.3 Coeur d’Alene last year, where the high winds caused the swim to be shortened and made the bike, and particularly the descents, stressful. I doubted this swim would be shortened or canceled, but I certainly braced myself for another challenging bike leg. It was, uh, very windy on race day on Sunday. [image or embed] — Guillermo Esteves (@giventotri.com) September 24, 2025 at 11:38 AM The weather forecast showed a high of 24ºC, so at least I didn't expect the heat to be an issue; it also showed a 25% chance of rain, so I placed my shoes and socks in a plastic bag from the expo to keep them dry if it rained. After setting up my bike computer and pumping up my tires, I went back to my room to wait for the swim start and do some mobility work to stretch and warm up in the meantime. At 6:00 AM, I put on my wetsuit and joined the crowd of athletes on the twenty-minute walk to Howard Amon Park to start the race. The wind seemed to have calmed down, but the sky was overcast and I could see rain in the distance to the southeast. I hoped none of it would hit the bike course; it would have been bad enough to deal with the wind on the bike without adding wet roads to the mix. The Columbia River from Howard Amon Park, 6:29 AM. Once I got to the park I handed over my morning clothes bag to a volunteer, ate a Maurten 100 gel, and lined myself up for the start. For a current-assisted swim, you’re supposed to line up in the group for your estimated time without the current, so even though I was expecting a finish time of around 26 minutes, I seeded myself in the 37–40 minute wave. One change I appreciated this year is that instead of lining up in the park, we were lined up on the beach along the river, so it was possible to get a quick dip in the water to get acclimated before entering the chutes. I didn’t really need it, though—the water temperature on race morning was a pleasant 21.2ºC. There weren’t any pros racing, so the race started with the Physically Challenged division at 6:27 AM, followed by the age groups at 6:30 AM. I didn’t have to wait long to get in the water, and I started my race at 7:04:13 AM. The Swim I ran out of the chutes and immediately dived in... by slipping on the rocks as soon as I set foot in the river and face-planting painfully in knee-deep water. Not my most graceful moment, but at least I wasn’t hurt, and recovered quickly. After pushing off into deeper water, I pointed myself towards the first buoy and let it rip. The swim course is point-to-point, starting at Howard Amon Park and ending back at Columbia Point Marina Park. This year the swim start got moved a little farther upriver, and after making a right turn at the first red buoy, it was almost a straight shot to the marina. With the huge assist from the current, it wasn’t a challenging swim at all. The only minor difficulty I faced was that my goggles fogged up almost immediately and made sighting difficult, although the buoys had strobes on them, which helped enormously. Beyond that, the swim was completely uneventful—I focused on my form, did my best to stay on track, and simply enjoyed the pleasant water while I watched the buoys fly by. Things got a little busy at the end as everyone got funneled into the marina, but nowhere near as bad as the pummeling I got in Boise a couple of months ago. You can see my swim split there quite clearly. | Credit: FinisherPix After one last push through the marina, I exited the water with a finish time of 26:08 and an official pace of 1:19/100m. Easy peasy. Now, if I could just swim this fast without a current... T1 After a quick stop at the wetsuit peelers to get my wetsuit pulled off, I jogged through Columbia Point Marina Park to the transition area, got my bike gear on, unracked my bike, and left in 9:13. On the off chance someone from Ironman happens to read this, here’s a small suggestion for next year: It’d be nice to get some mats on the paved footpaths in the park—they’re very rough and painful to run on barefoot. The Bike The course was largely the same as last year: A single clockwise lap through Richland and the countryside outside of town, with 619 m of elevation gain and a handful of short climbs. It’s a lovely course with smooth pavement, beautiful scenery as you drive through farmlands and vineyards outside of Richland, and just enough of a challenge from the climbs to keep things interesting—I described it to someone before the start as “Coeur d’Alene Lite.” There are three railroad crossings along the way, so there’s a chance riders might be stopped by passing trains, but the athlete briefing explained that timing mats before and after the railroad tracks would record any delays, and that time would be deducted from the final time. View this course in Garmin Connect or Strava. There were some minor but positive changes this year, most notably the descent through Dallas Road, which I found sketchy last year, now has much better separation from traffic, so it felt a lot safer. I didn’t find car traffic to be an issue at all; most of the course had an entire lane of traffic dedicated to the race, and most of the roads had barely any traffic anyway, especially on the backroads outside of town. With Ironman 70.3 St. George now discontinued, I think this might actually take its place as my favorite 70.3 bike course. I raced on my Speed Concept with the same nutrition setup I used in Boise: Two 24-ounce bottles between the aerobars with roughly 2.75 sachets of Maurten Drink Mix 320, for about 80 grams of carbs per hour. With the cooler temperatures this time around, I didn’t think I needed additional hydration, so I took out the aero bottle from the frame to save some weight for the climbs. I still haven’t tested if this setup is aerodynamically faster than having one bottle between the aerobars and the other behind the saddle, but I can’t argue with the convenience of having both bottles in front—it’s so easy to drink from either bottle without coming out of aero, and that’s gotta count for something. Instead of pacing by feel, I set up a Power Guide on my Garmin with an intensity factor of 0.8, which would give me an estimated finish time of 2:41:13, according to Best Bike Split, and put me in the green zone of my pacing table—not so easy that I’d feel like I left anything on the table, but not so hard that I’d blow up on the run later on. Bike pacing table for Ironman 70.3 races. | Credit: TriStar Athletes With that, I left T1 and got right to work. I stuck closely to my power cues and had little trouble passing people—the course felt less crowded than last year, which gave me more space to maneuver. I felt strong as I pushed hard up the first couple of climbs—it gave me a lot of confidence to see my training pay off, although the cool temperature and low altitude definitely played a role. Shortly after leaving T1. | Credit: FinisherPix I had forgotten all about the wind from earlier in the morning until I got to the top of Badger Mountain, at around kilometer 23. By then the weather had deteriorated and the wind was blowing fiercely again; I felt anxious coming down the mountain in a gusty crosswind. After that descent, I rode all of the roughly 20 km long segment on Badger Road in a strong headwind, which slowed me down enormously. In the parts of the road that faced northwest the wind was more of a crosswind, which made it hard to stay in aero position; I felt unstable every time I got hit by a gust of wind, so I spent a lot of time on the base bars, which slowed me down even more. I was so worried about crashing, I didn’t even want to let go of the handlebars for a second to drink from my bottles. I don’t know exactly how fast the wind was blowing, but one of the farms I rode by had a fully extended windsock, so the wind must have been at least 15 knots (27.8 km/h). The sky was overcast and dark, and I was certain a storm would break out at any moment, but it never rained more than a slight drizzle, and it didn’t last long. I found this whole section harder than any of the climbs, and I had one moment when I was tempted to step off the bike and quit the race, but I pressed on, and eventually the course turned eastward along I-82. With the wind now at my back, I was glad to get back in aero, dig deep, go fast, and make up some of the lost time. Once I got back into Richland the wind had calmed down again, and it was smooth sailing all the way into T2. I'm not exactly sure where this was taken. | Credit: FinisherPix I was pleasantly surprised to finish the bike with a final time of 2:42:52, close to what Best Bike Split had estimated; I had expected a much slower time after duking it out with the wind on Badger Road. My final intensity was 0.797, the closest I’ve ever been to my target. Maybe I could have gone a little harder, and I certainly could have gone faster if my handling skills in the wind were better, but as far as executing a plan goes, this was as close to flawless as I could manage. I’m very happy with this result. T2 I racked my bike, swapped my bike gear for my run gear, made a quick stop at the porta-potty, and left in 5:14. I don’t keep close track of my transition times, but I think this is my quickest one to date in a 70.3. My transitions are still slow, but this feels like progress. The Run After that awful shakeout run a couple of days before, I wasn’t quite sure how to pace this run, but I didn’t overthink it and stuck to my original plan: Aim for a pace of 4:55/km and reassess at the turnaround point. If I felt good, push the pace and get a negative split. If I didn’t, dial it back a little and finish as strong as I could manage. It was still windy and overcast as I left T2, so the temperature didn’t feel anywhere near the forecast high of 24ºC, which would help me—at least I wouldn't get demolished by the heat. It took me a few minutes to shake off the "jelly legs" feeling from the bike leg, but after that I had no trouble hitting my target pace—my heart rate and RPE were where I expected them to be, which was a relief and restored my confidence. The run course was unchanged from last year, a single-lap out-and-back on the Riverfront Trail along the Columbia River, through parks and residential side streets, with a turnaround point on the north end, just past the Washington State University campus. It’s fairly flat, with only 60 m of elevation gain, and, save for the last few hundred meters before the turnaround point, it’s all on smooth, paved paths. It’s a really nice run course, with plenty of shade and lots of spectator support, especially through the residential parts and the hotels close to the finish line. View this course in Garmin Connect or Strava. A few minutes into my run it started drizzling again, which felt refreshing, and I had to resist the temptation to push the pace. Since it wasn't hot, I didn’t feel the need to follow my usual strategy of walking through every aid station to drink water, and instead drank to thirst without slowing down. I relied on Maurten bars for my nutrition, eating half a bar roughly every 20 minutes, for a total of one and a half bars, plus a Maurten caffeinated gel to get a final kick before the finish line. Rain, I don't mind. | Credit: FinisherPix By the time I got to the turnaround point the drizzle had turned into steady rain, and I was soaked to the bone. I’ve worried about the heat in previous races, but now I had the opposite problem—I was freezing. My hands were so numb I fumbled a few cups of water at the aid stations. My watch recorded a low of 18ºC at this point, but I was soaking wet and the wind chill made it feel much colder than that. I had been keeping a “comfortably uncomfortable” pace up to this point, and with no heat to worry about, I followed my plan and started increasing the pace after the turnaround. I pushed well into “uncomfortable” territory. I was cold, my joints hurt, my toes hurt, I started getting painful blisters on the bottom of my feet, and running in waterlogged shoes was unpleasant, but I felt strong despite the harder pace. I was excited when I looked up and I could finally see the finish line off in the distance; it was time to empty the tank and give everything I had left. (After I finished I went back to that same spot to cheer on people and encourage them to make that last push to the finish line.) Those last couple of kilometers were an all-out effort, but I didn’t let up, and dug deep right up to the end, only slowing down in the last few meters to avoid ruining the finish line photo of the person in front of me. I finished the run in 1:41:53, with a final pace of 4:50/km. That’s almost four minutes faster than last year, my new personal best for the run in a 70.3. My final time was 5:05:16, over two minutes faster than last year. I finished 24th out of 148 in the M40–44 age group and 214th out of 1,702 overall. My age-graded result was 04:42:45 (5:05:16 × 0.9262), which put me in 211th place for the Ironman 70.3 World Championship slot allocation. There were 60 slots available at this race (30 for men and 30 for women) and the last ones rolled down to 70th place for women and 96th for men. I still have a lot of work to do before I can qualify for Worlds, but I’m not giving up on that. I don't care how long it takes, I will make it happen. And with that, my tenth Ironman 70.3 is in the books. | Credit: FinisherPix Importantly, though, I did what I set out to do: I had a plan, executed it to the best of my ability, and I’m closing out my triathlon season on a high note. Mission accomplished: No regrets.

Discussion in the ATmosphere

Loading comments...