Skip to content

Account expansion: one contact per company at a time, opened by the budget holder - #127

Merged
ralyodio merged 3 commits into
mainfrom
feat/planner-expansion
Oct 7, 2026
Merged

ralyodio merged 3 commits into
mainfrom
feat/planner-expansion

Conversation

@ralyodio

@ralyodio ralyodio commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

Second Hunter outreach-planner feature, fully automated.

The planner reaches four people at every target company, one at a time and a month apart. Each persona gets its own angle:

  1. Budget holder (CEO/VP/Head/Director/Founder)
  2. Pain feeler: the end user (engineer, specialist, analyst...)
  3. Blocker: legal, security, IT, finance, procurement
  4. Champion: the manager who carries it internally

What changes

  • classifyPersona(title) is deterministic. No model is used on the send path, and blocker titles are matched before seniority, so "VP Legal" counts as a blocker.
  • Autopilot moves each company's queued cards up behind its best one, in persona order. The order between companies doesn't change.
  • Never two contacts at one company at once. A colleague who was emailed in the last 21 days, or is on an active cadence, and hasn't replied holds the company. Everyone else there waits, and their cards stay pending. A reply releases the company.
    • ⚠️ This deliberately reverses the old test that sent to two colleagues with their own mailboxes in the same run. That test now shows the new order: the colleague is sent 22 days later.
  • Each draft gets an angle for the person's role, added to the step's own guidance (outcome / friction / objection answered / proof to forward).
  • Surfaces: GET /autogtm/campaigns/:id/accounts (in the OpenAPI doc), og leads accounts <campaignId>, MCP get_campaign_accounts. Each shows per company who was reached, who replied, who is next, and which personas are still missing.

No migration.

Tests: personas.test.ts (21) and account-expansion.test.ts (4, including a full four-persona sequence across four windows). The autopilot, AI draft/composer, MCP and CLI suites all pass locally: 152 tests, 0 failures.

🤖 Generated with Claude Code

ralyodio and others added 3 commits October 7, 2026 02:12
…retire bounced addresses

Hunter's outreach planner, run by the worker instead of remembered by a person:

- Every address is verified before its first message and again after 90 days
  (MX, then an SMTP RCPT probe where port 25 allows; a blocked port sends on
  MX alone). Verdicts are cached in email_verifications, 25 fresh checks per run.
- A bounce the delivery report pins to an address marks it invalid for good
  and stops the person's cadences. The sender query skips invalid addresses.
- A campaign whose bounce rate passes 2% over 50+ sends pauses itself,
  re-verifies every queued address, drops the failures and resumes on a fresh
  window once a complete pass finds nothing waiting (campaign_list_health).
- Accept-all addresses send only while the campaign bounces at or under 1%.
- GET /autogtm/campaigns/:id/list-health, og leads health, MCP get_list_health.

Migration 0053.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…udget holder

Hunter's planner reaches four people per target company, one at a time, a
month apart: budget holder, pain feeler (end user), blocker (legal, security,
IT, finance) and champion (manager). Now automatic:

- classifyPersona reads the job title deterministically (no model on the
  send path).
- Autopilot orders each company's queued cards by persona behind its best
  card, without changing the order between companies.
- A colleague emailed in the last 21 days, or on an active cadence, who has
  not answered holds the company; everyone else there waits, card intact.
  A reply releases it. Deliberately reverses the old "two mailboxes at one
  company both get written to in one run" test.
- Drafts get a per-role angle added to the step's guidance.
- GET /autogtm/campaigns/:id/accounts, og leads accounts, MCP
  get_campaign_accounts: who was reached, who is next, missing personas.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	apps/api/src/autogtm-docs.ts
#	apps/api/src/autogtm.ts
#	apps/cli/src/commands.ts
#	apps/mcp/src/tools.ts
#	packages/domain/src/index.ts
#	packages/pipeline/src/autopilot.ts
#	packages/pipeline/src/index.ts
@ralyodio
ralyodio merged commit cb9c14f into main Oct 7, 2026
4 checks passed
@ralyodio ralyodio mentioned this pull request Oct 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant