BitelioBitelio
Concepts

Contactos

Almacena, enriquece y da seguimiento a las personas a las que envías correo

Un contacto es el registro que Bitelio guarda de un único destinatario de correo: un identificador único ligado a una dirección de correo.

Añadir contactos

Hay varias formas de incorporar contactos a un proyecto de Bitelio:

  • Vía /v1/track — si registras un evento contra un correo que aún no está en el proyecto, el contacto se crea al vuelo (y empieza suscrito).
  • Vía POST /contacts — crea o hace upsert de un contacto. Si el correo ya existe, se actualiza en lugar de rechazarse; la respuesta trae un bloque _meta: { isNew, isUpdate }, con estado 201 cuando el contacto se creó y 200 cuando se actualizó.
  • Importación CSV masiva mediante POST /contacts/import — envía un CSV (≤ 5 MB) y luego sigue el job con GET /contacts/import/:jobId. email debe ser la primera columna; cada columna restante se convierte en una clave bajo data.*.
  • Suscripción/baja/eliminación masiva mediante POST /contacts/bulk-subscribe, bulk-unsubscribe y bulk-delete — cada una toma como máximo 1000 IDs de contacto y devuelve un ID de job que puedes consultar en GET /contacts/bulk/:jobId.
  • Añadiendo correos a un segmento estático con POST /segments/:id/members y createMissing: true, lo que crea cualquier dirección que aún no esté en el proyecto.
  • A mano, desde el panel.

Datos del contacto

Se pueden adjuntar pares clave-valor arbitrarios a cualquier contacto, y esos datos alimentan luego la segmentación y la personalización de plantillas.

Tipos de datos

Para cada clave de un proyecto, Bitelio infiere el tipo a partir del primer valor no nulo que encuentra:

TipoDescripción
StringTexto que no se interpreta como fecha.
NumberEnteros y decimales por igual.
Booleantrue o false.
DateCadenas con formato YYYY-MM-DD o YYYY-MM-DDTHH:MM:SS[.sss]Z. Los operadores de segmento que entienden fechas requieren la forma ISO 8601 completa.

La inferencia de tipos ocurre una sola vez por proyecto, en la primera escritura. Así que si una clave se tipa como number, los valores de texto posteriores se siguen guardando — pero la interfaz de filtros de segmento sigue tratando la clave como number. ¿Mezclaste los tipos por accidente? La forma más limpia de arreglarlo es DELETE /contacts/fields/:field para eliminar el campo por completo, y luego reimportarlo con valores consistentes.

Tipo de dato por defecto

Cualquier cosa que no se reconozca como número, booleano o fecha ISO 8601 se guarda como string por defecto.

Valores no persistentes

Envolver un valor como { value, persistent: false } lo hace disponible para un único renderizado sin llegar a escribirlo nunca en el contacto:

{
  "email": "user@example.com",
  "data": {
    "firstName": "Ada",
    "resetCode": { "value": "ABC123", "persistent": false }
  }
}

Aquí firstName se guarda en el contacto, mientras que resetCode existe solo para este envío y se descarta después. Eso lo convierte en la herramienta adecuada para secretos efímeros — códigos de restablecimiento de contraseña, enlaces mágicos, tokens de un solo uso.

Tratamiento especial de valores

Unos pocos valores reciben un tratamiento especial cuando se crea o actualiza un contacto:

ValorComportamientoEjemplo
Cadena vacía ("")Se omite — no se guarda ni cambia nada{ name: "" } → El campo se omite
nullElimina el campo de los datos del contacto{ name: null } → El campo se elimina
Otros valoresSe escriben normalmente{ name: "John" } → Se guarda como "John"

Eliminar datos de un contacto

Pasa null en un campo al crear o actualizar un contacto para borrarlo. Una cadena vacía no hace lo mismo — las cadenas vacías se filtran antes de la escritura, así que los datos existentes sobreviven.

Claves reservadas

Un puñado de claves pertenecen a Bitelio y viven en el propio contacto en lugar de en data. Son legibles, pero no se pueden escribir a través de data:

ClaveDescripción
emailLa dirección de correo del contacto
createdAtCuándo se creó el contacto
updatedAtCuándo se modificó el contacto por última vez
subscribedSi el contacto recibe actualmente correo de marketing (booleano)

Además, estas claves se eliminan silenciosamente de cualquier payload de data — incluirlas en /v1/track, POST /contacts o PATCH /contacts/:id ni las guarda ni produce un error:

id, bitelio_id, bitelio_email, unsubscribeUrl, subscribeUrl, manageUrl

Las tres últimas se generan de nuevo para cada destinatario en el momento del envío y aparecen como variables de plantilla (ver Plantillas).

Claves especiales

ClaveDescripción
localeEl idioma preferido del contacto como código ISO 639 (p. ej. 'en', 'fr', 'es'). Cuando está definido, tiene prioridad sobre el idioma general del proyecto en las páginas orientadas al contacto y en los pies de correo

Estado de suscripción

Cada contacto lleva un indicador subscribed que rige qué categorías de correo le llegan. Los contactos creados vía /v1/track empiezan suscritos; con POST /contacts el indicador toma lo que envíes (por defecto false).

En las actualizaciones, omitir subscribed conserva lo que sea que tenga actualmente — la omisión y false son cosas distintas. Envía un true o false explícito siempre que quieras un cambio.

Cada vez que subscribed cambia, Bitelio registra un evento en el contacto automáticamente:

  • pasa a true → un evento contact.subscribed
  • pasa a false → un evento contact.unsubscribed

Esto ocurre sin importar qué causó el cambio — una edición en el panel, la página pública de cancelación, un job masivo, o una cancelación automática tras un rebote o una queja de spam. Los flujos de trabajo pueden ramificarse a partir de ambos eventos.

Cómo un contacto termina sin suscripción

Hay varios caminos hacia el estado sin suscripción:

  • Manual — alguien lo activa/desactiva en el panel o mediante la API.
  • Autoservicio — el contacto hace clic en un enlace de cancelación en un correo, cayendo en la página pública de cancelación alojada.
  • Automático por rebote duro — un rebote permanente da de baja al contacto; los rebotes suaves dejan el estado sin cambios.
  • Automático por queja — el contacto reporta tu correo como spam y su proveedor de buzón traslada la queja a Bitelio.

Correos según el estado de suscripción

Que un correo de marketing se entregue depende del indicador de suscripción; el correo transaccional siempre pasa, esté suscrito o no.

Tipo de correoSuscritoNo suscrito
Transaccional (vía /v1/send)EntregadoEntregado
Campañas (marketing)EntregadoNo entregado
Campañas (headless)EntregadoNo entregado
Campañas (transaccional)EntregadoEntregado
Automatizaciones (plantilla marketing)EntregadoNo entregado
Automatizaciones (plantilla headless)EntregadoNo entregado
Automatizaciones (plantilla transaccional)EntregadoEntregado

Correos transaccionales y plantillas de marketing

Pasar por el endpoint transaccional (/v1/send) no permite que una plantilla de marketing llegue a un contacto sin suscripción — la comprobación de suscripción sigue aplicando. Si el mensaje tiene que llegar sin importar la baja, usa una plantilla transaccional.

Qué sigue