# Outbound from buying signals

You have access to a job-posting and tech-stack source, a company and
people database, a scoring model, a CRM, an outreach tool, a web
search tool, an email enrichment waterfall, and a messaging tool. Run
this every morning for **[the signals of the day before]**.

## 0. Set up (skip if you're already connected)

If you don't already have live tool access for this, connect it
first. This prompt is only as real as the tools behind it:

1. Get a Tulina account: book a demo at https://tulina.ai/book.
2. Add Tulina's MCP server to your assistant: https://mcp.tulina.ai/mcp
3. In Tulina, connect your own API keys for the tools this
   prompt uses: job postings and tech stacks, a company and people
   database, a scoring model, your CRM, your outreach tool, web
   search, email enrichment, and your team's messaging tool.

Once connected, your assistant has real tool access and the rest of
this prompt runs as written.

## 0b. Already on Tulina? Three things around the run

An account and the MCP server are not the whole setup. Two of these come
before the run below and one after it, and together they turn this from a
one-off answer into a process your workspace keeps:

1. **Activate this process's connectors first.** Call
   `oto_connector(op="list")`, match it against the tools named in step 3
   above, and `oto_connector(op="select", name="...")` every one that
   isn't active yet. Selecting a connector does not mount its tools in the
   conversation you're already in — reach them through `oto_call` for this
   run, or open a fresh conversation once they're all on.
2. **Attach the work to an existing project.** `oto_project(op="list")`
   shows your active org's projects: pick the one this work belongs to
   rather than opening another, and keep its id. The project is where this
   process, the tables it writes to and the connectors it uses hang
   together.
3. **When the run is done, save it as a process — with its graph.** Write
   the body with `oto_procedure(op="set", ...)`, then attach it with
   `oto_project(op="link", project_id=..., target_type="procedure",
   target_ref="<your slug>")`. The body has to carry a drawing: read
   `oto_guide(op="read", slug="procedure-flowchart")` and follow it
   exactly — ONE untagged fenced block in that grammar, opening with the
   trigger and a quoted example of what you'd type to start a run. Tulina
   parses that drawing back into the graph it renders as the process's
   default view, which is what makes it come out in the same style as
   every other process in the app; a drawing the grammar can't read falls
   back to raw characters instead. Saving a process needs org-admin
   rights — without them, hand the finished body to someone who has them.

## 1. Build the universe on stack and hiring

Two sources, one list, merged on the company's domain.

- **The stack.** From the tech-stack source, companies that started
  running **[the tools yours plugs into, and their rivals]** in the
  last week, in **[your countries and headcount band]**, in one call
  for the whole category. A detection resting on a single posting is
  one job ad, not a stack: keep only companies whose detection rests
  on **[at least two]** postings. A company whose industry is an
  agency or a consultancy is tagged with the tool because it sells
  work on it, and it leaves here.
- **Hiring.** From the same source, companies that opened a posting in
  the last day for **[the roles that mean a company needs what you
  sell]**. One posting is a signal; three for the same role is a
  stronger one, and the count is kept.

Resolve every company in the company database for its description,
headcount, founding year and ownership, ten domains per call. Keep
the record light: domain, name, headcount, industry, what was
detected and the postings behind it. Report the total each source
returned beside what was kept, so the team can see whether the
segment is bigger than the morning.

## 2. Score on your rubric

Send every company to the scoring model with the same rubric, in
batches: **[your ICP written as closed questions, for example: is
this company a buyer of what you sell, yes or no; which segment is it
in, one of your named segments or none; how well does it fit, on a
scale of 0 to 4]**. Send only the fields the judgement needs, never
the whole record.

Each answer comes back with a probability. Read it with two
thresholds: a fit above **[0.8]** is in, below **[0.4]** is parked,
and the band between goes to a person with the reasons, never forced
to a label. Store the score, the probability and the model's name on
the company, so the threshold is reproducible. A company parked here
costs nothing further: no search, no enrichment, no credit.

## 3. Drop what the CRM or a sequence holds

This is where most of the morning's list stops, and it stops before
anything is bought. Four checks, in order, on every company that
passed the rubric:

1. **A customer.** Match the domain against the CRM's companies, on
   the domain property and never the display name, and read the
   lifecycle stage. A customer leaves the list.
2. **An open deal.** Read the deals associated with each matched
   company, by pipeline and stage identifier, never by stage label.
   A company with an open deal leaves the list, and its owner gets one
   line saying it just showed a signal.
3. **Another rep's claim.** Read **[your claims register]**: a company
   claimed by another rep inside **[the claim window]**, on your
   exclusion list, or touched by anyone inside **[the cool-off after
   a touch]** leaves the list with that reason.
4. **A person already in a sequence.** Once people are found in step
   5, look each email up in the outreach tool's whole workspace, not
   one campaign, and against the CRM's contacts with their deals. A
   person already in a sequence, or a CRM contact on an open deal,
   stops.

A company that passes is claimed for this run's owner in the register
with the date, so the next morning and the next rep find it held.
Nothing billable is spent on a company this run has not claimed.

## 4. Read why now, match the buyer

For each claimed company, read its postings of the last **[90 days]**
in full, since the sentence worth quoting lives in the description,
and search the news of the last month for funding, expansion and
leadership changes. Keep each signal with the exact sentence it rests
on and its date. A signal with no quote behind it is not written.

The signal names the buyer: a company hiring its first sales manager
is a message to the founder, a company that just adopted the tool you
plug into is a message to whoever runs it. Write down which of
**[your buyer roles]** each signal points at. A company with no signal
is still worked; it opens on the segment instead of a reason.

## 5. Find the buyers, enrich their emails

Search the people database one domain per call, with the buyer roles
from step 4, the person's country and at most three candidates, and
keep **[two]** per company: the one the signal points at and one
beside them. Reveal each by their identifier, never by name plus
company, and read the contact record as well as the person record: an
address is usable only when both agree.

Send the misses to the enrichment waterfall as one job for the whole
morning, work emails only. Purge false affiliations: the email domain
belongs to the company, the employer returned matches it, and the
same person is not attached to two companies in this run. Then run
check 4 of step 3 on every email. A company where nobody resolves
keeps its claim and is reported for a person to find someone by hand.

## 6. Pick the play, write each opener

Read each company against **[your outbound playbook: how many people
to write to by segment, in what order, with what gap, and which
signals warrant the full play]**. Decide per company: the full
sequence, one person only, or the watchlist for a signal too weak on
its own. Name the rule.

Then write one opener per person: two sentences at most, the signal
first, quoted where it is a quote, and one question. In the person's
language. No pitch, no adjective about the company, nothing the
sources did not say, no figure your proof points do not mark citable,
no customer named that is not marked citable. A draft that fails
either check is not written, and the row says why.

## 7. Fill the campaign, update the CRM

Add each person with an email to **[the campaign your team keeps for
signal-based outbound]**, with their opener as the first-step
variable, deduplicated on email. That campaign is kept paused, and its
reports call proves it: the lead count up by the morning's people, and
nothing reviewed, in sequence or sent. If the campaign is found
running, add nobody and report that it was.

Write one note on each company in the CRM: the signal with its quote,
the score with its probability, the tier and the play chosen. Nothing
else: no property, stage, deal or owner. Create a company only when
the domain search came back empty.

Post one recap to the team: the universe against the total each
source returned, how many passed the rubric, how many were parked, and
every company that stopped with its reason, customers, open deals,
claims, cool-offs, people already in a sequence, unreachable, no
draft. The skipped line is how a rep finds out that half the segment
already belongs to someone else before the next morning repeats it.

## Output

Report: companies from each source against each source's total,
scores with their probabilities and the band sent to a person,
companies stopped at each of the four checks with their reasons,
signals found with their quotes, people found, emails verified and
purged, the play per company, drafts written and withheld, the
campaign and its paused state, and the notes written.
