How ICRX calculates mileage — the exact formulas
Engineers shouldn't have to trust a black box with part life. This page publishes the exact rules the ICRX engine applies — the same engine behind every number in Inventory, Fleet, Dashboard and the part panel, so they always agree.
The core formula
For every completed session in which a part was mounted on a car:
km = laps × track lap length (km)
A part's totals are the sum over those sessions, plus its starting values:
lifetime km = initial km + Σ (laps × track length) + Σ manual adjustments
current cycle km = lifetime km − lifetime km at last rebuild
The rules around that sum:
- Only sessions marked "Completed" count. Uncompleted sessions are planning data — zero effect on wear.
- Laps are counted raw. There is no per-lap-type weighting, no out-lap or safety-car derating, no hidden multiplier of any kind. What you log is what counts.
- Track length is in km (e.g.
4.653), set on the track; if it's missing or zero, no km can be computed for that event. - No double counting — ever. Km is attributed once per (session, part). Whether a part was fitted to the session directly or arrived as a member of an assembly, it earns that session's km exactly once.
- Everything is recomputed live. Fix a track length, add a forgotten session, change laps — every affected part updates immediately. There is no "recalculate" button because there is nothing to manually recalculate.
Statuses and thresholds
A part's status compares its current cycle against its category's effective EOL:
effective EOL = EOL km × target use % (target use % is optional, km only)
pct = current cycle km ÷ effective EOL
| Condition | Status |
|---|---|
| pct ≥ 100% | Over limit |
| pct ≥ Critical % (default 90%) | Critical |
| pct ≥ Warn % (default 75%) | Warning |
| pct ≥ half of Warn % | Mid-life |
| below that | Fresh |
| no EOL configured | No EOL (grey — never a false "fresh") |
Warn % and Critical % are set per category; invalid values fall back to the defaults, and Critical is never allowed below Warn.
Target use % models early retirement: with EOL 5,000 km and target 80%, the bar fills at 4,000 km. It deliberately applies only to km — hours and events limits usually come from supplier contracts and regulations, so they are compared at face value.
Multi-unit lifing
A category can limit life in up to four dimensions. Each configured dimension produces its own reading; the worst one drives the part's status (ties broken by higher percentage):
| Dimension | Used value | Notes |
|---|---|---|
| km | current cycle km (above) | The classic. |
| hours | initial hours + Σ hour entries | Hours come only from the hours ledger (opening values, ECU/logger readings, corrections). ICRX never estimates hours from laps. |
| events | distinct events where the part accrued km + initial events | Derived from the same data as km, so the two can never disagree. |
| expiry | days until the part's expiry date | Warning at ≤ 90 days, critical at ≤ 30 days, over limit once past. Days aren't a percentage — this dimension has no bar. |
Rebuilds
Marking a part rebuilt records the part's lifetime km at rebuild. From then on:
current cycle km = lifetime km − lifetime km at rebuild
- The EOL bar restarts from that point; lifetime km, laps and per-event history are never reset.
- If the serial was re-stamped, the old serial is stored on the rebuild record (
prev_serial) — full traceability, queryable, not a free-text note. - The "latest rebuild" is the one with the most recent rebuild date, not the highest km.
See Mark a part rebuilt for the workflow.
Manual adjustments
Sometimes reality and records diverge (a part arrives with dyno km, a data error). Adjustments fix that without breaking the math:
- You enter the part's correct lifetime km; ICRX stores the difference against the computed total. Logging the same target twice is a no-op.
- Adjustments add to lifetime and current-cycle km, but never to per-event history — so wear-rate trends and EOL projections stay honest.
- An adjustment backdated to before the last rebuild corrects the rebuild snapshot instead of leaking into the live cycle.
- Arrival mileage (setting a whole car's km when it arrives) is the batch version of the same mechanism — one adjustment per fitted part, idempotent.
Tyres and tyre sets
- A tyre-set cycle = one allocation that actually ran (≥ 1 lap). Sets allocated but never run don't count a cycle.
- Set km = laps run × track lap length, same rule as parts.
- FIA declarations count sets, not fitments: one set used in five sessions consumes one allocation slot. ICRX counts distinct sets per car per event, slicks and wets separately (intermediates count with wets), against the event's limit (event override → championship default → unlimited).
- Unknown ≠ zero: if a set's km can't be computed (track length missing), exports print
?— never a false0. A real fresh set with zero laps prints0.
What ICRX deliberately does not do
- No lap-type scaling factors (an out-lap is a lap).
- No estimated hours (only ledger entries count).
- No silent recalculation queues (the numbers are always current).
- No mileage edits without a trace (adjustments and rebuilds are records, not overwrites).
If you find a number you can't reproduce from this page, that's a bug — tell us.
Was this page helpful?