AI adoption leaves three public traces that can be checked: the roles a company advertises, the tools its website and postings name, and what it announces. Each answers a different question. This guide shows how to measure each for a set of listed companies from Hiring Activity, Job Postings, Technology Stack, Technology Changes and Company News, how to combine the three into one score that can be audited, and why a keyword count over text is the weakest of them.
Three legs, three questions
Each leg is independent evidence, and a company can lead on one and lag on another. That divergence is part of the measure.
| Leg | The question | Datasets and columns | Best read as |
|---|---|---|---|
| Hiring | Is the company paying people to build or run AI? | Hiring Activity: ai_postings and open_postings | Intent to build, as a share of open postings |
| Tools | Which AI-related technologies does it run or name? | Technology Changes, Technology Stack, and the tools named in Hiring Activity (tech_mentions) | Technologies in use on the website and named in postings |
| Announcements | What does it say it is doing? | Company News: title, excerpt and event_types | The company's own account of what it is doing |
Aggregate each leg on isin or figi. A brand or subsidiary carries the identifiers of its listed parent, so the group is measured as one company, and the guide to mapping alternative data to a security master covers the join in detail.
Leg one: AI roles as a share of open postings
Each posting is labelled under the frozen version jobs-v2, which carries the flag ai_role for a role built around AI. Hiring Activity counts the open postings with the flag on each closed UTC day as ai_postings, beside open_postings. The hiring dataset describes it, and the query below turns it into a 28-day share.
with daily as (
select
isin,
day,
sum(ai_postings) as ai_postings,
sum(open_postings) as open_postings
from company_hiring_daily
where isin is not null
group by isin, day
)
select
isin,
day,
(sum(ai_postings) over w)::float
/ nullif(sum(open_postings) over w, 0) as ai_share_28d,
avg(open_postings) over w as avg_open_28d
from daily
window w as (
partition by isin
order by day
range between interval '27 days' preceding and current row
);Two rules keep the share honest. Set a floor on the average number of open postings, 20 for example, because a company with five open roles moves by 20 percentage points on a single posting. And treat a company with no published job board as missing, not as zero.
Read both the level and the change. The level says how AI-heavy current hiring is, and the 90-day change in the share says which way it is moving; test which of the two relates to the outcome you care about before you weight them. As a cross-check, Hiring Activity's by_function counts open postings by function, including data_science_ml. A company with a high AI share and a flat data_science_ml count is hiring AI roles in other functions, such as software engineering or product management.
For a baseline use the weekly ai_role_share series in Market Series, which gives the share across the companies of the index and, where the catalogue lists them, by industry, country and size band. Sector hiring trends for macro and thematic research shows how to read it.
Leg two: tools
Tools are the territory of technographic data, and two views of them are available. The first is the website: technologies are detected from page content, scripts, network requests, response headers and DNS records, and the catalogue recognises 6,283 technologies in 68 categories. The marketing stack dataset holds each technology in Technology Stack (company_technologies) with its first-seen and last-seen dates, and each adoption and removal in Technology Changes (company_tech_events). A first observation sets a baseline and writes no events, so a tool present at the baseline has a first-seen date that is not its adoption date. Count adoption from the events.
Decide which technology ids count as AI evidence before you look at results. List the ids in your sample that you accept, freeze the list under a version of your own, and measure how many companies in your list show at least one. The catalogue covers advertising, analytics, commerce, CRM, support and similar website technology, so weight this leg by how many companies in your list show a recognised AI technology, and weight it low where few do.
select e.isin, count(*) as ai_tools_added_180d
from company_tech_events e
where e.category = 'technology'
and e.change = 'added'
and e.key in (select technology from my_ai_technology_list)
and e.observed_at >= current_date - 180
group by e.isin;The second view is the postings. Job Postings lists the tools each posting names in technologies, and Hiring Activity counts open postings naming each tool in tech_mentions. Where the list holds a product you accept as AI evidence, a company that names it in its postings is telling you what its teams will use.
Leg three: announcements
Company News, in the announcements and scale dataset, carries each announcement's title, the text of the announcement in excerpt, and an event type such as product_launch, partnership or acquisition_made. This leg is a text search that you define. Search title and excerpt for a reviewed list of phrases, count the distinct matching items of the last 90 days, and read the event type beside each match: an AI phrase in a product_launch item is a different fact from one in a financial_results item.
Read the event type before the phrase: the 13 event types classify what each announcement is, so you can separate a product launch, a partnership and an acquisition, and count each as its own kind of evidence.
Combining the legs
Standardise each leg within a peer group before you combine them. Rank-transform it to a percentile within the company's sector or size band in your own classification, so a software company is not compared with a utility. Combine the percentiles with weights you fix in advance, such as 50 per cent for hiring and 25 per cent each for tools and announcements, and store the weights and the date with the score. Where a leg is missing, recompute the weights over the legs present and mark the score as partial.
The illustrative scores below are for the invented company Acme Robotics.
| Leg | Percentile within peers |
|---|---|
| Hiring | 35 |
| Tools | 50 |
| Announcements | 92 |
| Composite at weights of 50, 25 and 25 | 53 |
The composite is middling, and the legs say something sharper: Acme Robotics announces far more than it hires. Keep the three percentiles in the output beside the composite, because a gap between telling and building is itself a finding worth testing.
Test the score against an outcome that you define before you score. One example is whether the top quintile later announces more AI product launches than the bottom quintile, counted with your frozen phrase list over product_launch items. This is a forward test, and the weights stay frozen while it runs.
Why keyword counts mislead
Short terms collide. Matched as substrings, "AI" sits inside other words, "ML" also names a unit of volume and a markup language, and "agent" and "model" have older meanings. Match whole words and phrases, and match the acronym with its capitals.
Templates repeat. A company that appends the same AI paragraph to every item scores high on a count and says nothing about intensity. Count distinct items, and use a share of items rather than a number of mentions.
Lists drift. Words come into fashion, and a list that grows over time moves scores without any change in companies. Freeze the list under a version name and a date, as Fokals freezes its labels, and release a new version when you change it.
Error needs measuring. The ai_role flag is produced under a frozen version, so its result is repeatable. A keyword list has an error rate you measure yourself: grade a hundred matches by hand before you trust a list.
Volume is not intensity. Counts rise with the number of postings or announcements. Use shares, with a floor on the denominator.
How to read the score
The score measures what companies publish and do in public, company by company. Hiring shows intent to build, a website shows the technologies in use there, and announcements are a company's own words. The index holds equity listings in 79 countries, and every row carries its dated observation, so a time series of the score is point-in-time and suits monitoring and forward tests. The labels are produced under named, frozen versions, and the methodology sets out how each is produced.
Frequently asked questions
How do you measure AI adoption from public data?
Read three independent traces and combine them. Hiring shows the share of a company's open postings that are AI roles, tools show which AI-related technologies appear on its website and in its postings, and announcements show what it says about AI. Rank each leg within peers, combine with weights fixed in advance and keep the three legs visible beside the composite.
Is counting AI mentions in job postings a reliable measure?
It is a start and a weak one. A keyword count collides with other words, repeats company boilerplate and drifts as vocabulary changes. A flag produced under a frozen version is easier to audit and repeats exactly. Use shares of postings, a floor on the denominator and a hand-graded sample.
What can a company website show about AI?
It shows the technologies the company runs on its website, dated to the first and last observation, and Technology Changes dates each adoption. Whether a recognised technology counts as AI evidence is your decision, so list the ones you accept, check how many companies in your list show any, and weight the leg accordingly.
Does Fokals label AI roles in job postings?
Yes. Each posting is labelled under a frozen version with an AI role flag, and Hiring Activity counts the open postings with the flag each day. A flag means the posting is for an AI role, so the count shows hiring intent. Combine it with tools and announcements to see whether the company is building, running and talking about AI.
How do I compare AI adoption across companies of different sizes?
Use shares and percentiles, never raw counts. Divide AI roles by open postings over 28 days, set a floor on the average number of open postings, and rank each company within its sector or size band. The identifiers on every row, ISIN and FIGI for a listed company, let you aggregate a group of brands under its listed parent.
The queries and code on this page are examples to adapt. Test them in your own environment before you rely on them.