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
An athlete's swim cap reads 487, their bike frame reads 512, and their run bib also reads 512. All three numbers show up in different photos. · very common
If those numbers aren't tied to one athlete in your CSV, the swim photos land under one profile and the bike/run photos under another — and the athlete looks like two different people in the gallery.
The event publishes two starting lists: a preliminary one with some numbers still unconfirmed, and a race-day final with late entries added at the end of the number range. · very common
If your CSV only has the preliminary list, photos of the late-entry athletes won't match any participant record. You have to add them after the race or leave those photos unmatched.
An athlete is listed under their body-marking (painted) number, which differs from their official bib number, so the same person appears under two different number systems across the day. · common
Swim photos read the painted arm number while bike and run photos read the bib. Unless both numbers map to the same athlete in your CSV, the two number systems never reconcile and the photos stay split.
An athlete DNFs after the bike leg. Their bike-frame number appears in many bike-course photos, but they never reach the run course, and the CSV has them registered with a run bib they never wore. · occasional
The bike photos read the frame number, but the CSV entry keyed on the run bib won't line up, so those photos can't be tied to a complete participant record without a manual check.
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
| Metric | Manual | Basic OCR | RaceTagger |
|---|---|---|---|
| Processing a full triathlon (many athletes across 3 disciplines) | Hours of spreadsheet reconciliation plus hand-tagging the edge cases | Faster than manual, but multiple lists usually mean separate passes | Batch processing with matching against your start-list in one workflow |
| Handling late entries after registration closes | Manual lookup and re-tagging required | Requires re-processing with an updated CSV | Update the CSV and re-run; photos of late-entry athletes get matched on the second pass |
| DNS/DNF athlete tracking | Spreadsheet notes plus visual inspection | Limited — depends on number visibility in the photos | If your CSV carries a status column, that status follows through to the matched photos |
| Multi-discipline number reconciliation | Manual swim → bike → run lookup, athlete by athlete | Not handled — needs separate lists reconciled by hand | All three numbers tie to one athlete profile when your CSV maps them to a single ID |
| Ambiguous or unreadable numbers | You squint, guess, or skip — and mistakes are easy to miss | Often returns a wrong read with no warning | Low-confidence reads are flagged for your review instead of being guessed silently |
Practical tips
- 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
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
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
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
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