The Layoff List Florida Publishes and Nobody Reads
Watches Florida's state layoff filings every week and logs every notice affecting 50 or more workers
The Problem
Before a company runs a mass layoff or closes a site, federal law makes it file advance notice with the state. Florida publishes those filings on a state web page that has no feed, no alerts, and no export. If you want to know which employers are about to cut staff, you have to remember to go look, read an HTML table, and keep your own history. Nobody does that reliably, so the information sits in public and nobody uses it.
What It Does
Every Sunday morning it pulls the current year's Florida WARN list straight off the state site. It reads the HTML table into clean rows: employer, site address, city, ZIP, the date the notice was filed, the planned layoff window, headcount, industry, and a direct link to the employer's own filed PDF. It drops anything under 50 employees. It fingerprints each notice by company, dates, headcount, and location so the same filing never gets logged twice, then writes the rows into a Google Sheet. The sheet adds a calculated status for each row, complete, in progress, or upcoming, color coded, plus a legend tab explaining what each field means and what it does not mean.
Anyone whose business turns on knowing that a few hundred people in a specific city are about to lose their jobs. Recruiters and staffing firms, real estate operators watching a local market soften, commercial landlords, and lenders.
Outcome
The pipeline was backfilled in one run and has run weekly since, holding 32 notices covering 8,358 named employees across 26 employers and 22 Florida cities. It was built as a proof of concept and was never put in front of a buyer, so there is no revenue or usage number attached to it.
Screenshots


How It's Built
Four functional nodes plus a sticky note holding the source and ledger links. A schedule trigger fires the run. An HTTP request fetches the state's WARN list for the current year with a browser User-Agent and a 60 second timeout, returning raw text rather than parsed JSON. A single JavaScript node does all the work: it walks the HTML table row by row with regex, splits each company cell into name, street, city, state, and ZIP, normalizes MM-DD-YY dates to ISO, pulls headcount and NAICS industry, and rebuilds the attachment link from the hidden form field behind the site's Download button so the employer's actual filed PDF is reachable by URL. The same node builds the dedupe key, filters to notices of 50 or more employees, and collapses duplicates inside the batch. A Google Sheets node appends or updates on that key. Two guards sit in front of the write: the run throws if zero rows parsed, and it throws if the page's own 'N Record(s) found' count exceeds the number of rows parsed, which catches pagination or a layout change instead of silently logging a short list. The status column, the days-to-start column, the color rules, and the legend tab were built by hand in the sheet rather than in n8n, so the pipeline stays a capture pipeline and the presentation lives where the reader is.
By the numbers
- notices logged in the 2026 list
- 32
- distinct employers
- 26
- total employees named across logged notices
- 8,358
- headcount range per notice
- 53 to 2,529
- filing dates covered
- 2026-04-27 to 2026-08-28
- Florida cities represented
- 22
- capture cadence
- weekly, Sundays 03:34 Central
- build time once the source was found
- under 1 hour
- backfill runs needed to populate the ledger
- 1
Key Decisions
Filter to 50 or more employees
A threshold Ryan picked to mark which notices are significant enough to be worth logging.
Refetch the full current-year list every run instead of tracking only new rows
That is how the state delivers the data, so taking the whole list was simpler than trying to track a high-water mark.
Run Sunday at 03:34 Central
Nothing about this is time sensitive, so it goes on a weekend slot where there is no chance of colliding with anything else running on the instance.
Rebuild the attachment URL from the page's hidden form field instead of following the Download button
The button runs JavaScript that POSTs a hidden path value and then opens a download endpoint that echoes the same filename. Reading the hidden field directly gets the PDF link without driving a browser.
Include location in the dedupe key, not just company plus date plus headcount
One company files a separate notice per site on the same day, sometimes with identical headcounts. Spirit Airlines alone filed five in one day. Keying on company and date would collapse real, separate notices into one row.
Dedupe inside the batch before writing, on top of the Sheets match
The Sheets append-or-update node only matches against rows already in the sheet, so two identical keys arriving in the same run would both get appended.
Write the parser defensively against the state site's broken markup
The page emits `</br>` rather than `<br>`, and some rows glue the street address straight into the city with no break at all, for example `771 S. County Line RoadPLANT CITY`. The parser matches all three break spellings and splits at the point where mixed-case street text runs into an all-caps city name, so a layout quirk cannot write a garbage city into the ledger.
Throw when the page's stated record count exceeds parsed rows
A silent short parse is worse than a failed run. If the state adds pagination or changes the table, the run fails loudly instead of quietly logging a partial list.
Where else this applies
The shape is a weekly capture of a government list that has no feed, turned into a deduped, queryable history with the source document attached to every row. Most agencies publish exactly like this: a table on a page, current data only, no archive, no export. Once a list is captured on a schedule and fingerprinted, you own a time series the agency itself does not publish, and you can answer questions the page cannot, such as which employers filed more than once or how a county trends across a year. The same four nodes point at any state's WARN list, or at any other recurring public filing.