Convert CSV (spreadsheet) to TCX

Your file never leaves your device — conversion happens here in your browser.

A CSV with a lap-index column is more useful than it might look: it's the one lap representation FitFileHub's own schema supports, and it's exactly what TCX is built to represent well. This tool reads each row using the documented column names — timestamp, lat, lon, elevation_m, plus optional hr_bpm, cadence_rpm, power_w, and lap columns — with tolerance for common alias headers if your spreadsheet wasn't built to that exact spec. Where CSV only carries lap boundaries as a per-point index, TCX has real lap structure: this tool groups points by that index and writes genuine TCX Lap elements, each with its own point sequence, giving back the structured activity a CSV can only approximate on its own. Heart rate, cadence, and power all map onto TCX's native trackpoint fields in full; only temperature has no home in TCX, so that column is dropped if present in the source. Timestamps come across at TCX's second-resolution precision. If your CSV has no lap column at all, the output is simply a single-lap TCX — still a fully valid, device-ready activity file. Everything runs locally in your browser, in a background worker for larger files, so spreadsheet data of any size converts without ever being uploaded to anyone.

Questions

How does my CSV's lap column become real TCX laps?

This tool groups consecutive rows by the value in your lap-index column and writes a separate TCX Lap element for each group, restoring the structure that a flat per-point index can only imply.

What if my CSV doesn't have a lap column?

The output is a single-lap TCX file containing every point — still valid and device-ready, just without lap splits.

Does temperature data survive the conversion?

No — TCX has no temperature field, so a temperature_c column in the source CSV is dropped. Every other supported channel, including heart rate, cadence, and power, carries over in full.

Is there a file size limit?

Free use handles files up to 25 MB, 3 at a time. Larger or more frequent conversions are unlocked by supporting the project.