Updated

Discipline record by license age: 4,809 IDFPR roofing licenses

As of Oct 21, 2026, 6 of the 1,789 active IDFPR roofing licenses first issued under 5 years ago (0.3%) have a discipline record, against 100 of the 1,311 first issued 15 or more years ago (7.6%); 200 of all 4,809 (4.2%). A newer license has had less time in which a case could open, so this is exposure time, not a rating of newer roofers.

License ageLicensesDiscipline on recordShare
Under 5 years1,78960.3%
5 to 14 years1,709945.5%
15 years or more1,3111007.6%
All4,8092004.2%

How we counted

Every active IDFPR roofing contractor license in the dataset is counted once, by its license age (full years from the date IDFPR first issued it to the day this site read the file) and by whether the IDFPR dataset shows any disciplinary case for it.

How to reproduce it

Run these two SoQL queries against IDFPR's open dataset (https://data.illinois.gov/resource/pzzh-kp68.json, the $query parameter): the first counts every license by age, the second only those with a discipline record. The age cut-offs are this build's date; the dataset changes daily, so a later run counts that day's licenses.

SELECT case(substring(original_issue_date, 7, 4) || substring(original_issue_date, 1, 2) || substring(original_issue_date, 4, 2) > '20211021', 'Under 5 years',
            substring(original_issue_date, 7, 4) || substring(original_issue_date, 1, 2) || substring(original_issue_date, 4, 2) > '20111021', '5 to 14 years',
            true, '15 years or more') AS license_age,
       count(distinct license_number) AS licenses
WHERE description='LICENSED ROOFING CONTRACTOR' AND license_status='ACTIVE' AND business_name IS NOT NULL
GROUP BY license_age

SELECT case(substring(original_issue_date, 7, 4) || substring(original_issue_date, 1, 2) || substring(original_issue_date, 4, 2) > '20211021', 'Under 5 years',
            substring(original_issue_date, 7, 4) || substring(original_issue_date, 1, 2) || substring(original_issue_date, 4, 2) > '20111021', '5 to 14 years',
            true, '15 years or more') AS license_age,
       count(distinct license_number) AS licenses
WHERE description='LICENSED ROOFING CONTRACTOR' AND license_status='ACTIVE' AND business_name IS NOT NULL
  AND (case_number IS NOT NULL OR upper(ever_disciplined) LIKE 'Y%')
GROUP BY license_age

Cite this

Roofing Cost and License Guide, “Discipline record by license age: 4,809 IDFPR roofing licenses”, Oct 21, 2026, https://roofingcostfinder.com/findings/discipline-record-by-license-age-idfpr-roofing-licenses/

All findings from this site (4)