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.
- 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
AI lists every matching company.
INSEE SireneINSEE Sirene
Every company matching your target profile comes back from the official registry, active and within the size and age bands you want.
- 2
AI keeps companies with a real website.
SerperSerper
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
AI tiers each company by its signal.
SerperSerper
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
AI finds an email for each company.
FullEnrichFullEnrich
Emails come back in batches, and anyone with no email but a confirmed profile is routed to another channel instead of dropped.
- 5
AI writes one opener per company.
Every company gets its own opening line from real evidence, spread across several sentence shapes.
- 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
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
Also on Serper
Other processes that run mainly on Serper. The tools they share with this one are lit.
Find doctors and clinics
A census of every doctor and clinic in a French city, from map listings cross-checked against the practitioner registry and facility directory, with gaps named.
- Shares
- Serper, INSEE Sirene
Specialty and city named6 steps →
Find local points of sale
Every target city is searched three different ways for shops that fit your positioning, each one ranked on fit and reviews before the first email goes out.
- Shares
- Serper
Target city list created5 steps →
Qualify accounts by number of local merchants
Multi-location businesses qualified on a real location count: a published figure checked for scope and date, then a map count confirmed by a second source.
- Shares
- Serper
List created4 steps →