A restructuring is often decided weeks before it is reported. In between it leaves traces that anyone can read: new postings stop, open roles close without being replaced, and sometimes a regulatory disclosure or a newsroom item says so. This guide turns those traces into a screen over a set of companies. It names the datasets and columns that carry them, shows how to order the evidence, and lists the look-alikes that cause false alarms.
The pattern in postings
Three measures in Hiring Activity (company_hiring_daily) carry the hiring side. open_postings is the number open at the end of the day. new_postings counts postings seen opening that day, and a posting already on a board when a company enters the record sets the baseline and is not counted as new. closed_postings counts postings that left the board that day, each recorded once its removal is established.
A cutback shows in all three together: new postings fall against the company's own recent level, closings run above openings, and open postings decline. Any one alone is common and harmless. A company that finishes a hiring round closes many postings and keeps opening others. A company that freezes hiring opens none, yet may leave its open roles up for weeks. The mix says where the cut falls: by_function and by_seniority show which open postings are going, and Sales Team Metrics (company_sales_weekly) shows the sales side through open_sales, new_sales and closed_sales.
with d as (
select
c.company_id,
c.isin,
c.day,
c.open_postings,
sum(c.new_postings) over w as new_28d,
sum(c.closed_postings) over w as closed_28d,
p.open_postings as open_28d_ago
from company_hiring_daily c
left join company_hiring_daily p
on p.company_id = c.company_id
and p.day = c.day - 28
window w as (
partition by c.company_id
order by c.day
range between interval '27 days' preceding and current row
)
)
select company_id, isin, day, open_28d_ago, open_postings, new_28d, closed_28d
from d
where open_28d_ago >= 20
and open_postings <= 0.75 * open_28d_ago
and new_28d <= 0.5 * closed_28d
order by day desc;The thresholds, a quarter fewer open postings in 28 days and new postings at most half of closings, are starting points to test on the companies you track, and each company's own recent level is the baseline they are measured against. Every row is dated, so a threshold can be tested over any period you choose and tuned on your own list.
Run the screen on closed days only. Daily rows are written once, after the day closes, so a row exists only once its day is over. A test that uses a row on the day it describes uses information nobody had then.
Run it at two levels. At the company ID, company_id, it shows a cut at one brand, which a group total dilutes. At isin it shows the group, because a brand carries the identifiers of its listed parent. A brand that is being wound down shows at the first level and may not show at the second.
Read a company against its sector before you read it alone. If the Market Series (market_series) rows for hiring_closed and hiring_new in its industry or size band turn at the same time, the company is following the market, and sector hiring trends for macro and thematic research explains how to read those series.
The announcements that confirm it
Company News (company_news) carries the company's own statements, newsroom items and regulatory disclosures, classified into 13 event types. Three kinds matter for a restructuring.
- Restructuring. The type
layoffs_restructuringinevent_types. A newsroom item receives it from a model undernews-v1. A regulatory disclosure receives it from Item 2.05, costs associated with exit or disposal activities, without a model. - Leadership. The type
leadership_change, with the role inroles. A departure of a finance or operating leader, such ascfoorcoo, is worth a look beside the hiring pattern. Each leadership change is delivered as the role concerned and the direction, appointed or departed. - Deals. The types
acquired_or_mergedandacquisition_made, which a disclosure carries under Items 5.01 and 2.01. Integration after a deal closes duplicate roles for reasons that are not distress, so these rows help you rule a false alarm out as much as in.
Item 2.05 is the specific one. A company files it when it commits to an exit or disposal plan that will bring material charges, and Fokals maps it from the item number with no model. Newsroom wording varies, so read the excerpt of a layoffs_restructuring row before you count it.
Which comes first varies. A posting pattern can lead the announcement by weeks when a company cuts quietly, and trail it when a plan is announced before it is carried out. Do not assume an order. Line the two up on the companies you track, as event-driven research with regulatory disclosures and newsrooms does for timing between a newsroom and a disclosure.
A fourth source is not an announcement but corroborates one. Technology Changes (company_tech_events) records changes on the company's own website, and a retreat can show there: a market dropped from the site's declared alternate versions (category of market and change of removed), or a key page such as careers removed (category of page).
Putting the evidence in order
The sequence below is illustrative, for the invented company Acme Robotics. Postings give the first signal, the sales view corroborates it, and the announcements arrive last. In another company the order could be reversed.
| Day | What the data shows | Dataset |
|---|---|---|
| 0 | 410 open postings; the last 28 days had 71 new and 40 closed | Hiring Activity (company_hiring_daily) |
| 28 | 306 open; the last 28 days had 14 new and 118 closed; the screen fires | Hiring Activity (company_hiring_daily) |
| 35 | Open sales postings fall from 48 to 31 | Sales Team Metrics (company_sales_weekly) |
| 41 | A newsroom item typed layoffs_restructuring | Company News (company_news), source of page |
| 44 | A regulatory disclosure under Items 2.05 and 5.02, role cfo, direction departed | Company News (company_news), source of sec_8k |
The screen fires 13 days before the newsroom item and 16 days before the disclosure. One case proves nothing, so measure the lead on the companies you track before you rely on it.
False alarms
| Look-alike | What it does to the series | How to tell |
|---|---|---|
| A move to a new job board | Old postings close, and the same roles reappear as first-seen postings that are not counted as new | open_postings returns to its level within days, and board_platform in Job Postings (job_postings) changes |
| A hiring round that finishes | Many closings | new_postings stays near its usual level |
| Integration after a deal | Postings consolidate onto the acquirer's board | An acquired_or_merged or acquisition_made row in Company News, such as Item 5.01 or 2.01 |
| Seasonal clearing | Closings bunch in the same weeks of each cycle | The industry's hiring_closed series in Market Series turns at the same time |
| Evergreen roles | A standing posting closes and reopens | Closings and new postings rise together while open_postings is level |
| A reorganisation that is not a cut | A newsroom item typed layoffs_restructuring | The excerpt, and items: Item 2.05 reports exit costs |
A move to a new applicant tracking system deserves the extra look because it can imitate a cut closely: closings spike and new_postings stays near zero, since postings first seen on a new board are not counted as new. What gives it away is open_postings, which holds level because the same roles are open on the new board.
Ranking the hits
A screen over a long list returns more companies than anyone can read, so rank them. Count the independent legs that agree: the hiring screen, a fall in open sales postings, and an announcement of the restructuring kind. A hit with one leg is a note, a hit with two goes on the review list, and a hit with all three has been announced, so read it for scale and not for news. Within a leg, rank by the size of the fall in open_postings and by how many functions it spans: a cut across by_function is a different event from one function closing out a project.
How to read the screen
A posting records an intention to hire, and a closing records that a role left the board, so the screen reads what a company does in public: roles advertised and roles withdrawn. A company that recruits mainly through agencies publishes fewer roles, and its screen is read against its own level. A company with a job board shows its hiring in full; a company without one is read through its announcements. Newsroom types come from a named model version, and disclosure types follow their items, so read the excerpt of any row you count.
Stated headcount confirms a reduction. Employee Headcount (company_headcounts) delivers stated headcount over time, so a fall in it confirms what the postings and announcements showed earlier. Treat a hit on the screen as a reason to look, then read the disclosure or newsroom item behind url.
How Fokals delivers it
The inputs are the hiring dataset, refreshed daily, and the announcements and scale dataset, refreshed daily to every three days. Both reach you through the REST API or as bulk files, so the screen can run as a scheduled query on your own database. Daily and weekly rows are written once after the period closes and never changed, so a screen re-run on a past date does not change its result. The same signals read for lenders are in company signals in credit research and counterparty monitoring.
Frequently asked questions
What is the earliest public sign that a company is restructuring?
Often a change on its job board: new postings stop, closings run above openings and open postings fall together. That can come before any disclosure or announcement, but not always, since some plans are announced first. Treat the hiring pattern as a reason to look, and confirm it with an announcement, a regulatory disclosure of exit costs or a later change in stated headcount.
Does a closed job posting mean the company filled the role?
Not necessarily. A posting is closed when it leaves the company's board, so a filled role, a withdrawn role and an expired posting look the same. That is why one closure carries little information and a pattern across many carries a great deal: closings above openings, with open postings falling.
Which regulatory disclosure reports restructuring costs?
Item 2.05, costs associated with exit or disposal activities. Fokals maps it to the restructuring event type from the item number, without a model, and keeps the text under the item as the excerpt. Item 5.02, which covers departures and appointments of certain officers, maps to the leadership change type, delivered as the role concerned and the direction.
How do you tell a hiring freeze from a change of job board?
Look at open postings. After a move to a new board the same roles reappear, so open postings return to their earlier level within days, and the board system recorded in Job Postings changes. In a real freeze open postings stay low or drift down while new postings stay near zero.
Can job postings data flag layoffs?
It flags companies worth a closer look. A posting pattern shows what a company advertises and withdraws, and a screen on it gives you a ranked list with the dated evidence behind each name. Test any rule on dated data, using only rows you could have had on each day, and expect look-alikes from board changes, seasonal clearing and integration after an acquisition.
The queries and code on this page are examples to adapt. Test them in your own environment before you rely on them.