From eb0c6238c33eadc6ec1a3d9ecdd642c514843aed Mon Sep 17 00:00:00 2001 From: Joel Horwitz Date: Fri, 28 Aug 2026 12:14:57 -0700 Subject: [PATCH] feat(skills): outbound, outbound-research and outbound-replies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Synter could reach Prospector's tools but had no playbook for them, so cold email was the one motion the plugin could act on without guidance. These three skills close that, and carry the corrections found auditing the live account on 2026-08-28. **outbound** — the workflow skill. Pipeline, campaigns, inbox health, pause and resume. Two things it insists on: Roughly 90% of raw "replies" are out-of-office auto-responders. Measured across the live account: campaign | inbox replies | automated | human | interested 216 | 87 | 80 | 7 | 2 235 | 23 | 20 | 3 | 0 195 | 28 | 25 | 3 | 2 Campaign 216 read as "85 replies, 3.0%" while producing two interested humans from 750 leads. The skill says to quote human replies and interested, never the raw counter, and to say so when the honest figure has not synced rather than substituting the inflated one. And: never top up a campaign to fix a low reply rate. A campaign at 0.3% has an offer problem; adding leads spends shared mailbox reputation to buy nothing. That was very nearly done to campaign 216. **outbound-research** — qualification. Disqualifiers (CRM, already met, current customer, prior contact, suppression) veto rather than score, with a lapsed customer as the deliberate win-back exception. Then a ranked signal hierarchy with decay windows, where role-plus-industry is explicitly not a signal. Then how to state the fact without naming the surveillance, the banned openers that read as generated, day-of-week anchors (including why "Happy Monday!" signals bulk mail), the fiscal calendar read from the prospect's year rather than ours, and life-event hooks with their windows. Its test is the operator one: for a real lead, if they asked "where did you get my information?", what would you say? That is a verbatim reply from a campaign that mailed 750 people an identical email. **outbound-replies** — triage. Strips auto-responders, our own Sent copies and bounces before counting, classifies what remains, routes opt-outs straight to suppression, and holds every draft for explicit approval. Approval for one reply never carries to the next message in the thread. Skills auto-discover, but the README enumerates them, so both listings are updated. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01D6Vx5DgLaKF3E9gw9xUn3q --- README.md | 3 + skills/outbound-replies/SKILL.md | 64 ++++++++++++++++ skills/outbound-research/SKILL.md | 118 ++++++++++++++++++++++++++++++ skills/outbound/SKILL.md | 58 +++++++++++++++ 4 files changed, 243 insertions(+) create mode 100644 skills/outbound-replies/SKILL.md create mode 100644 skills/outbound-research/SKILL.md create mode 100644 skills/outbound/SKILL.md diff --git a/README.md b/README.md index 9bef861..059aab8 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ This plugin packages **agents, skills, an MCP server, a hook, and an output styl | `/synter:launch` | Plan, preflight, and ship a cross-platform campaign. | | `/synter:replicate` | Rebuild an existing campaign from one platform onto another (e.g. Google to Microsoft). | | `/synter:optimize` | Cut wasted spend, scale winners, reallocate budget by ROAS. | +| `/synter:outbound` | Run cold email through Prospector — pipeline, campaigns, sending health. | | `/synter:report` | Cross-channel performance report and exec summary. | | `/synter:help` | What Synter can do, and where to get support. | @@ -58,6 +59,8 @@ Bundled alongside the workflows is a library of advertising-craft knowledge skil **Measurement:** `conversion-tracking` · `attribution` · `utm-builder` · `executive-reporting` +**Outbound:** `outbound-research` · `outbound-replies` + **Research:** `competitor-analysis` (Internal runbooks, Synter's proprietary operating playbooks, and anything that names internal infrastructure are intentionally not shipped — this plugin acts through the Synter MCP, not bundled scripts.) diff --git a/skills/outbound-replies/SKILL.md b/skills/outbound-replies/SKILL.md new file mode 100644 index 0000000..8e79bc1 --- /dev/null +++ b/skills/outbound-replies/SKILL.md @@ -0,0 +1,64 @@ +--- +name: outbound-replies +description: Triage and answer replies to cold email campaigns — separate real humans from auto-responders, classify intent, draft a reply in the founder's voice, and route opt-outs to suppression. Use when a user asks about outbound replies, their unibox, who responded to a campaign, or wants to answer a prospect. +--- + +# Outbound Replies + +Most of what looks like a reply is not one. Sort that out before you tell anyone how a campaign is doing. + +## 1. Auto-responders are not replies + +**Roughly 90% of raw replies are out-of-office.** On the live account, campaign 216 showed 87 inbox replies: 80 automated, 7 human, 2 actually interested. + +Three things must come out of the count before you report it: + +- **Auto-responders** — out-of-office, vacation, "no longer with the company" +- **The Sent folder** — our own outbound comes back through the same feed; counting it means counting our own words as prospect interest +- **Bounces** — a delivery failure is not a reply + +Only what remains is a reply. Never report the raw number, and never compute a rate from it. + +## 2. Classify what is left + +| Kind | Looks like | Do | +|---|---|---| +| Interested | "happy to discuss", asks about price or timing | draft a reply, propose a time | +| Question | wants detail before committing | answer the question, nothing else | +| Wrong person | "that's not me", "talk to X" | thank, ask for the handoff, never re-pitch | +| Not now | "we're in a good place", "revisit in Q1" | acknowledge, log the date, stop | +| **Opt-out** | "remove me", "unsubscribe", "where did you get my information" | **suppress immediately**, then a one-line apology if any reply at all | + +An angry "where did you get my information?" is an opt-out and a targeting failure. Suppress, and treat it as evidence the list was not qualified — see **outbound-research**. + +## 3. Draft, then wait + +`prospector_create_reply` drafts. A draft is not a send. + +Every reply to a real person needs explicit approval before it goes. Approval for one reply does not carry to the next message in the same thread. + +Voice rules, enforced by the copy gate: + +- **No em-dashes.** Short sentences. Specific asks. +- No "I hope this finds you well", no "circling back", no "per my last email". +- Never invent a number, a client name, a case study or a stat. If you do not have the figure, do not use one. +- Say "one prompt", never "click" — Synter is prompt-driven. +- Answer what they asked. A question about pricing gets a price, not a pitch. + +## 4. Booking + +When someone wants time, send the real scheduling link rather than proposing slots blind. Confirm the meeting actually lands in the calendar before telling the user it is booked — "created" is not "booked". + +## 5. What to report back + +When summarizing a campaign's replies, give the user: + +``` +N human replies (M auto-responders excluded) + → X interested + → Y questions + → Z not now + → W opt-outs ← flag these, they are the targeting signal +``` + +Two interested replies from 750 leads is not a reply rate to celebrate, and it is not a volume problem to solve by adding leads. Say what it is: the offer or the list is wrong. diff --git a/skills/outbound-research/SKILL.md b/skills/outbound-research/SKILL.md new file mode 100644 index 0000000..8d9cef4 --- /dev/null +++ b/skills/outbound-research/SKILL.md @@ -0,0 +1,118 @@ +--- +name: outbound-research +description: Qualify a prospect before writing cold outreach — find a checkable fact from first-party signals, rank competing signals, and land it in the email without sounding AI-generated. Covers day-of-week, seasonal and life-event timing. Use when building or topping up an outbound list, writing a first-touch email, or deciding whether someone should be contacted at all. +--- + +# Outbound Research + +Find a checkable fact about the person, or do not mail them. + +## The test + +For one real lead on the list, ask: **if they replied "where did you get my information?", what would I say?** + +If the honest answer is "you match an industry and a job title," the research is not done. Cut the cohort rather than send it. That question is not hypothetical — it is a verbatim reply from a real campaign that mailed 750 people a character-identical email. + +## 1. Disqualifiers first — they veto, they do not score + +Check these before any positive research. One hit stops the send, no matter how strong the positives. + +| Check | Blocks because | +|---|---| +| In the CRM already | known contact or open deal | +| We have already met | cold copy insults someone whose call you attended | +| Current paying customer | they already buy from us | +| Contacted before, any channel | double-touch reads as spam | +| Suppressed, bounced, unsubscribed | legal and deliverability | + +A **lapsed** customer is the deliberate exception: a win-back target, and a strong one. Say so plainly rather than pretending it is a cold approach. + +## 2. Positive signals — use the strongest you can actually fetch + +One fact per email. Never stack them. + +``` +they clicked our ad ............... strongest 30 day window +they used the product ............ very strong 45 day window +they engaged our social post ..... strong 60 day window (comment > reaction) +someone at their company visited . moderate 30 day window (company-level only) +new role, promotion, funding ..... strong 90 day window +role + industry only ............. NOT A SIGNAL — do not send +``` + +Ranking rules: + +1. **Recency beats strength within a tier.** A reaction from yesterday beats an ad click from four weeks ago. +2. **Honour the decay windows.** Opening with "I saw you engaged with my post" about something from March is worse than no personalization. +3. **Person-level beats company-level.** "You clicked" is a fact. "Someone at your company visited" is an inference and must be written as one. + +## 3. Land it without the AI tell + +**Never name the surveillance.** The fact goes in, the mechanism stays out. + +``` +BAD "I noticed you visited our pricing page on Tuesday." +BAD "Our system flagged that you clicked one of our ads." +GOOD "Your take on the PMax thread stuck with me." +GOOD "You were looking at programmatic pricing recently, so this may be timely." +``` + +The test: would the sentence be creepy said aloud at a conference? If yes, reference the topic, not the event. + +**Banned openers** — the tells that read as generated: + +- "I hope this email finds you well" +- "I noticed that..." / "I saw that you..." / "I came across your profile" +- "As a {TITLE} at {COMPANY}, you probably..." +- Em-dashes anywhere +- The word "click" — Synter is prompt-driven; say "one prompt" + +**Shape of the opening:** + +``` +line 1 timing or season anchor, short and human +line 2 the fact, stated as theirs not ours +line 3 why it matters to them specifically +``` + +Keep the fact out of line 1. Leading with it is what makes it feel like a merge field. A human beat first, then specificity, is what makes it feel written. Body under 90 words. + +## 4. Timing anchors + +| Send day | Use | Avoid | +|---|---|---| +| Mon | "kicking off the week" | **"Happy Monday!"** — the most-used cold-email opener there is; it signals bulk mail instantly | +| Tue-Wed | nothing, these are the best days | forcing an anchor | +| Thu | "before this week gets away" | | +| Fri | "Before the weekend," | asking for a call today | +| Sat-Sun | do not send cold | | + +Rotate anchors across a cohort — the same one on every email is its own tell. And only use a day anchor if the schedule actually matches it; "before the weekend" landing on Tuesday is worse than nothing. + +## 5. Seasonal and fiscal + +Read from **their** calendar, not ours. For a DTC brand in October the anchor is peak retail season, not our quarter. + +- **Jan** new budget, planning reopens · **Feb-Mar** Q1 under pressure +- **Apr-Jun** mid-year reforecast · **Jul-Aug** thin teams, keep asks small +- **Sep** everyone back, strongest window of the year +- **Oct-Nov** Q4 planning, next-year budget locking, retail peak +- **Dec** do not start sequences after the second week + +## 6. Life events — the strongest human hook + +| Event | Window | Angle | +|---|---|---| +| New role | **first 90 days**, the best window there is | choosing a stack, wants early wins | +| Promotion | 60 days | scope grew, budget grew | +| Funding | 90 days | pressure to deploy into growth | +| Team growth | 60 days | hiring paid roles means scaling spend | + +Congratulate in **one clause**, then get to the substance. A paragraph about their promotion is transparently a device. + +``` +GOOD "Three weeks into the growth seat - you're probably still + picking what the paid stack looks like." +BAD "Congratulations on your well-deserved promotion! It's always + exciting to see talented leaders like yourself step into..." +``` diff --git a/skills/outbound/SKILL.md b/skills/outbound/SKILL.md new file mode 100644 index 0000000..f207d4d --- /dev/null +++ b/skills/outbound/SKILL.md @@ -0,0 +1,58 @@ +--- +name: outbound +description: Run cold email outbound through Synter Prospector — review the pipeline, inspect campaigns, check sending health, and pause or resume. Use when a user asks about outbound, cold email, sequences, their lead pipeline, reply rates, or wants to launch, pause or top up an email campaign. +--- + +# Outbound + +Prospector is Synter's cold-email engine. You read freely; you never send without a yes. + +## 1. Where things stand + +Start every outbound conversation with the real state, not the dashboard's: + +- `prospector_get_pipeline_summary` — leads by stage, meetings, company grades. +- `prospector_get_campaigns` — what exists and its status. +- `prospector_get_inbox_health` — mailboxes, warmup, daily capacity. + +Sending capacity is the fleet's, not one campaign's. Every campaign draws on the same shared mailboxes, so one campaign's bounces damage all of them. + +## 2. Read reply numbers honestly + +**Roughly 90% of raw "replies" are out-of-office auto-responders.** Measured across the live account on 2026-08-28: + +| campaign | inbox replies | automated | human | interested | +|---|---:|---:|---:|---:| +| 216 | 87 | 80 | 7 | 2 | +| 235 | 23 | 20 | 3 | 0 | +| 195 | 28 | 25 | 3 | 2 | + +Campaign 216 read as "85 replies, 3.0%" while producing **two** interested humans from 750 leads. + +So from `prospector_get_campaign`: quote `reply_rate_pct` (human replies ÷ sends) and `total_interested`. **Never quote `total_replied_including_automated`, and never compute a rate from it.** If the human figure is null the honest stats have not synced yet — say so rather than substituting the inflated one. + +Bounce rate above ~2% is a fleet emergency, not a campaign problem. Say so plainly. + +## 3. Before anything sends + +Cold email is outward-facing and irreversible. Confirm before every send, resume or lead push — approval for one campaign never carries to the next. + +Two gates, both mandatory: + +1. **Qualification** — run the **outbound-research** skill. If you cannot name a checkable fact about a recipient, do not mail them. Matching an industry and a job title is not a fact. +2. **Deliverability** — every address verified, nobody on the suppression list, tokens rendering. Leads reach a campaign only through the gated push. + +## 4. Launch, pause, resume + +- `prospector_create_campaign` — creates it. Creating is not sending. +- `prospector_update_campaign_status` — pause or resume. **Resuming sends email.** Ask first, every time. +- `prospector_get_leads` / `prospector_get_contacts` — inspect who is actually on a list before it goes out. Read a sample aloud to the user; off-ICP names are obvious to a human and invisible in aggregate. + +Pause immediately, without asking, if you see: bounce rate over 5%, a token printing literally in a sent email, or a lead who asked to be removed still receiving mail. Report it after. + +## 5. What not to do + +- Do not top up a campaign to fix a low reply rate. A campaign at 0.3% has an offer problem; adding leads spends mailbox reputation to buy nothing. +- Do not quote open rates. Open tracking is off across the platform. +- Do not send to someone already in the CRM, already met, or already a customer — see **outbound-research**. +- Do not write email bodies with the LLM. Templates are human-written; the model fills variable slots from real facts only, and never invents a number, a client name or a stat.