Use case

Catching companies as they enter a new market

A new market shows up in a company's site, its job board and its newsroom, each at its own moment. Here is how to join them into one dated timeline per country.

Updated 5 October 20266 min read

A company entering a country leaves traces in public, each at its own moment: its website starts declaring that country, its job board starts advertising roles there, and its newsroom sooner or later says so. This guide shows how to read each trace from Technology Changes, Sales Team Metrics, Job Postings, Hiring Activity and Company News, join them into one dated timeline per company and country, and decide how much evidence to require before you act. It is written for teams that sell what a company needs when it opens somewhere new, such as payments, translation, hosting, compliance, logistics or local marketing.

What the traces add to firmographic data

Firmographic data records where a company is headquartered, what it does and how large it is. The traces below add where it is heading next, and each is a dated row that joins to a list of target accounts on company_id.

The three traces and where they live

Two of the traces are dated observations of a company's website and job postings. The third is the company's own statement. The datasets sit in the marketing stack, hiring and announcements datasets.

TraceDataset and columnsA new row saysRead it as
WebsiteTechnology Changes (company_tech_events) where category is market, language, currency or app and change is added; key holds the country, language, currency or app idThe site now declares a version for a country, a language, a currency in its prices or a store appA first trace: pair it with hiring or an announcement for entry
HiringSales Team Metrics (company_sales_weekly.new_countries) for sales roles; Job Postings (job_postings: country, languages, labels) for all roles; Hiring Activity (company_hiring_daily.by_country) for daily countsOpen postings in a country, and for sales the first one there, none beforeCustomer-facing roles mark a market, engineering roles a hub
AnnouncementCompany News (company_news) with event type expansion, acquisition_made or partnershipThe company said so, in its own wordsConfirmation, once the text names the country

Reading the website trace

A market row means the site now declares an alternate version of its pages for a country. A language row is a new language code among the page and its alternates, a currency row a new currency in the prices marked up on the page, and an app row a new store app. Each row carries observed_at, the observation that saw the change, and before and after. Three habits keep the reading honest.

  • Ask for events, not for state. The Website Profile (company_site_facts) holds the latest state of the site, including its markets. A company's first observation sets a baseline and writes no events, so only an event means new.
  • Count observations, not rows. A company that switches on thirty countries at once writes thirty rows with one observed_at. That is a global launch and not thirty decisions. To find staged entries, count distinct observed_at values.
  • Pair it with a second trace. A declared version is a first trace. Hiring in the same country or an announcement turns it into entry.

Reading the hiring trace

new_countries in Sales Team Metrics (company_sales_weekly) is the cleanest event for sales roles: the countries where the company opened its first sales posting this week, with none before. It is written for companies with earlier sales postings, so a first observation sets a baseline and counts nothing as new. For hiring in general the evidence is in Job Postings (job_postings).

The distinction that matters is market against hub. A company can open engineering roles in a country to find talent without selling anything there, so customer-facing functions are the better evidence of a market: sales, sales_development, customer_success_support and the three marketing functions.

Job Postings carries the function in labels, the country, the languages a role requires and found_on_first_read, which marks a posting already advertised when the company's observation began, so its opening day is unknown. The view below gives, for each company and country, the day of the first customer-facing posting, and leaves out any country where such a posting was already advertised at the first observation. It assumes JSON cells are loaded as jsonb and empty cells as null.

create view hiring_traces as
select
  company_id,
  upper(country)           as country,
  min(first_seen_at)::date as day,
  'hiring'                 as source
from job_postings
where country is not null
  and labels ->> 'job_function' in (
    'sales', 'sales_development', 'customer_success_support',
    'marketing_brand', 'marketing_performance', 'marketing_content_social'
  )
group by company_id, upper(country)
having not bool_or(found_on_first_read);

A role that requires a language other than English, in a country where it is spoken, adds weight. languages holds ISO 639-1 codes, and this hint is best read by eye.

Joining the traces

Join on company_id and a country code. The website's key and the posting's country come from different sources, so upper-case both and check a sample before you trust a match. The query stacks the website and hiring traces and counts the distinct sources behind each company and country in the last 90 days. Count sources, not rows: a currency and a language added to the same site are two rows and one source.

with site as (
  select company_id, upper(key) as country,
         observed_at::date as day, 'site' as source
  from company_tech_events
  where category = 'market' and change = 'added'
)
select
  company_id,
  country,
  count(distinct source) as sources,
  min(day)               as first_trace,
  max(day)               as latest_trace
from (
  select * from site
  union all
  select * from hiring_traces
) traces
where day >= current_date - 90
group by company_id, country
order by sources desc, latest_trace desc;

Announcements sit outside the join on purpose, because an announcement names its country in prose and not in a column. Attach them by company and date, and read the title and excerpt of expansion items for the country. A text match on country names helps; read the matches by eye, since a place named is not always the market.

One company, read end to end

The example is illustrative: Acme Robotics is an invented company, and the days are counted from its first trace. Each row is one trace in one of the tables above.

DaySourceTrace
0WebsiteMarket added for Germany
6WebsiteCurrency added, the euro
19HiringFirst sales posting in Germany, so Sales Team Metrics list Germany that week
41AnnouncementA newsroom item typed expansion that names a Berlin office

The join returns Germany with one source after day 0, and with two from day 19, when the first customer-facing posting appears. Entry is likely at that point and a seller can start research. The announcement on day 41 is the third source and confirms it. A team that waited for the announcement started 22 days after one that acted on day 19, and 41 days after the first trace.

How much evidence to require

Decide the rule before you look at the list. A starting point:

  • One source. Watch. The trace is real but can be a draft page or a single hub role.
  • Website and hiring. Entry is likely. Start research on the account.
  • Website, hiring and an announcement. An expansion item names the country. Treat the entry as confirmed and reach out.

Weigh the traces by what you sell. A payments vendor cares most about a currency event, a translation vendor about language, and a vendor of employment services about hiring, so each can act on the trace that marks the first decision its product serves. Test the cut-offs on companies whose entry dates you know. Every trace is dated, so the lead time you measure is the gap between the first trace and the announcement.

Which segments are moving

Single companies are one question. Which industries are moving is another, and it decides where to spend research time. Market Series (market_series) holds market_added and language_added as rates per 100 companies or websites, by industry, country or company size band, over 7, 30 and 180 days. The rates are over a same-store cohort, so a growing index of companies does not read as a growing market.

select dimension as industry, rate, count, cohort, growth
from market_series
where metric = 'market_added'
  and dimension_kind = 'industry'
  and window_days = 30
  and as_of = (select max(as_of) from market_series where metric = 'market_added')
order by rate desc;

A high growth figure over a small count says little, so read count and cohort beside it. The same events, seen at one company, are the subject of detecting go-to-market changes from pricing and key pages, and the sales side of hiring is in tracking sales team build-out.

How to read the traces

  • A declared version is a declaration. A site can publish pages for a country before it ships there, so a market event is a first trace and a second source confirms it.
  • Hiring is located by first location. The country is that of a posting's first location, so a role listed in several countries counts in one.
  • Announcements are the company's own words. The expansion type is assigned from the company's own text, so read the title for the country.
  • Segments. Market Series gives the rate of new markets by industry, country and size band, so a team can rank where to spend research time before it opens a single account.

Frequently asked questions

How can I tell when a company is expanding into a new country?

Look for independent traces that agree: its website declares a new country, language or currency; its job board advertises sales or customer-facing roles there for the first time; and its newsroom reports an expansion. Each is a dated row in a different dataset. One source is a lead, website and hiring together make entry likely, and an announcement that names the country confirms it. Join them on company and country code.

What does a new country on a website show?

A market event in Technology Changes records that the site now declares an alternate version for a country, dated to the observation that saw it. Treat it as a first trace, and look for hiring in that country or an announcement to confirm entry. A currency added to marked-up prices points more directly at selling, and a language adds weight where it is spoken.

How do job postings show international expansion?

The first sales posting in a country where the company has not hired before is the clearest trace, and Sales Team Metrics record it weekly. Customer-facing roles say more than engineering roles, which can mean a talent hub and not a market. Roles that require a local language add weight. A company's first observation sets a baseline, so only postings opened after it count as new.

How early can a new market be detected?

As early as the first trace, which is dated to the observation or posting that showed it. Website changes reach you daily to weekly depending on the company, postings daily, and announcements daily to every three days, so a pull each day keeps the timeline current.

How do I get an alert when a company adds a new market?

Fokals is delivered by REST API and bulk files. The feeds run oldest first from a time you set, and the last cursor is your bookmark, so a job that polls them can raise an alert on each new market, language or currency event. The guide to building company change alerts covers the schema, deduplication and wording.

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