

Track: 🗼 Vertical AI
Equipo:
Lanzar outbound B2B desde cero requiere semanas de trabajo manual: comprar dominios, configurar DNS y Mailgun, calentar los dominios para no caer en spam, investigar prospects y redactar emails personalizados. La mayoría de las startups en etapa temprana no tienen ni el tiempo ni el expertise para hacerlo bien, y las agencias que lo hacen cobran miles de dólares al mes.
GTM B2B MVP automatiza ese pipeline completo — desde el diagnóstico del negocio hasta el email enviado — con un sistema multi-agente que toma decisiones autónomas en cada etapa y requiere aprobación humana solo donde importa.
Las herramientas existentes (Apollo, Instantly, Lemlist) automatizan partes del proceso: prospecting, o envío, o warming. Ninguna cierra el loop completo desde infraestructura de dominio hasta campaña enviada dentro de un único sistema agentivo.
Este proyecto es distinto en cuatro aspectos:
execute=true en el request. Sin eso, todo corre en dry-run y es 100% auditable.blog.<dominio>, creando un activo de contenido desde el primer día sin trabajo manual. ┌───────────────────────────────┐
│ Next.js Frontend (Vercel) │
│ landing · onboarding · stage │
│ dashboard · email preview │
└──────────────┬────────────────┘
│ HTTP / SSE
┌──────▼───────────────────┐
│ FastAPI / Typer CLI │
└─────────────┬────────────┘
│
┌────────────────▼──────────────────┐
│ services/ │
│ diagnostic · domain · dns │
│ warmup · campaign · blog │
│ webhook · attachment │
└─────────┬──────────────┬──────────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ AgentRunner │ │ Safety service│
│ + ToolRegistry│ │ (flags, caps, │
└──────┬───────┘ │ audit log) │
│ └──────────────┘
┌─────────────────┼──────────────────────────────────┐
▼ ▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ Anthropic │ │ Porkbun / │ │ Mailgun REST │ │ Vercel REST │
│ Messages API │ │ Spaceship │ │ (email infra)│ │ (blog deploy)│
│ + web_search │ │ (DNS/reg) │ └──────────────┘ └──────────────┘
└──────────────┘ └──────────────┘
persistence
┌──────────────────┐
│ Supabase Postgres│
└──────────────────┘
| Agente | Qué hace | Output |
|---|---|---|
| GTM Diagnostic | Analiza el negocio, ICP, propuesta de valor | GtmDiagnostic |
| Domain Purchase | Evalúa disponibilidad y registra dominios (Porkbun / Spaceship) | DomainPurchaseSummary |
| DNS Configuration | Crea el dominio en Mailgun y configura registros MX/SPF/DKIM/DMARC | DnsSummary |
| Warmup Lite | Simula intercambio de emails entre dominios para reputación | WarmupSummary |
| Research & Send | Descubre prospects vía Anthropic web_search en tiempo real, puntúa por fit score + señal web, redacta y envía emails personalizados con URL de evidencia | ResearchSendSummary |
Todos los agentes corren sobre un AgentRunner genérico con Anthropic SDK (tool use estructurado). El SafetyService intercepta cada tool call que tenga efecto externo real y valida feature flags, caps y supresión antes de ejecutar.
Además del pipeline de 5 agentes, el sistema incluye un Blog Service post-pipeline que genera HTML editorial personalizado para la empresa usando Anthropic, lo despliega en Vercel y apunta blog.<dominio> con un CNAME en Spaceship — todo desde el dashboard en un clic.
POST /companies/analyze/stream-token emite un token de un solo uso, y GET /companies/analyze/stream?token=… lo consume vía StreamingResponse (text/event-stream). Esta indirección existe porque la API de EventSource del browser no acepta headers custom, así que la auth con X-Api-Key se reemplaza por el token efímero — la UI muestra los tokens del LLM en tiempo real mientras llegan.tools/gtm, tools/porkbun, tools/mailgun, tools/research, tools/warmup, tools/blog) y registradas en un ToolRegistry central con bootstrap.py, lo que permite scopear el toolset de cada agente sin acoplar la lógica al runner.app/core/safety.py, que evalúa ALLOW_DOMAIN_PURCHASES, ALLOW_COLD_EMAILS, ALLOW_DEMO_EMAILS y caps configurables, y deja audit log antes de permitir el call. Sin flag, todo se redirige a fixtures de dry-run.0002_enable_rls activa RLS sobre las tablas de tenants para que cada compañía solo vea sus propios datos a nivel base; se complementa con auth X-Api-Key en la API./webhooks/mailgun/events y /webhooks/mailgun/inbound validan firma HMAC-SHA256 y persisten eventos (delivered, opened, bounced, complained) para alimentar el dashboard.cli.py (Typer) y app/api/*.py (FastAPI) llaman a la misma capa services/, así que cualquier flujo demoable desde CLI es idéntico al que dispara la UI.AgentStage con visualizadores dedicados por agente (DiagnosticVis, DomainVis, DNSVis, WarmupVis, ResearchVis) + Console + PhaseRibbon, que renderizan el progreso del pipeline mientras los agentes corren.respx mockean Anthropic, Porkbun, Spaceship, Mailgun y Vercel; pytest corre en SQLite in-memory. Cero hits a APIs reales en CI.enable_rls, owned_domain_pool, target_evidence_url, company_target_countries, blog_publications, drop_purchased_domain_unique, seed_demo_fixed_domain).dry_run_planned → purchased → dns_pending → dns_verified → active_for_demo → active
│
paused / burned
researching → ready_to_draft → drafts_pending → approved → sent / dry_run_sent
| Capa | Tecnología |
|---|---|
| Frontend | Next.js + TypeScript + Tailwind (deploy: Vercel) |
| Streaming UI | Server-Sent Events (text/event-stream) con auth por token efímero |
| API | FastAPI + Pydantic v2 (auth X-Api-Key) |
| CLI | Typer (mismo services/ que la API) |
| Agentes | Anthropic SDK (tool use estructurado + web_search / web_fetch) |
| ORM / migraciones | SQLAlchemy + Alembic (8 migrations versionadas) |
| Base de datos | Supabase Postgres con Row-Level Security (SQLite in-memory en tests) |
| Registradores DNS | Porkbun REST API · Spaceship REST API |
| Email infra | Mailgun (dominios, warming, envío, webhooks HMAC-SHA256) |
| Blog deploy | Vercel REST API (deploy + dominio custom blog.<dominio>) |
| Tests | pytest + respx mocks sobre todas las APIs externas |
| Deploy backend | Render (Python Web Service, render.yaml Blueprint) |
# Backend
cd backend
python3.11 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
cp .env.example .env # completar keys
alembic upgrade head
uvicorn app.main:app --reload --port 8000
# Frontend (en otra terminal)
cd frontend
npm install
npm run dev # http://localhost:3000
Ver backend/README.md para documentación completa de instalación, CLI y deploy.
backend/ FastAPI service (app, alembic, tests, docs, examples, cli)
frontend/ Next.js UI — landing, onboarding, stage (agentes en vivo), dashboard, email preview
openspec/ Historial de cambios spec-driven
context/ Briefs e instrucciones usadas para generar el MVP
render.yaml Blueprint de deploy en Render (rootDir: backend)