Use case

Personalising campaigns by technology stack and growth stage

Key campaign variants on what an account runs, how fast it is hiring and what it announced last week. A rule set, a query and the guardrails that keep copy accurate.

Updated 5 October 20266 min read

A campaign variant is worth writing only if you can say, for each account, which one it gets and why. This guide shows how to assign a variant from three kinds of company data: the technology stack on the account's website, its hiring momentum as a stand-in for growth stage, and its recent announcements. It gives a query that returns one variant per account, and the rules for what the copy may say.

Three keys and how fast each changes

KeyQuestionDatasetsChanges
StackWhat does the account run, and what has it added or dropped?Technology Stack, Technology ChangesDaily to weekly
StageHow fast is it growing?Hiring Activity, Sales Team Metrics, Company Funding, Employee HeadcountDaily to weekly, headcount yearly
EventsWhat has it just announced?Company NewsDaily to every three days

Stack and stage choose the angle. Events set the moment. All three come from what the company itself publishes: its website, its job board, its newsroom and its regulatory filings. They are delivered in the marketing stack, hiring and announcements datasets, and the data dictionary defines every column named below.

Keys from the stack

Technology Stack lists the technologies each company runs, with a first-seen and a last-seen date. Reduce it to a few states: runs a rival, runs a complement, neither detected, a rival dropped recently, a complement added recently. The lists of rival and complementary technologies are yours, taken from the catalogue of 6,283 recognised technologies in 68 categories. A detection shows presence on the website, so read a company that shows neither as unknown rather than as running neither.

That sets the first rule of the copy. Use the stack to choose the variant, not to write the sentence. A line that tells a company which tool it runs is a claim about the reader, and a generic line costs less trust than a wrong one. A recent removal is a dated, confirmed change in Technology Changes, which makes it the strongest stack key. The guide to competitor displacement treats the timing of those windows.

Keys from the stage

Read stage from behaviour, which the hiring and funding datasets record directly.

  • Hiring momentum. New postings in the last 28 days against the company's own average for the 56 days before, from Hiring Activity.
  • Sales build-out. A first sales posting in a new country (new_countries) or a first enterprise-segment posting (upmarket) in Sales Team Metrics.
  • Funding. A private capital raise in Company Funding, or a funding_round announcement in Company News.
  • Size. Stated employees in Employee Headcount.
-- :last_day is the latest closed UTC day
select
  company_id,
  sum(case when day >  :last_day - 28 then new_postings end)                  as new_28d,
  sum(case when day <= :last_day - 28 and day > :last_day - 84
           then new_postings end) / 2.0                                       as new_prior_28d
from company_hiring_daily
where day > :last_day - 84
group by company_id;

The first observation of a job board sets a baseline and counts nothing as new, so the comparison runs on 56 days of observations for each board. Use open_postings for a board with a shorter record, or the sector baseline in the market series. Whatever the rule, a threshold such as 1.5 times the prior average is a starting point to tune against your own results.

Keys from events

A trigger event works in a campaign when its window is short and the copy cites the company's own words. Company News holds one row per announcement, with the company's own title, a link, an excerpt and zero or more of 13 event types. The windows below are illustrative. Set your own.

Event typeHandling
funding_roundA growth variant for 30 days, citing the announcement
product_launch, expansionA variant that cites the launch or the new market, for 14 days
partnershipA complement variant, after you read the excerpt
leadership_changeA new-owner variant when roles is the function you sell to
layoffs_restructuring, incident, acquired_or_mergedHold promotional variants for 30 days, then review
financial_results, award_or_recognition, regulatory_or_legal, otherNo variant

Regulatory disclosures by listed companies arrive as rows with the same types, typed from their item numbers. A material agreement maps to partnership, so read the excerpt before you use either kind of row and confirm it is a partnership of the kind a campaign should mention.

One variant per account

An account can match several keys, so give each variant a rank and take the highest. A reasonable order puts holds first, then events, then stack changes, then stack states, then stage, then a default. The query below returns one variant per account. It reads event_types, a JSON list in one cell, as text, so use your engine's JSON functions if you prefer, and it assumes you have chosen the rival and complement ids. It handles funding and holds as the event keys, so add a branch for each other event type you use.

-- :last_day is the latest closed UTC day
-- :rivals and :complements are lists of technology ids
with stack as (
  select
    company_id,
    max(case when technology in (:rivals)      then 1 else 0 end) as runs_rival,
    max(case when technology in (:complements) then 1 else 0 end) as runs_complement
  from company_technologies
  where missing_since is null
  group by company_id
),
dropped as (
  select distinct company_id
  from company_tech_events
  where category = 'technology'
    and change   = 'removed'
    and key in (:rivals)
    and observed_at >= :last_day - interval '60 days'
),
recent as (
  select
    company_id,
    max(case when event_types like '%"funding_round"%' then 1 else 0 end) as funded,
    max(case when event_types like '%"layoffs_restructuring"%'
              or  event_types like '%"incident"%' then 1 else 0 end)      as hold
  from company_news
  where at >= :last_day - interval '30 days'
  group by company_id
),
hiring as (
  select
    company_id,
    sum(case when day >  :last_day - 28 then new_postings end) as new_28d,
    sum(case when day <= :last_day - 28 and day > :last_day - 84
             then new_postings end) / 2.0                      as new_prior_28d
  from company_hiring_daily
  where day > :last_day - 84
  group by company_id
)
select
  a.company_id,
  case
    when r.hold = 1                          then 'hold'
    when r.funded = 1                        then 'funding'
    when d.company_id is not null            then 'evaluating'
    when s.runs_rival = 1                    then 'compare'
    when s.runs_complement = 1               then 'integration'
    when h.new_28d > 1.5 * h.new_prior_28d   then 'scaling'
    else 'default'
  end as variant
from target_accounts a
left join stack   s on s.company_id = a.company_id
left join dropped d on d.company_id = a.company_id
left join recent  r on r.company_id = a.company_id
left join hiring  h on h.company_id = a.company_id;

Take Acme Robotics, an invented account, in an illustrative example. It runs a rival tool, opened 40 postings in the last 28 days against an average of 22, and announced a funding round 12 days ago. No hold applies, the funding test is met, and the account gets the funding variant. The copy cites the announcement and its link. It does not mention the rival tool or the hiring.

What each variant may say

The set below is illustrative. Each variant has a trigger, an angle and a limit on what the copy may cite.

VariantTriggerAngleMay cite
fundingA funding announcement in the last 30 daysGrowing the team and the stackThe announcement and its link
evaluatingA rival tool dropped in the last 60 daysA tool decision is likely openNothing about the tool
compareA rival tool presentWhat changes when a team movesNothing about the tool
integrationA complement present and no rivalWorks with what teams like yours runThe category, not the tool
scalingNew postings well above the company's own averageCapacity for growthThe roles it has opened
defaultNone of the aboveThe core value of the productNothing
holdLayoffs, an incident or a saleNo campaign messageNot applicable

For the funding variant, an opening line can refer to the round by its date and link, then move to what a larger team needs. For the integration variant it can refer to the category the company works in and leave the named tool out. The four rules below hold for every variant.

  1. What the company published. An announcement with its link, a role it opened and a market it added are the company's own statements, and a message can refer to them.
  2. The data chooses, the company's words speak. The stack and the stage choose the angle and stay out of the sentence.
  3. Roles and company statements. A leadership change is recorded as a role and a direction, so any name in the copy comes from the announcement you link or from your own records.
  4. Nothing upbeat after bad news. Layoffs, an incident or a sale of the company hold promotional copy until you have reviewed it.

Testing and cadence

Treat each variant as a hypothesis. Within a variant, split accounts at random between the variant copy and a generic control, and measure replies and meetings per account, not opens. A cell of a few accounts confirms nothing, so merge variants that are too small to read. Record the variant assigned to each account on the day it is sent, because the data will have moved by the time you analyse the result.

Refresh on the cadence of each key. Stack changes arrive daily to weekly, hiring daily and announcements daily to every three days. Assign variants when you send, from the latest closed day, and not from a list built a month earlier. For segments that last longer than a send, see building account-based marketing segments from signals.

Where the audience comes from

Variants rest on public signals about a company, so the audience is your own list or a partner's, and the data decides which message each account on it receives. Because every observation is dated and written once, an assignment made on a given day can be reproduced exactly when you analyse the result.

Frequently asked questions

How do you segment accounts by technology stack?

Choose the technologies that matter to your product and list them as rivals and complements. Label each account from Technology Stack as running a rival, running a complement or neither detected, and add the dated changes in Technology Changes for tools added or dropped in the last 60 days. Read neither detected as unknown, because a detection shows presence and does not prove absence.

How do you personalise B2B campaigns without getting facts wrong?

Use public signals to choose the variant, and cite only what the company itself published, such as an announcement or a role it opened. Keep inferred facts, like the tools it runs or its growth stage, out of the sentence. A message that states something false about the reader costs more trust than a generic one. Open the original source before you quote it.

Which company events make good campaign triggers?

Funding rounds, product launches, expansion into a new market and leadership changes in the function you sell to usually justify a variant for a short window after the announcement. Layoffs, restructuring, incidents and mergers call for holding promotional copy instead. Financial results, awards and regulatory items rarely justify a variant. Test each against your own results.

How can you tell a company's growth stage from data?

Read it from behaviour: new job postings against the company's own average, a first sales posting in a new country or in the enterprise segment, a private capital raise or a funding announcement, and stated headcount over time. Each is dated, so you can say when a company crossed a threshold and apply the same rule to every account in the list.

How often should campaign segments be refreshed?

On the cadence of the data behind them. Technology changes arrive daily to weekly, hiring daily, announcements daily to every three days and intent scores weekly. Assign each account's variant on the day you send, from the latest closed day, and record it, rather than reusing a list built weeks earlier.

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