Construction · Safety

Safety incident rate (TRIR)

The number of OSHA recordable injuries and illnesses per 100 full-time workers per year. It lets contractors of different sizes compare their safety record, and owners and GCs often ask for it when prequalifying.

Plan your metrics

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.

OSHA recordable cases by quarter, Jan to Oct 2026Q1 20261 case98,000 hrsQ2 20260 cases104,000 hrsQ3 20262 cases112,000 hrsQ4 to date0 cases98,000 hrsTRIR = recordable cases × 200,000 ÷ hours worked = 3 × 200,000 ÷ 412,000 = 1.46.DART rate (days away, restricted, or transferred cases) = 1 × 200,000 ÷ 412,000 = 0.49.200,000 is the hours 100 full-time workers work in a year (50 weeks × 40 hours), per BLS.
Example data Cases and hours cover the same period. A small contractor's rate can swing a lot on one case.

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.
Customer report mockupExample data
Safety summaryYear to date, Jan 1 to Oct 31, 2026
TRIR1.463 recordable cases
DART rate0.491 case
Hours worked412,000own employees
QuarterHoursRecordableDARTTRIR (quarter)
Q198,000102.04
Q2104,000000.00
Q3112,000213.57
Q4 to date98,000000.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.

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.

Version 1.0 · Last reviewed 2026-10-20 · Machine-readable definition