Use case

Expansion signals for account management

Customers often show growth in public before they ask for more. Here is how to read it from their websites, job boards and announcements, and rank the accounts worth a call.

Updated 5 October 20267 min read

An account manager knows the people at a customer and often has no view of what the company is doing this quarter. This guide shows how to watch every account you already hold for four kinds of public expansion signal: new markets, funding, team growth and new initiatives. You match your customer list to company records once, run one query a week, and get a ranked list of accounts with a dated reason to talk about more seats, more regions or a second product.

Why customers need a different reading from prospects

Outbound reads signals to earn a first conversation. Account management reads the same signals to justify a second one, and three things change. The list is fixed and known, so the only matching job is joining your customer list to company records once. A false alarm costs little, because the conversation is with someone who already knows you. And the question is narrower: not whether the company fits, but whether something has changed that your product could serve.

Fokals delivers company-level signals, which suits this use: your account team already has its contacts and needs timing, and each dated signal below is a trigger event for a conversation you can already have. The same events drive trigger events for outbound, where the list is prospects, and the companion guide on churn risk from technology removals reads the opposite direction.

The four signals and where they live

Every dataset below carries the Fokals company ID, company_id, so each joins to your customer list on one key. All columns are defined in the data dictionary.

SignalDataset and columnsWhat it can mean for an accountCheck before you act
New marketTechnology Changes (company_tech_events) where category is market, language, currency or app and change is added; Sales Team Metrics (company_sales_weekly): new_countriesMore regions, entities or languages to serveThe site declares a version for a country; confirm the company also hires or announces there
FundingCompany Funding (company_funding): filed_at, first_sale, amount_offered, amount_sold; Company News (company_news) with event type funding_roundBudget that is not yet allocatedThe notice carries the company ID when the issuer name matches exactly one company
Team growthHiring Activity (company_hiring_daily): open_postings, new_postings, by_function; Employee Headcount (company_headcounts)More users of your product, if the growing function is the one that uses itOpen postings are roles, not hires; headcount is stated yearly
New initiativeJob Postings (job_postings): labels flags new_initiative, team_build and ai_role; Company News with product_launch, acquisition_made or partnership; tech_mentions in Hiring ActivityA project that may need your product or a neighbour of itWhether the postings name your product

Two columns deserve a note. tech_mentions in Hiring Activity counts the open postings that name each tool, so a customer that opens roles naming your product is saying in public that it plans to use it more. And by_function splits open postings over 26 job functions: map your product's users to the function that employs them, such as customer_success_support for a helpdesk or data_analytics for a reporting tool, and watch that function rather than total hiring.

The datasets sit in four products. The marketing stack holds Technology Changes and Technology Stack (company_technologies), the hiring dataset holds Hiring Activity, Sales Team Metrics and Job Postings, the intent dataset holds Company Funding and Company Signals (company_signals), and the announcements dataset holds Company News and Employee Headcount.

If your product is one of the 6,283 technologies Fokals recognises, there is a fifth signal: its own footprint spreading. A row in Technology Stack for your technology on a second domain of the same company_id, or an event of category technology_id, a new account id under a technology already there, can show deployment growing inside the customer before anyone has asked for more.

Build the weekly watchlist

  1. Match once. Join your customer list to company_id on the company website and keep the result in your own table. Decide the level of the contract first: a brand or subsidiary carries the identifiers of its listed parent, so a customer that signed as a subsidiary can show signals at either level.
  2. Load since the last run. Load the bulk files, or pull the feeds, which run oldest first from a time you set, so the last cursor is your bookmark.
  3. Group by account and signal kind. Keep observed_at, the source and the detail, which says what was seen.
  4. Rank. Order by the number of distinct kinds in the last 90 days, then by the summed weight, then by recency.

The query below does steps three and four over Company Signals. It assumes JSON cells are loaded as jsonb and empty cells as null, and that customer_accounts is your own table with an account_id and a company_id.

select
  a.account_id,
  a.company_id,
  count(distinct s.kind)                     as kinds_90d,
  sum(s.weight)                              as weight_90d,
  max(s.observed_at)                         as latest,
  array_agg(distinct s.kind order by s.kind) as kinds
from customer_accounts a
join company_signals s on s.company_id = a.company_id
where s.observed_at >= now() - interval '90 days'
  and (
    s.kind in ('market_added', 'language_added', 'currency_added', 'app_added',
               'funding', 'posting_international', 'posting_new_initiative')
    or (s.kind = 'news_event'
        and (s.detail -> 'events') ?| array['expansion', 'funding_round',
             'product_launch', 'acquisition_made', 'partnership'])
  )
group by a.account_id, a.company_id
having count(distinct s.kind) >= 2
order by kinds_90d desc, weight_90d desc, latest desc;

A news_event signal is any announcement that carries an event type, layoffs and incidents included, so the query keeps only the five types that point to growth. The having clause asks for two kinds of signal because one is a note and two are a pattern; set it to one if your customer base is small.

If the account you manage is a listed group, join on isin instead of company_id. Every row of a brand or subsidiary carries the identifiers of its listed parent, so the signals of all the group's trading names roll up to one account.

Put the evidence in the alert. Each signal has its date, its kind and a detail that holds what was seen, and for an announcement the title and the address of the original. An alert that says only that an account scored high gets ignored; one that says a newsroom item 12 days ago reported a funding round gets read.

Join the list to your renewal calendar as well: a signal 90 days before renewal lets the expansion go into the quote, while a later one waits for the next window. Then close the loop each quarter by counting, for each signal kind, the alerts followed by an upsell conversation within 60 days. Keep the kinds that earn their place and drop the rest.

One account, read end to end

The example is illustrative: Acme Robotics is an invented customer on a 120-seat plan. In one week's run it returns with four kinds of signal in the last 90 days.

ObservedKindWhat was seen
41 days agocurrency_addedPrices marked up in euros
33 days agomarket_addedAlternate versions declared for Germany and France
18 days agoposting_internationalA role labelled international, located in Germany
12 days agonews_eventA newsroom item typed funding_round

The order is part of the reading. The site changed first, the job board followed and the company announced last, so the evidence comes from three sources: site, careers and news. That is a pattern, and it gives the account manager a specific opening, such as a German workspace and euro invoicing in place before the first hires start. Nothing in the evidence says Acme will buy more. That is for the conversation.

Reading each signal without over-reading it

  • A market on a site is a declaration. The market category records that the site now declares an alternate version for a country. It can come before a launch or after one, and it records presence on the website. Pair it with hiring in that country or an announcement before you call it expansion.
  • A funding notice records an offering. Company Funding holds notices of exempt private offerings, filed within 15 days of a first sale, each with its amounts and dates. A funding_round announcement in Company News is a second trace of the same event, so join the two on company and a window of dates instead of counting both.
  • Team growth is demand for hires. A posting records an intention to hire, and new_postings counts postings that open after a company enters the record, so a newly indexed company does not look like a hiring burst. A posting can stay open for months.
  • Labels carry a threshold. The flags new_initiative and team_build are assigned by a model under a named, frozen version, and set only at 70% probability or more, so each flag is one the model stands behind. Read the posting title before you quote one to a customer.

Reading the watchlist beside your own records

  • Match rate. The share of your customer list that matches a company record is the share the watchlist reads. Report it with every weekly run.
  • A signal is timing. A signal says a company is changing and gives the date, which is the opening for a conversation about what it needs. The project may belong to a competitor, or to a part of your product the customer does not use, so the conversation settles that.
  • Your records are the other half. Seat utilisation, renewals and satisfaction sit in your own product and billing records. Read them beside the signal: a customer with high utilisation and a market signal is a good case to open.
  • The record. Every signal is dated and written once, never revised, so the watchlist you run each week gives a result you can audit later.

Frequently asked questions

How do you find upsell opportunities in existing customers?

Watch the customer list for dated changes that your product could serve: a new market, a funding round, hiring in the function that uses your product, or an announcement of a new initiative. Match the list to company records once, query the signals weekly, and rank accounts by how many distinct kinds of signal each shows. Check the evidence before the call, because a signal is a reason to ask a question, not proof of need.

Which signals show that a customer company is growing?

Four are dated and public: new markets, languages or currencies declared on its website; new countries in its job postings; a funding notice or announcement; and a rise in open postings, especially in the function that uses your product. Announcements typed expansion, acquisition made or product launch add the company's own account. No single signal proves growth, but two or more of different kinds from different sources make a pattern.

Can job postings show how many more seats a customer will need?

They show direction, not a number. Open postings by job function tell you which team is growing, and postings that name your product, counted in the tool mentions of Hiring Activity, show planned use. Roles are not hires and a posting can stay open for months, so convert postings to seats with a ratio taken from your own past accounts, and check it against the seats customers actually added.

Does a funding round mean a customer will spend more with me?

It raises the odds that budget exists, not that it will reach you. A funding notice or a funding round announcement gives the date and, in the notice, the amounts offered and sold. What the customer buys next depends on its plan, which hiring and new-market signals hint at. Treat the round as the reason to open a conversation about that plan.

How do I match my customer list to company data?

Match on the company website. Normalise the domains in your CRM to lower case without www or a path, join them to the domain field in Technology Stack, and keep the resulting company ID in your own table. Check a sample by hand, and decide whether your contract sits with the customer or with its parent. The match rate tells you how much of your customer list the watchlist reads.

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