# Campañas (/es/concepts/campaigns)

Una campaña es un único envío masivo a una audiencia que tú defines — piensa en newsletters, lanzamientos de producto, anuncios o promociones. Mientras que un flujo de trabajo sigue ejecutándose a lo largo del tiempo, una campaña se dispara exactamente una vez (de inmediato o en un momento programado) y es inmutable después de eso.

## Anatomía de una campaña

Todo lo necesario para renderizar y entregar un lote de correos vive en la propia campaña:

import {TypeTable} from 'fumadocs-ui/components/type-table';

<TypeTable
  type={{
  name: { type: 'string', required: true, description: 'Etiqueta interna mostrada en el panel.' },
  description: { type: 'string', description: 'Nota interna de formato libre; opcional.' },
  subject: { type: 'string', required: true, description: 'Línea de asunto del correo. Acepta las mismas variables de plantilla que las [Plantillas](/es/concepts/templates).' },
  body: { type: 'string', required: true, description: 'El cuerpo HTML, con soporte de variables de plantilla.' },
  from: { type: 'string', required: true, description: 'Dirección de envío — su dominio debe estar verificado.' },
  fromName: { type: 'string', description: 'Nombre mostrado como remitente (p. ej. `Acme Marketing <hello@acme.com>`). Opcional.' },
  replyTo: { type: 'string', description: 'Dirección de respuesta (reply-to); opcional.' },
  type: { type: 'string', required: true, description: 'Uno de `MARKETING`, `TRANSACTIONAL` o `HEADLESS` — el mismo significado que los [tipos de plantilla](/es/concepts/templates#templates-types). Determina el pie de cancelación de suscripción y si los contactos no suscritos quedan excluidos.' },
  audienceType: { type: 'string', required: true, description: 'Define los destinatarios. Uno de `ALL`, `SEGMENT` o `FILTERED` — detalles abajo.' },
  segmentId: { type: 'string', description: 'Obligatorio cuando `audienceType = SEGMENT`.' },
  audienceCondition: { type: 'object', description: 'Filtro ad-hoc usado cuando `audienceType = FILTERED`. Misma estructura que los [filtros de segmento](/es/guides/segment-filters).' },
  scheduledFor: { type: 'string', description: 'Timestamp ISO 8601. Cuando está presente, la entrega ocurre en ese momento; cuando es null, la entrega comienza en cuanto disparas el envío.' },
}}
/>

Tras el envío, la campaña guarda contadores desnormalizados — `totalRecipients`, `sentCount`, `deliveredCount`, `openedCount`, `clickedCount`, `bouncedCount` — recuperables mediante `GET /campaigns/:id/stats`.

## Segmentar una audiencia

Hay tres formas de definir a quién llega una campaña:

* **`ALL`** — todos los contactos suscritos del proyecto; la ruta más rápida hacia una difusión a toda la lista.
* **`SEGMENT`** — los miembros actuales de uno de tus [segmentos](/es/concepts/segments), de modo que se reutiliza la lógica de segmentación existente.
* **`FILTERED`** — una condición en línea escrita directamente en la campaña (misma estructura JSON que los filtros de segmento). Ideal cuando quieres una audiencia a medida para un único envío y no necesitas guardar un segmento.

Las campañas de tipo `MARKETING` o `HEADLESS` excluyen automáticamente a quien se haya dado de baja. Una campaña `TRANSACTIONAL`, en cambio, llega a todo contacto que coincida, esté suscrito o no — resérvala para contenido genuinamente transaccional, y úsala poco.

## Verificación del dominio remitente

Bitelio solo acepta una dirección `from` cuyo dominio haya sido verificado para el envío; de lo contrario, crear o actualizar la campaña falla con `403`. Consulta [Verificación de dominios](/es/guides/verifying-domains).

## Ciclo de vida

| Estado      | Significado                                                                                       |
| ----------- | ------------------------------------------------------------------------------------------------- |
| `DRAFT`     | Existe pero aún no se ha programado ni enviado; todavía editable.                                 |
| `SCHEDULED` | En cola para un `scheduledFor` futuro; aún se puede cancelar.                                     |
| `SENDING`   | Entrega en curso — se está recorriendo la cola de destinatarios.                                  |
| `SENT`      | Entrega finalizada; las estadísticas ya no cambiarán.                                             |
| `CANCELLED` | Detenida antes de terminar. Un estado terminal alcanzable desde `DRAFT`, `SCHEDULED` o `SENDING`. |

Una campaña en `SENT` o `CANCELLED` no puede editarse ni volver a enviarse. Para iterar sobre ella, llama a `POST /campaigns/:id/duplicate` y trabaja sobre la copia resultante.

## Envío y programación

`POST /campaigns/:id/send` inicia la entrega. El envío corre de forma asíncrona en segundo plano — las listas pequeñas terminan en segundos, mientras que las audiencias muy grandes tardan más. La página de detalle de la campaña en el panel muestra el progreso en vivo.

Una campaña `SCHEDULED` o `SENDING` puede detenerse con `POST /campaigns/:id/cancel`. Ten en cuenta que cancelar solo evita los envíos futuros; cualquier correo ya aceptado por el servidor de correo del destinatario está fuera de alcance.

## Envíos de prueba

`POST /campaigns/:id/test` entrega un único correo de vista previa. El body toma una sola dirección — `{ email: "you@example.com" }` — no una lista. Las variables se resuelven exactamente como en el envío real, pero la entrega va a la dirección que indicaste, lo que convierte los envíos de prueba en una forma cómoda de comprobar la personalización usando tu propio registro de contacto.

## Duplicar

Llamar a `POST /campaigns/:id/duplicate` produce un `DRAFT` nuevo que copia el contenido, la audiencia y la configuración del original. Útil para variantes A/B o campañas que envías de forma recurrente.

## Referencia de la API

La lista completa de endpoints de campañas — listar, obtener, crear, actualizar, eliminar, enviar, cancelar, duplicar, probar y estadísticas — está en el [resumen de la API](/es/api-reference/overview#campaigns).

## Qué sigue

<Cards>
  <Card title="Plantillas" href="/es/concepts/templates">
    Crea diseños reutilizables para el contenido de tus campañas.
  </Card>

  <Card title="Segmentos" href="/es/concepts/segments">
    Define las audiencias detrás de `audienceType: SEGMENT`.
  </Card>

  <Card title="Verificación de dominios" href="/es/guides/verifying-domains">
    Un requisito previo para enviar desde tu propio dominio.
  </Card>

  <Card title="Higiene de listas" href="/es/guides/list-hygiene">
    Protege la entregabilidad minimizando rebotes y quejas.
  </Card>
</Cards>
