Skip to content
← Processes

Outreach based on government data

Every candidate's website is verified before a credit is spent, tiered by signal strength, then written one grounded opener that is checked for repetition.

INSEE Sirene→Serper→FullEnrich
Starts
New target list
Steps
7
Checks and gates
0
A person decides
Never, runs alone

Trigger · Event

New target list

A newly defined target list starts the run, and nothing is sourced until one exists.

Claude runs the rest autonomously

  1. 1

    AI lists every matching company.

    INSEE Sirene

    INSEE Sirene

    Every company matching your target profile comes back from the official registry, active and within the size and age bands you want.

  2. 2

    AI keeps companies with a real website.

    Serper

    Serper

    Only companies whose own website exists and matches move on to paid enrichment, since a real share of any pulled list turns out to be the wrong fit.

  3. 3

    AI tiers each company by its signal.

    Serper

    Serper

    Each company is tiered by an open role, a known system, recent press or nothing, and even the last tier gets an opener from its own site.

  4. 4

    AI finds an email for each company.

    FullEnrich

    FullEnrich

    Emails come back in batches, and anyone with no email but a confirmed profile is routed to another channel instead of dropped.

  5. 5

    AI writes one opener per company.

    Every company gets its own opening line from real evidence, spread across several sentence shapes.

  6. 6

    AI rewrites openers that repeat.

    Any sentence shape or phrase used too often across the batch is counted and rewritten before anything moves forward.

  7. 7

    AI stages the campaign for review.

    Each company sits in the track matching its signal strength with its opener checked in place, ready for a person to review and launch.

Building a cold outbound list by hand usually means one search per city or category, stopping at the first page of results, and sending the same note to everyone regardless of fit. A registry pull can hand over thousands of names in an afternoon, so volume was never the hard part. Knowing which few hundred are actually worth an email, and writing to each one as if it were the only one, is.

Public company registries already hold the universe. Web search and an enrichment waterfall already resolve who to write to. The work that is hard to automate well is the discipline in between: verifying before spending, tiering by real evidence instead of a guess, and catching the moment a hundred true, personal lines start reading as one template.

What you get

A staged, two-track outbound campaign in which every message is personalized from real evidence, verified before it goes out, and handed to a person to launch.

Pulling the list from public company data

The list starts in an official registry, INSEE Sirene here, filtered on the fields that decide fit for this kind of campaign: sector, headcount band and company age. Revenue is recorded where a clean filing exists, and a company with none on file stays in scope. The pull is narrowed to active companies within the bands you want, then written once to a single running table that every later step reads from.

Verifying each company before a credit is spent

A pulled list is not yet a qualified one. Registry data alone gets the sector and size band wrong often enough that skipping verification turns every later step (enrichment, opener writing, sending) into wasted work on the wrong company. Each company gets one search through Serper for its name, its city and its official site. Business registries, review sites, map listings and marketplace pages never count as the answer, and the real site often sits under a brand name that differs from the legal one.

A company with no verified website of its own gets no enrichment credit. A site that reveals the wrong sector is dropped, with the reason recorded. On a real run roughly one in four pulled rows turns out to be the wrong sector, dissolved, or a subsidiary with no local buyer, so that ratio is expected. Results are saved as the batch goes, so a run that stops midway keeps what it already verified.

Tiering by signal and finding the email

Each verified company is tiered by the strongest evidence found, in order: a relevant back-office role open, a known back-office system, recent press that signals change (an acquisition, a new location, a franchise deal, an investment, a generational handover), or nothing. The evidence itself is recorded, because the openers are written from it. Tiering by evidence keeps every opener honest. A company with a hiring signal gets a line that names it, and a company with nothing still gets a real line from its own site, never a default sentence recycled across the tier.

Emails come from FullEnrich in batches of 20, since larger batches are rejected and one malformed row can fail a whole batch. A company with no email but a verified profile match is routed to another channel instead of dropped. An email on an unrelated or foreign head-office domain belongs to the wrong buyer, and that row is dropped for real.

Personalizing cold emails without a template feel

Every company gets one opening line from its own evidence: under 35 words, formal register, one specific fact a stranger couldn't have guessed, turned toward the daily pain behind it. If nothing specific can be found, the line is marked low confidence and never sent. Lines rotate across several structural frames (density, history, flow, an event addressed directly, a plain long-tail statement, a question built from their own site) so a hundred true lines don't read as one template.

The mechanical check on the full batch is the part that's easy to skip and expensive to skip. Six individually true, individually specific lines can still all lean on the same rhetorical move, a colon, a closing phrase, a sentence shape, and read as automated the moment they're seen together. So the batch is counted: no frame above 30%, colon pivots and repeated closing phrases capped at 20%, no shared opening pair above 5%, and no line over 35 words. The surplus is rewritten and the check runs again. Only then does each company move into the track matching its signal strength, its opener confirmed in place, for a person to review and launch.

The prompt

The real prompt behind the steps above, detailed enough that an agent with the same tools can run it as written. The Run buttons copy the full version, which also carries the steps for connecting those tools.

# Build a cold outbound list from public company data

You have access to an official company registry, web search, and an
email-enrichment tool. Run this for **[your target company profile: size,
sector, and company age]**.


## 1. List every matching company

- Pull every company matching your target profile from an official
  registry — the fields that matter are sector, headcount band, and
  company age, not revenue: revenue is worth recording where a clean
  filing exists, but a company with none on file is still in scope.
- Filter to active status and the age/size bands you actually want before
  doing anything else — a first pull that's too broad is fine, a filtered
  list is what the rest of this runs against.
- Write the full list to one running table. Don't re-pull per batch.

## 2. Keep companies with a real website

- For each company, one search for its name plus city plus "official
  site." Registry/directory listings (business registries, review sites,
  map listings, marketplace pages) are never the answer — the real site
  is often under a brand name that differs from the legal name, and a
  generic listing snippet usually reveals it.
- Treat this as qualification, not enrichment: a row with no verified
  first-party website doesn't get an email credit spent on it. A website
  that reveals the wrong sector gets dropped, with the reason recorded —
  on a real run, roughly one in four pulled rows turns out to be the
  wrong sector, dissolved, or a subsidiary with no local buyer. Expect
  that ratio; it's not a bug in your query.
- This step is a bulk job — batch it and save results as you go, not only
  at the end. A run that only saves at the end loses everything if
  credits run out mid-batch.

## 3. Tier each company by its signal

In order of strength:

1. **A relevant open role** — anything back-office: order processing,
   billing, admin, customer service. If you have a job-postings source,
   query it by company name directly; searching job boards by keyword
   instead returns staffing agencies hiding the real employer, not the
   company itself.
2. **A known back-office system** — if you have a technology-stack
   signal source, check for it.
3. **Recent, relevant press** — an acquisition, a new location, a
   franchise deal, an investment, a generational handover. Filter hard:
   an old story, a routine mention, or a profile piece isn't a trigger.
4. **Nothing** — still gets an opener, written from the company's own
   site. This is most of the list, not a fallback case to skip.

Record which signal each row got, and the evidence itself (the posting
title, the system name, the headline) — step 5 writes from this, never
from a guess about the segment.

## 4. Find an email for each company

- Submit in batches of 20 through an enrichment waterfall — larger
  batches get rejected outright, and one malformed row can fail the
  whole batch, so validate names are present before submitting.
- Poll until each batch finishes rather than assuming a fixed wait.
- Expect the tool to correct the domain when the real mailbox lives
  elsewhere from the site you found.
- A miss on email that still returns a verified profile match isn't a
  dead end — route that row to a different channel instead of dropping
  it. An email on an unrelated or foreign-HQ domain is the wrong buyer;
  drop that one for real.

## 5. Write one opener per company, then rewrite openers that repeat

Every row gets its own opening line, written from its own evidence —
the signal from step 3, or the company's own site for tier 4. One
sentence, two short ones at most, under 35 words, formal register, no
em dash. It states one specific fact a stranger couldn't have guessed
and turns it toward the actual daily pain in the same breath. Never
invent a fact — if nothing specific is findable, mark that row's
confidence low, and never send a low-confidence line.

**Rotate across several structural frames, so a hundred true lines don't
read as one template:**

- **Density** — a number against a headcount: *"47 accounts on file,
  4 people touching every one of them — a ratio that only tightens as
  the roster grows."*
- **History** — the company's own longevity: *"[Company] has run the
  same regional routes since 1998. The trucks got faster. The paperwork
  behind them didn't."*
- **Flow** — people and volume in motion: *"Three reps on the road, two
  people at a desk turning what they bring back into orders that
  actually ship."*
- **Event, addressed directly** — from the step-3 signal: *"You're
  hiring an ops coordinator this month. Most of that role, on paper, is
  re-entering what already arrived once."*
- **Long tail, plainly** — two flat sentences, no twist: *"[Company] has
  supplied independent retailers since 2003. A lot of small orders,
  entered by hand, one at a time."*
- **Question** — built from a fact on their own site: *"How many of your
  [N] regional accounts still order by phone or email?"*

Then run a mechanical check over the whole batch before anything moves
forward — count, don't eyeball:

| Check | Cap |
|---|---|
| Same structural frame | no more than 30% of the batch |
| Lines built on a colon pivot | 20% |
| Lines closing on the same stock phrase | 20% |
| Same opening two words, grouped | no group over 5% |
| Em dash, or over 35 words | 0 — reject and rewrite |

Rewrite the surplus into an under-used frame and re-run the check. A
batch that hasn't passed doesn't move to step 6 — this catches what
individually-true lines miss when read as a set.

## 6. Stage the campaign for a person to launch

- Route each row to the track matching its signal strength: rows with a
  real trigger (role, system, press) into your highest-touch track,
  everything else into your standard track.
- A simple three-touch structure holds up well: touch one leads with the
  opener and one clear value line; touch two, a few days later,
  references what the delay is now costing them and — if you have real,
  named public customers — names one and asks a different, more direct
  question; touch three, about a week later, closes the loop rather than
  pushing again, and offers to redirect to whoever else might own this.
- Before loading anything, read back what you just wrote and confirm the
  opener field actually changed per row — a write that silently fails
  ships a generic line where a personal one should be, with no visible
  symptom.
- Stage everything, then stop. The agent prepares the campaign; a person
  reviews and launches it. Never call a send/launch action yourself.

## Output

Report: how many companies pulled, how many passed the website gate,
how many landed in each signal tier, how many resolved to a usable
email or fallback channel, how many openers passed the mechanical check
on the first pass vs. needed a rewrite, and the campaign staged for
review.

Why run it with Tulina

A prompt helps one person. A process moves a team.

Pasted into a chat, the prompt above works once, for whoever pasted it. In Tulina, "Outreach based on government data" becomes a process the team shares, that keeps its history, runs on its own, and stays inside the same security perimeter as the tools it calls.

  • The whole team works on the same one

    PersonalTeamOrganisation

    A process lives where it belongs: yours, your team's or the whole organisation's. Whoever runs it can improve it, and everyone starts from the best version instead of explaining the job again.

  • Every edit is a version

    v1v2v3

    Each change is a new version with the previous one kept, so a bad edit is undone by restoring an earlier one. Every run records the version it followed, and what a run teaches goes back into the process.

  • It runs without you

    schedulewebhookon demand

    A hosted agent runs the process on Tulina's own infrastructure, on a schedule or when an event arrives, and keeps going when you close the chat. Nothing to host. Every run is tracked to its outcome.

  • Inside the same security perimeter

    vaultrolesrun log

    Credentials stay in the vault, never in the prompt. Roles decide who may run what, every call is logged, and a step a person has to approve waits for that person.

Questions about building cold outbound lists

Yes — an agent with access to an official company registry can pull every business matching a target profile, verify each one's real website before spending any enrichment credit, and tier them by the strongest signal found.

By writing one opening line per company from real evidence, then running a mechanical check across the whole batch for repeated phrasing and structure — individually true lines can still read as one template when seen together.

Yes — a website-verification gate runs before any paid step, since roughly a quarter of any pulled registry list turns out to be the wrong sector or already gone.

No — everything is staged and verified, then the agent stops. A person reviews and launches.

Other processes that run mainly on Serper. The tools they share with this one are lit.

See Tulina in a 30-minute demo.

Book a demo