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.