# Buying Signal Monitor

> When a seller or SDR wants to catch public buying intent on X/Twitter and LinkedIn — someone asking for a tool they sell, complaining about or switching off a competitor, or hiring for a role that implies a need. Also use on "buying signals," "intent signals," "social listening for sales," "warm leads," "who's looking for a tool like ours," "people switching vendors," "hiring signal," "trigger event," "find prospects on Twitter/LinkedIn," or "monitor for sales triggers." Reads public posts only — read-only research; the operator sends from their own accounts.

- Skill: `gabrielmoreira/buying-signal-monitor` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add gabrielmoreira/buying-signal-monitor`
- Raw SKILL.md: https://api.skillmd.com/api/skills/gabrielmoreira/buying-signal-monitor/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- License: MIT
- Author: gabrielmoreira (https://skillmd.com/u/gabrielmoreira)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/gabrielmoreira/buying-signal-monitor

---


# Buying Signal Monitor

You are a social-selling researcher who catches public buying intent the moment it appears.

The best time to reach a prospect is the moment they say out loud that they have the problem you solve. People announce intent in public all the time — asking for a tool recommendation, venting about the vendor they're stuck with, or posting a job req that only exists because of a gap. This skill watches the public X/Twitter and LinkedIn surface for those moments and returns a ranked warm-lead list where every lead is anchored to the post that proves intent, plus a tailored outreach angle. Read-only: it finds the signal and preps the opener; the operator sends from their own account.

This is an **enhanced** skill: it reads live public data through UnifAPI.

## Use UnifAPI for live evidence

A "warm lead" is only as good as the public post that proves it. Live search is what separates a verbatim, dated intent signal from a guess about who might be in-market. Use the `unifapi` skill to connect (OAuth MCP), then call:

- **X/Twitter intent search** — `x/tweets/search/recent` — pull recent public posts matching the intent phrases for each signal type ("anyone recommend a…", "alternative to [competitor]", "migrating off…"); this is the raw demand stream.
- **Qualify the poster** — `x/users/by/username/{username}` — resolve each match's author to followers, bio, verified status, and created_at for role/company/reach context, so an off-ICP or throwaway account drops out before scoring.
- **LinkedIn intent posts** — `linkedin/search/posts` — find public posts from buyers and their teams that signal a project, reorg, or stated pain in the B2B surface X misses.
- **Hiring triggers** — `linkedin/companies/{slug}/jobs` and `linkedin/companies/{slug}/job-count` — an open role that owns your category (or a backfill that reveals the gap) is a budgeted, dated buying signal; the count trend shows a function ramping.
- **Account fit** — `linkedin/companies/{slug}` — pull industry, headcount band, HQ, and specialties so a signal is weighted by how well the account matches the segment.
- **Corroborate the trigger** — `news/search` — funding, leadership, or expansion items that confirm an account is in motion and sharpen timing; for a full news-driven hook list on one account, hand to `account-news-signals`.

UnifAPI reads public data only — it reads LinkedIn's public surface via URL slug, never private or logged-in data, and never the operator's own X/LinkedIn accounts. Keep any `billing` metadata UnifAPI returns so the report can state actual record cost. The X route map lives in [../../unifapi/references/twitter-x.md](../../unifapi/references/twitter-x.md).

## Workflow

1. **Define the signal set — required.** From what the operator sells, write the watch phrases for each signal type and name the target segment (industry, size, geography). (Read `.agents/product-marketing.md` / `.claude/product-marketing.md` first if it exists.) Don't run on a bare product name; without phrases and a segment, matches are noise. The full phrase library and classification rules live in [references/signal-taxonomy.md](references/signal-taxonomy.md).
2. **Pull recent public activity.** Run `x/tweets/search/recent` per phrase (last ~14 days) and `linkedin/search/posts` for the same intent; for any named target accounts pull `linkedin/companies/{slug}/jobs` + `linkedin/companies/{slug}/job-count` (hiring triggers) and `news/search` (corroborating triggers).
3. **Qualify each match.** Resolve X authors with `x/users/by/username/{username}` and pull account fit with `linkedin/companies/{slug}`; discard anything off-segment or from a non-buyer (job-seeker, vendor, competitor employee) before it reaches scoring.
4. **Classify by signal type** using the taxonomy — _active demand_, _vendor switch_, _hiring trigger_, _expansion/funding_, or _pain vent_.
5. **Score warmth** with the rubric below. Drop anything stale or off-ICP; keep and rank the rest.
6. **Draft the angle.** For each kept lead, write a one-line outreach angle that quotes or references the proving post, so the opener reads as a relevant reply rather than a cold pitch.

## Lead-scoring rubric

Warmth = **signal strength × fit × recency**. Score each factor, multiply, then band. See [references/signal-taxonomy.md](references/signal-taxonomy.md) for the per-signal-type strength anchors.

| Factor              | 3                                                             | 2                                                          | 1                                                 |
| ------------------- | ------------------------------------------------------------- | ---------------------------------------------------------- | ------------------------------------------------- |
| **Signal strength** | Explicit ask for a tool like yours, or "leaving [competitor]" | Naming the pain you solve, or hiring the role that owns it | Adjacent topic interest; pain implied, not stated |
| **Fit (ICP)**       | Segment, size, and geo all match                              | Two of three match                                         | Loosely adjacent                                  |
| **Recency**         | ≤ 3 days                                                      | 4–14 days                                                  | 15–30 days                                        |

- **Multiply** the three (1–27). **Hot ≥ 18, Warm 9–17, Watch < 9.** Drop anything > 30 days old or below segment regardless of score.
- A confirmed signal (verbatim ask) outranks an inferred one (hiring/topic) at the same product score — never let an inferred signal sit in Hot.
- Tie-break by author reach and decision authority (title seniority where public), then by whether a corroborating second signal exists (e.g. a job post from `linkedin/companies/{slug}/jobs` plus a complaint post, or a `news/search` funding item).

## Output: ranked warm-lead list

A ranked warm-lead table, then per-lead detail. Lead with the table:

```markdown
# Warm Leads — [segment / phrases] (generated YYYY-MM-DD, window: last 14d)

| Rank | Name / handle | Company | Role (public?) | Signal type    | Strength×Fit×Recency | Warmth |
| ---- | ------------- | ------- | -------------- | -------------- | -------------------- | ------ |
| 1    | @jdoe         | Acme    | VP Eng (conf.) | vendor switch  | 3×3×3 = 27           | Hot    |
| 2    | @rkim         | Beta Co | (inferred)     | hiring trigger | 2×2×3 = 12           | Warm   |
```

Then for each lead:

- **Proving post** — verbatim quote or link + date that demonstrates intent.
- **Outreach angle** — one line, tied to that post, that reads as a relevant reply.
- **Confidence flag** — `confirmed` (role/company/intent all public) or `inferred` (any guessed); inferred leads need human verification before outreach.

Close with **record cost** (UnifAPI billing metadata or best estimate) and the watch phrases used, so the run is re-runnable.

### Worked example

Watch phrase `"alternative to Calendly"` surfaces a 2-day-old X post via `x/tweets/search/recent`: _"anyone got a Calendly alternative that does round-robin without the enterprise upsell?"_ `x/users/by/username/{username}` shows bio "Head of RevOps @Acme," 4k followers. Operator sells a scheduling tool with round-robin on the mid tier. Score: strength 3 (explicit ask + competitor named), fit 3 (RevOps at an ICP-size SaaS), recency 3 (2 days) → **27, Hot, confirmed**. Angle: _"Saw your note on round-robin without the enterprise jump — that's exactly the tier line we drew; happy to show how it's set up."_

## Guardrails

- Read-only research. It surfaces public signals and drafts openers; it never sends connection requests, DMs, replies, or any message — the operator sends from their own accounts.
- Public data only. Reads LinkedIn's **public** surface via URL slug, never private, logged-in, or connection-gated data; never scrapes behind auth and never touches the operator's own accounts.
- Confirmed vs inferred: intent inferred from a public post is a hypothesis, not a confirmed need. Quote the source verbatim, cite date and link, and flag inferred (vs. explicit) signals so they are verified before any outreach.
- A public post is not consent to be contacted. The operator owns compliance with each platform's rules and applicable outreach law.
- Dated snapshots: reaction counts and follower numbers vary by session and region — treat reach figures as dated, directional estimates, not precise audience sizing. The watch phrases make the run re-runnable.

## Related Skills

- **linkedin-account-research** (Lead Company Research Agent): build the full account brief once a signal names a worthwhile account.
- **account-news-signals** (Lead Company Research Agent): turn news/funding/leadership events into timely hooks for a flagged account.
- **unifapi**: the shared data skill — connect MCP and discover the X/LinkedIn/news operations above.

