Getting Started with SignalPipe
Everything you need to go from install to your first approved lead. Covers setup, scoring, the temperature model, the full toolset, and running the sender yourself.
Quick Start
Five steps from zero to a working account. Only the first two are required — scoring works from any agent, bot or plain HTTP call once a product exists.
Open your dashboard and create your key
After checkout you land on the sign-in page. Enter the email you paid with and we send you a sign-in link; it opens your dashboard, where you create your OPERATOR_KEY — one key, it identifies your account on every call. It is shown once: we store only a one-way hash, so copy it somewhere safe. Lost it? Replace it from the dashboard.
skp_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Nothing else to install to get started. The plugin and daemon further down are only for sending replies from your own accounts.
Describe what you sell — in your buyer’s words
Everything is scored against a product profile. Go to signalpipe.io/setup and write three to five anchor sentences: the way a customer says the problem out loud, before they know your product exists.
"I spend every Friday chasing unpaid invoices" "clients keep paying late and I hate the follow-up emails" "is there something that just nudges people who owe me money"
This decides more of your results than anything else on this page. Write what they would type into a forum at 11pm, not what you would put on a landing page.
Add the stations where your buyers already complain
A station is any feed you want read: a community or forum’s RSS feed, a news or search alert, a Hacker News search. There is no allowlist and no approved list: name the ones your customers actually use. Start with three.
"Read the Hacker News search for help desk, and my Google Alert feed for our category."
Read the next section before you pick. Choosing stations is the single decision that most determines whether this works for you, and the obvious choices are often the wrong ones.
Let it run, then work the queue
Scouting starts on its own and runs every 30 minutes. Leads that clear the gate arrive with a verdict from the three-judge panel and a drafted reply. If a day passes with nothing, look at your stations before your anchors: that is usually where the buyers are missing. Approve the ones worth answering, reject the rest.
"Show me today’s missions." "Approve the second one." "Reject the third — wrong audience."
Nothing sends without you: every public reply and DM waits for your approval. Approving marks a draft ready; sending happens from your own accounts, either by hand or through the plugin below.
Reject with a reason — that is the training signal
Rejections are not discarded. Each one carries a reason, and the reason feeds back into how that station is weighted the next time it is scouted. A station that keeps producing the wrong people gets quietly demoted.
"Reject that one — they are building a competitor, not buying."
A silent skip teaches it nothing. Ten rejections with reasons in week one are worth more than a hundred silent ones.
Your first week
Four things decide whether this works for you. They are in order of how much difference they make, and the first one matters more than the other three put together.
Pick stations where your buyers complain — not where your peers hang out
The most common way this goes wrong is choosing a community that talks about your category constantly. Those places are usually full of people who build what you sell rather than buy it. We learned this on our own data: one product’s leads matched its profile more closely than ours did, and not one of fifty-seven cleared the gate, because its best-matching posts were competitors comparing notes. Being on-topic is not the same as being in-market.
Before you add a station, ask: do people here publicly ask for what I sell, or do they build it themselves and swap tips? If it is the second, the scoring will be fine and the results will still be useless.
Write anchors the way a customer says the problem out loud
Anchor sentences are how your product is matched against a post. Marketing language matches marketing language — which is mostly written by other vendors. The sentences that find buyers are the ungrammatical ones: what somebody types at 11pm when they are annoyed.
Read your anchors back. If any of them could appear on your own landing page, it is probably the wrong sentence.
Reject with a reason — that is the training signal
Every rejection carries a reason, and the reason changes how that station is weighted next time it is scouted. A station that keeps producing the wrong people gets demoted on its own. A silent skip teaches it nothing at all.
Ten rejections with reasons in your first week are worth more than a hundred silent ones.
Expect some content to get through, and reject it when it does
The panel is built to tell somebody describing their own problem apart from somebody writing about the category. It is good at that and it is not perfect — a well-written thought-leadership post that happens to describe your buyer’s pain can still survive all three judges. That is the failure mode to watch for, and it is the one worth rejecting loudly.
A post that teaches, brags about results, or asks a rhetorical question to an audience is not a buyer, however well it matches your topic.
What a judgement is, and what it costs you
One judgement is one run of the three-judge panel. Text that is clearly noise, or clearly a buyer, is decided on content alone without convening the panel — so a month of judgements covers considerably more than that number of posts. Your remaining balance comes back on every scoring call, and a verdict reached without the panel is labelled as such rather than presented as a full one.
How Scoring Works
Every post runs a 4-stage filter. Each stage is more expensive but more accurate than the last — designed to eliminate noise cheaply before using expensive AI calls.
If (and only if) you configure buy_signal_keywords, a post must contain one of them to be scored at all. It costs nothing and cuts scoring spend — but a list you guessed will silently drop buyers who worded it differently, so it ships empty and we recommend leaving it empty.
How closely the post matches your anchor sentences in meaning, not wording. Text-embedding-3-small. Urgency and specificity sub-scores are detected in English, Spanish ("urgente", "migrando de"), French ("dès que possible", "on change de"), German ("dringend", "wir wechseln"), Portuguese ("agora mesmo", "trocando de"), and Finnish ("kiireellinen", "mahdollisimman pian") — no configuration needed.
LLM check that distinguishes genuine buyers from irony, hypotheticals, and casual venting. Fails open — if uncertain, the lead passes through rather than being suppressed.
Borderline posts go to a panel of three judges (Skeptic, Analyst, Optimist), who read them independently. When they agree, the verdict stands; when they split, you see the split. Clear-cut posts are decided without convening the panel and cost nothing. The draft is written to fit how strong the signal turned out to be.
Competitor floors
Posts that match any of your configured competitor_keywords get a higher floor when the author is replacing, complaining about or comparing that competitor, so a weak general match cannot bury them. A passing mention gets no floor, and the panel still judges every one.
It learns from you
Every approve and reject changes how much the system trusts the feed that lead came from, which shapes what it surfaces from that feed in future:
Approve
That feed earns more of your attention
Reject
That feed earns less — and the reason matters
Learning is per-feed, not per-product, so one noisy source — an SEO content sub, a brand-promo account — gets demoted without penalising your good sources alongside it. Pick your reject reason accurately. Different failures mean different things: a lead that was outright spam is not the same problem as one that was a perfectly good post from someone who is already your customer, and the system treats them differently. Clicking through with whatever reason is first in the list teaches it the wrong lesson.
Temperature Model
Every prospect has a 0–100 temperature and a lifecycle mode. Mode is intent-based, not pure temperature — a brand-new contact starts in Nurture regardless of starting score, and only moves out once a real signal lands. Mode + temperature together determine which AI persona writes the next message and when.
First-touch or no engagement yet. Value-first messaging — answer their question, mention the product only if it fits.
Prospect engaged (replied / clicked / asked / viewed). Qualify, show fit, build trust.
Sustained engagement. Urgency, social proof, clear CTA — no time wasted on education.
Was engaged and then went quiet, or told you the timing was wrong. Re-open with low pressure, no hard sell.
One-directional mode transitions
Mode transitions only move forward — never backward. Once a prospect reaches Closing, they don't regress to Sales even if their temperature dips. A Nurture prospect only enters Recovery if they actually ghost or explicitly cool — not just because their starting temperature is low. Once in Recovery, they re-enter Sales only when they genuinely warm again.
This prevents the classic spam loop: a prospect who briefly responds doesn't suddenly receive closing messages, then nurture messages, then closing messages again as the score oscillates. It also prevents the opposite failure — a fresh contact getting Re-engager voice ("I know it's been a while…") on day 2.
13 Signal Types
Use signalpipe_track_prospect with any of these signals to update a prospect's temperature.
Objection signals (too_expensive, competitor, bad_timing, no_time, not_decision_maker) are permanently recorded and injected into all future message generation calls — the AI never re-pitches what already failed.
booked_demostrong ↑Prospect agreed to or attended a demoasked_pricingstrong ↑Prospect asked about pricing or plansviewed_contentmoderate ↑Visited a page, watched a video, read a docrepliedslight ↑Responded to your outreach messageclicked_linkslight ↑Clicked a link in your messagenot_decision_makerno changeNot the right person — flag onlyno_timeslight ↓Said "not now" or "too busy"ghosted_3_daysslight ↓No response after 3 dayscompetitormoderate ↓Mentioned they're evaluating a competitortoo_expensivemoderate ↓Price objection raised — never pitched on price againbad_timingstrong ↓Timing issue — contract, budget cycle, etc.ghosted_7_daysstrong ↓No response after 7 daysnot_interestedstrong ↓Explicit rejection — moves to RecoveryWriting Anchor Sentences
Anchor sentences are the most important thing you configure. They define what a buyer looks like. The embedding model measures every incoming post against these sentences — write them in first-person buyer voice.
Good anchors
- "I need a tool that automatically finds leads on Reddit"
- "We're switching from [Competitor] and need something better"
- "Looking for an alternative to [Competitor] — pricing got too high"
- "How do I find buyers who are actively asking for my product?"
- "We need outreach automation that doesn't get us banned"
Weak anchors
- ✗"SignalPipe lead generation" (your product name, not buyer voice)
- ✗"buy leads" (too generic)
- ✗"sales automation" (too broad — catches tool comparisons, not buyers)
- ✗"Reddit marketing" (describes a topic, not a buying need)
- ✗"outreach" (single word — too much noise)
Rules of thumb
- 3–7 anchor sentences per product is the sweet spot
- Write from the buyer's perspective, not yours ("I need X" not "we offer X")
- Include competitor frustration angles if you have known competitors
- Include the specific outcome the buyer wants, not just the category
- Multilingual posts are scored automatically — no need to write anchors in every language
- Use signalpipe_reload_products after editing — anchors are re-embedded immediately
Tool Reference
SignalPipe gives your agent 24 tools — for lead acquisition and drafting, feed preview and upkeep, prospect nurturing and replies, pipeline visibility, and universal signal scoring. All tools are called conversationally from your agent: OpenClaw, Claude Code, Cursor, or any MCP client.
Over remote MCP (Claude.ai, Claude Code, Cursor, Windsurf) the names appear without the signalpipe_ prefix. The OpenClaw plugin uses the prefixed names and adds signalpipe_get_message, three sender controls (start, stop, status) and signalpipe_read_feeds, which reads the feeds marked for your machine.
signalpipe_get_missionsFetch pending leads awaiting your review. Returns scored leads with AI-drafted replies.
signalpipe_approve_missionApprove a lead and queue it for outreach. Optionally edit the draft before approving.
signalpipe_reject_missionReject a lead with an optional reason (not_relevant, sarcasm, spam, wrong_product, too_vague, already_customer). Penalty adapts to the reason.
signalpipe_scout_nowTrigger an immediate scouting run outside the scheduled cycle.
signalpipe_get_productsList all active products and their current monitoring config.
signalpipe_add_productRegister a new product. Provide name, description, target audience, and anchor sentences.
signalpipe_update_productEdit a product’s anchors or description, or pause and resume it. The previous anchors are kept so an edit can be undone.
signalpipe_suggest_anchorsDraft candidate anchor sentences from a product description. Suggestions to edit into buyer voice, not to accept as written.
signalpipe_preview_stationCheck a feed for buyers before adding it. The judges read its best-matching posts and answer VIABLE, MARGINAL, ON-TOPIC NOT IN-MARKET, NO BUYERS or NO DATA. Nothing is saved.
signalpipe_add_stationAdd any RSS or Atom feed, or a Hacker News search, for the scout to read for a product.
signalpipe_list_stationsYour feeds with a health readout: posts captured, posts that reached your queue, and what to change.
signalpipe_update_stationPause, resume, rename or re-point a feed.
signalpipe_remove_stationRemove a feed. One that already produced leads is switched off instead, to keep its history.
signalpipe_reload_productsHot-reload the product cache after adding or editing products. No restart needed.
signalpipe_draft_missionGenerate or regenerate the draft reply for a mission on demand.
signalpipe_upload_draftHand a client-side-written draft back to a mission — your agent drafts, then uploads it.
signalpipe_mark_sentMark a mission sent after you reply by hand — records the outreach so follow-ups know what was said.
signalpipe_delete_missionRemove a mission from the queue (e.g. a low-confidence draft you don't want to review).
signalpipe_score_signalUniversal classifier — score arbitrary text your agent reads (Gmail, Slack, Discord, LinkedIn…) for buying intent. For a reply, pass the post it answers as context; panel_verdict says what the judges decided.
signalpipe_track_prospectLog a prospect interaction signal. Creates the prospect if new, updates temperature if existing. opted_out ends the relationship.
signalpipe_record_replyHand the brain a prospect’s reply. It reads the intent, objections and any opt-out, updates temperature and mode, and says whether they invited a private message.
signalpipe_get_message_promptGet a context-aware drafting prompt for a prospect (full signal history + objection memory) so your agent can draft the next message.
signalpipe_get_pipelineView your full prospect pipeline sorted by temperature. See who needs attention first.
signalpipe_record_messageRecord a message you sent to a prospect, so the next draft knows what was already said.
Station platform types
When calling signalpipe_add_station, use these platform values:
redditthe community’s RSS feed URLMarks the feed as a Reddit community, so drafts are written as in-thread commentshnhttps://hnrss.org/newest?q=YOUR+KEYWORDSHacker News by keywordrsshttps://any-rss-feed-url.com/feed.xmlAny RSS or Atom feed: forums, communities, blogs, news, a Google Alert delivered as RSStwitter_search(no rss_url required)Routes outreach to X reply channel. Lead monitoring on X — via your own X API keys — is on the roadmap.Universal signal scoring & the churn radar
The scout watches public feeds — but the same scoring engine works on any text your agent can read. signalpipe_score_signal takes arbitrary text (a Gmail thread, a Slack message, a Discord post, a LinkedIn DM, a support ticket) and returns the same score, classification, and drafting context the scout produces. Your agent connects to the channel with its own plugins; SignalPipe never touches the source — we just score what you hand us.
Buying intent, anywhere
Point it at your inbox or community DMs and surface the messages that signal a ready-to-buy moment — the same precision-first filter, on private channels the scout can't reach.
Churn radar
Describe your product the way an unhappy customer would want it — someone who fixes the billing problem, matches a competitor's price or arranges a downgrade — and the same engine reads your support messages for the ones about to leave. It catches customers who say it: comparing prices, asking what the notice period is, or on their third complaint. It will not catch silent disengagement, where someone quietly stops using a feature and never writes in. Conversations, not usage dashboards. See the churn-detection use case.
Run the sender yourself
The scoring brain is a managed service. What runs on your side is the sender — the open-source daemon (or the OpenClaw plugin). It streams missions the brain has scored and drafted and that you've approved, then posts them from your own accounts. We never see your platform credentials or your LLM keys.
What you need
- Python 3.11+ (the daemon installs via pip) — or just the OpenClaw plugin
- Your operator key from the dashboard
- A Reddit script app on your sending account (enables reddit_comment / reddit_dm)
- X / Twitter app credentials (enables twitter_reply) — optional
No Reddit app? You do not need one. Since November 2025 Reddit only issues new API apps after a manual approval, so an existing app is the exception rather than the rule. Without one, work the queue in your agent, post the approved reply yourself from your own account, then mark the mission sent (mark_sent over MCP) so the lead is recorded and never surfaced again. Scoring, drafting and the queue are identical either way. X sending needs a paid X API account (pay-per-use since February 2026).
Daemon environment variables
SIGNALPIPE_KEYRequired. Your operator key from the dashboard.SIGNALPIPE_API_URLBrain URL. Defaults to https://api.signalpipe.ioREDDIT_CLIENT_IDReddit script app on your sending accountREDDIT_CLIENT_SECRETREDDIT_USERNAMEREDDIT_PASSWORDEnables reddit_comment + reddit_dmX_API_KEYX / Twitter app creds — enables twitter_reply (optional)X_API_SECRETX_ACCESS_TOKENX_ACCESS_SECRETMAX_REDDIT_COMMENTS_PER_DAYDefault: 15MAX_REDDIT_DMS_PER_DAYDefault: 5MAX_TWITTER_ACTIONS_PER_DAYDefault: 10Install & run
pip install "signalpipe-daemon[all]" signalpipe-daemon status # validate key, show queue depth signalpipe-daemon run # stream missions and send
The daemon holds an SSE stream to the brain, posts approved missions from your own accounts, and respects per-channel daily caps. Full details in the daemon repo.
How sending works
- Your sender posts — never the brain. The plugin or daemon sends from your own Reddit / X accounts; the managed brain only scores and drafts, and never holds your credentials.
- Public comment first, never a cold DM. A fresh buying-intent post gets a public reply (
reddit_comment). DMs are reserved for prospects who have already engaged. - You approve every reply. Reddit and X require a person behind each public reply and DM, so none is sent without your approval. The drafts are written by AI: edit them in your own words, and disclose AI help where a community asks for it.
- Per-channel daily caps. The sender respects the limits above (15 comments / 5 DMs / 10 X actions per day by default) so your accounts stay within platform norms.
Ready to find your first lead?
Managed brain access starts at $29 a month — the open-source plugin and daemon run on your side for free.