{"id":58,"date":"2026-08-30T07:32:28","date_gmt":"2026-08-30T11:32:28","guid":{"rendered":"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/"},"modified":"2026-10-25T04:46:07","modified_gmt":"2026-10-25T08:46:07","slug":"florida-roofing-license","status":"publish","type":"post","link":"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/","title":{"rendered":"Florida Roofing License: Requirements, Exam and Scope"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A Florida roofing contractor license lets you contract directly for roofing work, which in a state that gets hit by hurricanes is a substantial business. It is a Division II trade license with its own experience requirement and its own exam, sat alongside the same Business and Finance paper everyone takes.<\/p>\n\n\n\n<div class=\"msq-audio\" data-article=\"florida-roofing-license\" data-minutes=\"11\">\n<style>.msq-audio{margin:1.25em 0 1.75em;padding:16px 18px;background:#F3F1EC;border:1px solid #D9D3C7;border-radius:12px}\n.msq-audio-lead{margin:0 0 8px;font-size:.95em}.msq-audio audio{width:100%;margin:0 0 12px;display:block}\n.msq-toc-title{margin:0 0 6px;font-weight:700}.msq-toc ol{margin:0;padding:0;list-style:none}\n.msq-toc li{display:flex;gap:10px;align-items:center;padding:6px 6px;border-bottom:1px solid #D9D3C7;border-radius:8px}\n.msq-toc li:last-child{border-bottom:0}.msq-toc li.is-active{background:#fff}\n.msq-toc-play{flex:0 0 auto;width:30px;height:30px;border-radius:50%;border:0;background:#24405E;color:#fff;font:inherit;font-size:.72em;line-height:30px;padding:0;cursor:pointer}\n.msq-toc-play.is-playing{background:#C4540E}\n.msq-toc-time{flex:0 0 auto;min-width:3.1em;font-variant-numeric:tabular-nums;color:#4C5561;font-size:.9em}\n.msq-toc a{color:#1B1F24;text-decoration:none;line-height:1.35}.msq-toc li.is-active a{font-weight:700;color:#24405E}\n.msq-audio-note{margin:10px 0 0;font-size:.82em;color:#4C5561}\nh2.wp-block-heading[id]{scroll-margin-top:24px}\n.msq-hplay{display:inline-block;vertical-align:middle;width:26px;height:26px;margin:0 0 0 10px;border-radius:50%;border:0;background:#24405E;cursor:pointer;padding:0;position:relative;top:-2px}\n.msq-hplay::before{content:'\u25b6\ufe0e';display:block;color:#fff;font-size:11px;line-height:26px;text-align:center}\n.msq-hplay.is-playing{background:#C4540E}.msq-hplay.is-playing::before{content:'\u2016';font-size:13px;font-weight:700}\n.msq-bar{position:fixed;left:0;right:0;bottom:0;z-index:9000;display:flex;align-items:center;gap:10px;padding:8px 12px;padding-bottom:calc(8px + env(safe-area-inset-bottom));background:#FFFFFF;border-top:1px solid #D9D3C7;box-shadow:0 -4px 16px rgba(0,0,0,.08);font-size:.92em;color:#1B1F24;transition:transform .2s ease}\n.msq-bar.is-hidden{transform:translateY(130%)}\n.msq-bar-play{display:inline-flex;align-items:center;gap:8px;border:0;border-radius:999px;background:#24405E;color:#fff;font:inherit;font-weight:700;padding:8px 14px 8px 12px;cursor:pointer;white-space:nowrap}\n.msq-bar-play.is-playing{background:#C4540E}\n.msq-bar-icon::before{content:'\u25b6\ufe0e';font-size:12px}.msq-bar-play.is-playing .msq-bar-icon::before{content:'\u2016';font-size:14px;font-weight:700}\n.msq-bar-chapter{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.msq-bar-time{flex:0 0 auto;font-variant-numeric:tabular-nums;color:#4C5561;font-size:.9em}\n.msq-bar-rate,.msq-bar-close{flex:0 0 auto;border:1px solid #D9D3C7;background:#fff;color:#1B1F24;font:inherit;font-size:.85em;line-height:1;border-radius:8px;padding:7px 9px;cursor:pointer}\n.msq-bar-close::before{content:'\u2715'}\n.msq-bar.msq-bar-pill{left:auto;right:14px;bottom:14px;padding:6px;padding-bottom:6px;border:1px solid #D9D3C7;border-radius:999px;box-shadow:0 6px 20px rgba(0,0,0,.15)}\n.msq-bar.msq-bar-pill .msq-bar-chapter,.msq-bar.msq-bar-pill .msq-bar-time,.msq-bar.msq-bar-pill .msq-bar-rate{display:none}\nbody.msq-has-bar{padding-bottom:76px}\n@media (max-width:600px){.msq-bar-time{display:none}.msq-bar{gap:8px;padding-left:10px;padding-right:10px}}\n.msq-s.msq-now{background:#F3F1EC;box-shadow:0 2px 0 #24405E;border-radius:2px}\ntr.msq-now td,tr.msq-now th{background:#F3F1EC;box-shadow:inset 0 -2px 0 #24405E}\n@media (hover:hover){.msq-s,tr[data-i]{cursor:pointer}.msq-s:hover{background:#F3F1EC}}<\/style>\n<script type=\"application\/ld+json\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"AudioObject\",\"@id\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/#audio\",\"name\":\"Florida Roofing License: Requirements, Exam and Scope, read aloud\",\"description\":\"Synthetic voice reading of the article, recorded 25 October 2026.\",\"contentUrl\":\"https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/10\/florida-roofing-license-audio-202610251416.mp3\",\"encodingFormat\":\"audio\/mpeg\",\"duration\":\"PT11M16S\",\"uploadDate\":\"2026-10-25\",\"inLanguage\":\"en-US\",\"isAccessibleForFree\":true,\"mainEntityOfPage\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/\",\"hasPart\":[{\"@type\":\"Clip\",\"name\":\"Florida Roofing License: Requirements, Exam and Scope\",\"startOffset\":0,\"endOffset\":50},{\"@type\":\"Clip\",\"name\":\"What the license covers\",\"startOffset\":50,\"endOffset\":96,\"url\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/#what-the-license-covers\"},{\"@type\":\"Clip\",\"name\":\"Why unlicensed roofing is treated differently\",\"startOffset\":96,\"endOffset\":151,\"url\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/#why-unlicensed-roofing-is-treated-differently\"},{\"@type\":\"Clip\",\"name\":\"Qualifying\",\"startOffset\":151,\"endOffset\":235,\"url\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/#qualifying\"},{\"@type\":\"Clip\",\"name\":\"What the trade exam covers\",\"startOffset\":235,\"endOffset\":295,\"url\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/#what-the-trade-exam-covers\"},{\"@type\":\"Clip\",\"name\":\"The Business and Finance paper\",\"startOffset\":295,\"endOffset\":315,\"url\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/#the-business-and-finance-paper\"},{\"@type\":\"Clip\",\"name\":\"The insurance claims question\",\"startOffset\":315,\"endOffset\":403,\"url\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/#the-insurance-claims-question\"},{\"@type\":\"Clip\",\"name\":\"Permits, and the paperwork that goes with every job\",\"startOffset\":403,\"endOffset\":481,\"url\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/#permits-and-the-paperwork-that-goes-with-every-job\"},{\"@type\":\"Clip\",\"name\":\"What the work actually is in Florida\",\"startOffset\":481,\"endOffset\":534,\"url\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/#what-the-work-actually-is-in-florida\"},{\"@type\":\"Clip\",\"name\":\"Heat, safety and why the license takes it seriously\",\"startOffset\":534,\"endOffset\":567,\"url\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/#heat-safety-and-why-the-license-takes-it-seriously\"},{\"@type\":\"Clip\",\"name\":\"A sensible order\",\"startOffset\":567,\"endOffset\":595,\"url\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/#a-sensible-order\"},{\"@type\":\"Clip\",\"name\":\"What has changed since this was first published?\",\"startOffset\":595,\"endOffset\":676,\"url\":\"https:\/\/passcontractorexam.com\/articles\/florida-roofing-license\/#what-has-changed-since-this-was-first-published\"}],\"contentSize\":\"4.7 MB\"}<\/script>\n<p class=\"msq-audio-lead\"><strong>Listen to this article<\/strong>, about 11 minutes. A synthetic voice reads the article and announces each section title as it begins; tables are read row by row and the questions at the end are left out.<\/p>\n<audio class=\"msq-audio-player\" controls preload=\"metadata\" src=\"https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/10\/florida-roofing-license-audio-202610251416.mp3\"><\/audio>\n<nav class=\"msq-toc\" aria-label=\"In this article\"><p class=\"msq-toc-title\">In this article<\/p>\n<ol>\n<li data-start=\"0.0\"><button type=\"button\" class=\"msq-toc-play\" data-start=\"0.0\" aria-label=\"Play from: Florida Roofing License: Requirements, Exam and Scope\">&#x25B6;&#xFE0E;<\/button><span class=\"msq-toc-time\">0:00<\/span><a href=\"#top\">Florida Roofing License: Requirements, Exam and Scope<\/a><\/li>\n<li data-start=\"50.26\"><button type=\"button\" class=\"msq-toc-play\" data-start=\"50.26\" aria-label=\"Play from: What the license covers\">&#x25B6;&#xFE0E;<\/button><span class=\"msq-toc-time\">0:50<\/span><a href=\"#what-the-license-covers\">What the license covers<\/a><\/li>\n<li data-start=\"96.28\"><button type=\"button\" class=\"msq-toc-play\" data-start=\"96.28\" aria-label=\"Play from: Why unlicensed roofing is treated differently\">&#x25B6;&#xFE0E;<\/button><span class=\"msq-toc-time\">1:36<\/span><a href=\"#why-unlicensed-roofing-is-treated-differently\">Why unlicensed roofing is treated differently<\/a><\/li>\n<li data-start=\"150.58\"><button type=\"button\" class=\"msq-toc-play\" data-start=\"150.58\" aria-label=\"Play from: Qualifying\">&#x25B6;&#xFE0E;<\/button><span class=\"msq-toc-time\">2:31<\/span><a href=\"#qualifying\">Qualifying<\/a><\/li>\n<li data-start=\"235.36\"><button type=\"button\" class=\"msq-toc-play\" data-start=\"235.36\" aria-label=\"Play from: What the trade exam covers\">&#x25B6;&#xFE0E;<\/button><span class=\"msq-toc-time\">3:55<\/span><a href=\"#what-the-trade-exam-covers\">What the trade exam covers<\/a><\/li>\n<li data-start=\"295.42\"><button type=\"button\" class=\"msq-toc-play\" data-start=\"295.42\" aria-label=\"Play from: The Business and Finance paper\">&#x25B6;&#xFE0E;<\/button><span class=\"msq-toc-time\">4:55<\/span><a href=\"#the-business-and-finance-paper\">The Business and Finance paper<\/a><\/li>\n<li data-start=\"315.2\"><button type=\"button\" class=\"msq-toc-play\" data-start=\"315.2\" aria-label=\"Play from: The insurance claims question\">&#x25B6;&#xFE0E;<\/button><span class=\"msq-toc-time\">5:15<\/span><a href=\"#the-insurance-claims-question\">The insurance claims question<\/a><\/li>\n<li data-start=\"402.58\"><button type=\"button\" class=\"msq-toc-play\" data-start=\"402.58\" aria-label=\"Play from: Permits, and the paperwork that goes with every job\">&#x25B6;&#xFE0E;<\/button><span class=\"msq-toc-time\">6:43<\/span><a href=\"#permits-and-the-paperwork-that-goes-with-every-job\">Permits, and the paperwork that goes with every job<\/a><\/li>\n<li data-start=\"481.0\"><button type=\"button\" class=\"msq-toc-play\" data-start=\"481.0\" aria-label=\"Play from: What the work actually is in Florida\">&#x25B6;&#xFE0E;<\/button><span class=\"msq-toc-time\">8:01<\/span><a href=\"#what-the-work-actually-is-in-florida\">What the work actually is in Florida<\/a><\/li>\n<li data-start=\"534.38\"><button type=\"button\" class=\"msq-toc-play\" data-start=\"534.38\" aria-label=\"Play from: Heat, safety and why the license takes it seriously\">&#x25B6;&#xFE0E;<\/button><span class=\"msq-toc-time\">8:54<\/span><a href=\"#heat-safety-and-why-the-license-takes-it-seriously\">Heat, safety and why the license takes it seriously<\/a><\/li>\n<li data-start=\"567.2\"><button type=\"button\" class=\"msq-toc-play\" data-start=\"567.2\" aria-label=\"Play from: A sensible order\">&#x25B6;&#xFE0E;<\/button><span class=\"msq-toc-time\">9:27<\/span><a href=\"#a-sensible-order\">A sensible order<\/a><\/li>\n<li data-start=\"594.86\"><button type=\"button\" class=\"msq-toc-play\" data-start=\"594.86\" aria-label=\"Play from: What has changed since this was first published?\">&#x25B6;&#xFE0E;<\/button><span class=\"msq-toc-time\">9:55<\/span><a href=\"#what-has-changed-since-this-was-first-published\">What has changed since this was first published?<\/a><\/li>\n<\/ol><\/nav>\n<p class=\"msq-audio-note\">Recorded 25 October 2026 from the article as published that day. Press a chapter to jump there; the highlighted line is what is playing. A play button sits beside every section heading, and once you scroll past this player a bar at the bottom of the screen keeps the controls in reach. Tap or click any sentence to hear the reading start from there.<\/p>\n<script>var MSQ_SENT = [[0.0,\"h\",\"floridaroofinglicensereq\",45],[3.88,\"p\",\"afloridaroofingcontracto\",127],[13.28,\"p\",\"itisadivisioniitradelice\",126],[21.4,\"p\",\"onthispagewhatafloridaro\",264],[42.92,\"p\",\"itisalsothetradewherewor\",97],[50.26,\"h\",\"whatthelicensecovers\",20],[51.74,\"p\",\"roofingcontractinginstal\",132],[60.34,\"p\",\"ageneralorbuildingcontra\",162],[71.42,\"p\",\"whattheygenerallycannotd\",50],[75.18,\"p\",\"ifroofingisyourbusinessr\",85],[81.42,\"p\",\"plumbingsitsinitsowncert\",218],[96.28,\"h\",\"whyunlicensedroofingistr\",40],[98.84,\"p\",\"everytradetakeslicensing\",33],[101.12,\"p\",\"roofingenforcementinflor\",63],[104.8,\"p\",\"afterahurricaneunlicense\",74],[110.24,\"p\",\"ithappensatscaleithappen\",144],[118.96,\"p\",\"undersection489127ofthef\",227],[135.2,\"p\",\"ifyouareworkingtowardthi\",74],[140.0,\"p\",\"thepenaltiesaresteeperth\",163],[150.58,\"h\",\"qualifying\",10],[152.5,\"t\",\"experience\",246],[175.02,\"t\",\"education\",59],[180.22,\"t\",\"exams\",54],[185.74,\"t\",\"financialresponsibility\",184],[205.98,\"t\",\"insurance\",53],[210.86,\"t\",\"backgroundcheck\",46],[213.86,\"p\",\"thegeneraleligibilitypic\",108],[221.06,\"p\",\"theexperienceroutesarein\",58],[229.58,\"p\",\"takecurrentfeelevelsandf\",58],[235.36,\"h\",\"whatthetradeexamcovers\",22],[236.84,\"p\",\"roofingspecificandheavil\",71],[241.64,\"p\",\"roofsystems\",11],[242.6,\"p\",\"shingletilemetalbuiltupm\",47],[246.16,\"p\",\"materialsassembliesandwh\",44],[249.48,\"p\",\"winduplift\",10],[250.36,\"p\",\"fasteningpatternsattachm\",69],[254.96,\"p\",\"thiscarriesrealweightand\",81],[260.84,\"p\",\"underlaymentandsecondary\",37],[264.04,\"p\",\"floridaspecificrequireme\",59],[267.56,\"p\",\"flashinganddetailing\",20],[269.04,\"p\",\"whereroofsactuallyleakan\",50],[273.36,\"p\",\"safety\",6],[274.04,\"p\",\"fallprotectionaboveallgi\",34],[277.32,\"p\",\"estimatingandmaterials\",22],[279.64,\"p\",\"squareswastefactorsorder\",27],[282.32,\"p\",\"ifyouhaveroofedinflorida\",52],[286.0,\"p\",\"thepartsthatcatchpeoplea\",132],[295.42,\"h\",\"thebusinessandfinancepap\",26],[297.26,\"p\",\"everydivisioniicandidate\",263],[315.2,\"h\",\"theinsuranceclaimsquesti\",26],[317.56,\"p\",\"notanexamtopicbutitwillb\",88],[323.64,\"p\",\"alargeshareoffloridaroof\",154],[339.72,\"p\",\"gettingthemwrongisalicen\",65],[344.52,\"p\",\"acontractormaynotdirectl\",37],[348.28,\"p\",\"advertiseroofdamageclaim\",97],[356.04,\"p\",\"offerahomeownerarebategi\",109],[364.24,\"p\",\"payoracceptareferralfeef\",59],[367.88,\"p\",\"interpretthepolicyadvise\",85],[374.36,\"p\",\"handoverarepairauthoriza\",65],[379.48,\"p\",\"thefineisupto10000pervio\",100],[386.92,\"p\",\"thedeductiblewaiveristhe\",64],[390.72,\"p\",\"understandthoserulesbefo\",61],[396.4,\"p\",\"thisistheareawhereotherw\",80],[402.58,\"h\",\"permitsandthepaperworkth\",42],[405.42,\"p\",\"aroofingcontractorpullsp\",101],[413.46,\"p\",\"floridasconstructionlien\",203],[432.22,\"p\",\"getthatwrongandyoucreate\",136],[442.46,\"p\",\"inspectionsthenhavetobec\",119],[449.7,\"p\",\"permitbeforeworknotdurin\",55],[453.78,\"p\",\"noticeofcommencementreco\",64],[457.3,\"p\",\"inspectionscalledatthest\",69],[462.02,\"p\",\"finalinspectionclosedout\",78],[467.34,\"p\",\"noneofthisisdifficult\",21],[469.26,\"p\",\"itissimplyadministration\",166],[481.0,\"h\",\"whattheworkactuallyisinf\",30],[483.28,\"p\",\"worthbeingstraightaboutb\",64],[487.04,\"p\",\"floridaroofingisseasonal\",98],[494.28,\"p\",\"aquietyearissteadyreplac\",42],[497.92,\"p\",\"astormyearismonthsofdema\",131],[507.6,\"p\",\"businessesthatplanonlyfo\",79],[512.8,\"p\",\"demandarrivesinsurgesrat\",82],[519.0,\"p\",\"materialavailabilityandp\",55],[522.88,\"p\",\"laboristhebindingconstra\",47],[526.96,\"p\",\"customerexpectationsafte\",85],[534.38,\"h\",\"heatsafetyandwhythelicen\",42],[539.1,\"p\",\"roofinghasoneofthehigher\",102],[545.34,\"p\",\"fallprotectioncarriesrea\",73],[550.66,\"p\",\"thepracticalsidethatthee\",97],[557.1,\"p\",\"earlystartshydrationrota\",132],[567.2,\"h\",\"asensibleorder\",14],[568.36,\"p\",\"confirmyourroofingexperi\",73],[573.12,\"p\",\"prepareforbothpapersweig\",71],[578.0,\"p\",\"sortfinancialdocumentati\",48],[581.4,\"p\",\"sittheexams\",11],[583.08,\"p\",\"submitwitheverythingasse\",78],[587.52,\"p\",\"ifyoufailapaperwhathappe\",56],[591.88,\"p\",\"itismoreforgivingthanpeo\",31],[594.86,\"h\",\"whathaschangedsincethisw\",40],[597.78,\"p\",\"corrected25october2026th\",84],[605.74,\"p\",\"rule61g415006lastamended\",131],[622.1,\"p\",\"thatwasalreadytherulewhe\",63],[626.62,\"p\",\"added25october2026theins\",189],[645.98,\"p\",\"comingon31december2026th\",136],[658.46,\"p\",\"fortileroofsmiamidadesun\",161],[668.06,\"p\",\"permitsarejudgedunderthe\",117]];\n(function(){\n  function init(){\n  var root = document.querySelector('.msq-audio'); if (!root) { return; }\n  var audio = root.querySelector('audio'), items = Array.prototype.slice.call(root.querySelectorAll('.msq-toc li'));\n  var starts = items.map(function(li){ return parseFloat(li.getAttribute('data-start')) || 0; });\n  var names = items.map(function(li){ return li.querySelector('a').textContent; });\n  var anchors = items.map(function(li){ var h = li.querySelector('a').getAttribute('href') || ''; return (h.charAt(0) === '#' && h !== '#top') ? document.getElementById(h.slice(1)) : null; });\n  var article = root.getAttribute('data-article') || location.pathname, minutes = root.getAttribute('data-minutes') || '';\n  var marks = {}, started = false, pausedAt = -1, closed = false, ended = false;\n  var RATES = [1, 1.25, 1.5], rate = 1;\n  try { var saved = parseFloat(localStorage.getItem('msq-audio-rate')); if (RATES.indexOf(saved) >= 0) { rate = saved; } } catch (e) {}\n  audio.playbackRate = rate;\n  function track(name, extra){ try { if (typeof gtag === 'function') { var p = { article: article }; for (var k in extra) { p[k] = extra[k]; } gtag('event', name, p); } } catch (e) {} }\n  function current(){ var t = audio.currentTime, idx = 0; for (var i = 0; starts.length > i; i += 1) { if (t + 0.25 >= starts[i]) { idx = i; } } return idx; }\n  function onScreen(){\n    var line = window.innerHeight \/ 3, idx = 0;\n    for (var i = 0; anchors.length > i; i += 1) { var el = anchors[i]; if (el && line >= el.getBoundingClientRect().top) { idx = i; } }\n    return idx;\n  }\n  function fmt(s){ s = Math.max(0, Math.round(s || 0)); var m = Math.floor(s \/ 60), r = s % 60; return m + ':' + (10 > r ? '0' : '') + r; }\n  function play(from, source){\n    if (from !== null) { audio.currentTime = from; }\n    var p = audio.play(); if (p && p.catch) { p.catch(function(){}); }\n    track(from === null ? 'audio_resume' : 'audio_chapter', { chapter: names[current()], start: Math.round(audio.currentTime), source: source });\n  }\n  var hbtns = anchors.map(function(el, i){\n    if (!el) { return null; }\n    var b = document.createElement('button'); b.type = 'button'; b.className = 'msq-hplay'; b.setAttribute('aria-label', 'Play this section: ' + names[i]);\n    b.addEventListener('click', function(){\n      if (!audio.paused && current() === i) { audio.pause(); track('audio_pause', { source: 'heading' }); return; }\n      play(starts[i], 'heading');\n    });\n    el.appendChild(b); return b;\n  });\n  var bar = document.createElement('div'); bar.className = 'msq-bar msq-bar-pill is-hidden'; bar.setAttribute('role', 'region'); bar.setAttribute('aria-label', 'Audio player');\n  var playBtn = document.createElement('button'); playBtn.type = 'button'; playBtn.className = 'msq-bar-play';\n  var icon = document.createElement('span'); icon.className = 'msq-bar-icon'; icon.setAttribute('aria-hidden', 'true');\n  var label = document.createElement('span'); label.className = 'msq-bar-label';\n  playBtn.appendChild(icon); playBtn.appendChild(label);\n  var chap = document.createElement('span'); chap.className = 'msq-bar-chapter';\n  var clock = document.createElement('span'); clock.className = 'msq-bar-time';\n  var rateBtn = document.createElement('button'); rateBtn.type = 'button'; rateBtn.className = 'msq-bar-rate'; rateBtn.setAttribute('aria-label', 'Playback speed');\n  var closeBtn = document.createElement('button'); closeBtn.type = 'button'; closeBtn.className = 'msq-bar-close'; closeBtn.setAttribute('aria-label', 'Close the audio bar');\n  bar.appendChild(playBtn); bar.appendChild(chap); bar.appendChild(clock); bar.appendChild(rateBtn); bar.appendChild(closeBtn);\n  document.body.appendChild(bar);\n  function showRate(){ rateBtn.textContent = (rate === 1 ? '1' : String(rate)) + 'x'; }\n  showRate();\n  rateBtn.addEventListener('click', function(){\n    rate = RATES[(RATES.indexOf(rate) + 1) % RATES.length]; audio.playbackRate = rate; showRate();\n    try { localStorage.setItem('msq-audio-rate', String(rate)); } catch (e) {}\n    track('audio_rate', { rate: rate });\n  });\n  closeBtn.addEventListener('click', function(){\n    closed = true; if (!audio.paused) { audio.pause(); } paint(); track('audio_bar_close', {});\n  });\n  function mode(){\n    if (!audio.paused) { return 'pause'; }\n    if (ended) { return 'again'; }\n    if (!started) { return 'listen'; }\n    return (pausedAt === onScreen()) ? 'resume' : 'section';\n  }\n  playBtn.addEventListener('click', function(){\n    var m = mode();\n    if (m === 'pause') { audio.pause(); track('audio_pause', { source: 'bar' }); return; }\n    if (m === 'again') { ended = false; play(0, 'bar'); return; }\n    if (m === 'resume') { play(null, 'bar'); return; }\n    play(starts[onScreen()], 'bar');\n  });\n  function paint(){\n    var idx = current(), playing = !audio.paused, m = mode();\n    items.forEach(function(li, i){\n      var on = (i === idx) && playing, b = li.querySelector('.msq-toc-play'), a = li.querySelector('a');\n      li.classList.toggle('is-active', on); b.classList.toggle('is-playing', on);\n      b.textContent = on ? '\u2016' : '\u25b6\ufe0e';\n      b.setAttribute('aria-label', (on ? 'Pause: ' : 'Play from: ') + a.textContent);\n    });\n    hbtns.forEach(function(b, i){ if (b) { var on = (i === idx) && playing; b.classList.toggle('is-playing', on); b.setAttribute('aria-label', (on ? 'Pause this section: ' : 'Play this section: ') + names[i]); } });\n    playBtn.classList.toggle('is-playing', playing);\n    label.textContent = m === 'pause' ? 'Pause' : m === 'again' ? 'Play again' : m === 'resume' ? 'Resume' : m === 'section' ? 'Play this section' : 'Listen, ' + minutes + ' min';\n    playBtn.setAttribute('aria-label', label.textContent);\n    chap.textContent = started ? names[(playing || m === 'resume') ? idx : onScreen()] : '';\n    clock.textContent = started ? fmt(audio.currentTime) + ' \/ ' + fmt(audio.duration) : '';\n    bar.classList.toggle('msq-bar-pill', !started);\n    var show = !closed && (started || 0 > root.getBoundingClientRect().bottom);\n    bar.classList.toggle('is-hidden', !show);\n    document.body.classList.toggle('msq-has-bar', show);\n  }\n  root.addEventListener('click', function(e){\n    var b = e.target.closest ? e.target.closest('.msq-toc-play') : null; if (!b) { return; }\n    var li = b.parentNode, s = parseFloat(b.getAttribute('data-start')) || 0;\n    if (!audio.paused && current() === items.indexOf(li)) { audio.pause(); track('audio_pause', { source: 'index' }); return; }\n    play(s, 'index');\n  });\n  audio.addEventListener('play', function(){ ended = false; closed = false; if (!started) { started = true; track('audio_play', { minutes: Math.round((audio.duration || 0) \/ 60) }); } paint(); });\n  audio.addEventListener('pause', function(){ pausedAt = current(); paint(); });\n  audio.addEventListener('timeupdate', function(){\n    paint();\n    if (audio.duration > 0) {\n      var pct = Math.floor(audio.currentTime \/ audio.duration * 100);\n      [25, 50, 75].forEach(function(m){ if (pct >= m && !marks[m]) { marks[m] = true; track('audio_progress', { percent: m }); } });\n    }\n  });\n  audio.addEventListener('ended', function(){ ended = true; track('audio_complete', {}); paint(); });\n  var ticking = false;\n  function onScroll(){ if (ticking) { return; } ticking = true; setTimeout(function(){ ticking = false; paint(); }, 80); }\n  window.addEventListener('scroll', onScroll, { passive: true }); window.addEventListener('resize', onScroll);\n  paint();\n  }\n  if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); }\n})();\n\n(function(){\n  function start(){\n    var root = document.querySelector('.msq-audio'), audio = root ? root.querySelector('audio') : null;\n    var map = (typeof MSQ_SENT !== 'undefined') ? MSQ_SENT : [];\n    if (!root || !audio || !map.length) { return; }\n    var scope = root.closest('main') || root.closest('article') || root.closest('.entry-content') || document.body;\n    var SKIP = '.msq-audio,.msq,.msq-tool,.msq-end,.msq-bar,script,style,noscript,figcaption,#rank-math-faq,.rank-math-block,nav,header,footer';\n    function norm(s){ return s.toLowerCase().replace(\/[^a-z0-9]+\/g, ''); }\n    var nodes = [], stream = '', walker = document.createTreeWalker(scope, NodeFilter.SHOW_TEXT, null), n;\n    while ((n = walker.nextNode())) {\n      var el = n.parentElement; if (!el || el.closest(SKIP)) { continue; }\n      var raw = n.nodeValue, keep = [], norms = '';\n      for (var i = 0; raw.length > i; i += 1) { var c = raw.charAt(i).toLowerCase(); if (\/[a-z0-9]\/.test(c)) { keep.push(i); norms += c; } }\n      if (!norms) { continue; }\n      nodes.push({ node: n, a: stream.length, b: stream.length + norms.length, keep: keep });\n      stream += norms;\n    }\n    var segs = [], cursor = 0, lastRow = null;\n    map.forEach(function(m, idx){\n      var kind = m[1], f = m[2], len = m[3];\n      if (kind === 't') {\n        var rows = scope.querySelectorAll('tr'), after = !lastRow;\n        for (var r = 0; rows.length > r; r += 1) {\n          var tr = rows[r];\n          if (!after) { if (tr === lastRow) { after = true; } continue; }\n          var cell = tr.querySelector('td,th');\n          if (cell && norm(cell.textContent).indexOf(f) === 0) { tr.setAttribute('data-i', idx); lastRow = tr; break; }\n        }\n        return;\n      }\n      var p = stream.indexOf(f, cursor); if (0 > p) { return; }\n      segs.push({ i: idx, a: p, b: Math.min(p + len, stream.length) }); cursor = p + len;\n    });\n    var si = 0;\n    nodes.forEach(function(nd){\n      var frag = document.createDocumentFragment(), raw = nd.node.nodeValue, rawPos = 0, any = false;\n      for (var k = si; segs.length > k; k += 1) {\n        var sg = segs[k]; if (sg.a >= nd.b) { break; } if (nd.a >= sg.b) { continue; }\n        var s = Math.max(sg.a, nd.a), e = Math.min(sg.b, nd.b);\n        var rs = nd.keep[s - nd.a], re2 = nd.keep[e - nd.a - 1] + 1;\n        if (rs > rawPos) { frag.appendChild(document.createTextNode(raw.slice(rawPos, rs))); }\n        var span = document.createElement('span'); span.className = 'msq-s'; span.setAttribute('data-i', sg.i); span.textContent = raw.slice(rs, re2);\n        frag.appendChild(span); rawPos = re2; any = true;\n        if (sg.b > nd.b) { break; }\n      }\n      while (segs.length > si && nd.b >= segs[si].b) { si += 1; }\n      if (!any) { return; }\n      if (raw.length > rawPos) { frag.appendChild(document.createTextNode(raw.slice(rawPos))); }\n      nd.node.parentNode.replaceChild(frag, nd.node);\n    });\n    var starts = map.map(function(m){ return m[0]; }), curIdx = -1, lastUser = 0, timer = null, autoUntil = 0, dragging = false;\n    function idxAt(t){ var lo = 0, hi = starts.length; while (hi > lo + 1) { var mid = (lo + hi) >> 1; if (t + 0.15 >= starts[mid]) { lo = mid; } else { hi = mid; } } return (t + 0.15 >= starts[0]) ? lo : -1; }\n    function setNow(i){\n      if (i === curIdx) { return; }\n      Array.prototype.forEach.call(scope.querySelectorAll('.msq-now'), function(el){ el.classList.remove('msq-now'); });\n      curIdx = i; if (0 > i) { return; }\n      var els = scope.querySelectorAll('[data-i=\"' + i + '\"]'); if (!els.length) { return; }\n      Array.prototype.forEach.call(els, function(el){ el.classList.add('msq-now'); });\n      var r = els[0].getBoundingClientRect(), now = Date.now();\n      if (!dragging && now > lastUser + 2500 && (80 > r.top || r.bottom > window.innerHeight - 140)) {\n        var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n        autoUntil = now + (reduce ? 400 : 1600);\n        els[0].scrollIntoView({ block: 'center', behavior: reduce ? 'auto' : 'smooth' });\n      }\n    }\n    function tick(){ if (!audio.paused) { setNow(idxAt(audio.currentTime)); } }\n    function userScrolled(){ lastUser = Date.now(); }\n    ['wheel', 'touchmove', 'keydown'].forEach(function(ev){ window.addEventListener(ev, userScrolled, { passive: true }); });\n    window.addEventListener('scroll', function(){ if (Date.now() > autoUntil) { userScrolled(); } }, { passive: true });\n    window.addEventListener('mousedown', function(e){ if (e.clientX >= document.documentElement.clientWidth) { dragging = true; userScrolled(); } }, { passive: true });\n    window.addEventListener('mouseup', function(){ if (dragging) { dragging = false; userScrolled(); } }, { passive: true });\n    audio.addEventListener('play', function(){ if (timer) { clearInterval(timer); } timer = setInterval(tick, 150); tick(); });\n    audio.addEventListener('pause', function(){ if (timer) { clearInterval(timer); timer = null; } });\n    scope.addEventListener('click', function(e){\n      if (e.target.closest('a, button, input, select, textarea, label, summary, .msq, .msq-tool, .msq-end, .msq-audio, .msq-bar')) { return; }\n      var sel = window.getSelection ? String(window.getSelection()) : '';\n      if (sel && sel.trim()) { return; }\n      var el = e.target.closest('[data-i]'); if (!el) { return; }\n      var i = parseInt(el.getAttribute('data-i'), 10); if (isNaN(i)) { return; }\n      if (!audio.paused && i === curIdx) { return; }\n      lastUser = Date.now();\n      audio.currentTime = starts[i];\n      var p = audio.play(); if (p && p.catch) { p.catch(function(){}); }\n      try { if (typeof gtag === 'function') { gtag('event', 'audio_chapter', { article: location.pathname, source: 'sentence', start: Math.round(starts[i]) }); } } catch (err) {}\n    });\n    audio.addEventListener('seeked', tick);\n    audio.addEventListener('ended', function(){ setNow(-1); });\n  }\n  if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', start); } else { start(); }\n})();<\/script>\n<\/div>\n\n\n\n<p class=\"msq-hook wp-block-paragraph\">On this page: what a Florida roofing license covers and what a general contractor cannot do without it, the statute that turns unlicensed roofing into a felony after a storm, the experience routes in section 489.111, the Notice of Commencement that trips new licence holders, and what a storm year does to a roofing business.<\/p>\n\n\n\n<div class=\"msq\" id=\"ms-quiz\" data-slug=\"florida-roofing-license\" data-category=\"Florida contractor licensing\" data-list=\"1\">\n<style>.msq,.msq-hook,.msq-box,.msq-end,.msq-tool{--msq-accent:#24405E;--msq-accent-text:#FFFFFF;--msq-line:#D9D3C7;--msq-warn:#C4540E;--msq-muted:#4C5561;--msq-tint:#F3F1EC;--msq-base:#FFFFFF}\n.msq{margin:1.25em 0 1.75em}\n.msq-hook{border-left:3px solid var(--msq-accent);padding:6px 14px;color:var(--msq-muted);font-size:.97em}\n.msq-box{background:var(--msq-tint);border:1px solid var(--msq-line);border-radius:12px;padding:0}\n.msq-box>summary{cursor:pointer;list-style:none;padding:14px 18px;font-weight:700;color:var(--msq-accent)}\n.msq-box>summary::-webkit-details-marker{display:none}\n.msq-box>summary::before{content:\"+\";display:inline-block;width:1.1em;font-weight:800}\n.msq-box[open]>summary::before{content:\"\\00d7\"}\n.msq-body{padding:2px 18px 18px}\n.msq-intro{margin:0 0 12px;font-size:.95em;color:var(--msq-muted)}\n.msq-list{margin:0;padding:0;list-style:none}\n.msq-q{margin:0 0 18px;padding:0}\n.msq-question{font-weight:700;margin:0 0 8px}\n.msq-options{display:flex;flex-direction:column;gap:8px}\n.msq-opt{text-align:left;background:var(--msq-base);border:1px solid var(--msq-line);border-radius:8px;padding:10px 12px;font:inherit;font-size:.95em;color:inherit;cursor:pointer;line-height:1.35}\n.msq-opt:hover{border-color:var(--msq-accent)}\n.msq-opt[disabled]{cursor:default}\n.msq-opt.is-right{border-color:var(--msq-accent);background:var(--msq-line);font-weight:700}\n.msq-opt.is-wrong{border-color:var(--msq-warn);color:var(--msq-warn)}\n.msq-explain{margin:8px 0 0;font-size:.92em;padding:10px 12px;border-left:3px solid var(--msq-accent);background:var(--msq-base);border-radius:0 8px 8px 0}\n.msq-explain[hidden]{display:none}\n.msq-verdict{font-weight:700}\n.msq-result{margin-top:14px;padding:14px 16px;background:var(--msq-base);border:1px solid var(--msq-line);border-radius:10px}\n.msq-result[hidden]{display:none}\n.msq-result h3{margin:0 0 6px;font-size:1.1em}\n.msq-result p{margin:0 0 8px}\n.msq-jump{margin:0 0 8px;padding-left:1.2em}\n.msq-form{margin-top:10px;display:flex;flex-wrap:wrap;gap:8px;align-items:center}\n.msq-form input[type=email]{flex:1 1 220px;padding:10px 12px;border:1px solid var(--msq-muted);border-radius:8px;font:inherit;background:#fff}\n.msq-btn{background:var(--msq-accent);color:var(--msq-accent-text);border:0;border-radius:8px;padding:11px 18px;font:inherit;font-weight:700;cursor:pointer}\n.msq-btn:hover{filter:brightness(.92)}\n.msq-btn[disabled]{opacity:.7;cursor:default}\n.msq-no{font-size:.9em;color:var(--msq-muted);margin-left:4px}\n.msq-privacy{margin:6px 0 0;font-size:.82em;color:var(--msq-muted);flex-basis:100%}\n.msq-hp{position:absolute;left:-5000px;width:1px;height:1px;overflow:hidden}\n.msq-msg{margin:8px 0 0;font-size:.92em}\n.msq-end{margin:1.5em 0;padding:18px;border:1px solid var(--msq-accent);border-radius:12px;text-align:center;background:var(--msq-tint)}\n.msq-end p{margin:0 0 12px}\n.msq-end .msq-body{text-align:left;padding:16px 0 0}\n.msq-end .msq-start-test[hidden]{display:none}\n.msq-tool{margin:1.5em 0;padding:18px 20px;background:var(--msq-tint);border:1px solid var(--msq-line);border-radius:12px}\n.msq-tool h3{margin:0 0 6px;font-size:1.15em}\n.msq-tool p{margin:0 0 10px}\n.msq-tool .msq-note{font-size:.85em;color:var(--msq-muted);margin:10px 0 0}\n.msq-check label{display:flex;gap:10px;align-items:flex-start;padding:9px 0;border-bottom:1px solid var(--msq-line);cursor:pointer;line-height:1.4}\n.msq-check label:last-of-type{border-bottom:0}\n.msq-check input{margin-top:5px;flex:0 0 auto;width:18px;height:18px;accent-color:var(--msq-accent)}\n.msq-check-count{font-weight:700;margin:10px 0 0}\n.msq-verdict-box{margin:12px 0 0;padding:10px 14px;border-radius:8px;background:var(--msq-base);border-left:3px solid var(--msq-warn)}\n.msq-verdict-box[hidden]{display:none}\n.msq-calc{display:grid;grid-template-columns:1fr 1fr;gap:10px 16px}\n.msq-calc label{display:flex;flex-direction:column;gap:4px;font-size:.92em}\n.msq-calc input,.msq-calc select{padding:8px 10px;border:1px solid var(--msq-muted);border-radius:8px;font:inherit;background:#fff}\n.msq-calc-out{grid-column:1 \/ -1;margin-top:6px;padding:12px 14px;background:var(--msq-base);border-radius:8px;border:1px solid var(--msq-line)}\n.msq-calc-out strong{font-size:1.15em}\n.msq-choose label{display:block;padding:9px 12px;margin:0 0 8px;background:var(--msq-base);border:1px solid var(--msq-line);border-radius:8px;cursor:pointer}\n.msq-choose input{margin-right:8px;accent-color:var(--msq-accent)}\n.msq-choice-result{margin-top:10px;padding:12px 14px;background:var(--msq-base);border-left:3px solid var(--msq-accent);border-radius:0 8px 8px 0}\n.msq-choice-result[hidden]{display:none}\n@media (max-width:600px){.msq-calc{grid-template-columns:1fr}}\nh2.wp-block-heading[id]{scroll-margin-top:24px}<\/style>\n<noscript><style>.msq-explain{display:block !important}<\/style><\/noscript>\n<details class=\"msq-box\">\n<summary>Think you already know this? Five questions, one minute.<\/summary>\n<div class=\"msq-body\">\n<p class=\"msq-intro\">Every answer is on this page. Answer from what you know now; the page fills in the rest.<\/p>\n<ol class=\"msq-list\">\n<li class=\"msq-q\" data-q=\"1\" data-answer=\"a\" data-title=\"What the license covers\" data-section=\"#what-the-license-covers\">\n<p class=\"msq-question\">1. What can a general or building contractor usually not do without a roofing license?<\/p>\n<div class=\"msq-options\" role=\"group\" aria-label=\"Question 1 options\"><button type=\"button\" class=\"msq-opt\" data-opt=\"a\">Contract for roofing alone<\/button><button type=\"button\" class=\"msq-opt\" data-opt=\"b\">Include roofing inside a wider project they hold the contract for<\/button><button type=\"button\" class=\"msq-opt\" data-opt=\"c\">Order roofing materials<\/button><\/div>\n<p class=\"msq-explain\" hidden><span class=\"msq-verdict\"><\/span>Roofing contracting is a Division II trade license with its own experience requirement and its own exam, sat alongside the Business and Finance paper everyone takes. <a class=\"msq-section\" href=\"#what-the-license-covers\">Read the section<\/a><\/p>\n<\/li>\n<li class=\"msq-q\" data-q=\"2\" data-answer=\"b\" data-title=\"Why unlicensed roofing is treated differently\" data-section=\"#why-unlicensed-roofing-is-treated-differently\">\n<p class=\"msq-question\">2. Under section 489.127, what is unlicensed contracting during a state of emergency declared by executive order of the Governor?<\/p>\n<div class=\"msq-options\" role=\"group\" aria-label=\"Question 2 options\"><button type=\"button\" class=\"msq-opt\" data-opt=\"a\">A warning letter<\/button><button type=\"button\" class=\"msq-opt\" data-opt=\"b\">A felony of the third degree, even for a first offence<\/button><button type=\"button\" class=\"msq-opt\" data-opt=\"c\">A civil fine only<\/button><\/div>\n<p class=\"msq-explain\" hidden><span class=\"msq-verdict\"><\/span>Per <a href=\"https:\/\/www.flsenate.gov\/Laws\/Statutes\/2025\/489.127\" target=\"_blank\" rel=\"noopener\">section 489.127 of the Florida Statutes<\/a>; outside an emergency a first offence is a first degree misdemeanor and a repeat is a third degree felony. <a class=\"msq-section\" href=\"#why-unlicensed-roofing-is-treated-differently\">Read the section<\/a><\/p>\n<\/li>\n<li class=\"msq-q\" data-q=\"3\" data-answer=\"a\" data-title=\"Qualifying\" data-section=\"#qualifying\">\n<p class=\"msq-question\">3. Which of these is one of the experience routes in section 489.111?<\/p>\n<div class=\"msq-options\" role=\"group\" aria-label=\"Question 3 options\"><button type=\"button\" class=\"msq-opt\" data-opt=\"a\">4 years of active experience as a worker in the trade, including at least 1 year as a foreman<\/button><button type=\"button\" class=\"msq-opt\" data-opt=\"b\">A weekend course<\/button><button type=\"button\" class=\"msq-opt\" data-opt=\"c\">Six months on a roof<\/button><\/div>\n<p class=\"msq-explain\" hidden><span class=\"msq-verdict\"><\/span>Per <a href=\"https:\/\/www.flsenate.gov\/Laws\/Statutes\/2025\/489.111\" target=\"_blank\" rel=\"noopener\">section 489.111<\/a>, alongside a degree in engineering, architecture or building construction plus 1 year of experience, or set combinations of college credit, worker and foreman time. <a class=\"msq-section\" href=\"#qualifying\">Read the section<\/a><\/p>\n<\/li>\n<li class=\"msq-q\" data-q=\"4\" data-answer=\"a\" data-title=\"Permits, and the paperwork that goes with every job\" data-section=\"#permits-and-the-paperwork-that-goes-with-every-job\">\n<p class=\"msq-question\">4. What does the page say must be recorded before work begins on most jobs above a modest value?<\/p>\n<div class=\"msq-options\" role=\"group\" aria-label=\"Question 4 options\"><button type=\"button\" class=\"msq-opt\" data-opt=\"a\">A Notice of Commencement<\/button><button type=\"button\" class=\"msq-opt\" data-opt=\"b\">A press release<\/button><button type=\"button\" class=\"msq-opt\" data-opt=\"c\">A warranty card<\/button><\/div>\n<p class=\"msq-explain\" hidden><span class=\"msq-verdict\"><\/span>It sits at the root of the lien process, inspections then have to be called at the right stages, and an open permit follows the property and comes back to you. <a class=\"msq-section\" href=\"#permits-and-the-paperwork-that-goes-with-every-job\">Read the section<\/a><\/p>\n<\/li>\n<li class=\"msq-q\" data-q=\"5\" data-answer=\"a\" data-title=\"What the work actually is in Florida\" data-section=\"#what-the-work-actually-is-in-florida\">\n<p class=\"msq-question\">5. What does the page say is the binding constraint in a busy storm period?<\/p>\n<div class=\"msq-options\" role=\"group\" aria-label=\"Question 5 options\"><button type=\"button\" class=\"msq-opt\" data-opt=\"a\">Labor, not work<\/button><button type=\"button\" class=\"msq-opt\" data-opt=\"b\">Advertising<\/button><button type=\"button\" class=\"msq-opt\" data-opt=\"c\">Permits<\/button><\/div>\n<p class=\"msq-explain\" hidden><span class=\"msq-verdict\"><\/span>Demand arrives in surges, material availability and price move sharply after a major storm, and customer expectations are shaped by distress, which changes how you need to communicate. <a class=\"msq-section\" href=\"#what-the-work-actually-is-in-florida\">Read the section<\/a><\/p>\n<\/li>\n<\/ol>\n<div class=\"msq-result\" hidden><\/div>\n<\/div>\n<\/details>\n<script>(function(){\n  if (window.__msqInit) { return; }\n  window.__msqInit = true;\n  var root = document.getElementById('ms-quiz');\n  if (!root) { return; }\n  var meta = { slug: root.getAttribute('data-slug'), category: root.getAttribute('data-category'),\n               list: root.getAttribute('data-list') || '1' };\n  function qs(el, s){ return el.querySelector(s); }\n  function qsa(el, s){ return Array.prototype.slice.call(el.querySelectorAll(s)); }\n  function track(name, params){\n    try { if (typeof gtag === 'function') { var p = params || {}; p.article = meta.slug; gtag('event', name, p); } } catch (e) {}\n  }\n  function jumpList(missed){\n    if (!missed.length) { return ''; }\n    return '<ul class=\"msq-jump\">' + missed.map(function(q){\n      return '<li><a href=\"' + q.getAttribute('data-section') + '\">' + q.getAttribute('data-title') + '<\/a><\/li>';\n    }).join('') + '<\/ul>';\n  }\n  function emailForm(){\n    return '<div class=\"msq-sub\"><p><strong>Get the next one.<\/strong> We publish new articles on ' + meta.category\n      + ' most weeks and recheck this page on Sundays. Email me when a new article goes up or this page changes.<\/p>'\n      + '<form class=\"msq-form\" method=\"post\" action=\"\/mail\/form.php\" novalidate>'\n      + '<input type=\"hidden\" name=\"list\" value=\"' + meta.list + '\">'\n      + '<input type=\"hidden\" name=\"name\" value=\"\">'\n      + '<label class=\"msq-hp\" aria-hidden=\"true\">Leave this empty<input type=\"text\" name=\"website\" tabindex=\"-1\" autocomplete=\"off\"><\/label>'\n      + '<input type=\"email\" name=\"email\" placeholder=\"you@example.com\" required aria-label=\"Email address\" autocomplete=\"email\">'\n      + '<button type=\"submit\" class=\"msq-btn\">Email me the updates<\/button>'\n      + '<a href=\"#\" class=\"msq-no\">No thanks<\/a>'\n      + '<p class=\"msq-privacy\">We store your email and this page\\'s topic, nothing else. Unsubscribe any time.<\/p>'\n      + '<\/form><p class=\"msq-msg\" aria-live=\"polite\"><\/p><\/div>';\n  }\n  \/* The autoresponder always answers 200 with its own page. A \".msg.err\" box means the\n     address was rejected, \"You're subscribed\" means accepted, and a redirect only happens\n     after a successful subscribe. Same reading as the landing pages on the other sites. *\/\n  function sendForm(form){\n    return fetch(form.getAttribute('action'), { method: 'POST', body: new FormData(form), credentials: 'same-origin', redirect: 'manual' })\n      .then(function(res){\n        if (res.type === 'opaqueredirect') { return { status: 'ok' }; }\n        if (res.status === 404) { return { status: 'notlive' }; }\n        if (!res.ok) { throw new Error('HTTP ' + res.status); }\n        return res.text().then(function(t){\n          var doc = new DOMParser().parseFromString(t, 'text\/html');\n          var err = doc.querySelector('.msg.err');\n          if (err) {\n            var m = err.textContent.trim();\n            if (\/something went wrong\/i.test(m)) { throw new Error(m); }\n            return { status: 'rejected', message: m };\n          }\n          if (\/you.re subscribed\/i.test(doc.body.textContent)) { return { status: 'ok' }; }\n          return { status: 'unknown' };\n        });\n      });\n  }\n  function wireForm(sub){\n    var form = qs(sub, '.msq-form'), msg = qs(sub, '.msq-msg');\n    qs(form, '.msq-no').addEventListener('click', function(e){\n      e.preventDefault();\n      sub.innerHTML = '<p class=\"msq-msg\">No problem. The Sunday refresh keeps this page current either way.<\/p>';\n      track('quiz_email', { result: 'declined' });\n    });\n    form.addEventListener('submit', function(e){\n      e.preventDefault();\n      var input = qs(form, 'input[name=email]'), btn = qs(form, '.msq-btn');\n      var email = input.value.trim(); input.value = email;\n      if (!\/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(email)) { msg.textContent = 'That email does not look right.'; return; }\n      btn.disabled = true; btn.textContent = 'Sending';\n      function reset(){ btn.disabled = false; btn.textContent = 'Email me the updates'; }\n      sendForm(form).then(function(r){\n        if (r.status === 'ok' || r.status === 'unknown') {\n          sub.innerHTML = '<p class=\"msq-msg\"><strong>Done.<\/strong> We will email you when the next article on ' + meta.category\n            + ' goes up and when this page changes. If a confirmation email arrives, click it.<\/p>';\n          track('quiz_email', { result: r.status });\n          if (r.status === 'ok') { track('generate_lead', { method: 'quiz' }); }\n        } else if (r.status === 'notlive') {\n          msg.textContent = 'Sign up is not switched on yet for this site. Nothing was stored.'; reset();\n          track('quiz_email', { result: 'notlive' });\n        } else {\n          msg.textContent = r.message || 'Please check the email address and try again.'; reset();\n          track('quiz_email', { result: 'rejected' });\n        }\n      }).catch(function(){\n        msg.textContent = 'Could not reach the sign up service just now. Nothing was stored.'; reset();\n        track('quiz_email', { result: 'error' });\n      });\n    });\n  }\n  function finish(container, mode, score, total, missed){\n    var result = qs(container, '.msq-result');\n    track('quiz_complete', { mode: mode, score: score, total: total });\n    var h;\n    if (mode === 'pre') {\n      h = '<h3>You knew ' + score + ' of ' + total + ' before reading.<\/h3>';\n      h += (score === total) ? '<p>All of them. Read on anyway; the sections below carry the detail behind each answer.<\/p>'\n                             : '<p>The rest is below. Jump straight to what you missed:<\/p>' + jumpList(missed);\n      try { sessionStorage.setItem('msq-pre-' + meta.slug, String(score)); } catch (e) {}\n    } else {\n      var pre = null;\n      try { pre = sessionStorage.getItem('msq-pre-' + meta.slug); } catch (e) {}\n      h = '<h3>You got ' + score + ' of ' + total + '.<\/h3>';\n      if (pre !== null) { h += '<p>Before reading you had ' + pre + ' of ' + total + '.<\/p>'; }\n      if (missed.length) { h += '<p>Worth a second look:<\/p>' + jumpList(missed); }\n      h += emailForm();\n    }\n    result.innerHTML = h; result.hidden = false;\n    if (mode !== 'pre') { wireForm(qs(result, '.msq-sub')); }\n    result.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n  }\n  function setup(container, mode){\n    var qEls = qsa(container, '.msq-q'), answered = 0, score = 0, missed = [];\n    qEls.forEach(function(q){\n      var answer = q.getAttribute('data-answer'), opts = qsa(q, '.msq-opt'), explain = qs(q, '.msq-explain');\n      q.removeAttribute('data-done'); explain.hidden = true; qs(explain, '.msq-verdict').textContent = '';\n      opts.forEach(function(b){ b.disabled = false; b.classList.remove('is-right', 'is-wrong'); });\n      opts.forEach(function(b){\n        b.addEventListener('click', function(){\n          if (q.getAttribute('data-done')) { return; }\n          q.setAttribute('data-done', '1');\n          var ok = b.getAttribute('data-opt') === answer;\n          opts.forEach(function(o){ o.disabled = true; if (o.getAttribute('data-opt') === answer) { o.classList.add('is-right'); } });\n          if (ok) { score += 1; } else { b.classList.add('is-wrong'); missed.push(q); }\n          qs(explain, '.msq-verdict').textContent = ok ? 'Right. ' : 'Not quite. ';\n          explain.hidden = false;\n          answered += 1;\n          track('quiz_answer', { mode: mode, question: q.getAttribute('data-q'), correct: ok ? 1 : 0 });\n          if (answered === qEls.length) { finish(container, mode, score, qEls.length, missed); }\n        });\n      });\n    });\n  }\n  var box = qs(root, '.msq-box');\n  setup(root, 'pre');\n  if (box) { box.addEventListener('toggle', function(){ if (box.open) { track('quiz_open', { mode: 'pre' }); } }); }\n  \/* The end block sits far below this script, so it does not exist yet while this runs\n     during parsing. A delegated listener finds it at click time. *\/\n  document.addEventListener('click', function(e){\n    var startBtn = (e.target && e.target.closest) ? e.target.closest('.msq-start-test') : null;\n    if (!startBtn) { return; }\n    var end = startBtn.closest('.msq-end');\n    if (!end) { return; }\n    var mount = qs(end, '.msq-mount');\n    var clone = qs(root, '.msq-body').cloneNode(true);\n    var intro = qs(clone, '.msq-intro');\n    if (intro) { intro.textContent = 'The same five questions, now that you have read the page.'; }\n    var res = qs(clone, '.msq-result'); if (res) { res.hidden = true; res.innerHTML = ''; }\n    mount.innerHTML = ''; mount.appendChild(clone);\n    setup(mount, 'test');\n    startBtn.hidden = true;\n    track('quiz_open', { mode: 'test' });\n    mount.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    var first = qs(mount, '.msq-opt'); if (first) { first.focus({ preventScroll: true }); }\n  });\n  \/* Shared tool behaviour: checklists remember their ticks on this device, and a chooser\n     shows the result for the option picked. Calculators carry their own small script. *\/\n  function initTools(){\n    qsa(document, '.msq-check').forEach(function(box){\n      var key = 'msq-check-' + meta.slug + '-' + (box.getAttribute('data-id') || 'x');\n      var boxes = qsa(box, 'input[type=checkbox]'), count = qs(box, '.msq-check-count');\n      var yes = qs(box, '.msq-verdict-yes'), no = qs(box, '.msq-verdict-no');\n      var saved = {};\n      try { saved = JSON.parse(localStorage.getItem(key) || '{}'); } catch (e) {}\n      boxes.forEach(function(cb, i){ if (saved[i]) { cb.checked = true; } });\n      function refresh(){\n        var n = boxes.filter(function(cb){ return cb.checked; }).length, state = {};\n        boxes.forEach(function(cb, i){ if (cb.checked) { state[i] = 1; } });\n        try { localStorage.setItem(key, JSON.stringify(state)); } catch (e) {}\n        if (count) { count.textContent = n + ' of ' + boxes.length + (box.getAttribute('data-verb') || ' done'); }\n        if (yes && no) { yes.hidden = n === 0; no.hidden = n !== 0; }\n      }\n      boxes.forEach(function(cb){ cb.addEventListener('change', function(){ refresh(); track('tool_check', { tool: box.getAttribute('data-id') }); }); });\n      refresh();\n    });\n    qsa(document, '.msq-choose').forEach(function(box){\n      var results = qsa(box, '.msq-choice-result');\n      qsa(box, 'input[type=radio]').forEach(function(r){\n        r.addEventListener('change', function(){\n          results.forEach(function(el){ el.hidden = el.getAttribute('data-for') !== r.value; });\n          track('tool_choose', { tool: box.getAttribute('data-id'), choice: r.value });\n        });\n      });\n    });\n  }\n  \/\/ read progress: how far down the article the reader has scrolled, fired once per quarter\n  (function(){\n    var art = root.closest('article') || root.parentNode, fired = {};\n    function check(){\n      var top = art.getBoundingClientRect().top + window.pageYOffset, h = art.offsetHeight || 1;\n      var seen = (window.pageYOffset + window.innerHeight - top) \/ h * 100;\n      [25, 50, 75, 100].forEach(function(m){ if (seen >= m && !fired[m]) { fired[m] = true; track('read_progress', { percent: m }); } });\n    }\n    window.addEventListener('scroll', check, { passive: true }); window.addEventListener('load', check);\n  })();\n  if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initTools); } else { initTools(); }\n})();<\/script>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\">It is also the trade where working without a license goes worst, and that is worth understanding before anything else.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"what-the-license-covers\">What the license covers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Roofing contracting: installation, repair, replacement and maintenance of roof systems, together with the waterproofing and related work that goes with them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A general or building contractor can usually include roofing inside a wider project they hold the contract for, and <a href=\"https:\/\/passcontractorexam.com\/articles\/florida-building-contractor-license\/\">what the Florida building contractor licence covers<\/a> sets out that wider scope. What they generally cannot do is contract for roofing alone. If roofing is your business rather than one trade within a build, the roofing license is the one you need. Plumbing sits in its own certified category with a separate trade knowledge paper, which is set out in our guide to <a href=\"https:\/\/passcontractorexam.com\/articles\/florida-plumbing-license-exam\/\">what the Florida plumbing license exam actually contains<\/a>. <a href=\"https:\/\/passcontractorexam.com\/articles\/florida-general-contractor-license\/\">the general contractor license<\/a> covers the broader categories if you are weighing them up.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"why-unlicensed-roofing-is-treated-differently\">Why unlicensed roofing is treated differently<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every trade takes licensing seriously. Roofing enforcement in Florida is harder than most, and the reason is storms.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After a hurricane, unlicensed operators arrive, take deposits for roof repairs, and leave. It happens at scale, it happens to people who have just lost part of their home, and Florida has responded with enforcement that escalates when a state of emergency is in effect. Under <a href=\"https:\/\/www.flsenate.gov\/Laws\/Statutes\/2026\/489.127\" rel=\"nofollow noopener\" target=\"_blank\">section 489.127 of the Florida Statutes<\/a> unlicensed contracting is a first degree misdemeanor for a first offence and a third degree felony for a repeat, and during a state of emergency declared by executive order of the Governor a first offence is a third degree felony.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">If you are working toward this license, do not take roofing contracts while you wait for it. The penalties are steeper than in other trades, they get steeper again during a declared emergency, and a conviction sits on the background disclosure of the application you are trying to complete.<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"627\" src=\"https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/08\/florida-roofing-license-2.jpg\" alt=\"Roof underlayment and shingle installation detail on a Florida home\" class=\"wp-image-57\" srcset=\"https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/08\/florida-roofing-license-2.jpg 1200w, https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/08\/florida-roofing-license-2-300x157.jpg 300w, https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/08\/florida-roofing-license-2-1024x535.jpg 1024w, https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/08\/florida-roofing-license-2-768x401.jpg 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><figcaption class=\"wp-block-image__caption\">Wind uplift and coastal requirements dominate the Florida code content.<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1600\" height=\"900\" src=\"https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/09\/florida-roofing-license-chart.png\" alt=\"Timeline of penalties for contracting without a Florida roofing license, from misdemeanor to third degree felony during a declared emergency\" class=\"wp-image-343\" srcset=\"https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/09\/florida-roofing-license-chart.png 1600w, https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/09\/florida-roofing-license-chart-300x169.png 300w, https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/09\/florida-roofing-license-chart-1024x576.png 1024w, https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/09\/florida-roofing-license-chart-768x432.png 768w, https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/09\/florida-roofing-license-chart-1536x864.png 1536w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><figcaption class=\"wp-block-image__caption\">The reason the roofing trade is policed harder than most: after a hurricane, unlicensed operators take deposits from people who have just lost part of their home. Source: Florida Statutes section 489.127.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"qualifying\">Qualifying<\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Requirement<\/th><th>Detail<\/th><\/tr><\/thead><tbody><tr><td>Experience<\/td><td>One of the routes in <a href=\"https:\/\/www.flsenate.gov\/Laws\/Statutes\/2026\/489.111\" target=\"_blank\" rel=\"noopener\">section 489.111<\/a>: 4 years of active experience as a worker in the trade including at least 1 year as a foreman; a degree in engineering, architecture or building construction plus 1 year of experience; or set combinations of college credit, worker and foreman time<\/td><\/tr><tr><td>Education<\/td><td>Accredited coursework can substitute for part of it<\/td><\/tr><tr><td>Exams<\/td><td>Roofing trade knowledge plus Business and Finance<\/td><\/tr><tr><td>Financial responsibility<\/td><td>A FICO credit score of 660 or higher and no unsatisfied judgments or liens; below 660, a 14 hour board approved financial responsibility course (<a href=\"https:\/\/www.law.cornell.edu\/regulations\/florida\/Fla-Admin-Code-Ann-R-61G4-15-006\" target=\"_blank\" rel=\"noopener\">rule 61G4-15.006<\/a>). The rule offers no bond route<\/td><\/tr><tr><td>Insurance<\/td><td>General liability and workers compensation<\/td><\/tr><tr><td>Background check<\/td><td>Fingerprints and disclosure<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The general eligibility picture is the same across Florida contractor licenses and is covered in <a href=\"https:\/\/passcontractorexam.com\/articles\/florida-contractor-license-requirements\/\">the eligibility requirements<\/a>. The experience routes are in <a href=\"https:\/\/www.flsenate.gov\/Laws\/Statutes\/2026\/489.111\" rel=\"nofollow noopener\" target=\"_blank\">section 489.111<\/a>, reread on 25 October 2026. Take current fee levels and forms from <a href=\"https:\/\/www2.myfloridalicense.com\/construction-industry\/\" rel=\"nofollow noopener\" target=\"_blank\">DBPR<\/a> rather than from any guide.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"what-the-trade-exam-covers\">What the trade exam covers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Roofing specific, and heavily weighted toward the things that fail in a Florida storm.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li><strong>Roof systems.<\/strong> Shingle, tile, metal, built up, modified bitumen, single ply. Materials, assemblies and where each is appropriate.<\/li>\n\n\n<li><strong>Wind uplift.<\/strong> Fastening patterns, attachment requirements and the code provisions behind them. This carries real weight and it is the difference between a roof that stays on and one that does not.<\/li>\n\n\n<li><strong>Underlayment and secondary water barriers.<\/strong> Florida specific requirements that have no equivalent in most states.<\/li>\n\n\n<li><strong>Flashing and detailing.<\/strong> Where roofs actually leak, and where questions concentrate.<\/li>\n\n\n<li><strong>Safety.<\/strong> Fall protection above all, given the work.<\/li>\n\n\n<li><strong>Estimating and materials.<\/strong> Squares, waste factors, ordering.<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If you have roofed in Florida for years, most of this is familiar. The parts that catch people are the code citations rather than the practice: knowing that a detail is right is different from knowing which section requires it.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1376\" height=\"768\" src=\"https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/09\/florida-roofing-license-underlayment.jpg\" alt=\"A partly completed shingle roof with underlayment exposed under a bright Florida sky, the work a Florida roofing license covers\" class=\"wp-image-344\" srcset=\"https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/09\/florida-roofing-license-underlayment.jpg 1376w, https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/09\/florida-roofing-license-underlayment-300x167.jpg 300w, https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/09\/florida-roofing-license-underlayment-1024x572.jpg 1024w, https:\/\/passcontractorexam.com\/articles\/wp-content\/uploads\/2026\/09\/florida-roofing-license-underlayment-768x429.jpg 768w\" sizes=\"auto, (max-width: 1376px) 100vw, 1376px\" \/><figcaption class=\"wp-block-image__caption\">Underlayment and secondary water barriers carry Florida specific requirements that have no equivalent in most states.<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-business-and-finance-paper\">The Business and Finance paper<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every Division II candidate sits it, and roofers report the same experience as every other trade: it is the harder of the two papers, because nothing about installing a roof teaches you lien law or job costing. <a href=\"https:\/\/passcontractorexam.com\/articles\/florida-business-and-finance-exam\/\">the Business and Finance exam<\/a> covers it, and it deserves separate preparation time rather than a weekend before.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"the-insurance-claims-question\">The insurance claims question<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Not an exam topic, but it will be most of your business, so it belongs in any honest article about this license.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A large share of Florida roofing work runs through insurance claims, and the rules sit in one place: <a href=\"https:\/\/www.flsenate.gov\/Laws\/Statutes\/2026\/489.147\" target=\"_blank\" rel=\"noopener\">section 489.147 of the Florida Statutes<\/a>, created in 2021 and amended in 2022, 2024 and 2025. Getting them wrong is a licensing problem rather than merely a commercial one. A contractor may not, directly or indirectly:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>advertise roof damage claims without the disclosures the statute requires about deductibles and insurance fraud<\/li><li>offer a homeowner a rebate, gift, cash, coupon, deductible waiver or anything else of value for a roof inspection or a roof damage claim<\/li><li>pay or accept a referral fee for work the insurance proceeds will cover<\/li><li>interpret the policy, advise on coverage or adjust the claim, unless also licensed as a public adjuster<\/li><li>hand over a repair authorization without a good faith, itemized cost estimate<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The fine is up to $10,000 per violation, and an unlicensed person doing any of it is treated as contracting without a licence. The deductible waiver is the one that sounds like customer service and is not.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Understand those rules before you take claims work, not after a complaint. This is the area where otherwise competent roofing contractors get into disciplinary trouble.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"permits-and-the-paperwork-that-goes-with-every-job\">Permits, and the paperwork that goes with every job<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A roofing contractor pulls permits, and in Florida that carries specific obligations that catch new licence holders out.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Florida&#8217;s construction lien law exempts an improvement with a direct contract price of $2,500 or less from most of its provisions (<a href=\"https:\/\/www.flsenate.gov\/Laws\/Statutes\/2026\/713.02\" target=\"_blank\" rel=\"noopener\">section 713.02(5)<\/a>), so above that figure a recorded Notice of Commencement before work begins is normally part of the job. Get that wrong and you create problems for the owner with their lender and problems for yourself with payment, because the notice sits at the root of the lien process. Inspections then have to be called at the right stages, and a roof that gets covered before an inspection may have to be opened back up at your cost.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Permit before work, not during, and certainly not after a complaint<\/li>\n\n\n<li>Notice of Commencement recorded where required, before the first day on site<\/li>\n\n\n<li>Inspections called at the stages the jurisdiction requires, not batched at the end<\/li>\n\n\n<li>Final inspection closed out, because an open permit follows the property and comes back to you<\/li>\n\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">None of this is difficult. It is simply administration that has to happen on every job, and it is the part that most often separates a contractor who grows from one who spends their evenings resolving problems from six months ago.<\/p>\n\n\n\n<div class=\"msq-tool msq-check\" data-id=\"roofing-job-paperwork\" data-verb=\" done\">\n<h3>Every job&#8217;s paperwork<\/h3>\n<p>The administration that has to happen on every job, from the page above. Tick each item as it is done on the current job.<\/p>\n<label><input type=\"checkbox\">Permit pulled before work, not during, and certainly not after a complaint<\/label>\n<label><input type=\"checkbox\">Notice of Commencement recorded where required, before the first day on site<\/label>\n<label><input type=\"checkbox\">Inspections called at the stages the jurisdiction requires, not batched at the end<\/label>\n<label><input type=\"checkbox\">Final inspection closed out, because an open permit follows the property<\/label>\n<label><input type=\"checkbox\">Insurance claims rules read before the first claims job<\/label>\n<p class=\"msq-check-count\"><\/p>\n<p class=\"msq-note\">Administration, not legal advice. The exact thresholds and forms come from the jurisdiction and the board. Ticks are saved on this device only.<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"what-the-work-actually-is-in-florida\">What the work actually is in Florida<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Worth being straight about, because it shapes whether this license suits you. Florida roofing is seasonal in a way most trades are not, and the season is driven by weather rather than by the calendar.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A quiet year is steady replacement and repair work. A storm year is months of demand you cannot meet, customers under pressure, insurance adjusters, supply shortages and subcontractors who can name their price. Businesses that plan only for the quiet years struggle in the busy ones, and the reverse is worse.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n\n<li>Demand arrives in surges rather than evenly, so cash flow planning matters more than in most trades<\/li>\n\n\n<li>Material availability and price move sharply after a major storm<\/li>\n\n\n<li>Labor is the binding constraint in a busy period, not work<\/li>\n\n\n<li>Customer expectations after a storm are shaped by distress, which changes how you need to communicate<\/li>\n\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"heat-safety-and-why-the-license-takes-it-seriously\">Heat, safety and why the license takes it seriously<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Roofing has one of the higher injury rates in construction and Florida adds heat to the ordinary risks of working at height. Fall protection carries real weight on the exam for that reason, and it is not box ticking.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The practical side that the exam cannot test, but which any roofing contractor has to solve, is scheduling around heat. Early starts, hydration, rotation and knowing the signs of heat illness in your crew are part of running roofing work in this state rather than an optional extra.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"a-sensible-order\">A sensible order<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n\n<li>Confirm your roofing experience meets the requirement and identify who will verify it.<\/li>\n\n\n<li>Prepare for both papers, weighting Business and Finance more than instinct suggests.<\/li>\n\n\n<li>Sort financial documentation and insurance in parallel.<\/li>\n\n\n<li>Sit the exams.<\/li>\n\n\n<li>Submit with everything assembled, and read up on claims rules before your first insurance job.<\/li>\n\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">If you fail a paper, <a href=\"https:\/\/passcontractorexam.com\/articles\/failed-florida-contractor-exam\/\">what happens if you fail<\/a> covers what happens next. It is more forgiving than people fear.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"what-has-changed-since-this-was-first-published\">What has changed since this was first published?<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Corrected, 25 October 2026: the qualifying table said a bond was available below the credit threshold. <a href=\"https:\/\/www.law.cornell.edu\/regulations\/florida\/Fla-Admin-Code-Ann-R-61G4-15-006\" target=\"_blank\" rel=\"noopener\">Rule 61G4-15.006<\/a>, last amended with effect from 5 May 2024, requires a credit score of 660 or higher or a 14 hour financial responsibility course, and names no bond. That was already the rule when this page went up, so it was an error, not a change.<\/li><li>Added, 25 October 2026: the insurance claims section now names section 489.147 and its five prohibited practices, and the Notice of Commencement paragraph now carries the $2,500 figure from section 713.02(5) in place of &#8220;a modest value&#8221;.<\/li><li>Coming on 31 December 2026: the 9th edition (2026) Florida Building Code, scheduled to take effect that day in the Florida Building Commission&#8217;s <a href=\"https:\/\/www.floridabuilding.org\/fbc\/commission\/FBC_1026\/Commission\/Workplan_October_2026.pdf\" target=\"_blank\" rel=\"noopener\">October 2026 workplan<\/a>. For tile roofs, Miami-Dade&#8217;s <a href=\"https:\/\/www.miamidade.gov\/resources\/economy\/board-and-code\/documents\/9th-edition-fbc-roofing-underlayment.pdf\" target=\"_blank\" rel=\"noopener\">underlayment notice<\/a> says every underlayment beneath a tile system will need product approval and the prescriptive allowance for yellow stripe underlayments goes. Permits are judged under the edition in force when they are filed, so a reroof contract that straddles the date carries the transition with it.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"frequently-asked-questions\">Frequently asked questions<\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-q-1\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Is a roofing license a Division I or Division II license?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Division II. It is a trade specific license rather than one of the broad building categories, which means the experience requirement and the exam are focused on roofing rather than on general construction management.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-q-2\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Can a general contractor do roofing work?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>A general or building contractor can typically include roofing within a larger project they are contracting for. Contracting directly for roofing alone generally requires the roofing license. If roofing is your business rather than a component of it, you want the roofing license.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-q-3\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Why is unlicensed roofing treated more seriously?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Because of what follows a hurricane. Unlicensed roofing after a storm is a persistent fraud problem in Florida, enforcement is correspondingly aggressive, and penalties escalate sharply when a state of emergency is in effect.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-q-4\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">What does the exam cover?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Roofing systems and materials, installation methods, the Florida Building Code as it applies to roofing including wind uplift and coastal requirements, safety, and estimating. Plus the Business and Finance exam, which every candidate sits.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-q-5\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Do I need to know about insurance claims work?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>It is not an exam subject but it is a large part of Florida roofing in practice. There are specific rules about what a contractor may and may not do in relation to a customer&#8217;s insurance claim, and they are worth understanding before you take that work.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n\n\n<div class=\"msq-end\" id=\"ms-quiz-end\">\n<p><strong>Finished the page?<\/strong> The same five questions from the top, to see what stuck.<\/p>\n<button type=\"button\" class=\"msq-btn msq-start-test\">Test Your Understanding of This Article<\/button>\n<div class=\"msq-mount\"><\/div>\n<\/div>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Rules and fees change without notice. This page was verified on the date shown and is rechecked regularly. If you hit something different, tell us in the comments.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>What the license covers, how to qualify, and why roofing is the trade where working unlicensed goes worst.<\/p>\n","protected":false},"author":1,"featured_media":56,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","rank_math_title":"Florida Roofing License: Requirements, Exam and Scope","rank_math_description":"What a Florida roofing contractor license permits, the experience and exam requirements, and why unlicensed roofing carries heavier consequences than most trades.","rank_math_focus_keyword":"florida roofing license","rank_math_canonical_url":"","rank_math_breadcrumb_title":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"","rank_math_twitter_title":"","rank_math_twitter_description":"","rank_math_twitter_image":"","rank_math_pillar_content":"","rank_math_robots":[],"rank_math_advanced_robots":[]},"categories":[4],"tags":[],"class_list":["post-58","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-licensing"],"_links":{"self":[{"href":"https:\/\/passcontractorexam.com\/articles\/wp-json\/wp\/v2\/posts\/58","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/passcontractorexam.com\/articles\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/passcontractorexam.com\/articles\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/passcontractorexam.com\/articles\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/passcontractorexam.com\/articles\/wp-json\/wp\/v2\/comments?post=58"}],"version-history":[{"count":11,"href":"https:\/\/passcontractorexam.com\/articles\/wp-json\/wp\/v2\/posts\/58\/revisions"}],"predecessor-version":[{"id":748,"href":"https:\/\/passcontractorexam.com\/articles\/wp-json\/wp\/v2\/posts\/58\/revisions\/748"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/passcontractorexam.com\/articles\/wp-json\/wp\/v2\/media\/56"}],"wp:attachment":[{"href":"https:\/\/passcontractorexam.com\/articles\/wp-json\/wp\/v2\/media?parent=58"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/passcontractorexam.com\/articles\/wp-json\/wp\/v2\/categories?post=58"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/passcontractorexam.com\/articles\/wp-json\/wp\/v2\/tags?post=58"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}