Audiencias y Contactos

Una audiencia (audience) en Resend es un grupo de contactos a los que puedes enviar broadcasts -- emails de marketing, newsletters o comunicaciones masivas. Es el equivalente a una lista de suscriptores.

Audiencias son solo para broadcasts

Las audiencias son exclusivamente para broadcasts (emails masivos como newsletters). Para emails transaccionales (confirmaciones de cuenta, reset de contraseña, notificaciones) no necesitas audiencias. Esos los envías directamente con resend.emails.send() al destinatario específico.

Crear una audiencia

Desde el dashboard

  1. Ve al dashboard de Resend
  2. Haz clic en Audiences en el menú lateral
  3. Haz clic en Create Audience
  4. Escribe un nombre descriptivo (por ejemplo "Newsletter" o "Usuarios Pro")
  5. Haz clic en Create

Por API

typescript
import { Resend } from 'resend'
 
const resend = new Resend(process.env.RESEND_API_KEY)
 
const { data, error } = await resend.audiences.create({
  name: 'Newsletter',
})
 
// data.id contiene el ID de la audiencia (aud_xxxx)
console.log(data?.id)

Agregar contactos

Cada contacto tiene un email, nombre opcional y un flag de suscripción.

Por API

typescript
const { data, error } = await resend.contacts.create({
  audienceId: 'aud_xxxx',
  email: 'usuario@ejemplo.com',
  firstName: 'Juan',
  lastName: 'Pérez',
  unsubscribed: false,
})

Los campos firstName, lastName y unsubscribed son opcionales. Si no pasas unsubscribed, el valor por defecto es false (suscrito).

Agrega contactos después del registro

Puedes agregar contactos a tu audiencia de forma programática justo después de que un usuario se registra en tu app. Así lo agregas a tu newsletter automáticamente sin que tenga que suscribirse por separado:

typescript
// En tu lógica de registro de usuarios
async function registrarUsuario(email: string, nombre: string) {
  // 1. Crear usuario en tu base de datos
  const usuario = await db.usuarios.create({ email, nombre })
 
  // 2. Agregarlo a la audiencia de newsletter
  await resend.contacts.create({
    audienceId: process.env.RESEND_AUDIENCE_ID!,
    email: usuario.email,
    firstName: nombre,
    unsubscribed: false,
  })
 
  // 3. Enviar email de bienvenida (transaccional, sin audiencia)
  await resend.emails.send({
    from: 'Mi App <noreply@midominio.com>',
    to: [email],
    subject: 'Bienvenido a Mi App',
    react: WelcomeEmail({ nombre }),
  })
}

Agregar múltiples contactos

Para agregar varios contactos a la vez, puedes iterar sobre un array:

typescript
const contactos = [
  { email: 'ana@ejemplo.com', firstName: 'Ana' },
  { email: 'carlos@ejemplo.com', firstName: 'Carlos' },
  { email: 'maria@ejemplo.com', firstName: 'María' },
]
 
for (const contacto of contactos) {
  await resend.contacts.create({
    audienceId: 'aud_xxxx',
    email: contacto.email,
    firstName: contacto.firstName,
    unsubscribed: false,
  })
}

Importar desde CSV

Si ya tienes una lista de contactos, puedes importarlos desde el dashboard:

  1. Ve a tu audiencia en Audiences
  2. Haz clic en Import contacts
  3. Sube un archivo CSV con las columnas: email, first_name, last_name, unsubscribed
  4. Resend procesa el archivo y agrega los contactos

Listar contactos

Para obtener todos los contactos de una audiencia:

typescript
const { data, error } = await resend.contacts.list({
  audienceId: 'aud_xxxx',
})
 
// data.data es un array de contactos
data?.data.forEach((contacto) => {
  console.log(contacto.email, contacto.firstName)
})

Obtener un contacto específico

typescript
const { data, error } = await resend.contacts.get({
  audienceId: 'aud_xxxx',
  id: 'contacto_id',
})

Actualizar un contacto

typescript
const { data, error } = await resend.contacts.update({
  audienceId: 'aud_xxxx',
  id: 'contacto_id',
  unsubscribed: true,
})

Eliminar un contacto

typescript
const { data, error } = await resend.contacts.remove({
  audienceId: 'aud_xxxx',
  id: 'contacto_id',
})

También puedes eliminar por email:

typescript
const { data, error } = await resend.contacts.remove({
  audienceId: 'aud_xxxx',
  email: 'usuario@ejemplo.com',
})

Unsubscribe automático

Cuando envías un broadcast a través de Resend, el email incluye automáticamente un link de unsubscribe (darse de baja) en el footer. Esto es obligatorio por ley en la mayoría de países (CAN-SPAM en EE.UU., RGPD en Europa).

Cuando un contacto hace clic en el link de unsubscribe, Resend actualiza automáticamente su campo unsubscribed a true y no le envía más broadcasts. No necesitas implementar esta lógica manualmente.

Listar audiencias

Si tienes múltiples audiencias, puedes listarlas:

typescript
const { data, error } = await resend.audiences.list()
 
data?.data.forEach((audiencia) => {
  console.log(audiencia.id, audiencia.name)
})

Eliminar una audiencia

typescript
const { data, error } = await resend.audiences.remove({
  id: 'aud_xxxx',
})
Eliminar una audiencia es irreversible

Al eliminar una audiencia se eliminan todos sus contactos. No hay forma de recuperarlos. Exporta tus contactos antes de eliminar una audiencia si necesitas conservar la lista.