Campañas

Crea y envía campañas de email masivo con templates personalizados, variables por destinatario, lotes automáticos y rate limiting integrado.

Base URL: https://api.reallyquickemails.com


Como enviar correos masivos

Hay dos formas de enviar correos masivos con ReallyQuickEmails:

MétodoMejor paraLímite por request
API: POST /v1/send-batchIntegraciones programáticas, envíos desde tu backend10,000 destinatarios
API: POST /v1/campaigns o DashboardEnvíos grandes con segmentos, lotes y warmingHasta 10,000,000 destinatarios (procesamiento automático por lotes)

Ver más en POST /v1/send-batch.


POST /v1/campaigns

Crea una campaña de envío masivo.

Parámetros del body

CampoTipoRequeridoDescripción
namestringNombre de la campaña.
templateIdstringID (UUID) del template a enviar.
senderProfileIdstringID del perfil de remitente (dominio verificado).
recipientIdsstring[]CondicionalIDs de destinatarios. Requerido cuando selectAllRecipients es false.
selectAllRecipientsbooleanNoEnviar a todos los destinatarios del proyecto. Default: false.
recipientCountnumberCondicionalTotal de destinatarios. Requerido cuando selectAllRecipients es true.
recipientFilterobjectNoFiltro de destinatarios (solo con selectAllRecipients: true).
subjectstringNoAsunto de la campaña. Si se omite, se usa el asunto del template.
previewTextstringNoTexto de preview (preheader).
templateInternalIdstring | numberNoID interno numérico del template (alternativo al UUID).
scheduledForstringNoTimestamp ISO para programar el envío.
scheduleTypestringNoTipo de programación. Default: scheduled. Con delay requiere delayAmount y delayUnit.
delayAmountnumberNoCantidad de retraso (solo con scheduleType: "delay").
delayUnitstringNoUnidad del retraso (solo con scheduleType: "delay").
batchModebooleanNoActiva el envío por lotes. Default: false.
batchSizenumberNoDestinatarios por lote (con batchMode: true).
batchIntervalHoursnumberNoHoras entre lotes. Default: 24.
sendOverHoursnumberNoDistribuye el envío uniformemente en N horas.
variableConfigobjectNo{ "defaults": {...}, "mappings": {...} } — valores por defecto y mapeo de campos del destinatario a variables del template.
confirmDuplicatebooleanNoOmite la detección de campañas duplicadas (ver respuesta 409).

Request example

Requiere autenticación con Bearer token (Authorization: Bearer sk_proj_...). Ver más en Autenticacion.

bash
curl -X POST https://api.reallyquickemails.com/v1/campaigns \
  -H "Authorization: Bearer sk_proj_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Newsletter Junio",
    "templateId": "9f1c2b34-5678-4abc-9def-012345678901",
    "senderProfileId": "1a2b3c4d-5678-4abc-9def-012345678901",
    "recipientIds": ["c0ffee00-1111-4222-8333-444455556666"],
    "subject": "Novedades de junio",
    "batchMode": true,
    "batchSize": 5000,
    "batchIntervalHours": 24
  }'

Response example (200)

json
{
  "success": true,
  "campaign": {
    "id": "7e8d9c0b-1234-4abc-9def-012345678901",
    "name": "Newsletter Junio",
    "status": "initializing",
    "subject": "Novedades de junio",
    "template_id": "9f1c2b34-5678-4abc-9def-012345678901",
    "sender_profile_id": "1a2b3c4d-5678-4abc-9def-012345678901",
    "total_recipients": 1,
    "batch_mode": true,
    "batch_size": 5000,
    "batch_interval_hours": 24,
    "total_batches": 1,
    "current_batch": 0,
    "utm_campaign": "rqe_7e8d9c0b12344abc9def012345678901"
  }
}

La campaña se devuelve de inmediato en estado initializing; los registros de destinatarios se crean en segundo plano (típicamente 2-30 segundos según el tamaño de la audiencia) y la campaña pasa a pending. El envío comienza automáticamente.

El objeto campaign incluye la fila completa de la campaña (también created_at, next_batch_at, select_all_recipients, send_over_hours, variable_config, scheduled_for, etc.).

Ver más en Estados de una campana.

Detección de duplicados (409)

Para evitar envíos duplicados accidentales, la API responde 409 en dos casos:

  • subject_match_60min — ya existe una campaña con el mismo asunto creada en los últimos 60 minutos.
  • name_template_24h — ya existe una campaña con el mismo nombre y template en las últimas 24 horas en estado no completado (pending, paused, processing, initializing).
json
{
  "warning": "duplicate_campaign",
  "reason": "subject_match_60min",
  "message": "Ya existe una campaña \"Newsletter Junio\" con el mismo asunto enviada hace 12 minutos",
  "existingCampaignId": "7e8d9c0b-1234-4abc-9def-012345678901",
  "existingCampaignStatus": "processing"
}

Si realmente quieres crear la campaña, reenvía el request con "confirmDuplicate": true.

Códigos de error

CódigoError
400Missing required fields: name, templateId, senderProfileId
400recipientIds is required when selectAllRecipients is false
400recipientCount is required when selectAllRecipients is true
400scheduledFor must be a string (ISO timestamp)
401API key inválida o ausente.
409duplicate_campaign (ver arriba).
500Failed to create campaign

Campanas desde el Dashboard

El Dashboard de RQE ofrece un asistente de 5 pasos para crear y enviar campañas sin código.

Flujo completo

text
1. Crear template     2. Crear campaña       3. Se envía automáticamente
   (Editor visual)       (Asistente 5 pasos)    (Procesamiento en segundo plano)
        |                      |                       |
   Editor visual        Destinatarios,           Lotes automáticos,
   con variables         template, sender,        rate limiting,
   {{nombre}}            variables, schedule      reintentos

Paso 1: Crear un template

Desde Templates → Nuevo Template, usa el editor visual de campañas para diseñar tu email. Los templates soportan variables dinámicas con sintaxis Handlebars:

html
<h1>¡Hola {{nombre}}!</h1>
<p>Tu código de descuento es: {{codigo}}</p>
<p>{{default producto "nuestro catálogo"}}</p>

Sintaxis de variables:

SintaxisDescripción
{{variable}}Sustitución básica
{{default variable "fallback"}}Valor por defecto si la variable no existe
{{#each items}}...{{/each}}Loop sobre arrays

Helpers disponibles:

HelperDescripción
{{formatCurrency precio "USD"}}Formatea un número como moneda.
{{formatDate fecha "long"}}Formatea una fecha (short por defecto).
{{multiply cantidad precio}}Multiplica dos números (2 decimales).
{{capitalize texto}} / {{uppercase texto}} / {{lowercase texto}}Transformación de texto.

Variables integradas: cada destinatario recibe automáticamente {{name}}, {{email}} y {{unsubscribe_url}}, además de los campos de datos del contacto. La búsqueda de claves de primer nivel también funciona en minúsculas (si tus datos de CSV/CRM traen claves como NOMBRE, el template puede usar {{nombre}}). Si el template no incluye {{unsubscribe_url}}, se agrega un footer de cancelación de suscripción automáticamente y los emails incluyen headers List-Unsubscribe.

Paso 2: Crear la campana

Desde Campañas → Nueva Campaña, el asistente te guía en 5 pasos:

  1. Destinatarios — Selecciona manualmente, usa "Seleccionar todos" o filtra por segmento.
  2. Template y Remitente — Elige el template creado y el perfil de remitente (dominio verificado).
  3. Variables (opcional) — Configura valores por defecto, mapea campos del destinatario a variables del template, o sube un CSV con valores personalizados por email.
  4. Configuración de envío — Activa modo por lotes, define tamaño de lote e intervalo, o distribuye el envío en N horas.
  5. Revisar y Enviar — Confirma todo y lanza la campaña.

Paso 3: Procesamiento automatico

Una vez creada la campaña:

  1. Se crean los registros de destinatarios (estado: pending)
  2. La campaña pasa de initializing a pending
  3. Los destinatarios se procesan de forma asíncrona en segundo plano: se preparan las variables de cada uno, se encolan para envío y pasan a estado queued
  4. Cada email se renderiza con Handlebars, se envía a través de nuestra infraestructura de envío y pasa a estado sent
  5. Los eventos de delivery/bounce/complaint actualizan el estado final y disparan tus webhooks

Ver más en Webhooks.

Configuracion avanzada

Modo por lotes

Divide el envío en lotes con intervalos entre ellos con batchMode, batchSize y batchIntervalHours. Útil para warming de dominio o para no saturar a tus destinatarios.

Ejemplo: 50,000 destinatarios con lotes de 10,000 cada 24 horas = 5 días de envío gradual.

Ver más en POST /v1/campaigns.

Distribucion horaria

Distribuye el envío uniformemente en un período de tiempo con el campo sendOverHours.

Ejemplo: 3,000 emails distribuidos en 6 horas = ~500 emails por hora.

Variables por destinatario (CSV)

Personaliza cada email subiendo un CSV con columnas:

csv
email,nombre,codigo_descuento,producto
juan@ejemplo.com,Juan,JUAN20,Plan Pro
maria@ejemplo.com,Maria,MARIA15,Plan Business

Las variables del CSV tienen prioridad sobre los valores por defecto.


Warming de dominio

Para envíos grandes (>50,000 emails) desde un dominio nuevo o con poco historial, envía gradualmente:

DíaVolumen sugerido
Día 1~50,000
Día 2~75,000
Día 3+Resto

Usa el modo por lotes para automatizar esto. Enviar todo de golpe desde un dominio frío puede resultar en clasificación como spam por Gmail, Outlook y otros proveedores.

Ver más en Deliverability y autenticación.


Estados de una campana

EstadoDescripción
initializingCreando registros de destinatarios (transitorio, típicamente 2-30 segundos)
pendingLista para ser procesada
processingEnviando lotes activamente
pausedPausada manualmente por el usuario
rate_limitedPausada automáticamente por límite de tasa
completedTodos los emails fueron procesados
failedLa campaña terminó con errores
cancelledCancelada por el usuario