Documéntalo
Integraciones

Email con Resend

Integración de email transaccional vía Resend en Coordinalo

Email con Resend

Coordinalo utiliza Resend para enviar emails transaccionales como recordatorios, confirmaciones, recibos y campañas de marketing.

Requisitos previos

  • Cuenta de Resend
  • API Key de Resend
  • Dominio verificado en Resend

Configuración inicial

Configurar API Key

La API Key se configura como variable de entorno:

RESEND_API_KEY=re_xxxxxxxxxxxxx

Verificar configuración

GET /api/v1/organization/email/status

Respuesta

{
  "status": "active",
  "provider": "resend",
  "fromEmail": "[email protected]",
  "fromName": "Centro de Kinesiología",
  "replyTo": "[email protected]",
  "domain": "micentro.com",
  "domainStatus": "verified",
  "stats": {
    "sentToday": 125,
    "deliveredToday": 122,
    "bouncedToday": 2,
    "openRateToday": 68.5
  }
}

Actualizar configuración de email

PUT /api/v1/organization/email/settings

Body

{
  "fromEmail": "[email protected]",
  "fromName": "Centro de Kinesiología",
  "replyTo": "[email protected]",
  "footer": "Centro de Kinesiología | Av. Principal 123, Santiago | +56 2 1234 5678"
}

Templates de email

Templates predefinidos

Coordinalo incluye los siguientes templates:

TemplateCódigoDescripción
Confirmación de sesiónsession_confirmationConfirma agendamiento
Recordatorio de sesiónsession_reminderRecuerda sesión próxima
Recibo de pagopayment_receiptComprobante de pago
Recordatorio de pagopayment_reminderAviso de pago pendiente
Bienvenidawelcome_clientOnboarding de cliente
CampañacampaignTemplate para campañas
Reseteo de contraseñapassword_resetRecuperar acceso

Listar templates

GET /api/v1/organization/email/templates

Respuesta

{
  "templates": [
    {
      "id": "session_confirmation",
      "name": "Confirmación de sesión",
      "subject": "Tu sesión de {{service}} está confirmada",
      "category": "transactional",
      "variables": ["name", "service", "date", "time", "provider", "location"],
      "lastModified": "2026-01-15T10:00:00Z"
    },
    {
      "id": "session_reminder",
      "name": "Recordatorio de sesión",
      "subject": "Recordatorio: {{service}} mañana a las {{time}}",
      "category": "reminder",
      "variables": ["name", "service", "date", "time", "provider"],
      "lastModified": "2026-01-10T14:00:00Z"
    },
    {
      "id": "payment_receipt",
      "name": "Recibo de pago",
      "subject": "Recibo de pago #{{receiptNumber}}",
      "category": "transactional",
      "variables": ["name", "receiptNumber", "amount", "description", "date"],
      "lastModified": "2026-01-05T09:00:00Z"
    }
  ]
}

Ver template específico

GET /api/v1/organization/email/templates/:templateId

Respuesta

{
  "id": "session_reminder",
  "name": "Recordatorio de sesión",
  "subject": "Recordatorio: {{service}} mañana a las {{time}}",
  "body": "Hola {{name}},\n\nTe recordamos que tienes una sesión de {{service}} programada para:\n\n📅 Fecha: {{date}}\n⏰ Hora: {{time}}\n👤 Profesional: {{provider}}\n📍 Lugar: {{location}}\n\nSi necesitas cancelar o reprogramar, por favor hazlo con al menos 24 horas de anticipación.\n\n¡Te esperamos!\n\nSaludos,\n{{organizationName}}",
  "html": "<!DOCTYPE html><html>...",
  "variables": ["name", "service", "date", "time", "provider", "location", "organizationName"],
  "category": "reminder",
  "previewText": "No olvides tu sesión de {{service}}",
  "createdAt": "2025-06-01T10:00:00Z",
  "lastModified": "2026-01-10T14:00:00Z"
}

Personalizar template

PUT /api/v1/organization/email/templates/:templateId

Body

{
  "subject": "⏰ Recordatorio: Tu sesión de {{service}}",
  "body": "Hola {{name}},\n\nMañana tienes tu sesión de {{service}} a las {{time}}.\n\nTe esperamos en {{location}}.\n\n{{organizationName}}",
  "previewText": "Tu sesión de {{service}} es mañana"
}

Crear template personalizado

POST /api/v1/organization/email/templates

Body

{
  "id": "birthday_greeting",
  "name": "Felicitación de cumpleaños",
  "subject": "🎂 ¡Feliz cumpleaños, {{name}}!",
  "body": "Querido/a {{name}},\n\n¡Todo el equipo de {{organizationName}} te desea un muy feliz cumpleaños!\n\nComo regalo, te ofrecemos un {{discount}}% de descuento en tu próxima sesión.\n\nUsa el código: {{promoCode}}\n\nVálido hasta: {{expirationDate}}\n\n¡Que tengas un excelente día!",
  "category": "marketing",
  "variables": ["name", "organizationName", "discount", "promoCode", "expirationDate"]
}

Enviar email

Enviar email directo

POST /api/v1/clients/:clientId/send-email

Body

{
  "template": "session_reminder",
  "variables": {
    "service": "kinesiología",
    "date": "21 de enero de 2026",
    "time": "10:00",
    "provider": "María González",
    "location": "Av. Principal 123, Santiago"
  }
}

Respuesta exitosa (200)

{
  "id": "email_abc123",
  "clientId": "cli_001",
  "to": "[email protected]",
  "subject": "Recordatorio: kinesiología mañana a las 10:00",
  "template": "session_reminder",
  "status": "sent",
  "sentAt": "2026-01-20T08:00:00Z",
  "resendId": "re_xyz789"
}

Enviar email con contenido personalizado

POST /api/v1/clients/:clientId/send-email

Body

{
  "subject": "Información importante",
  "body": "Hola Juan,\n\nQueríamos informarte que...",
  "replyTo": "[email protected]"
}

Preview de email

Generar preview

POST /api/v1/organization/email/templates/:templateId/preview

Body

{
  "clientId": "cli_001",
  "variables": {
    "service": "kinesiología",
    "date": "21 de enero de 2026",
    "time": "10:00"
  }
}

Respuesta

{
  "subject": "Recordatorio: kinesiología mañana a las 10:00",
  "body": "Hola Juan,\n\nTe recordamos que tienes una sesión de kinesiología programada para:\n\n📅 Fecha: 21 de enero de 2026\n⏰ Hora: 10:00\n...",
  "html": "<!DOCTYPE html><html>...",
  "previewText": "No olvides tu sesión de kinesiología"
}

Enviar email de prueba

POST /api/v1/organization/email/templates/:templateId/test

Body

{
  "to": "[email protected]",
  "variables": {
    "name": "Usuario de Prueba",
    "service": "kinesiología",
    "date": "21 de enero de 2026",
    "time": "10:00"
  }
}

Webhooks de Resend

Coordinalo recibe webhooks de Resend para rastrear el estado de los emails.

Eventos soportados

EventoDescripción
email.sentEmail enviado a Resend
email.deliveredEmail entregado al servidor destino
email.openedEmail abierto por el destinatario
email.clickedClick en enlace del email
email.bouncedEmail rebotado
email.complainedMarcado como spam

Configurar webhook en Resend

GET /api/v1/organization/email/webhook-config
{
  "webhookUrl": "https://api.coordinalo.com/webhooks/resend/org_abc123",
  "secret": "whsec_xyz789",
  "events": [
    "email.delivered",
    "email.opened",
    "email.clicked",
    "email.bounced",
    "email.complained"
  ]
}

Ejemplo de webhook recibido

{
  "type": "email.opened",
  "data": {
    "email_id": "re_xyz789",
    "to": ["[email protected]"],
    "subject": "Recordatorio: kinesiología mañana a las 10:00",
    "opened_at": "2026-01-20T09:15:00Z"
  }
}

Gestión de rebotes

Ver emails rebotados

GET /api/v1/organization/email/bounces

Respuesta

{
  "data": [
    {
      "id": "bounce_001",
      "clientId": "cli_002",
      "clientName": "Ana López",
      "email": "[email protected]",
      "bounceType": "hard",
      "reason": "Mailbox does not exist",
      "bouncedAt": "2026-01-15T10:00:10Z",
      "originalEmailId": "email_def456"
    }
  ],
  "summary": {
    "hardBounces": 15,
    "softBounces": 8,
    "last30Days": 23
  }
}

Tipos de rebote

TipoCódigoDescripciónAcción
Hard bouncehardEmail no existeMarcar como inválido
Soft bouncesoftBuzón lleno, temporalReintentar
Spam complaintcomplaintMarcado como spamDesuscribir

Limpiar emails inválidos

POST /api/v1/organization/email/clean-bounces
{
  "action": "mark_invalid",
  "bounceIds": ["bounce_001", "bounce_002"]
}

Lista de supresión

Ver lista de supresión

GET /api/v1/organization/email/suppression-list

Respuesta

{
  "data": [
    {
      "email": "[email protected]",
      "reason": "unsubscribed",
      "addedAt": "2026-01-10T14:00:00Z"
    },
    {
      "email": "[email protected]",
      "reason": "hard_bounce",
      "addedAt": "2026-01-15T10:00:10Z"
    }
  ]
}

Agregar a lista de supresión

POST /api/v1/organization/email/suppression-list
{
  "email": "[email protected]",
  "reason": "manual"
}

Estadísticas

Obtener estadísticas de email

GET /api/v1/organization/email/stats

Parámetros de query

ParámetroTipoDescripción
fromstringFecha inicio
tostringFecha fin
groupBystringday, week, month

Respuesta

{
  "period": {
    "from": "2026-01-01",
    "to": "2026-01-31"
  },
  "totals": {
    "sent": 1500,
    "delivered": 1425,
    "opened": 1100,
    "clicked": 280,
    "bounced": 50,
    "complained": 5
  },
  "rates": {
    "deliveryRate": 95.0,
    "openRate": 77.2,
    "clickRate": 19.6,
    "bounceRate": 3.3,
    "complaintRate": 0.3
  },
  "byTemplate": {
    "session_reminder": {
      "sent": 600,
      "openRate": 82.5
    },
    "payment_receipt": {
      "sent": 400,
      "openRate": 75.0
    }
  }
}

On this page