← Back to SEO Report ← Page analysis

Miami Workers' Compensation Lawyer — SEO Improvements

injury-law/miami-workers-compensation-lawyer  ·  Gallardo Law Firm  ·  Audited 2026-08-13, 14 rounds through 2026-08-14  ·  En / article.cshtml + articlemetas.cshtml + FaqEntities.xml + ServiceEntities.xml

URL https://gallardolawyers.com/injury-law/miami-workers-compensation-lawyer
Target Keyword miami workers compensation lawyer
3,1588,108
Visible corpus, words (+157%)
2,5206,858
Body words (En)
5331,240
FAQ words · 10 of 10 slots
14+718+13
H2 + H3 headings
03
JSON-LD blocks · 3 speakable ids
024
Visible external citations
011
Outbound internal links, 11 distinct anchors
7 / 1515 / 15
Comp pages linking to this hub
THE HEADLINE: 40,650 impressions at average position 17 produced 27 clicks — 0.07% CTR. The top 1,000 queries alone carry 39,131 impressions and 7 clicks. The page ranks in positions 8–10 for its own commercial terms. Visibility exists; nothing converts to a click. That is a title-and-snippet problem, not a ranking problem, and it set the priority order of all fourteen rounds.
Meta Tags — Round 2, the CTR pass (edits 19–21)
The single biggest impression driver was in no meta field and no heading. «miami workers comp lawyer» carries 2,501 GSC impressions at position 8.11 — more than any other query on the page — and appeared only in body copy. The old title was also 76 characters and being truncated. «Work Injury Attorney» was kept: at 177 impressions it holds the best average position on the entire page (5.62).
miami-workers-compensation-lawyer / En / articlemetas.cshtml
@* ROUND 2 — title rewritten for CTR. 76 chars -> 47. Old title preserved in the comment directly above it. *@
@* was: Miami Workers Compensation Lawyer | Work Injury Attorney | Gallardo Law Firm *@
<title>Miami Workers Comp Lawyer | Work Injury Attorney</title>
@* 150 chars. Opens on the searcher's state, names the three highest-intent problems, closes on the 30-day statutory deadline — a real reason to act, not a promise. *@
<meta name="description" content="Injured at work in Miami? Workers comp lawyers handling denied claims, unpaid benefits and treatment disputes. Free consultation. Report within 30 days." />
<link rel="canonical" href="https://gallardolawyers.com/injury-law/miami-workers-compensation-lawyer" />

@* SOCIAL IMAGE — repointed from the 375x211 thumbnail to the 903x530 asset, which ALREADY EXISTED on disk (139,775 bytes, verified before editing). *@
<meta property="og:image" content="https://gallardolawyers.com/themes/gallardo/images/services/903x530/miami-workers-compensation-lawyer.jpg" />
<meta property="og:image:width" content="903" />
<meta property="og:image:height" content="530" />
@* summary -> summary_large_image *@
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="https://gallardolawyers.com/themes/gallardo/images/services/903x530/miami-workers-compensation-lawyer.jpg" />

@* MAINTENANCE — description applied IDENTICALLY to og:description and twitter:description. title = og:title = twitter:title. IF ONE CHANGES, CHANGE ALL SIX. *@

Trade-off the firm must sign off on: «Gallardo Law Firm» was dropped from the <title> to fit the CTR hook in 47 characters. Google has shown site names separately since 2022, og:site_name still carries the brand, and brand queries already rank position 1 at 8.33% CTR — but it is a deliberate brand removal and it is reversible: the previous title and description are preserved verbatim in Razor comments. Open item (h).
What it bought, measured: «miami workers comp lawyer» went 0 → 6 occurrences across metas + content + FAQs. What it cost: «miami workers compensation lawyer» dropped one occurrence, and it is one of only two rows in the whole 201-row table that moved down.

Keyword Coverage — Was / Now — 201 rows · 41 up · 2 down · 154 unchanged · 4 n/a
GSC 2026-05-11 → 2026-08-10 (page-filtered)  ·  SEMrush US bulk, 2026-08-12/13  ·  corpus = metas + content + FAQs
KeywordGSC impPosVolKDCPCWasNowΔNote
miami workers comp lawyer2,5018.1126012$46.7306+6⭐ #1 impression driver sitewide — was body-only, in NO meta field and NO heading
workers compensation lawyer1,3909.6074,00026$36.861014+4head term — biggest volume in the set
workers compensation attorney1,3659.1160,50028$36.8645+1H2 #6, H2 #9, FAQ answers
miami workers compensation lawyer1,0849.0432017$24.5698−1PRIMARY — title, canonical, URL, H2 #2/#14. The −1 is the Round 2 CTR pass
workers compensation lawyers8989.2233,10029$36.8626+4⭐ biggest keyword on BOTH measures — deliberately reinforced in Rounds 9–11
workers compensation attorneys7349.3527,10030$36.8615+4second biggest on both measures
best workers comp lawyers in miami florida54012.523901600=GAP — «best» cluster = 48 queries / 1,713 imp / 0 clicks. Rejected as a FAQ: self-laudatory, Rule 4-7 risk
work injury lawyer near me3177.273,60055$59.6800=GAP — near-me cluster is 63,480 US volume; page had zero «near me» copy
workers comp lawyer2849.9233,10040$44.71113+12largest single-row gain in the table
workers compensation lawyer near me20710.3612,10011$31.8602+2⭐ THE standout: 12k volume at KD 11. Held to 2 instances on purpose — search phrasing, not prose
work injury attorney1775.626,60038$62.8811=META-ONLY — best average position on the page. Retained in the new title for exactly that reason
work accident lawyer1377.465,40026$77.7111=TOP CLICK-EARNING QUERY — 1 of the page's 7 clicks
spanish speaking workers compensation attorney13846.6270901+1English query about bilingual service — never stated in EN copy. Was ranking position 46
workers compensation attorney coral gables13916.66404$24.5600=Coral Gables cluster = 33 queries / 2,324 imp / 0 clicks — biggest untapped geo
hialeah workers compensation lawyer10614.70904$36.8600=KD 4 at $36.86 CPC — easiest high-value geo win on the board
miami denied workers compensation claim attorneys8920.19001+1CANNIBAL — the sibling page owns this. Handled with a handoff link, not with copy
workers compensation doctor miami6921.2670100=«workers comp doctor + neighbourhood» = 91 queries / 2,147 imp / 0 clicks — answered in Round 6 as WHO IS AUTHORISED
how much does a workers comp lawyer cost03200$10.6200=KD 0, the lowest in the dataset. Page now answers it — but as «how much a workers comp lawyer costs» (near-match, item m)
workers comp lawyer free consultation78.2932023$30.5300=14.29% CTR — the page's best-converting query band
workers' compensation (root term)65122+57density across headings, body and FAQs
workers comp mediation / Judge of Compensation Claims01100027+27KD 0 and unowned by any page on the site. Round 6's dispute-process section
Petition for Benefits2019+8the correct answer to «can I appeal my denial» — Round 9
authorized doctor / unauthorized doctor28+6Round 6's H2 #16, built on 2,147 impressions of measured demand
workers compensation claim1,00053$10.35819+11head term for the claim-steps section
impairment rating29+7statutory benefit mechanics, added Round 1 and extended Round 10
injured worker411+7body throughout
workers compensation settlement calculator048010$3.0702+2answered HONESTLY — by explaining why no calculator can price a claim
miami workers' compensation lawyer1937.9798−1apostrophe variant — same single cause as row 4
workers compensation attorney niceville fl26832.8800=NOISE — Niceville + Navarre ≈ 1,400 impressions from panhandle cities. No business value, unfixable
Full table: 201 rows, 41 up / 2 down / 154 unchanged / 4 marked n/a. Corpus, counted identically on both sides: articlemetas.cshtml <title> and every content="" value + article.cshtml visible copy + the 10 EN FAQ question/answer pairs. Razor comments, XML comments and the three JSON-LD blocks are EXCLUDED, so schema alternateName values are not double-counted as body density. «Was» is read from git show HEAD: on the same files with the identical matcher. Counts are substring counts, so a longer phrase also increments its shorter components — the rows are not mutually exclusive and must not be summed.
Two figures in the source report disagree, and the newer one is used here: the table legend still lists three decreases (rows 2, 4 and 125) from the Round 5 recount. That predates the recomputation run after Rounds 6–11 added ~2,700 words. At the row level as the table stands today there are exactly two decreases, both −1, both the same Round 2 CTR event. Open item (s) — a single re-run of the whole table with the corrected extractor would retire the discrepancy.
What the Data Says — 190-keyword gap set + 122 bulk keywords, measured against GSC
Cluster totals — GSC impressions vs SEMrush US volume
ClusterGSC impGSC clkSEM volumeKD rangeRead
Near-me2,748263,48011–55Huge market; the page had zero «near me» copy
Head commercial~9,0002328,48017–40Ranks position 8–10 and converts nothing
«Best / top»1,71301708–27Volume is small; the GSC impressions overstate it
Coral Gables2,324018010–16Low national volume, still 0 clicks at position 15
Workers-comp doctor2,14701200–1Wrong service — the firm does not provide doctors
Hialeah7970503–4Thin volume, trivially easy KD
Miami Beach6310906Thin volume
Fort Lauderdale37306009–33Real volume — deserves its own page, not this one
Informational H2s~5010,0500–63See the correction below
Free consultation22133023Small volume, best CTR band on the page
A correction to this report's own earlier read. An earlier version concluded the informational H2s «earn no search demand». The GSC half of that is still true — retaliation, permanent restrictions, reporting deadlines, third-party claims and the four disability-benefit H3s return essentially zero impressions. But SEMrush shows the demand exists: 10,050 monthly US searches across that cluster at a median KD of 13, several terms at KD 0–2. The correct conclusion is not «no demand» but «real demand this page fails to capture». Those sections are under-optimised, not pointless — and that reversal is what justified Rounds 6, 8, 9, 10 and 11. Search Console is the wrong instrument for finding heading gaps: a page earns no impressions for topics it does not cover, so zero impressions measures absence of RANKING, not absence of demand.
Biggest opportunities by volume-to-difficulty ratio
  • workers compensation lawyer near me — 12,100 vol / KD 11. THE standout. Page had no «near me» copy at all
  • workers comp attorney — 22,200 vol / KD 25 / $36.86. Ranks 8.7 in GSC via variants only
  • work accident attorney — 2,900 vol / KD 24 / $77.71 CPC. Highest-CPC tier
  • workers compensation law firm — 2,900 vol / KD 19. H2 #13 already covers it
  • how much does a workers comp lawyer cost — 320 vol / KD 0. Zero fee content existed on the page
  • construction accident lawyer miami — 70 vol / KD 3 / $137.58 CPC, the highest in the entire dataset
  • back injury at work · slip and fall at work — 590 vol each at KD 1–2. Listed as bullets only
  • Nearby-city geo — 710 total volume but KD 6–22 and ~5,500 GSC impressions already landing at positions 10–20. CHEAP TO WIN, SMALL CEILING — a paragraph each, not separate pages
Demand that is structurally unconvertible, and was NOT chased. ~2,147 impressions across 91 queries are «workers comp doctor + neighbourhood» — demand for a service the firm does not provide. ~1,400 more come from Niceville and Navarre, panhandle cities outside the service area. Fort Lauderdale (600 volume) is real but belongs on its own page; this Miami URL ranks 33–47 for it. The doctor cluster was answered anyway, but reframed: every sentence in the Round 6 section is about WHO IS AUTHORISED to treat you and what to do when authorisation is refused — never implying the firm supplies medical care. Same framing rule as FAQ 3.
Content Changes — 14 rounds · body 2,520 → 6,858 words · 14 H2 + 7 H3 → 18 H2 + 13 H3
En/article.cshtml  ·  41 balanced Razor provenance comments — one per edit, each stating WHAT / SOURCE / KEYWORDS REINFORCED
New sections STRUCTURE
  • #heading-15 · What does a workers' comp lawyer cost? — the page carried ZERO fee, cost or contingency content. s. 440.34's 20/15/10/5 schedule, Castellanos striking the mandatory cap, JCC approval, carrier-paid fees
  • #heading-16 · Who is the authorized doctor? + 3 H3 (488w) — the strongest evidenced gap: 91 queries / 2,147 impressions already arriving at positions 20–45 with nothing to land on
  • #heading-17 · The dispute process + 3 H3 (432w) — «workers comp mediation» is 110 vol at KD 0 and no page on the site ranked for it
  • #heading-18 · Steps in a claim: who does what, and when (560w, 7 ordered steps) — the page stated every duty and never once showed the SEQUENCE
  • H3 · Can you appeal a denied claim? (370w) — «appeal» appeared 0 times on this page and once site-wide; «First District Court of Appeal» nowhere at all
  • H3 · Does working while your claim is open affect benefits? (400w) — the mechanics were covered; the behavioural question a worker actually types was not
  • H3 · How long does a Florida claim take? (500w) + the page's first <table> — 9 rows × 4 columns: Stage | Who acts | Deadline set by law | Florida average 2024-25. STRONGEST GEO ASSET ADDED
The two facts in the steps section that do the persuasive work
Steps 2 and 3 belong to the EMPLOYER and the CARRIER, not the worker — the employer must report to its carrier within 7 days of actual knowledge, under civil penalty of up to $500 per failure, and the carrier must mail the informational brochure within 3 business days. Neither fact appeared anywhere on this site before Round 8. They convert a passive reader into a caller: a worker who reported an injury and then heard nothing now has a concrete, checkable reason to believe something went wrong, and a named party at fault for it. Step 5 does the same job for a worker who IS being paid — s. 440.20(4) lets a carrier pay and keep investigating for 120 days without waiving its right to deny. Receiving a check is not the same as having the claim accepted, and nobody tells them.
The claim-timeline table — what was deliberately left blank matters more than what was filled in
Source: OJCC 2024-25 Annual Report (8.7 MB PDF, 325 pages, mandated by s. 440.45) — downloaded and read in session, HTTP 200 re-verified after the edit. Average days to mediation 85 (statutory 130) · to trial 174 (statutory 210) · trial to order 19 (statutory 30) · 79,039 petitions filed · 35.80% of mediations settle all issues. THE DISTINCTION THAT MADE THE SECTION WORTH WRITING: a statutory deadline is a LIMIT, not a duration. The page told readers mediation must happen within 130 days. The state's own data says it actually happens in 85. Publishing both columns side by side is the whole value, and almost no competitor page does it. Five rows read «Not published», on purpose. The instruction asked for the average time until the process is finished. THAT NUMBER DOES NOT EXIST IN ANY PUBLISHED SOURCE — the OJCC measures only the litigated phase, and most claims are never litigated. An invented end-to-end average would be unsourceable on a page that already carries a past-results disclaimer, and is exactly the figure a competitor or a Bar complaint would attack. The prose says plainly that «anyone quoting you a single figure for the whole process is estimating». The gaps are the honest answer, and saying so is itself a credibility signal. A discrepancy inside the source was resolved rather than ignored: the report says 87 days in its executive summary and 85 in its Statutory Measures section; two of three places plus the trend graph say 85, so 85 was used — and the Razor comment tells the next editor to check BOTH places.
Round 1 — statutory substance added where the page named categories without stating what they pay
  • Benefit rates — TTD 66 2/3% (80% for six months in catastrophic cases) · the TPD formula · IIB at 75% of the TTD rate · PTD 66 2/3%. s. 440.15(1)–(4)
  • The 30-day rule was not absolute — four statutory exceptions added (s. 440.185(1)(a)–(d)). Presenting the deadline as absolute could discourage a worker with a late-reported but still viable claim from calling
  • Uninsured employers — real thresholds (construction 1+, non-construction 4+, agriculture 6/12) and the real consequence: the worker may ELECT to sue in tort, and the employer loses the fellow-servant, assumption-of-risk and contributory-negligence defences
  • Retaliation — s. 440.205 named for the first time; the section described retaliation without naming the law prohibiting it
  • Video schema bugthumbnailUrl held the literal placeholder «VIDEO_ID». It is a REQUIRED VideoObject property, so the placeholder was invalidating video rich-result eligibility FIXED
  • An unverifiable statistic was removed, not kept. The «49,304 lost-time claims» tile could not be verified against any independent source — the only page on the open web containing it was this page itself, a circular citation. Replaced with the statutory 66 2/3% wage-replacement rate, which is verifiable and is the figure workers search for most. REMOVED
Round 6 edit 28 — a section retitled the same day, after review REFRAMED
«What Happens After a Denial: Mediation and the Judge of Compensation Claims»«The Florida Workers' Compensation Dispute Process: Mediation and Hearings» A contradiction inside one round. The cannibalisation sweep correctly identified that the denied-claims sibling owns the denial topic, and the section's CONTENT was scoped to avoid it — measured at 0% overlap. But the HEADING still led with «After a Denial», the sibling's entire subject by name, sitting immediately after this page's own H2 #9 on denial reasons. The content collision was avoided; the framing collision was walked straight into. Reframing rather than deleting was right because no page on the site owned «workers comp mediation» (110 vol / KD 0), and moving it to the sibling would have put a KD 0 term on a page that ranks ~20 instead of 8–10. SIDE BENEFIT: the new opening is more accurate — disputes are not only denials. TRADE ACCEPTED: the old H2 exact-matched a real query shape and the new one does not. The sibling should own denial queries.
Drafting correction made before commit — recorded because it should not survive review
The first Round 10 draft closed with «Our workers compensation attorneys and Miami workers comp lawyer team review these offers…» — three commercial phrases stacked in one sentence, and «Miami workers comp lawyer team» is not English. Chasing the keyword instruction produced copy that would read as spam to a human and as low quality to a ranking system. Rewritten to carry two phrases in natural syntax. The standing instruction is to reinforce valuable keywords, not to reach a count at the cost of the prose. Related and recorded honestly: «workers compensation lawyer miami» carries 481 GSC impressions at 0 exact occurrences — its word order cannot go into English prose without reading as spam, so «workers compensation lawyer in Miami» was used and the exact-match count remains 0. Open item (m).
Compliance — Fla. Bar Rule 4-7 DISCLAIMER ADDED
A past-results disclaimer was added beneath the $135,250 settlement figure, per Rule 4-7.13(b)(2). Stated honestly: enforcement as to truthful past results was enjoined in Rubenstein v. The Florida Bar (S.D. Fla. 2014), so this is precautionary rather than strictly required, and is removable. The fee section states the s. 440.34 schedule AS LAW and notes fees require judicial approval. It does not quote this firm's price, does not promise a result, and does not use «no fee unless we win» phrasing. Consistent with the decision to omit priceRange from the Service JSON-LD. Open item (a): the fee wording is deliberately non-committal about this firm's own arrangement and now appears in TWO places — #heading-15 and FAQ 9. Both need Gallardo's actual terms.
FAQ Roster — 8 → 10 of 10 slots · 533 → 1,240 words
The constraint that governs this file: ServicePageSkin.cshtml renders Model.FAQs.Take(10), and .Take(10) does not sort — it takes XML document order. A valuable FAQ appended past the tenth entry never renders and nobody notices. The roster is now FULL at 10: any future FAQ must REPLACE an entry, not extend the list.
App_Data/FaqEntities.xml  ·  language="en"  ·  10 of 10 slots · 1,841 FAQEntity nodes site-wide, all others untouched
Final roster — 10 questions, each anchored to a statute
1[47w] How long do I have to report a work-related accident to my employer?
2[61w] How long do I have to file a workers' compensation claim in Florida?
3[115w] Can I change doctors in my workers' compensation case? EXPANDED s. 440.13(2)(f) — the 5-day carrier deadline and what happens when it is missed
4[152w] Can I appeal a denied workers' compensation claim in Florida? RETITLED + REWRITTEN IN PLACE was «What should I do if my claim is denied?» — 89 imp at position 20.19, zero clicks
5[52w] What benefits can I receive after a workplace injury in Florida?
6[139w] Can I sue my employer after a work injury? EXPANDED s. 440.11(1)(b) intentional-tort exception
7[144w] What if my employer does not have workers' compensation insurance? EXPANDED statutory thresholds + the election right
8[54w] Do I need a lawyer for a workers' compensation claim in Miami?
9[200w] How much does a workers' compensation lawyer cost in Florida? NEW s. 440.34 · Castellanos — targets the KD 0 term
10[173w] How much does workers' compensation pay in Florida? NEW s. 440.15 — the most-searched figure in the topic
Two candidates deliberately rejected — recorded so they are not revisited without cause
  • «best workers compensation attorney in Miami» — would target 1,713 impressions across 48 «best» queries, all at 0 clicks. But a FAQ whose answer asserts this firm is the best is self-laudatory and a Rule 4-7 risk. The comparison guidance was written into #heading-15 instead, as neutral criteria a reader can apply to ANY firm
  • «workers compensation lawyer near me» — 12,100 vol / KD 11, the largest single gap in the table. Rejected AS A QUESTION because it reads unnaturally in question form and because Google answers that query shape with a local pack, not a FAQ snippet. Worked into FAQ 9's closing sentence instead, where it reads naturally
Three checks run before writing the new entries
1. Anti-duplication. FAQ 10 was the close call: existing FAQ 5 asks WHICH benefit categories exist; FAQ 10 answers HOW MUCH each pays. Distinct questions, distinct answers, no shared figures — checked explicitly rather than assumed.  ·  2. Rule 4-7. FAQ 9 describes the STATUTORY schedule as law and states that fees require judicial approval; no own price, no promised result, no «no fee unless we win».  ·  3. Structured-data value. FAQ 10's answer is also the target of the #wc-rate speakable selector, so 66 2/3% is now reinforced in three places: body copy, speakable node, FAQ. A rationale that no longer holds, corrected in the record: Round 3 partly justified the 10-slot roster on FAQPage rich results. Google deprecated FAQ rich results on 7 May 2026. THAT RATIONALE IS DEAD. The roster is still worth keeping at 10, but only for the reasons that survive: the FAQ text is part of the indexable corpus, it carries keywords the body cannot carry naturally, and Q&A is the format generative engines quote most readily. The structured data itself is now maintenance, not benefit — but do not remove it.
*** THE FAQ EXTRACTION BUG — WHY EVERY EARLIER FAQ COUNT WAS WRONG *** The Round 8 extraction script matched <FaqEntity … language="En">. The real markup is <FAQEntity … language="en"> — capital FAQ, lowercase «en» — and the question and answer are ATTRIBUTES (q="" / a=""), not child elements. Every filter missed, the FAQ corpus came back empty, and no error was raised because an empty string concatenates silently. It mattered because the corpus definition was set by explicit instruction («metas + content + FAQs»), so the figures were wrong against this report's own standard. Every corrected figure moved UP, none moved down — FAQs only ever add occurrences — so no Round 8 conclusion reversed. CHECK ADDED: the extractor now prints the FAQ count it found (expected: 10). A silent zero cannot recur unnoticed. NOT YET DONE: the main table's Was/Now columns from Rounds 5–6 were built with other scripts and have not been re-verified against this bug — open item (s).
Internal Linking & Cannibalisation — 330 EN pages audited · 11 links out · 8 links in · 1 title collision resolved
Rounds 7, 8, 12, 13, 14  ·  the page started with 0 on-topic internal links and 6 off-topic ones
The related-services block was pointing out of the cluster REPLACED
miami-car-accident-attorney · miami-rideshare-accident-lawyer · truck-accident-attorney-miami · motorcycle-accident-attorney-miami · miami-medical-malpractice-attorney miami-denied-workers-compensation-claim-attorneys · who-is-eligible-for-workers-compensation · what-does-workers-compensation-cover · what-is-a-worker-comp-injury · can-workers-return-to-work-after-injury  — RETAINED: slip-and-fall-attorney-miami, the one genuinely adjacent cross-practice link PartialServicesRelated.cshtml renders these as live anchors at the foot of the page, so the last thing a crawler read on this workers' comp page was six links into car-accident territory. Meanwhile five workers-comp siblings share this page's own category and NONE were linked — including the denied-claims page, which takes 89 impressions off this page as a competitor while receiving no link from it. All destinations verified in ServiceEntities.xml AND sitemap.xml before linking. SCOPING NOTE: four other pages share this identical block, so the replacement was scoped to this ServiceEntity only.
11 outbound links · 11 distinct destinations · 11 distinct anchors · 0 repeats · 0 self-links
Rules applied. Every link sits inside a sentence that already existed — no link-bait sentences were written to carry a link, and no «related pages» block was appended. All anchors distinct and descriptive; «miami workers comp lawyer» was never used as an anchor. The benchmark report's own log records repeated anchor text as a mistake it made, and that was avoided here. Every destination checked against ServiceEntities.xml for active="true" AND against sitemap.xml: 10/10 services + 1/1 blog post. No link was written from memory of a URL. One tooling note: linkcheck.py flags the blog destination as broken — FALSE POSITIVE, it only reads ServiceEntities.xml. Verified by hand.
Cannibalisation was measured before every new section, and it changed what got written — twice. Result across three neighbouring documents: 0 shared 6-word phrases, re-measured AFTER each edit, not only before. Round 6: the denied-claims sibling already owns the mediation → trial → judge narrative as its only substantive differentiator. This section took the statutory PROCEDURE and TIMELINE instead, which neither page owned, and links out to the sibling for the denial story. Term ownership afterwards (this page / sibling): judge of compensation claims 3/0 · petition for benefits 3/0 · authorized doctor 5/0 · mediation 9/2.  ·  Round 8: the blog post owns «how to file» by slug AND title tag, so the H2 was framed around WHO owes WHICH duty and BY WHEN, written as a 7-step SUMMARY that cannot outgrow the spoke, and linked out for the filing detail.  ·  Round 10, the highest risk of any round: the return-to-work sibling carries «Is It Possible For Injured Workers To Continue Working At The Same Company?» as an H2 — the first half of the question asked, word for word. THE SPLIT: the sibling keeps PERMISSION («can I keep working»), this page takes EFFECT («does working change my benefits»). «Keep working» and «continue working» are not written into the section at all.
Round 12 site-wide audit — 330 EN pages, read-only
  • 27 of 330 pages carry any workers-comp vocabulary. 3 were real problems
  • TIER 1 · strain-and-sprain-injury-lawyer-miami — its title tag contained «MIAMI WORKERS COMP LAWYER», this page's single biggest keyword. A 696-word page about sprains holding the same title phrase as the 6,858-word hub FIXED IN ROUND 14
  • TIER 1 · construction-accident-lawyer-in-miami — 27 shared 6-word phrases, the highest on the site, and it shares the «Work Injury Attorney» title element. But 6 of the 27 are one CTA sentence and the rest are comp fundamentals both pages legitimately need. Boilerplate collision, not two pages answering one question OPEN (y)
  • TIER 1 · 8 of 15 comp pages never linked to this hub — cannibalisation does its worst damage when no page is clearly signalled as the hub FIXED IN ROUND 13
  • 4 blog posts declare this page's commercial keywords in targeredkeyword. Verified inert: BlogPostPageSkin.cshtml renders <h1>@Model.Title</h1>, so on a blog post the attribute never reaches the rendered page. This overturned the audit's own first recommendation, which had ranked those four edits as the cheapest big win. Record-keeping only OPEN (x3), LOW PRIORITY
Round 13 — 8 inbound links added. This page was not touched. 7 / 15 → 15 / 15
8 distinct anchors, 0 repeats, checked programmatically; none exact-match commercial; no collision with this page's own 11 outbound anchors; exactly one link per page — a second would look like a scheme rather than a reference. Each link sits inside a proposition the destination genuinely answers: gradual-onset reporting on the repetitive-trauma page, the «date you knew» problem on chemical exposure, the one-employee coverage threshold on the construction page. SCOPE-RULE REVERSAL, RECORDED DELIBERATELY: the standing rule is that edits stay on the page under work and problems elsewhere get reported, not fixed. This round reversed it on an explicit request, read narrowly — eight named files, links only. The three findings the user had declined or not asked for were NOT touched. A request to add links is not a licence to fix everything else on a page while inside it.
Round 14 — the title collision RESOLVED
«Strain and Sprain Injuries - MIAMI WORKERS COMP LAWYER | Gallardo Law Firm» (74 chars) → «Strain and Sprain Injury Lawyer Miami | Gallardo Law Firm» (57 chars) Two title tags on one domain competing for one query splits the signal, and a 696-word page about sprains is not the one that should win 2,501 impressions. Nothing of that page's own subject was surrendered — only the phrase belonging to another page — and at 57 characters it now displays in full instead of truncating. SECOND PROBLEM FOUND WHILE IN THE FILE: og:title and twitter:title were a THIRD variant, so the page presented three different titles to three different consumers. All three are now identical. SITE-WIDE RE-SCAN after the fix: every live title across 158 service pages + 172 blog posts re-checked — exactly one page now holds the phrase, this one.
An honest note about how the collision survived so long. It PREDATES this workstream — at git HEAD both titles already carried «Work Injury Attorney», and the strain-and-sprain title already carried the comp-lawyer phrase. It was not created here. But this page's title was rewritten in Round 2 without a site-wide uniqueness check, and this audit is the first time one was run. RULE ADOPTED: a title rewrite includes a site-wide uniqueness check for every phrase in it, before the rewrite ships — not two rounds later.
JSON-LD Schemas — the page had NONE; 3 added, all cross-referenced by @id
3 blocks, wired to one entity. provider on the Service references the firm by @id, so the Service, the WebPage, the BreadcrumbList and the skin's own LegalService all resolve to a single entity rather than four disconnected islands. All 3 parse as valid JSON; all 3 speakable selectors resolve against ids that exist in the markup.
Block 1
BreadcrumbList
Fields — 3 levels
position 1Home
position 2Personal Injury → the LIVE hub (personal-injury-lawyer-in-florida), because /injury-law has no landing page of its own
position 3Miami Workers' Compensation Lawyer
Notes
  • Destination verified present in BOTH ServiceEntities.xml AND sitemap.xml before linking
  • That URL is not an href, so any audit that only scans href attributes skips it. Verified separately
Block 2
WebPage + Speakable
Fields
speakable#wc-intro · #wc-definition · #wc-rate — all three ids were ADDED to the markup in the same round; the selectors would otherwise have pointed at nothing
#wc-ratethe 66 2/3% paragraph — the direct answer to «how much does workers comp pay», the most-searched figure in this topic
breadcrumbcross-reference to the BreadcrumbList node
Decisions
  • The speakable list is held to THREE selectors: one covering half the page stops being a signal
  • The visible review stamp is STATIC on purpose and must always match dateModified — it records when a HUMAN last verified the legal content against Chapter 440, not when the file was touched. Deliberately NOT @Model.GetLastModifiedDate
Block 3
Service
Fields
alternateName7 values, all MEASURED not invented: Miami Workers Comp Lawyer (2,501 imp) · Workers Compensation Lawyer (74,000) · Workers Compensation Attorney (60,500) · Workers Comp Attorney (22,200) · Work Injury Lawyer (14,800) · Work Accident Attorney (2,900, $77.71) · Workers Compensation Law Firm (2,900)
areaServed11 values — the geo terms the page already earns impressions for: Coral Gables 2,324 · Hialeah 797 · Miami Beach 631 · Miami Gardens ~370 · Homestead · Doral · Tamiami · Aventura · Miami Lakes
hasOfferCatalog10 Offers, reusing claim types ALREADY in the page copy
priceRangeNONE, ON ANY OFFER — Fla. Bar Rule 4-7 fee risk
Why priceRange matters MORE here
  • This page now carries an attorney-fee section. The s. 440.34 schedule is described in prose AS LAW and must not be restated as this firm's price in structured data
Block 4
FAQPage (skin microdata)
Coverage
1010 EN questions, wrapped by ServicePageSkin.cshtml
NO FAQPage node was added in the article — it would duplicate the skin's
Rule
  • New FAQs go in FaqEntities.xml, NEVER in article.cshtml
  • Rich results for FAQPage were deprecated 7 May 2026. The markup stays — it is valid, it is just no longer a SERP feature
Bug fixed
VideoObject thumbnailUrl held «VIDEO_ID»
  • The literal placeholder string was shipping in a REQUIRED property, invalidating video rich-result eligibility. Replaced with the real YouTube id o1iTXN1Dbq4, taken from embedUrl on the same node rather than from memory.
  • Found in Round 1, before any content work — the cheapest fix in the whole workstream and the only one that was purely technical.
  • Open defect
    Taxonomy disagrees with itself
  • The ServiceEntity category is workers-comp, the URL is /injury-law/, and all ten FAQ entries are tagged Category id injury-law. Three names for one thing.
  • DO NOT CHANGE THE URL. It holds the page's entire ranking history — 40,650 impressions and every anchor id that GSC has accumulated. Open item (k) is a records fix, not a routing fix.
  • Measurement Discipline — every extraction bug found in this workstream, including the one that invented a defect
    Three extraction failures, and the third was the serious one. The first two under-reported. The third INVENTED A CRITICAL DEFECT in a client's live site and reported it as the highest-value fix available. All three produced clean, plausible, internally consistent output — which is exactly why they survived.
    Rounds 5, 8 and 12  ·  recorded in full because the rules adopted from them apply to every future page
    Round 5 — three bugs in the Round 4 keyword counts ALL FIXED
    BUG 1 · truncated keywords produced junk counts (HIGH). The KEYWORD column was hard-truncated to 48 characters, cutting six composite rows mid-word. The matcher then split those rows on their separators and counted the FRAGMENTS as terms. One row's final fragment was the two letters «Co», which match 290 times in the corpus — compensation, cover, contact, construction. That single fragment is the entire reason a row read 194 → 296 (+102); corrected, it reads 8 → 13 (+5). FIX: full keyword text restored, column widened to 56, and fragments shorter than 4 characters are now rejected outright. BUG 2 (MEDIUM): four rows were page furniture, not keywords — a person entity, a case-result figure, a statistics block and CTA button copy — and counting them implied an SEO value they do not have. They now read n/a; 197 of 201 rows carry a real count. BUG 3 (LOW, self-inflicted): the first repair attempt wrote three values into one table field, producing rows with 18 fields instead of 16. Caught by a field-count assertion, not by eye — every row is now verified at exactly 16 fields.
    Round 12 — the retraction FINDING WAS FALSE
    CLAIMED: six pages in this cluster share one H1 string, «Miami workers compensation lawyer», which would explain why the five spokes have never ranked. Reported as CRITICAL and as the highest-value fix available anywhere on the site.
    TRUE: nothing of the sort. Verified with a real XML parser across all 155 service entities carrying a targeredkeywordZERO share a value with any other page. The user caught it by opening the pages in a browser and seeing six different H1s. THE BUG: the script located each entity with find('id="<slug>"') and walked backwards with rfind('<ServiceEntity', 0, i). But the FIRST occurrence of those slugs in the file is not each page's own entity — it is inside the HUB's <ServicesRelated> block, the cross-reference list added in Round 2 by this very workstream. So rfind walked back to the hub's own tag and returned the hub's keyword for every one of them. The five «duplicates» were exactly the five siblings put into ServicesRelated in Round 2. The pattern was not a finding. It was the shape of my own edit reflected back at me — which is precisely why it looked so clean and so alarming. A single ET.fromstring parse, one command, would have caught it. A related regex bug in the same round required targeredkeyword="…" with no spaces while the XML is written with spaces around the equals sign, so every service page matched as empty and the truth reported was the exact opposite of the fact.
    Rules adopted ADOPTED
    • Parse XML with an XML parser. Never locate a record with find/rfind over raw text
    • Validate every extractor against a known-good example that MUST return a non-empty, correct value before any output is trusted
    • A surprising result is a reason to verify harder, not to report faster
    • Before reporting a defect on a LIVE page, confirm it the way the user would see it — open the page
    • A title rewrite includes a site-wide uniqueness check for every phrase in it — the Round 12 title collision existed for two rounds because the Round 2 rewrite skipped one
    One more finding recorded rather than fixed, because the user declined it. While checking for cannibalisation, the sibling can-workers-return-to-work-after-injury was found stating flatly: «An employer can't fire you. It's simply illegal». Florida is an at-will state — s. 440.205 prohibits discharge IN RETALIATION FOR a claim; it does not make an injured worker unfireable for other lawful reasons. The same page also garbles the TPD threshold. This page states both rules correctly, in H2 #10 and H2 #5. The user instructed «do not touch the sibling page», so it was NOT fixed and will not be as part of this workstream. Recorded here so the finding is not lost if that page is revisited by someone else. CLOSED — user declined the fix.
    Validation — RESULT: NO BROKEN LINKS, NO ORPHAN ANCHORS, NO MALFORMED XML
    Run after every round · final state after Round 14
    ✓ Verified
    • 18/18 H2 ids · 18 TOC entries · 0 orphans · 0 duplicates
    • 11/11 internal links resolve — 10 services active="true" in ServiceEntities.xml + sitemap, 1 blog post in BlogPostEntities.xml + sitemap
    • 24 visible external citations · the 9 checked in Round 2 returned HTTP 200 · the OJCC PDF re-verified 200 after the edit
    • 3/3 JSON-LD blocks parse as valid JSON · 3/3 speakable selectors resolve against real ids
    • 41/41 Razor comment pairs balanced · 121 <li> pairs · 24 <div> pairs · 13 <h3> pairs
    • FaqEntities.xml + ServiceEntities.xml well-formed · 1,841 FAQEntity nodes site-wide unchanged — no other service lost an entry
    • Table: 1 <table> · 10 <tr> · 4 <th> · 36 <td> · every row exactly 4 cells · wrapped in overflow-x:auto so it scrolls inside its own container on mobile
    • Cannibalisation: 0 shared 6-word phrases with the denied-claims sibling, the return-to-work sibling, and the how-to-file blog post — re-measured AFTER each edit
    • Site-wide title re-scan across 158 service pages + 172 blog posts: exactly ONE page holds «miami workers comp lawyer»
    ⚠ Caveats worth knowing
    • The cannibalisation analysis is a TEXT analysis. Declared limit, same as the benchmark report: it cannot see a page that receives workers-comp impressions while carrying thin content, and it does not measure what Google actually chose to rank
    • linkcheck.py reports the blog destination as broken — false positive, it reads only ServiceEntities.xml. Do not «fix» the link
    • The main table's Was/Now columns from Rounds 5–6 have not been re-run against the corrected FAQ extractor and may understate FAQ occurrences (item s)
    • The five workers-comp siblings run 312–1,044 words and now receive link equity they may not yet deserve. That is an argument for building them out, not for withholding the links (item j)
    • At 18 H2s the page is heading-heavy against a benchmark that runs 10 H2 + 7 H3. Merging Permanent Restrictions (87w) and Settlements (84w) — closely related, since restrictions drive settlement value — is worth more now than before (item o)
    • Zero <img> elements across 6,858 words. The new table covers part of what images were wanted for — visual break, scannability — but there are still no images (item r)
    Status — Done vs Open
    Final verification 2026-08-14  ·  14 rounds  ·  4 files on this page + 9 other pages edited in Rounds 13–14
    ✓ Done
    • CTR pass: title 76 → 47 chars, description rewritten to 150, 903×530 social image, title = og:title = twitter:title
    • 4 new H2 sections + 6 new H3s, every deadline read from the statute in session
    • The page's first ordered list and first table, both built for extractability
    • FAQ roster full at 10, FAQ 4 retitled in place to match the query people actually type
    • 11 outbound links, 8 inbound links, related-services block moved into the cluster
    • 3 JSON-LD blocks cross-referenced by @id, no priceRange anywhere
    • Title collision on strain-and-sprain resolved; one page now owns the phrase
    • An unverifiable statistic removed rather than kept; a video-schema placeholder fixed
    ⚠ Open — needs a decision or a re-run
    • (a) Fee wording is non-committal in TWO places — #heading-15 and FAQ 9. Needs Gallardo's actual fee arrangement FIRM DECISION
    • (h) Brand dropped from the title. Quantified, reversible, previous title preserved in a comment FIRM DECISION
    • (d) The past-results disclaimer is precautionary — confirm with compliance counsel FIRM DECISION
    • (u) The best remaining win. «workers compensation lawyers» (898 imp / 33,100 vol) and «workers compensation attorneys» (734 / 27,100) are now well represented in body copy at 6 and 5 — but absent from the title, the description and every H2, which is where CTR is actually decided
    • (m) Five keywords are present only as near-matches — «how much does a workers comp lawyer cost», «workers comp lawyer free consultation», «best workers compensation attorney miami», «construction accident lawyer miami», «employer retaliation workers compensation». Four are KD 0–23, where exact match is cheap. The clean fix is FAQ 9's question wording
    • (q) The blog post needs work, and this round made that more urgent. how-to-file-a-workers-comp-claim-in-florida promises steps in its title, delivers none in 804 words, and declares «Miami workers comp lawyer» as its target — a directly declared conflict with this page that costs nothing to fix
    • (n) The denied-claims sibling's «Fighting a Denial» section should be rewritten. 407 words; mentions appeal, JCC, Petition for Benefits and the 30-day rule zero times each, and now sits beside a hub covering all four. Overlap is 0%, so this is a quality gap, not a conflict
    • (c) The 49,304 statistic can be restored if located in the DWC report with a table and page citation. The 325-page OJCC report downloaded in Round 11 is a promising lead
    • (g) «Lost-time claim = 8+ days missed» — Florida's own definition, used on the page as a concept but never defined
    • (y) construction-accident-lawyer-in-miami still shares the «Work Injury Attorney» title element and 27 CTA-boilerplate phrases. Weaker than the collision already fixed — that phrase is a secondary element here, not the lead
    • (p) 4 heading candidates remain unwritten pending SEMrush volumes: pain and suffering (the Florida answer is NO, and it bridges to third-party claims), MMI + impairment rating, «how much is a case worth», light duty
    Standing instruction, recorded 2026-08-13: every change made to this page is logged in miami-workers-compensation-lawyer-improvements.txt as a matter of course, without being asked. Each round gets its own CHANGE LOG section appended below the previous one, in the established format — numbered edits continuing the existing sequence, with WHAT changed, the SOURCE or rule relied on, the KEYWORDS reinforced with their volume/KD data, the validation run, and the updated open-items list carried forward.