- name
- buying-signal-monitor
- description
- 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.
- license
- MIT
- metadata
- {"author":"UnifAPI","version":"1.0.0"}
# 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.
Ver no GitHub