Skip to content
← Processes

Find buyers engaging with competitors

Everyone who engages with a competitor's posts gets found, scored against your ICP, enriched, and staged for outreach with a human approving the list.

Watching a competitor's engagement is a job somebody does by hand for about a week. You open their page, scroll the reactions on the last few posts, copy the interesting names into a sheet, look up a handful of them, and then stop, because doing it properly means checking a few hundred profiles every week and the returns are invisible until you have done it for a month.

Both halves of the work already exist as data. Who engaged with a public post is public, and what a good account looks like is written down in your CRM as the shape of everything you closed. Joining and filtering the two is the rest of the job.

What you get

A staged campaign built from people who already engaged with a competitor this week, each one scored against your ICP, enriched, and held for a human to approve before anything sends.

The part worth getting right

Enrichment runs after scoring, never before. A competitor post with decent reach returns a few hundred people, and enriching all of them buys you the discovery that most were students, employees and people in the wrong country. Scoring costs nothing, so the free filter goes first. On a typical week you pay for thirty lookups instead of four hundred.

Deduplicate by profile URL rather than by name. The same person reacting to three posts in a fortnight is one prospect, not three, and their display name will not group them. Middle initials appear and disappear, job titles get appended, accents get stripped by whatever scraped them. The profile URL is the only identifier the platform itself treats as unique.

"I saw you commented on their post about warehouse routing" is a sentence with evidence behind it. Keep the engagement context attached to each person during collection and the opener writes itself from it. Strip it out and write the opener later, and you get "I see you're interested in logistics", which reads as generated because it is.

The prompt

The real prompt behind the steps above — detailed enough that an agent with a people-search tool, email/phone enrichment, and CRM access can run it as written.

# Find buyers engaging with competitors

You have access to a scraping tool, a CRM, an outreach tool, and a
messaging tool. Run this for **[competitor company names]**.

## 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. Create a free account at app.tulina.ai.
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: social scraping, your CRM, your outreach tool, 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.

Engagement is a weak signal on its own. A like is not intent, and
treating it as intent is how this becomes spam. Everything below is
about filtering hard enough that what survives is worth an email.

## 1. Collect the engagement

Pull reactions and comments on the competitor's posts from the last 14
days. Two weeks is the window worth using: older engagement has gone
cold, and a shorter window returns too little to rank.

Collect the whole set in one run rather than post by post. Deduplicate
by profile URL, not by display name, because the same person shows up
under different name spellings across posts.

Keep the engagement itself alongside each person: which post, what
kind of interaction, and the comment text if there is one. That
context is what step 4 writes from, and losing it here means the
opener has nothing real to stand on.

## 2. Drop everyone who is not a buyer

Most engagement is not from prospects. Remove, in this order:

- Anyone whose current employer is the competitor. Employees engage
  with their own company's posts constantly.
- Anyone already in your CRM as an open opportunity or a customer.
  Check by email where you have one, by company domain otherwise.
- Anyone whose title does not sit in the function you sell to. A
  commenting engineer at a target account is not the buyer, though
  they may be worth keeping as a route in.

## 3. Score what is left against your ICP

Score each remaining person on the axes you actually sell against:
company size, sector, geography, and how close their title is to the
buying role. Score the company and the person separately, then combine
them, so a perfect-fit company with the wrong contact is visible as
exactly that rather than averaged into the middle.

Anything below your threshold gets dropped and counted, not queued.

## 4. Enrich only what survived

Find a work email for the people above the threshold and nobody else.
Enrichment costs money per lookup, and running it before scoring is
the single most expensive mistake in this workflow: it prices the
entire engagement list rather than the fraction of it worth writing to.

Where no verified email comes back, keep the person on the list and
mark them unreachable rather than dropping them silently. A named
person with no email is still useful to whoever owns that account.

## 5. Stage the campaign and ask for approval

Write one opener per person, grounded in the specific post they
engaged with and what they said about it. Load them into the outreach
tool as a draft campaign, not a live one.

Post the summary to your team's channel: how many were found, how many
survived scoring, how many were enriched, and a sample of the openers.
Nothing sends until a person approves it.

## Output

Report: total engagements collected, how many were dropped at each
filter and why, how many were enriched successfully, how many are
unreachable, and the campaign's draft status.

Questions about this process

Yes, as long as the engagement is publicly readable. The scraper is pointed at a company's posts and returns whoever reacted or commented; the filtering, scoring and enrichment steps after it do not care which network the names came from.

Three filters before anyone is contacted. Competitor employees and existing pipeline are removed outright, everyone left is scored against your ICP with a hard threshold, and the campaign stages as a draft that a person has to approve. Engagement alone never triggers an email.

Enrichment is billed per lookup. Scoring first means you only pay for the fraction of the list that passed your ICP threshold, which on a typical competitor's post is a small minority of the people who engaged.

They stay on the list and are marked unreachable rather than dropped. A named person at a target account is still worth handing to whoever owns that account, even when there is no address to write to.

Related processes

  • Build a target list from a sentence

    Describe the companies you want in one sentence, and get them sourced, scored on dated signals, enriched, deduplicated against your CRM, and staged as a campaign.

  • Turn website visitors into outreach

    Every company that reads your site gets one decision, and the few worth answering arrive as a named person with a note already written from the page they read.

  • Brief every cold call before it starts

    Every account on the call list gets a note before anyone dials, carrying the signals found on it, what the lead has said publicly, and one opener grounded in both.

Experience Tulina for 14 days.

By continuing, you agree to our Terms of Use and Privacy policy.