What it is
US employers covered by OSHA recordkeeping log work-related injuries and illnesses on the OSHA 300 log (OSHA recordkeeping). The total recordable incident rate (TRIR) turns the count into a rate per 100 full-time equivalent workers, using a base of 200,000 hours (BLS).
The DART rate uses only cases with days away from work, restricted duty, or job transfer.
Why operators track it
- Prequalification. Owners and GCs commonly ask for safety rates when qualifying contractors and subs.
- People. The first reason to track it.
- Cost. Injuries affect insurance cost and project schedules.
- Trends by job and trade. Shows where to focus training.
How it is calculated
TRIR = recordable cases × 200,000 ÷ total hours worked
- 200,000 = 100 full-time workers × 40 hours × 50 weeks (BLS).
- DART rate = DART cases × 200,000 ÷ hours worked.
- Use the same period for cases and hours, usually a calendar year or rolling 12 months.
Worked example
From January through October the company had 3 recordable cases and 412,000 hours worked. TRIR is 3 × 200,000 ÷ 412,000 = 1.46. One case involved days away, so the DART rate is 0.49.
How to read it
- Small contractors swing. One case moves the rate a lot when hours are low. Show counts with the rate.
- Use rolling 12 months for a stable trend.
- Leading indicators help. Near misses and inspections show risk before injuries.
- BLS publishes industry rates by NAICS code (BLS). If you compare, use the published figure for the exact industry and year, with a link.
Definitional choices and common pitfalls
- Who is included. Employees only, or include subcontractor hours on your sites. OSHA rates are per employer; site rates are a separate view.
- Hours source. Hours actually worked, not hours paid. Exclude vacation and holiday.
- Period. Calendar year matches the OSHA 300A summary; rolling 12 months is better for trend.
- Recordability. Recordability follows OSHA rules. The software should take the classification as entered, not decide it.
How different roles use it
| Role | How they use it |
|---|---|
| Safety director | Owns the OSHA log and reports TRIR and DART monthly. |
| Operations / superintendent | Reviews incidents on their sites and leads corrective actions. |
| Owner / CEO | Watches the trend and the rate shared with customers. |
| Business development | Supplies safety rates for prequalification forms. |
Questions it answers
- What is our TRIR and DART rate this year?
- Which jobs or trades had incidents?
- Is the trend improving?
- What rate do we report on prequalification forms?
How to present it in a report
- KPIs for TRIR and DART, with case counts and hours beside them.
- Rolling 12-month trend line.
- Incidents by job, trade, and type.
- Leading indicators alongside, if tracked.
| Quarter | Hours | Recordable | DART | TRIR (quarter) |
|---|---|---|---|---|
| Q1 | 98,000 | 1 | 0 | 2.04 |
| Q2 | 104,000 | 0 | 0 | 0.00 |
| Q3 | 112,000 | 2 | 1 | 3.57 |
| Q4 to date | 98,000 | 0 | 0 | 0.00 |
Quarterly rates swing on small counts. Use the full-period figure for external reporting.
Data you need
Fields
| Field | What it means | Example value |
|---|---|---|
| Incident | Date, job, employee or sub, description | Aug 12, job 2431 |
| OSHA recordable | Yes or no, per OSHA rules | Yes |
| Case type | Days away, restricted or transfer, other recordable | Days away |
| Hours worked | Employee hours, by month and job | 34,500 (Aug) |
| Employer | Own employee or subcontractor | Own employee |
What the raw data looks like
Example data A few rows as they might come out of the source system.
| Date | Job | Employer | Recordable | Case type | Days away |
|---|---|---|---|---|---|
| Feb 3 | 2417 | Own | Yes | Other recordable | 0 |
| Aug 12 | 2431 | Own | Yes | Days away | 6 |
| Sep 9 | 2420 | Own | Yes | Other recordable | 0 |
| Sep 22 | 2420 | Sub | No | First aid | 0 |
Where this data usually lives
- Safety tools or spreadsheets hold the incident log and OSHA 300 data.
- Payroll and time tracking hold hours and labor cost by job and cost code, sometimes from a field time app.
The same field can live in more than one system. Agree with the customer which one is the source of truth.
Common data gaps and traps
- Incidents in a safety tool, hours in payroll. Two systems to join by month and job.
- Hours paid vs worked. Payroll may only have paid hours.
- Sub hours missing. Sub incidents may be logged without their hours.
- Recordable flag missing. First aid and recordable may not be separated.
Related metrics
- Subcontractor compliance: safety documents for subs.
- Labor productivity: the same hours data.
- Equipment utilization: equipment on the same sites.
FAQ
- What is the 200,000 in the TRIR formula?
- The hours 100 full-time employees work in a year at 40 hours a week for 50 weeks (BLS).
- What is a DART rate?
- The rate of cases with days away from work, restricted duty, or job transfer, on the same 200,000-hour base.
- What is a good TRIR?
- Compare with the BLS published rate for your industry code and year, cited with a link. We do not repeat a figure here.
For your data teamFormula variants, tables, SQL sketch, and dashboard spec
Formula details
trir = recordable_cases * 200000 / hours_worked
dart = dart_cases * 200000 / hours_worked
-- same period for numerator and denominator, e.g. rolling 12 months
Worked example detail
| Item | Jan to Oct 2026 |
|---|---|
| Recordable cases | 3 |
| DART cases | 1 |
| Hours worked | 412,000 |
| TRIR | 1.46 |
| DART rate | 0.49 |
Tables and fields
| Table | Fields | Notes |
|---|---|---|
incidents |
incident_id, job_id, occurred_at, employer_type, recordable, case_type, days_away | |
hours_worked |
employee_id, job_id, work_date, hours | Worked, not paid |
SQL sketch
SELECT COUNT(*) FILTER (WHERE recordable) * 200000.0 / h.hours AS trir,
COUNT(*) FILTER (WHERE case_type IN ('days_away','restricted_transfer')) * 200000.0 / h.hours AS dart
FROM incidents i, (SELECT SUM(hours) hours FROM hours_worked WHERE work_date > :as_of - 365) h
WHERE i.occurred_at > :as_of - 365 AND i.employer_type = 'own' GROUP BY h.hours;
Build spec
Copy this into a ticket. It lists the grain, inputs, logic, and edge cases.
metric: construction.safety_incident_rate
grain: company per rolling 12 months; optional by job
inputs:
- recordable flag
- case type
- hours worked
logic:
- trir = recordable * 200000 / hours
- dart = dart cases * 200000 / hours
edge_cases:
- hours = 0: null
- own vs sub: separate rates
- recordable status changed later: use latest classification
As a dashboard card
- KPIs for TRIR and DART with counts, a rolling 12-month line, and incidents by job.
Common mistakes
- Using hours paid instead of worked.
- Mixing sub incidents with employee hours.
- Showing a rate without the count on small hour bases.