Problem & solution

CSV Integration in Triathlon Photography — How AI Solves It

Triathlon events often run three separate starting lists: swim numbers, bike numbers (frequently on the frame), and run numbers. Some athletes carry a different number in each discipline. Matching photos to participants without losing data across the three legs is a real headache.

Mismatched photos get filed under the wrong athlete. Participants can't find all their images, and an incomplete or confusingly organized gallery makes a hard event even harder to deliver and sell.

Understanding the problem

CSV integration in triathlon is the process of matching the race numbers RaceTagger detects in your photos against your participant start-list — a list that may hold separate entries for the swim, bike, and run disciplines, and sometimes numbers that don't line up with each other.

Triathlon is a three-discipline event where the same participant can wear different race numbers in each leg (swim cap, bike frame, chest bib on the run). To deliver galleries athletes can browse by discipline and find every photo of themselves, your start-list has to tie those numbers back to one person. Without a clean CSV mapping, you're either delivering disconnected galleries or reconciling thousands of photos by hand.

In this sport specifically

In a large Ironman-style event you may have a swim-cap number, a bike-frame number, and a run-bib number for each athlete. Late entries can appear with placeholders in one list but confirmed numbers in another. Some athletes DNS (Did Not Start) a leg; some finish the swim and bike but DNF on the run. Body-marking numbers (painted on arms) are sometimes used as a backup ID in the swim but may not match the official entry number. Your CSV workflow has to account for all of these.

Where it shows up

Traditional approaches, and why they fall short

Three separate CSVs, one per discipline, reconciled by hand

Significant manual reconciliation for late entries and DNS/DNF athletes after the race · Depends entirely on how carefully you cross-reference; error-prone as fatigue sets in

Requires manual lookup and spreadsheet work to link each athlete's swim, bike, and run numbers. Hard to spot when one number appears across multiple lists for the same person.

A single organizer-provided master CSV with all three numbers per athlete

Depends on the event — the master list often isn't final until finishers are confirmed · Strong if the master list is clean, but data-entry errors are common in large events

Only works when the organizer actually provides a master list — many don't. Late entries and DNS/DNF athletes are handled inconsistently, and any error in the list propagates into your matching.

Manual visual sorting (read the number off each photo and file by hand)

Hours of repetitive work that scales linearly with photo count · High on clear numbers, but it degrades with fatigue and the sheer volume of a triathlon

Doesn't solve the cross-discipline problem at all — you still have to know which swim number belongs to which bike and run number, athlete by athlete.

How RaceTagger handles it

RaceTagger reads the race numbers in your photos and matches them against the participant start-list CSV you upload — whether that's one master list or coordinated lists for each discipline. It works on both JPEG and RAW (reading the embedded preview), and processes a folder in batch. When a number is clear it matches confidently; when a number is partially obscured or ambiguous, RaceTagger flags the photo as low-confidence for your review instead of guessing.

Key advantage

One matching workflow across all three numbering schemes. If your CSV ties each athlete's swim, bike, and run numbers to a single participant, RaceTagger links every photo to that athlete regardless of which number is visible — so you don't reconcile three lists by hand.

Good conditions
High reliability when numbers are clear and unobstructed and your CSV is up to date with late entries
Challenging
Harder when a number is partially obscured, the CSV is missing some late entries, or DNS/DNF athletes are present — borderline reads are flagged for review rather than forced
Worst case
When numbers are unreadable or multiple number systems are in play, RaceTagger surfaces low-confidence detections for you to confirm instead of mis-tagging silently

Before the race, collect the participant list(s) from the organizer — ideally a master CSV that maps each athlete's swim, bike, and run numbers to a single ID, or coordinated per-discipline lists. Upload it into RaceTagger and run your photos in batch; detected numbers are matched to the CSV and metadata is written into the files (EXIF/XMP/IPTC). After the race, update the CSV with any late entries or DNS/DNF status and re-run to pick up the changes. RaceTagger sits between your shoot and your editor (Photo Mechanic, Lightroom, Capture One) — it tags, then hands off.

Manual vs OCR vs AI vision

MetricManualBasic OCRRaceTagger
Processing a full triathlon (many athletes across 3 disciplines)Hours of spreadsheet reconciliation plus hand-tagging the edge casesFaster than manual, but multiple lists usually mean separate passesBatch processing with matching against your start-list in one workflow
Handling late entries after registration closesManual lookup and re-tagging requiredRequires re-processing with an updated CSVUpdate the CSV and re-run; photos of late-entry athletes get matched on the second pass
DNS/DNF athlete trackingSpreadsheet notes plus visual inspectionLimited — depends on number visibility in the photosIf your CSV carries a status column, that status follows through to the matched photos
Multi-discipline number reconciliationManual swim → bike → run lookup, athlete by athleteNot handled — needs separate lists reconciled by handAll three numbers tie to one athlete profile when your CSV maps them to a single ID
Ambiguous or unreadable numbersYou squint, guess, or skip — and mistakes are easy to missOften returns a wrong read with no warningLow-confidence reads are flagged for your review instead of being guessed silently

Practical tips

  1. 1

    Get the master CSV from race organizers BEFORE race day, even if some entries are still 'TBD'

    A preliminary CSV with placeholder numbers beats scrambling after the race. You can update it as late entries confirm — the key is having the swim → athlete, bike → athlete, run → athlete baseline mapping as early as possible.

  2. 2

    Ask for both the chip/timing number AND the visible race numbers in the CSV — they're often different

    Many triathlons use a timing-chip ID that differs from the visible bib/frame number. RaceTagger matches the visible number it reads in the photo, so make sure the visible numbers are in your CSV. If organizers only provide the chip mapping, request a separate visible-number list.

  3. 3

    Capture body-marking numbers in the swim leg as a backup ID when cap numbers are hard to read

    Swim caps are small and curved, so cap numbers can be tough from a distance. Many athletes also have body-marking numbers painted on their arms. Shoot both and include both in your CSV so an ambiguous cap number has a confirmation path.

  4. 4

    Keep a 'discipline tracker' so you can see which legs each athlete actually appears in

    Marking swim / bike / run per athlete makes DNFs obvious — if an athlete has swim and bike photos but no run photos, you can see it at a glance, and it's a useful sanity check that your CSV and gallery line up with what happened on course.

  5. 5

    For last-minute entries, get an updated CSV close to race start and re-run those photos

    If late entries arrive the night before, their numbers likely aren't in your original CSV. Ask the race director for an updated list, re-import it, and re-run — RaceTagger will pick up the new entries on a second pass.

Match swim, bike, and run numbers in one workflow

Multi-discipline CSV matching. Upload your start-list, process all your photos in batch, and help participants find every image of themselves in one place.

Try it free →

Questions photographers ask

What if the swim cap number is different from the bike frame number? Does RaceTagger get confused?

No. If your CSV maps all three numbers to a single athlete (swim #487, bike #512, run #512 all pointing to the same person), RaceTagger links every photo to that athlete across all three disciplines. It matches to the athlete in your start-list, not to the bare number, so different numbers per leg are fine as long as the CSV ties them together.

Can I use separate CSVs for swim, bike, and run instead of one master CSV?

Yes — RaceTagger matches against the participant list you provide. The cleanest result comes from a list that ties each athlete's swim, bike, and run numbers to a single ID. If you keep them in separate lists, make sure there's a shared identifier (a participant ID) so the disciplines can be tied to one athlete.

What happens to athletes who DNF or DNS (did not finish / did not start)?

RaceTagger reads what's in your CSV. If your start-list carries a status column for DNS/DNF athletes, that status comes along with the match, so a DNF athlete's photos are still tagged with their number while their profile reflects the status. That keeps the gallery organized without dropping any photos.

If late entries are added after I've already processed photos, do I have to re-process everything?

No — you only need to re-run after updating the CSV. RaceTagger will match any already-processed photos of the new athletes once they're in the list, so re-importing the updated CSV and running a second pass is enough to pick up late entries.

Keep reading

← All guides