Path B · Sales invio reale outreach — piano (BOS · 2026-06-05)
Sessione A→C→B (founder: "procediamo in ordine, estrema qualità, ciò che non viene fatto segna BOS"). A (il Sole che scrive · #221) e C (booking a prova di pagante · #226) shippate e mergiate. B NON shippata in sessione: decisione di qualità, non di tempo. Qui il perché + il piano.
Perché B non è stata shippata subito (è la cosa giusta)
L'invio reale di cold outreach non può passare dal relay transazionale Brevo
(noreply@multiverbe.com) che oggi usano CRM e Booking. Due motivi duri:
- ToS Brevo: l'API
smtp/emailè transazionale (email innescate da un'azione dell'utente: conferme, reset, notifiche). Il cold outreach è marketing/prospecting → usarlo lì viola i ToS transazionali e rischia la sospensione dell'account Brevo (che ci serve per le email vere). - Reputazione dominio: spedire cold da
noreply@multiverbe.combrucia la reputazione del dominio transazionale (quello che fa arrivare conferme prenotazione e benvenuti). Il cold va da una casella di vendita dedicata e scaldata (es.loris@multiverbe.ch), separata.
Quindi l'invio outreach di qualità = invio per-workspace dalla casella propria del cliente (SMTP del workspace), che è esattamente l'Email epic (già stimata ~35-40h nel dogfooding audit). Shippare uno shortcut transazionale sarebbe stato low-quality e auto-lesivo: scartato.
Cosa c'è già (riusabile)
- Generazione:
api/sales/generate-outreach.tsproduce la sequenza 3-step (email1, email2 follow-up +3gg, LinkedIn DM) via gateway sovrano (Mistral FR EU). Solida, NON tocca l'invio. - Config SMTP per-workspace:
smtp_configs+ edgeupsert-smtp-config/test-smtp/test-imap+ hookuseSmtpConfigs+SignatureTab. La password è cifrata; esiste l'RPCdecrypt_smtp_password. Manca il SEND di produzione dalla casella (oggi solo config+test). - Inngest: presente (
api/_inngest/, patternsendBookingCreated+ funzioni con step/sleep).
Piano di build (quando si fa)
- Helper invio SMTP per-workspace
api/_lib/smtp-send.ts:- Legge
smtp_configsdel workspace, decifra la password via RPCdecrypt_smtp_password. - Invia con
nodemailer(⚠️ NUOVO dep Node → aggiungere afrontend/multiverbe-app/package.jsone rigenerarepnpm-lock.yamlin CI/ambiente pulito, NON a mano su Windows — vedi memoryproject_dependabot_pnpm_lockfile_blocker). In alternativa: relay SMTP via edge function Deno (riusa lo stack ditest-smtp) chiamata dall'endpoint Node → niente dep Node nuova. - Fail-closed pulito: se
smtp_configsassente →412 mailbox_not_connectedcon messaggio "collega la tua casella in Impostazioni → Outreach".
- Legge
- Endpoint
POST /api/sales/send-outreach:- Auth
verifyUser+ role IN (owner, admin, sales-manager) (come generate-outreach). - Input:
{ workspaceId, prospect{email,...}, sequence }(o genera+invia in un colpo). - Invia email1 ORA dalla casella del workspace.
- Accoda email2 (+3gg) via Inngest (
sales/outreach.followup). - LinkedIn DM: nessuna API → ritorna la copy per invio manuale (task), non auto.
- Telemetria in
content_generations(come generate-outreach) +legal_basisLIA cold (docops/lia-cold-outreach-2026-06-02.md).
- Auth
- Inngest function
sales/outreach.followup: stepsleep('3d')→ invia email2 dalla casella (skip se il prospect ha già risposto — quando ci sarà l'inbox IMAP sync; per ora invia sempre). - Frontend: bottone "Invia sequenza" nel cockpit Sales (stato: inviata email1 · email2 +3gg).
- Compliance cold CH/EU: unsubscribe/opt-out nel footer, LIA registrata, soppressione su reply.
Stima & priorità
- ~8-12h (send helper + endpoint + Inngest + UI), DENTRO l'Email epic (la parte "send"; l'inbox sync IMAP + AI-compose restano oltre).
- Priorità: dopo che Loris ha caselle scaldate (
*.multiverbe.ch) configurate insmtp_configs. Per il dogfooding immediato, l'outreach può partire a mano dalla copy generata (già disponibile).
Stato
DA FARE · non blocca il primo pagante (booking/CRM/sito/pagamenti sono pronti). Aggancia all'Email epic. Generazione outreach già viva → valore immediato anche senza auto-send.