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:

  1. 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).
  2. Reputazione dominio: spedire cold da noreply@multiverbe.com brucia 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.ts produce 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 + edge upsert-smtp-config / test-smtp / test-imap + hook useSmtpConfigs + SignatureTab. La password è cifrata; esiste l'RPC decrypt_smtp_password. Manca il SEND di produzione dalla casella (oggi solo config+test).
  • Inngest: presente (api/_inngest/, pattern sendBookingCreated + funzioni con step/sleep).

Piano di build (quando si fa)

  1. Helper invio SMTP per-workspace api/_lib/smtp-send.ts:
    • Legge smtp_configs del workspace, decifra la password via RPC decrypt_smtp_password.
    • Invia con nodemailer (⚠️ NUOVO dep Node → aggiungere a frontend/multiverbe-app/package.json e rigenerare pnpm-lock.yaml in CI/ambiente pulito, NON a mano su Windows — vedi memory project_dependabot_pnpm_lockfile_blocker). In alternativa: relay SMTP via edge function Deno (riusa lo stack di test-smtp) chiamata dall'endpoint Node → niente dep Node nuova.
    • Fail-closed pulito: se smtp_configs assente → 412 mailbox_not_connected con messaggio "collega la tua casella in Impostazioni → Outreach".
  2. 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_basis LIA cold (doc ops/lia-cold-outreach-2026-06-02.md).
  3. Inngest function sales/outreach.followup: step sleep('3d') → invia email2 dalla casella (skip se il prospect ha già risposto — quando ci sarà l'inbox IMAP sync; per ora invia sempre).
  4. Frontend: bottone "Invia sequenza" nel cockpit Sales (stato: inviata email1 · email2 +3gg).
  5. 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 in smtp_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.