A target list built on technology is only as good as three things: the technology ids you choose, the rule that combines them and the checks you run before the list reaches a rep. This guide builds one from the technographic data in Technology Stack (company_technologies): companies that run a tool your product works with, run none that competes with it, and show a reason to talk now.
The output is a list of accounts: company IDs, domains and the dated reason each one is on it. The list goes to your CRM, where the owner and the contact come from what you already hold.
Start from technology ids
Technology Stack has one row per company website and technology, with a stable technology id, a readable technology_name and a technology_category. The vocabulary is 6,283 recognised technologies in 68 categories, and a distinct query lists what your delivery holds.
select distinct technology, technology_name, technology_category
from company_technologies
order by technology_category, technology_name;Build three sets from that list and write them down as ids, never as names.
- Complements. Tools your product works with or depends on. A company running one is a company where your product can be used.
- Competitors. Tools that do your job. A company running one is already served, which matters in two opposite ways: it is a displacement target, or it is a company to leave alone. The list rule must say which.
- Categories. Groups of tools by function, such as advertising or analytics, for the cases where any tool of a kind is the signal.
Three list patterns
Complement present, competitor absent. This is the core list.
select t.company_id, min(t.domain) as domain
from company_technologies t
where t.technology = any(:complements)
and t.missing_since is null
and not exists (
select 1
from company_technologies c
where c.company_id = t.company_id
and c.technology = any(:competitors)
)
group by t.company_id;The parameters are the id lists from your three sets. The exclusion is the part that matters. It counts rows with missing_since set as present on purpose, because a technology that is absent from recent readings but not yet counted as removed has not left yet. It is also where to read the data with care: a detection shows presence on the website, so the exclusion removes every company where a competitor was detected, and a competitor used only behind a login is a question for the first conversation.
Category without a tool. The same query with technology_category in place of technology finds companies that run something in one category and nothing in another, such as an advertising tool and no analytics tool. The first category says what the company does and the second says what is missing.
An illustrative case: a vendor of loyalty software needs an online store to attach to and competes with other loyalty tools. Its list is the companies that run a technology in a commerce category and none in a loyalty category, and the rule needs no list of platforms because the categories do the work. That is easier to maintain than naming every platform, and a tool added to the catalogue later is picked up without a change to the query.
Established or recent. first_seen_at separates a technology that has been in view for months from one that arrived lately, with one caveat. A company's first observation sets a baseline, so for anything already on the site first_seen_at is the date of that first observation. A technology with an added event in Technology Changes (company_tech_events) was seen arriving, and one without may be as old as the site. Use events when the question is recency.
What account ids add
account_ids holds the public account ids detected with a technology: advertising pixel ids, analytics properties and tag-manager containers. A technology that exposes an id carries it, and the ids add three things to a list.
- Groups of websites. Two websites that share an id may belong to one organisation. Explode the list into one row per id and group on it, then check a sample before you merge, because a shared id is a lead and not a proof.
- Depth of use. The number of distinct ids under a technology is a rough sign of how many accounts a company runs. One pixel id is one account, and several can point to several brands or markets.
- Expansion. A new id under a technology already in place is an event in Technology Changes, with
categoryset totechnology_id. For a seller of a tool that works beside it, that is a dated reason to reach out.
-- assumes account_ids holds a JSON list of ids; adapt to your warehouse
select i.id, array_agg(distinct t.domain) as domains
from company_technologies t,
jsonb_array_elements_text(t.account_ids) as i(id)
group by i.id
having count(distinct t.domain) > 1;Rank the list by timing
A filter gives a set, and a set is not a queue. Add timing from three sources, each joined on company_id.
- A recent
addedevent for a complement in Technology Changes: the company has just added it to its website. For a competitor, see the guide to competitor displacement from technology changes. - Hiring in Hiring Activity (
company_hiring_daily): risingopen_postings, andtech_mentionsfor tools in your space. Postings can name tools that a website never shows, as timing outreach with hiring signals explains. - Intent in Intent Scores (
company_intent_weekly): a surge on a topic that matches your product, with the dated signals behind the score. The guide to prioritising accounts with intent scores shows how to join it to a list like this one.
Check the list before it reaches a rep
- Provenance. Read
seen_via, which records how each technology was detected: from page content, scripts, network requests, response headers or DNS records. A tool detected in the page is a live part of the site. A tool detected only in DNS records shows a relationship with a software vendor, such as a mail provider or a domain verification, and may be no feature of the site. Decide per technology which methods count and filter on them. - Freshness. Compare
last_seen_atwith the website'slast_read_atin Website Profile (company_site_facts). A technology last seen some observations ago hasmissing_sinceset. Keep those rows out of "runs it" lists or mark them. - A sample. Open twenty websites from the list and look for each tag in the page source or the network panel. Record the match rate before the list goes out, and again each quarter.
- Duplicates. A company can have several websites, and a brand is its own company in the index with the identifiers of its listed parent. Collapse on the company ID, and on the parent's
isinwhere your reps own the group. - The CRM match. Match on the website domain, lower-cased and without a leading "www", then on
isin, or on ticker andmic, for listed accounts. Accounts that match nothing in your CRM are net-new, which is the point of the list. The accounts that do match show how much of it you already work.
Count at every step, and keep the list current
Report four numbers each time you build the list: the companies that match the complement rule, the number left after the competitor exclusion, the number left after duplicates are collapsed, and the number that are net-new to your CRM. A step that removes almost everything, or nothing, says the rule is wrong, and it is easier to see in the counts than in the list.
A list built once goes out of date. Technologies are added and dropped, and the data is refreshed daily to weekly. Run the same query every week, store each run with its date, and give reps only the entries that are new since the previous run. The entries that left are worth a look too, because a company that dropped the complement may no longer fit.
How to read a technology list
A detection shows presence on the website, and each row says so with the dates it was first and last seen. Tools used in the back office are best read from the postings that name them, which is why Hiring Activity belongs beside Technology Stack in a ranked list. A company missing from the list was not detected on its website, so the sample check and the CRM match are how you size the list for your market. Contract, spend and satisfaction belong to the conversation and to your CRM, and the list gives the reps the company, the technology and the date.
How Fokals delivers it
The marketing stack dataset is refreshed daily to weekly, depending on the company, and reaches you by REST API or as bulk files. The data dictionary defines every column used above, and the article on how technologies are detected explains the methods behind seen_via. If you are building this as a feature of a product and not as a list, see adding technographic filters to a prospecting tool.
Frequently asked questions
How do I find companies that use a specific technology?
Filter Technology Stack on the stable technology ID with the missing-since date empty, which returns the websites where the technology is currently present. Collapse the rows to the company ID to count companies, and check a sample of results against the page source before you use the list at scale.
How do I exclude companies that already use a competing product?
Use a not-exists test on Technology Stack for the competitor IDs, and count rows with the missing-since date set as still present. The test removes every company where a competitor was detected, which gives a clean list of accounts that are open to your product.
Why does a company show a technology that is not on its homepage?
Technologies are detected from page content, scripts, network requests, response headers and DNS records, and the seen-via field says which method found each one. A tool loaded by a script, or detected only in DNS records, will not appear in the visible page source, and the field tells you which case you have.
How do I match a technology list to my CRM accounts?
Match on the website domain, lower-cased and without a leading "www", then on ISIN, or on ticker and MIC, for listed accounts. Each file also carries the company ID, so match once and store it. Accounts with no match are net-new to your CRM, and the match rate shows how much of the list you already hold.
How current is a technology list?
Websites are refreshed daily to weekly, depending on the company, so a row is between a day and a week old. Compare the last-seen date with the website's last-read time, and use events with their observation time when the question is what changed recently.
The queries and code on this page are examples to adapt. Test them in your own environment before you rely on them.