Use case

Company signals in credit research and counterparty monitoring

Public signals can flag a borrower under strain before the next report. This guide builds a watchlist from them and shows how to read each trigger beside your own credit file.

Updated 5 October 20267 min read

A credit analyst reads financial statements that arrive quarterly, covenant certificates that arrive on a schedule and prices that move daily. Between them is a gap in which a borrower's operations change and nothing in the file says so. This guide shows how to put dated public signals into that gap for listed issuers and private borrowers: what to watch, how to map your book to company records, how to run a weekly watchlist, and how to read each trigger. Fokals adds operating context to the credit data you already use.

What public signals add

Fokals records what a company does in public: the postings on its own job board, what its newsroom and its regulatory disclosures say, the changes on its website, and notices of private offerings. Every observation is dated, so a signal is a point-in-time fact you can place against a reporting date. Ratings come from rating agencies, payment histories from credit bureaux, and financial statements from the borrower and its filings. The signals sit beside them: earlier and coarser, they tell you where to look in your own file.

The same approach serves a procurement or treasury team watching suppliers and trading counterparties. The book is then a list of names and domains instead of a loan register, and monitoring supplier and vendor risk with public company signals covers that side.

Map the book to company records

Every dataset carries the company ID, company_id. For a listed issuer, find it once in listed_securities, which holds isin, lei, figi, ticker, mic and the company_id of the company each listing belongs to. A bond is often issued by a finance subsidiary or a holding company with its own LEI, and Fokals carries the identifiers of the listed company, with a subsidiary carrying those of its listed parent. Map the issuer to its listed parent first, and keep that parent in your table beside the issuer.

create table borrower_map as
select distinct b.borrower_id, l.company_id
from borrowers b
join listed_securities l on l.lei = b.parent_lei
where l.company_id is not null;

listed_securities holds one row for each listing, so one company can appear several times, which is why the pairs are taken as distinct. Check the match rate against your book before you rely on the watchlist: the borrowers that match are the ones the watchlist covers, and the match rate tells you how much of the book it reads.

For a private borrower, use the website domain: Technology Stack (company_technologies) and Web Traffic (traffic_ranks) carry domain with company_id. A borrower that matches a domain is read from its own website, its job board and its announcements.

Private funding notices are delivered in Company Funding (company_funding). A notice is tied to a company when the issuer's legal name matches exactly one company in the index, and otherwise arrives with issuer and cik for you to match. For a lender the useful fields are amount_offered and amount_sold, which are empty when indefinite, first_sale and, in details, the securities offered and the number of investors. A notice records that securities were offered, and the guide to following private funding with SEC Form D filings sets out how to read one.

The signals, by the stress they point to

The datasets are Hiring Activity (company_hiring_daily), Sales Team Metrics (company_sales_weekly), Company News (company_news), Company Funding (company_funding) and Technology Changes (company_tech_events).

StressSignalWhereThe benign reading
Cost cuttingOpen postings falling, closings above openings, new postings collapsingHiring Activity (company_hiring_daily)A hiring round that finished, or a change of job board
Revenue pressureOpen sales roles falling and sales hiring stoppedSales Team Metrics (company_sales_weekly): open_sales, new_sales, closed_salesA sales team reorganised, not shrunk
Announced cutsEvent type layoffs_restructuring; disclosure item 2.05Company News (company_news): event_types, itemsAn efficiency programme at a healthy company
Management turnoverA leadership change at a finance or operating roleCompany News (company_news): roles such as cfo, coo, ceoA planned succession: the direction is recorded as appointed, departed or succession
Capital raisingDisclosure item 3.02, typed funding_round; private funding notices for private borrowersCompany News (company_news); Company Funding (company_funding): amount_offered, amount_soldFunding for growth
Change of controlDisclosure items 5.01 and 2.01Company News (company_news): itemsA buyer with deeper pockets, or an integration that closes duplicate roles
Operational incidentsDisclosure item 1.05, typed incidentCompany News (company_news)A contained event with no lasting cost
RetreatA market, app or key page removed from the websiteTechnology Changes (company_tech_events): category of market, app or page, change of removedA site redesign

Capital raising cuts both ways. New equity helps a lender, new debt may rank beside the loan, and repeated raising can signal a need for it: the datasets show the fact, and the direction is your judgement. Other disclosure items matter in credit, such as 1.03 for bankruptcy or receivership, 2.04 for events that accelerate a financial obligation, 3.01 for a notice of delisting and 4.02 for non-reliance on previously issued financial statements. Every row of Company News carries the item numbers it was filed under in items, so filter on the item itself and read the excerpt and the original at url. Check in your sample how an item you care about is typed, because event types follow the items.

A weekly watchlist query

The query counts, for each borrower in your mapped book, the triggers of the last 30 days in Company News. borrower_map is your table of borrowers and their company_id, built in the previous step. The query uses Postgres syntax, and list columns arrive as JSON in a single cell.

select
  m.borrower_id,
  count(*) filter (where n.event_types @> '["layoffs_restructuring"]')       as restructuring_30d,
  count(*) filter (where n.event_types @> '["leadership_change"]'
                     and n.roles @> '["cfo"]')                               as cfo_changes_30d,
  count(*) filter (where n.items ?| array['1.03', '2.04', '3.01', '4.02'])   as distress_items_30d
from borrower_map m
join company_news n on n.company_id = m.company_id
where n.at >= current_date - 30
group by m.borrower_id
order by restructuring_30d + cfo_changes_30d + distress_items_30d desc;

The output below is illustrative. Borrower B tops the list with a restructuring announcement and a departure at the cfo role in the same month. Acme Robotics, an invented borrower, scores zero because its signals are in postings, which this query does not read.

borrower_idrestructuring_30dcfo_changes_30ddistress_items_30d
Borrower B110
Acme Robotics000

Run the hiring screen from detecting restructuring early from postings and announcements beside it, and join the two on company_id. A weekly cadence matches the refresh: hiring is refreshed daily and announcements daily to every three days, so a weekly review reads the changes of the week in one pass.

Reading a trigger

Rank triggers by what they let you do, not by how alarming they sound.

  1. Read today. A disclosure under an item such as 1.03, 2.04 or 4.02, a departure at the cfo role, or an announcement typed layoffs_restructuring. These are the company's own statements and need no corroboration to deserve reading.
  2. Read this week. The hiring contraction pattern, open sales roles falling for four weeks running, or a private funding notice with a large amount_offered for a private borrower.
  3. Read this month. Markets, apps or key pages removed from the website, and a new stated headcount in Employee Headcount.

As an illustration, the invented borrower Acme Robotics shows two signals from the second tier in one month, a hiring contraction and falling sales roles, and nothing from the first. The watchlist moves it up for a call with the borrower before the next covenant certificate. The internal rating keeps resting on the financial statements, with the signal as the prompt to open them.

Calibrating the watchlist

Every observation is dated and written once, never revised, so a trigger logged today reads the same when you review it next year. Log every trigger with its date, the tier you gave it, what you did and what the borrower later reported. After a few reporting cycles the log gives you a hit rate and a lead time for each signal on your own book, which is the evidence a credit committee will ask for. Change a threshold only under a dated version, as Fokals does with its labels, so that the log stays comparable.

Reading signals against a credit file

Hiring may fall because a company is becoming more efficient, and a company in trouble may keep advertising roles, so a hiring signal records an intention to hire or to stop and not the reason. Liquidity, covenant headroom, debt maturities and the terms of what you lent live in your own file, and the signal tells you when to open it.

Group structure matters too. The signals describe the operating company at the level of its website and listed parent, and each carries the company ID of that company. For a borrower that is a special-purpose vehicle, map it to its operating parent and read the parent's signals. Treat each signal as a prompt to read your own file, and as evidence that is dated and sourced.

How Fokals delivers it

The inputs are the hiring dataset, the announcements and scale dataset and the marketing stack dataset, refreshed daily to weekly. They reach you through the REST API or as bulk files, so the watchlist can run as a scheduled job on your own database. The data comes from first-party company sources and public records, processed in-house, and the sourcing statement is the document to give a compliance team that asks.

Frequently asked questions

Can job postings data predict a corporate default?

Postings and announcements show operating changes, such as hiring stopping or a restructuring, that can come before reported results. Use them to decide where to look first, and test any rule on dated data before relying on it. Each signal is dated, so you can place it against the borrower's reporting calendar and measure the lead time on your own book.

Which public signals warn that a borrower is under strain?

A fall in open postings with closings above openings, open sales roles falling, a restructuring announcement or disclosure item 2.05, the departure of a finance or operating leader, repeated capital raising, and markets, apps or key pages removed from the website. Each is ambiguous alone. Two or three within a month justify a call or a read of the borrower's file.

What does Fokals add to a credit file?

Fokals adds dated operating signals: Hiring Activity, Sales Team Metrics, Company News, Company Funding and Technology Changes, keyed to one company ID. They sit beside ratings from rating agencies, payment histories from credit bureaux and the borrower's own statements, and tell the analyst when a borrower's operations have changed and which record to open.

How can I monitor a private borrower with public data?

Match its website domain to a company record, then watch its job board, its newsroom and the changes on its website, and the private funding notices it files. Every observation is dated, and a borrower that matches is read daily to weekly, so the watchlist reports each change in the week it appears.

Which disclosure items matter for credit analysis?

Items for bankruptcy or receivership (1.03), events that accelerate a financial obligation (2.04), exit costs (2.05), delisting notices (3.01), non-reliance on financial statements (4.02), change in control (5.01) and the departure of certain officers (5.02). Company News records every item number, so filter on the item and read the text, because event types follow the items.

The queries and code on this page are examples to adapt. Test them in your own environment before you rely on them.