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.
| Signal | Dataset and columns | What it can mean for an account | Check before you act |
|---|---|---|---|
| New market | Technology Changes (company_tech_events) where category is market, language, currency or app and change is added; Sales Team Metrics (company_sales_weekly): new_countries | More regions, entities or languages to serve | The site declares a version for a country; confirm the company also hires or announces there |
| Funding | Company Funding (company_funding): filed_at, first_sale, amount_offered, amount_sold; Company News (company_news) with event type funding_round | Budget that is not yet allocated | The notice carries the company ID when the issuer name matches exactly one company |
| Team growth | Hiring 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 it | Open postings are roles, not hires; headcount is stated yearly |
| New initiative | Job 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 Activity | A project that may need your product or a neighbour of it | Whether 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
- Match once. Join your customer list to
company_idon 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. - 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.
- Group by account and signal kind. Keep
observed_at, thesourceand thedetail, which says what was seen. - 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.
| Observed | Kind | What was seen |
|---|---|---|
| 41 days ago | currency_added | Prices marked up in euros |
| 33 days ago | market_added | Alternate versions declared for Germany and France |
| 18 days ago | posting_international | A role labelled international, located in Germany |
| 12 days ago | news_event | A 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
marketcategory 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_roundannouncement 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_postingscounts 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_initiativeandteam_buildare 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.