fabIAna

Conecta tu producto con Fabiana

Avisa a Fabiana cuando alguien se registra o hace algo en tu producto. Ella mantiene el contacto al día y tus automatizaciones envían el email adecuado en el momento adecuado.

Autenticación

Crea una clave en Configuración → Claves API (planes Pro y Business). Solo se muestra una vez. Envíala en cada petición:

Authorization: Bearer fab.…

La URL base es https://api.getfabiana.com. Las peticiones y respuestas son JSON. Cada organización puede hacer 300 peticiones por minuto.

Enviar eventos

Una llamada por cada cosa que pasa. Fabiana busca el contacto por email o teléfono, o lo crea, y guarda las propiedades en el contacto como campos personalizados.

curl -X POST https://api.getfabiana.com/v1/events \
  -H "Authorization: Bearer $FABIANA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "event": "signed_up",
    "contact": { "email": "ana@example.com", "name": "Ana", "emailOptIn": true },
    "properties": { "plan": "pro", "seats": 3 }
  }'
{ "contactId": "6f1c…", "created": true }

Qué pasa después

  • El evento aparece en la cronología del contacto.
  • Se ejecutan las automatizaciones con el disparador Llega un evento, filtradas por nombre del evento y propiedades.
  • Se ejecutan las automatizaciones con el disparador Cambia un campo personalizado cuando una propiedad cambia de valor.
  • Las secuencias que esperaban este evento avanzan; las que deben pararse con él se paran.
  • Un contacto nuevo también activa las automatizaciones de Se crea el contacto.

Los nombres de evento usan letras, números y _ . : -. Las propiedades son planas: hasta 50 textos, números o booleanos.

Emails a partir de tus eventos

Las automatizaciones pueden iniciar una secuencia de emails o enviar un email suelto, escrito como texto o hecho con una plantilla con tu logo y tu color. Asuntos y textos pueden usar {{first_name}}, {{name}}, {{email}} y cualquier propiedad como {{custom.plan}}. Los pasos de una secuencia pueden esperar días u horas, esperar a un evento o a una propiedad, o bifurcarse según una condición.

Los emails de marketing solo llegan a contactos que aceptaron recibirlos o que ya son clientes, y llevan enlace de baja. Envía emailOptIn: true cuando la persona marcó la casilla en tu formulario de registro.

Un email suelto marcado como Transaccional, sobre la propia cuenta o petición de la persona (una bienvenida, un recibo), se envía sin ese consentimiento y sin enlace de baja. Nunca lo uses para promociones.

Añade tu dominio en Configuración → Envío de emails y copia los registros DNS que aparecen. Una vez verificado, los emails salen desde tu propia dirección, firmados para tu dominio.

Contactos

POST/v1/eventsRegistra algo que un contacto hizo en tu producto
POST/v1/contactsCrea un contacto, o devuelve el que tiene el mismo email o teléfono
GET/v1/contactsLista contactos, de 50 en 50 (limit, cursor)
GET/v1/contacts/{id}Devuelve un contacto
PATCH/v1/contacts/{id}Actualiza un contacto
curl -X POST https://api.getfabiana.com/v1/contacts \
  -H "Authorization: Bearer $FABIANA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "email": "ana@example.com", "name": "Ana", "tags": ["trial"], "properties": { "plan": "pro" } }'

La referencia completa está en la descripción OpenAPI, que la mayoría de herramientas de API y asistentes de código saben leer.

Webhooks

Añade un endpoint en Configuración → Webhooks y elige los eventos que quieres. Fabiana envía un POST por cada uno y reintenta si tu servidor falla.

  • contact.created: Se creó un contacto: Fabiana, el equipo, una importación o la API
  • contact.updated: Un contacto cambió; changedFields dice qué
  • contact.stage_changed: Un contacto pasó a otra etapa del embudo (también se envía como deal.stage_changed)
  • lead.created: Fabiana captó un nuevo lead en una conversación
  • lead.converted: Un contacto llegó por primera vez a la etapa de reservado
  • deal.closed: Se cerró una venta como ganada (también se envía como deal.closed_won)
  • deal.closed_lost: Un contacto pasó a la etapa de perdido
  • conversation.created: Empezó una conversación nueva (también se envía como conversation.started)
  • message.received: Un cliente escribió por cualquier canal
  • handoff.requested: Fabiana pasó una conversación al equipo (también se envía como conversation.handoff)
  • handoff.claimed: Alguien del equipo tomó una conversación
  • handoff.resolved: Se resolvió una conversación que había tomado el equipo
  • conversation.resolved: Una conversación se marcó como resuelta
  • conversation.closed: Una conversación se archivó
  • csat.submitted: Un cliente valoró una conversación
{
  "event": "deal.closed",
  "organizationId": "…",
  "timestamp": "2026-10-29T10:00:00.000Z",
  "data": { "contactId": "…", "name": "Ana", "dealClosedValue": 1200, "dealClosedAt": "…", "stage": "booked" }
}

Comprueba la cabecera X-Fabiana-Signature con el cuerpo tal cual y el secreto del webhook:

import { createHmac, timingSafeEqual } from 'node:crypto'

function isFromFabiana(rawBody: string, header: string, secret: string): boolean {
  const expected = 'sha256=' + createHmac('sha256', secret).update(rawBody).digest('hex')
  return header.length === expected.length && timingSafeEqual(Buffer.from(header), Buffer.from(expected))
}

Errores

400 la petición no es válida, 401 falta la clave o fue revocada, 403 el rol de la clave o tu plan no lo permiten, 404 no existe ese contacto, 429 demasiadas peticiones. El cuerpo trae un message.

¿Dudas? Escribe a hello@getfabiana.com.