Kelly Sales Outreach
Turn one product or service description into a repeatable customer-development
loop: infer the best initial ICP, find companies showing relevant business
signals, identify one public business contact, draft a message grounded in those
signals, and let the human approve every first touch.
Subcommands
| Invocation |
What to do |
/kelly-sales-outreach setup |
Create or adopt the Busabase Folder and three Bases, then verify them. |
/kelly-sales-outreach profile |
Read product/service material, store the offer, derive an explicit ICP hypothesis, and optionally build a factual one-page PDF. |
/kelly-sales-outreach research |
Discover and qualify target accounts and public business contacts, then draft one personalized first-touch email per company. |
/kelly-sales-outreach send |
Configure the seller's mailbox in Vault and send only the individually approved queue. |
/kelly-sales-outreach |
Open the desk and report the current bounded next step. |
Run setup, profile, research, then send the first time. Afterwards,
research repeats by period. Never repeat a first-touch email to a company that
is already queued, sent, or opted-out.
Dependencies
Before changing the app:
- Read
$kelly-app-skill-creator for product behavior, responsive UI, and the canonical content/kelly-sales-outreach-app/ artifact.
- Read
$busabase for target Space, ChangeRequests, review, merge, and Vault behavior.
- Read
$busabase-app-creator for runtime, SDK, security, validation, and AirApp deployment.
- Read
references/sales-outreach-schema.md before changing fields, statuses, or Vault keys.
- Read
references/research-playbook.md before running research.
If a dependency is unavailable, finish deterministic local artifact work but
stop before its Busabase or AirApp operation and name the missing dependency.
Never introduce a second backend.
Product Boundary
- The minimum input is the offer. Onboarding requires only
offer-name and
offer-summary. Do not force the user to know their ICP before the research
loop begins; propose it from the offer and evidence, then let them edit it.
- One company, one initial thread. Multiple public contacts are fallback
candidates, not permission to blast several people at one company.
- The human approves every first touch. App approval changes
draft to
queued; it does not itself send. The trusted script is a separate explicit
execution step.
- Every company and contact carries provenance. Require an exact public URL.
Never generate likely address patterns or import purchased/scraped private
lists. If no address is verifiable, keep the account blocked.
- Honor opt-out immediately.
opted-out is terminal for outreach. The
sender re-reads status immediately before sending and stops on opt-out,
already-sent, or non-queued state.
- Use truthful personalization. Drafts may mention only stored offer claims
and observed company signals. Do not invent urgency, customer logos, metrics,
relationships, or research that did not happen.
- Secrets stay trusted. SMTP values live in Vault or runtime environment and
never reach browser source, logs, screenshots, or chat.
- Stay within lawful public access. Do not bypass authentication, paywalls,
robots controls, rate limits, or platform terms. Do not impersonate a person.
/kelly-sales-outreach setup
node scripts/setup.mjs
node scripts/setup.mjs --apply
Confirm the Space first. Setup is idempotent and resolves resources from the
declared Folder; nobody copies Node IDs into config. Re-read after every
ChangeRequest and report a pending CR rather than claiming the workspace exists.
/kelly-sales-outreach profile
Accept whatever the user has: website, deck, proposal, product notes, service
menu, or a short description. Extract facts and ask only for a missing fact that
materially changes targeting.
Store:
- offer name and plain-language summary;
- value proposition and verifiable proof points;
- target industries and regions;
- likely buyer roles;
- an explicit ideal-customer hypothesis covering size, stage, pain, trigger,
exclusions, and why this offer wins now;
- public research channels;
- optional collateral filename and sender address.
Distinguish facts supplied by the user from hypotheses inferred by the
Agent. Put uncertainty into the ICP text instead of presenting it as known.
Never fabricate proof. When useful, generate a factual one-page asset:
node scripts/build_one_pager.mjs
node scripts/build_one_pager.mjs --apply
The dry run writes HTML. --apply renders collateral/<offer>-one-pager.pdf
and records the filename. The file is optional for sending.
/kelly-sales-outreach research
Research in bounded rounds of 20-30 accounts. Use the offer profile to form a
testable ICP, then seek companies with observable signals rather than merely
matching industry keywords.
For every company record:
- canonical name, key, website, industry, region, and approximate size;
- exact company source URL;
- ICP score and a concrete match reason;
- observed pain/buying signals and capture date;
- evidence type:
first-party, public-directory, or market-signal;
- one concise, plain-text first-touch subject/body grounded in that evidence.
For every contact record:
- company key, valid business email, optional public name, buyer role;
- exact public source URL and confidence;
- no guessed email patterns.
Use references/research-playbook.md for score calibration, sources,
personalization, and failure handling. Import is idempotent:
node scripts/import_leads.mjs findings.json
node scripts/import_leads.mjs findings.json --apply
Do not overwrite existing company rows. This preserves approvals, sends,
opt-outs, edits, and stable #n references.
/kelly-sales-outreach send
Configure the user's own mailbox. Never ask for a mailbox password in chat;
use an app password/authorization code through SMTP_PASS or --pass.
SMTP_PASS=xxx node scripts/configure_smtp.mjs --host smtp.example.com --user seller@example.com --apply
node scripts/send_emails.mjs
node scripts/send_emails.mjs --test-to seller@example.com --apply
node scripts/send_emails.mjs --apply
The dry run prints sender, optional collateral readiness, SMTP readiness by key,
and exact recipients without printing secret values. --test-to sends one
approved message to an inbox the user controls and writes nothing to Busabase.
For each real send, re-read the account immediately before sendMail. Require:
- current status exactly
queued;
- no
sent-at and no opted-out-at;
- exact approved recipient, subject, and body;
- SMTP readiness;
- configured collateral exists, if a filename is present.
On success write sent and sent-at. On failure leave it queued and report the
company-specific error. Never silently retry in a way that can duplicate mail.
Operating Loop
Research
Run by explicit request or agreed period. Store capture date, source, coverage,
and uncertainty. Deduplicate by company key and company/email pair.
Plan
Rank first-party evidence before directory evidence, then ICP score. The desk
gives stable #n references and lets the human edit recipient, subject, and
body. Missing evidence/contact/draft is blocked, not guessed.
Action
Human approval queues one exact first touch. The trusted sender performs the
external side effect with duplicate prevention and records the result.
Retrospective
When the user supplies replies, meetings, conversions, objections, or opt-outs,
compare outcomes with the stored ICP and signals. Propose changes to profile,
score weights, sources, and copy as reviewed updates. Do not silently rewrite
targeting rules from a single outcome. Automated follow-up sequences and inbox
reply ingestion are out of scope for v1.
App Contract
- Keep the canonical Hono project in
<skill-root>/content/kelly-sales-outreach-app/; use the same source
locally and in AirApp.
- Store persistent profile, accounts, contacts, decisions, and execution state
only in Busabase through
busabase-sdk.
- Local OAuth appears only in an explicitly requested standalone preview;
hosted AirApp uses its ambient Busabase session.
- Browser writes go through ChangeRequests and may auto-merge only in a
standalone local runtime.
- Demo data is explicit, deterministic, non-persistent, and cannot send.
- Keep the desktop sidebar/list/detail shell, true mobile list/detail flow,
hash routes, and responsive Help & Settings from the creator contract.
Resources
| Resource |
Purpose |
kelly-sales-outreach-profile |
One offer, ICP hypothesis, proof, research channels, optional collateral, sender address, onboarding version, and Vault reference names. |
kelly-sales-outreach-companies |
Target accounts with source evidence, pain signals, first-touch draft, review state, recipient, and send/opt-out timestamps. |
kelly-sales-outreach-leads |
Public business contacts with company key, name/role, source URL, and confidence. |
Vault SMTP_* |
Mail transport values readable only by trusted execution. |
Screens
#/profile — product, service, proof, ICP, channels, optional collateral,
sender, and SMTP readiness.
#/all, #/to-send, #/sent — account list/detail queue with evidence,
contacts, editable draft, and exact approval action.
#/settings/<tab> — commands, guide, resources, and connection.
Stop Conditions
Stop rather than guess when the offer is missing; a company or contact lacks a
public source; an address is inferred; a company is already sent or opted out;
the draft contains unsupported claims; SMTP is unavailable; an explicit
collateral file is missing; the target Space is ambiguous; or the required
review/deployment dependency is unavailable.
1---2name: kelly-sales-outreach3description: Run a Busabase-backed sales prospecting and first-touch outreach desk with a bundled Hono App-in-Skill deployable to AirApp. Use whenever the user invokes $kelly-sales-outreach or /kelly-sales-outreach, wants to enter a product or service and discover its ideal customers, asks to continuously find target accounts or public business contacts, needs evidence-based ICP scoring and personalized outreach drafts, or wants to review and send cold outreach safely. Four subcommands - setup, profile, research, send - plus the desk itself. Every first-touch message requires human approval; one company receives one initial email; guessed addresses, purchased lists, secret exposure, automated spam, and unreviewed external sends are forbidden.4---56# Kelly Sales Outreach78Turn one product or service description into a repeatable customer-development9loop: infer the best initial ICP, find companies showing relevant business10signals, identify one public business contact, draft a message grounded in those11signals, and let the human approve every first touch.1213## Subcommands1415| Invocation | What to do |16| --- | --- |17| `/kelly-sales-outreach setup` | Create or adopt the Busabase Folder and three Bases, then verify them. |18| `/kelly-sales-outreach profile` | Read product/service material, store the offer, derive an explicit ICP hypothesis, and optionally build a factual one-page PDF. |19| `/kelly-sales-outreach research` | Discover and qualify target accounts and public business contacts, then draft one personalized first-touch email per company. |20| `/kelly-sales-outreach send` | Configure the seller's mailbox in Vault and send only the individually approved queue. |21| `/kelly-sales-outreach` | Open the desk and report the current bounded next step. |2223Run `setup`, `profile`, `research`, then `send` the first time. Afterwards,24`research` repeats by period. Never repeat a first-touch email to a company that25is already `queued`, `sent`, or `opted-out`.2627## Dependencies2829Before changing the app:30311. Read `$kelly-app-skill-creator` for product behavior, responsive UI, and the canonical `content/kelly-sales-outreach-app/` artifact.322. Read `$busabase` for target Space, ChangeRequests, review, merge, and Vault behavior.333. Read `$busabase-app-creator` for runtime, SDK, security, validation, and AirApp deployment.344. Read `references/sales-outreach-schema.md` before changing fields, statuses, or Vault keys.355. Read `references/research-playbook.md` before running research.3637If a dependency is unavailable, finish deterministic local artifact work but38stop before its Busabase or AirApp operation and name the missing dependency.39Never introduce a second backend.4041## Product Boundary4243- **The minimum input is the offer.** Onboarding requires only `offer-name` and44 `offer-summary`. Do not force the user to know their ICP before the research45 loop begins; propose it from the offer and evidence, then let them edit it.46- **One company, one initial thread.** Multiple public contacts are fallback47 candidates, not permission to blast several people at one company.48- **The human approves every first touch.** App approval changes `draft` to49 `queued`; it does not itself send. The trusted script is a separate explicit50 execution step.51- **Every company and contact carries provenance.** Require an exact public URL.52 Never generate likely address patterns or import purchased/scraped private53 lists. If no address is verifiable, keep the account blocked.54- **Honor opt-out immediately.** `opted-out` is terminal for outreach. The55 sender re-reads status immediately before sending and stops on opt-out,56 already-sent, or non-queued state.57- **Use truthful personalization.** Drafts may mention only stored offer claims58 and observed company signals. Do not invent urgency, customer logos, metrics,59 relationships, or research that did not happen.60- **Secrets stay trusted.** SMTP values live in Vault or runtime environment and61 never reach browser source, logs, screenshots, or chat.62- **Stay within lawful public access.** Do not bypass authentication, paywalls,63 robots controls, rate limits, or platform terms. Do not impersonate a person.6465## `/kelly-sales-outreach setup`6667```bash68node scripts/setup.mjs69node scripts/setup.mjs --apply70```7172Confirm the Space first. Setup is idempotent and resolves resources from the73declared Folder; nobody copies Node IDs into config. Re-read after every74ChangeRequest and report a pending CR rather than claiming the workspace exists.7576## `/kelly-sales-outreach profile`7778Accept whatever the user has: website, deck, proposal, product notes, service79menu, or a short description. Extract facts and ask only for a missing fact that80materially changes targeting.8182Store:8384- offer name and plain-language summary;85- value proposition and verifiable proof points;86- target industries and regions;87- likely buyer roles;88- an explicit ideal-customer hypothesis covering size, stage, pain, trigger,89 exclusions, and why this offer wins now;90- public research channels;91- optional collateral filename and sender address.9293Distinguish **facts** supplied by the user from **hypotheses** inferred by the94Agent. Put uncertainty into the ICP text instead of presenting it as known.95Never fabricate proof. When useful, generate a factual one-page asset:9697```bash98node scripts/build_one_pager.mjs99node scripts/build_one_pager.mjs --apply100```101102The dry run writes HTML. `--apply` renders `collateral/<offer>-one-pager.pdf`103and records the filename. The file is optional for sending.104105## `/kelly-sales-outreach research`106107Research in bounded rounds of 20-30 accounts. Use the offer profile to form a108testable ICP, then seek companies with observable signals rather than merely109matching industry keywords.110111For every company record:112113- canonical name, key, website, industry, region, and approximate size;114- exact company source URL;115- ICP score and a concrete match reason;116- observed pain/buying signals and capture date;117- evidence type: `first-party`, `public-directory`, or `market-signal`;118- one concise, plain-text first-touch subject/body grounded in that evidence.119120For every contact record:121122- company key, valid business email, optional public name, buyer role;123- exact public source URL and confidence;124- no guessed email patterns.125126Use `references/research-playbook.md` for score calibration, sources,127personalization, and failure handling. Import is idempotent:128129```bash130node scripts/import_leads.mjs findings.json131node scripts/import_leads.mjs findings.json --apply132```133134Do not overwrite existing company rows. This preserves approvals, sends,135opt-outs, edits, and stable `#n` references.136137## `/kelly-sales-outreach send`138139Configure the user's own mailbox. Never ask for a mailbox password in chat;140use an app password/authorization code through `SMTP_PASS` or `--pass`.141142```bash143SMTP_PASS=xxx node scripts/configure_smtp.mjs --host smtp.example.com --user seller@example.com --apply144node scripts/send_emails.mjs145node scripts/send_emails.mjs --test-to seller@example.com --apply146node scripts/send_emails.mjs --apply147```148149The dry run prints sender, optional collateral readiness, SMTP readiness by key,150and exact recipients without printing secret values. `--test-to` sends one151approved message to an inbox the user controls and writes nothing to Busabase.152153For each real send, re-read the account immediately before `sendMail`. Require:154155- current status exactly `queued`;156- no `sent-at` and no `opted-out-at`;157- exact approved recipient, subject, and body;158- SMTP readiness;159- configured collateral exists, if a filename is present.160161On success write `sent` and `sent-at`. On failure leave it queued and report the162company-specific error. Never silently retry in a way that can duplicate mail.163164## Operating Loop165166### Research167168Run by explicit request or agreed period. Store capture date, source, coverage,169and uncertainty. Deduplicate by company key and company/email pair.170171### Plan172173Rank first-party evidence before directory evidence, then ICP score. The desk174gives stable `#n` references and lets the human edit recipient, subject, and175body. Missing evidence/contact/draft is blocked, not guessed.176177### Action178179Human approval queues one exact first touch. The trusted sender performs the180external side effect with duplicate prevention and records the result.181182### Retrospective183184When the user supplies replies, meetings, conversions, objections, or opt-outs,185compare outcomes with the stored ICP and signals. Propose changes to profile,186score weights, sources, and copy as reviewed updates. Do not silently rewrite187targeting rules from a single outcome. Automated follow-up sequences and inbox188reply ingestion are out of scope for v1.189190## App Contract191192- Keep the canonical Hono project in `<skill-root>/content/kelly-sales-outreach-app/`; use the same source193 locally and in AirApp.194- Store persistent profile, accounts, contacts, decisions, and execution state195 only in Busabase through `busabase-sdk`.196- Local OAuth appears only in an explicitly requested standalone preview;197 hosted AirApp uses its ambient Busabase session.198- Browser writes go through ChangeRequests and may auto-merge only in a199 standalone local runtime.200- Demo data is explicit, deterministic, non-persistent, and cannot send.201- Keep the desktop sidebar/list/detail shell, true mobile list/detail flow,202 hash routes, and responsive Help & Settings from the creator contract.203204## Resources205206| Resource | Purpose |207| --- | --- |208| `kelly-sales-outreach-profile` | One offer, ICP hypothesis, proof, research channels, optional collateral, sender address, onboarding version, and Vault reference names. |209| `kelly-sales-outreach-companies` | Target accounts with source evidence, pain signals, first-touch draft, review state, recipient, and send/opt-out timestamps. |210| `kelly-sales-outreach-leads` | Public business contacts with company key, name/role, source URL, and confidence. |211| Vault `SMTP_*` | Mail transport values readable only by trusted execution. |212213## Screens214215- `#/profile` — product, service, proof, ICP, channels, optional collateral,216 sender, and SMTP readiness.217- `#/all`, `#/to-send`, `#/sent` — account list/detail queue with evidence,218 contacts, editable draft, and exact approval action.219- `#/settings/<tab>` — commands, guide, resources, and connection.220221## Stop Conditions222223Stop rather than guess when the offer is missing; a company or contact lacks a224public source; an address is inferred; a company is already sent or opted out;225the draft contains unsupported claims; SMTP is unavailable; an explicit226collateral file is missing; the target Space is ambiguous; or the required227review/deployment dependency is unavailable.