# Supabase: enviar email, SMS y WhatsApp gratis, en una función

> El email por defecto de Supabase envía 2 mensajes por hora, solo a tu equipo. Una Edge Function al insertar envía email, WhatsApp y SMS gratis. Con código.

Source: https://unlimitedmessaging.app/es/articles/supabase-whatsapp-email-sms-notifications

Guía Supabase

# Una fila nueva en Supabase,  
_sale un email y un WhatsApp._

Un database webhook llama a una Edge Function en cada insert, la función hace una llamada API y el mensaje de bienvenida o de pedido sale de tu buzón, de tu número de WhatsApp o de tu móvil Android. Gratis, con el código y un prompt para tu editor de IA.

[Obtener una clave API gratis](https://app.unlimitedmessaging.app)[Ver la API](https://unlimitedmessaging.app/es/api)

La respuesta corta

## ¿Cómo enviar email, SMS y WhatsApp desde Supabase?

Crea un database webhook en tu tabla (profiles, orders) que llame a una Edge Function de Supabase en cada INSERT. La función lee la fila nueva y hace una petición POST /message a Unlimited Messaging, que envía el email desde tu buzón, el WhatsApp desde tu número y el SMS desde tu móvil Android. Los [database webhooks](https://supabase.com/docs/guides/database/webhooks) usan pg\_net, así que el insert nunca espera al mensaje.

Supabase no tiene una API para los mensajes que envía tu aplicación. Su servicio de email integrado sirve para los emails de Auth: envía 2 mensajes por hora, solo a direcciones del equipo del proyecto, y Supabase indica que no está pensado para producción. Un email de bienvenida, una confirmación de pedido o un WhatsApp al cliente te toca enviarlos a ti.

Una Edge Function es el lugar adecuado: se ejecuta en el servidor, lee los secretos con Deno.env.get y el plan Free de Supabase incluye 500.000 invocaciones. Lo habitual es un proveedor por canal, una API de email, Twilio para SMS, la Cloud API de Meta para WhatsApp: tres claves, tres facturas. Aquí una sola petición cubre los tres canales, y el plan Free de Unlimited Messaging no cobra por mensaje.

Esta guía cubre los mensajes que envía tu aplicación. Los emails de Auth (confirmación de registro, magic link, restablecer contraseña) y el OTP por teléfono siguen en los ajustes de Supabase Auth, donde conectas un servidor SMTP o un proveedor de SMS.

Lee también: [email y WhatsApp en una sola petición API](https://unlimitedmessaging.app/es/articles/email-whatsapp-single-api-request), y [la API de SMS gratis que envía desde tu propio móvil](https://unlimitedmessaging.app/es/articles/free-sms-api).

![Ilustración: nodos de automatización que unen un disparador con un mensaje y un correo, con el titular «Una fila en Supabase, un mensaje enviado».](https://unlimitedmessaging.app/_next/image?url=%2Fassets%2Farticles%2Fcovers%2Fsupabase-whatsapp-email-sms-notifications-es.png&w=3840&q=75)

Definición
Database webhook de Supabase

Un trigger que envía una petición HTTP mediante la extensión pg\_net tras un INSERT, UPDATE o DELETE en una tabla. El JSON incluye type, table, schema, record y old\_record.

Se suele combinar con una Edge Function para enviar un email o un SMS cuando se inserta una fila.

[Fuente: Supabase Docs, Database Webhooks↗](https://supabase.com/docs/guides/database/webhooks)

Paso a paso

## ¿Cómo se monta, paso a paso?

Cinco pasos, unos 15 minutos. Necesitas un proyecto de Supabase, la CLI de Supabase y una cuenta gratis de Unlimited Messaging.

1. 01  
### Conecta tus canales y crea una clave API  
En la app de Unlimited Messaging, vincula tu número de WhatsApp con un código QR, conecta tu buzón por IMAP/SMTP (sirve una contraseña de aplicación de Gmail) y, para SMS, inicia sesión en la app Android gratuita en un móvil con SIM. Conecta solo los canales que uses y crea una clave API.  
supabase/functions/.env.env  
```  
# supabase/functions/.env (gitignored, local only)  
# Created at app.unlimitedmessaging.app > API keys  
UM_API_KEY=um_live_xxxx  
# Any long random string, shared with the database webhook  
WEBHOOK_SECRET=change-me-to-a-long-random-string  
```
2. 02  
### Crea la función y guarda los secretos  
Crea la función con la CLI y sube los dos secretos a tu proyecto. Solo viven en el entorno de la función: nunca pongas la clave API en una variable VITE\_ o NEXT\_PUBLIC\_, ni en ningún código del frontend.  
TerminalSupabase CLI  
```  
supabase functions new notify-signup  
# Push the secrets to your project (never to the frontend)  
supabase secrets set --env-file supabase/functions/.env  
supabase secrets list  
```
3. 03  
### Escribe la función  
La función comprueba el secreto compartido, lee la fila insertada, envía el email siempre y el WhatsApp solo si la fila tiene número. priority: transactional pone el mensaje por delante de cualquier envío masivo que espere en tu cola.  
notify-signup/index.tsDeno / TypeScript  
```  
// supabase/functions/notify-signup/index.ts  
type Profile = { id: string; email: string; phone: string | null; full_name: string | null };  
type WebhookPayload = {  
  type: 'INSERT' | 'UPDATE' | 'DELETE';  
  table: string;  
  schema: string;  
  record: Profile;  
  old_record: Profile | null;  
};  
Deno.serve(async (req) => {  
  // The database webhook sends this header; nobody else knows it  
  if (req.headers.get('x-webhook-secret') !== Deno.env.get('WEBHOOK_SECRET')) {  
    return new Response('Unauthorized', { status: 401 });  
  }  
  const { record } = (await req.json()) as WebhookPayload;  
  const name = record.full_name ?? 'there';  
  // Email always, WhatsApp when the row has a phone (E.164: +33612345678).  
  // Use { channel: 'SMS' } instead for people who are not on WhatsApp.  
  const channels: Array<{ channel: 'EMAIL' | 'WHATSAPP' | 'SMS' }> = [{ channel: 'EMAIL' }];  
  if (record.phone) channels.push({ channel: 'WHATSAPP' });  
  const res = await fetch('https://api.unlimitedmessaging.app/message', {  
    method: 'POST',  
    headers: {  
      Authorization: `Bearer ${Deno.env.get('UM_API_KEY')}`,  
      'Content-Type': 'application/json',  
    },  
    body: JSON.stringify({  
      to: { email: record.email, phone: record.phone ?? undefined },  
      channels,  
      subject: 'Welcome aboard',  
      text: `Hi ${name}, your account is ready. Reply to this message if you need anything.`,  
      priority: 'transactional',  
    }),  
  });  
  if (!res.ok) console.error('Unlimited Messaging', res.status, await res.text());  
  return new Response(null, { status: res.ok ? 200 : 502 });  
});  
```
4. 04  
### Despliégala, protegida por tu propio secreto  
Un database webhook no envía un JWT de usuario: desactiva la verificación de la plataforma solo para esta función (--no-verify-jwt, o verify\_jwt = false en config.toml). La cabecera x-webhook-secret que comprueba la función deja fuera a los desconocidos.  
TerminalSupabase CLI  
```  
# A database webhook sends no user JWT: turn the platform check off  
# for this function only, the x-webhook-secret header protects it  
supabase functions deploy notify-signup --no-verify-jwt  
# Or keep it in supabase/config.toml:  
# [functions.notify-signup]  
# verify_jwt = false  
```
5. 05  
### Crea el database webhook  
En el dashboard, Database > Webhooks: elige la tabla (aquí profiles), el evento Insert, el tipo Supabase Edge Functions y la función notify-signup, y añade una cabecera x-webhook-secret con el mismo valor. Inserta una fila de prueba: este es el cuerpo que recibe la función.  
Cuerpo del POSTWebhook payload  
```  
{  
  "type": "INSERT",  
  "table": "profiles",  
  "schema": "public",  
  "record": {  
    "id": "8f1c2d3e-0000-4000-8000-000000000000",  
    "email": "lea@example.com",  
    "phone": "+33612345678",  
    "full_name": "Lea"  
  },  
  "old_record": null  
}  
```

Vibe coding

## ¿Programas con Lovable, Cursor o Claude Code? Pega este prompt

El prompt le da a tu editor de IA el patrón exacto: una Edge Function, los secretos en Supabase, una llamada REST. Te pregunta antes de enviar nada de verdad.

Prompt para copiar

Añade notificaciones transaccionales a este proyecto de Supabase con Unlimited Messaging (email, WhatsApp y SMS enviados desde mis propias cuentas).

1. Crea una Edge Function de Supabase llamada notify-signup. Lee UM_API_KEY y WEBHOOK_SECRET con Deno.env.get. Nunca pongas la clave en el código del frontend ni en una variable VITE_ / NEXT_PUBLIC_.
2. La función recibe el payload de un database webhook de Supabase { type, table, schema, record, old_record }. Devuelve 401 si la cabecera x-webhook-secret no es igual a WEBHOOK_SECRET.
3. Envía un POST https://api.unlimitedmessaging.app/message con la cabecera Authorization: Bearer UM_API_KEY y el JSON { to: { email, phone }, channels: [{ channel: 'EMAIL' }, { channel: 'WHATSAPP' }], subject, text, priority: 'transactional' }. Añade WHATSAPP (o SMS) solo si la fila tiene un número en formato E.164.
4. Dame los comandos: supabase secrets set, supabase functions deploy notify-signup --no-verify-jwt, y cómo crear el database webhook en el INSERT de mi tabla con la cabecera x-webhook-secret.
5. Referencia de la API: https://docs.unlimitedmessaging.app. Creo la clave API en https://app.unlimitedmessaging.app.

Pregúntame qué tabla y qué texto de mensaje usar antes de escribir el código.

Las opciones

## ¿Qué opción para enviar mensajes desde Supabase?

Cuatro formas de enviar una notificación cuando llega una fila a tu base de datos, del servicio integrado a una sola API para todos los canales.

__¿Qué opción para enviar mensajes desde Supabase?__
| [Email integrado de Supabase](https://supabase.com/docs/guides/auth/auth-smtp)Solo emails de Auth | [Resend desde una función](https://resend.com/pricing)API de email | [Twilio desde una función](https://www.twilio.com/en-us/sms/pricing)API de SMS y WhatsApp | Unlimited MessagingEmail, WhatsApp y SMS                    |                                                       |
| ------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------- | ----------------------------------------------------- |
| Canales                                                                                           | Solo emails de Auth                                                | Email                                                                                     | SMS y WhatsApp, cobrados por mensaje                        | Email, WhatsApp y SMS en una petición                 |
| Gratis                                                                                            | 2 emails por hora, solo direcciones del equipo                     | 3.000 emails al mes, 100 al día                                                           | Prueba: hasta 5 números verificados                         | Plan Free sin coste por mensaje                       |
| Remitente                                                                                         | La dirección de Supabase                                           | Tu dominio verificado                                                                     | Un número de Twilio o un remitente de WhatsApp registrado   | Tu propio buzón, tu número de WhatsApp y tu móvil     |
| Mensajes de WhatsApp                                                                              | No                                                                 | No                                                                                        | Plantillas aprobadas por Meta para iniciar una conversación | Texto libre desde tu número vinculado                 |
| Configuración                                                                                     | Ninguna                                                            | Registros DNS de tu dominio                                                               | Cuenta, número, registro del remitente de WhatsApp          | Código QR, acceso IMAP/SMTP, app Android              |
| Ideal para                                                                                        | Probar los flujos de Auth                                          | Email en gran volumen                                                                     | SMS en volumen, WhatsApp oficial                            | Mensajes de una app uno a uno, gratis mientras creces |

Comprobado el 9 de noviembre de 2026 en supabase.com, resend.com/pricing y la documentación de prueba de Twilio (enlaces en las fuentes). Los planes gratis cambian: sigue los enlaces antes de construir sobre uno.

La letra pequeña

## ¿Cuáles son los límites?

Gratis quita la factura por mensaje. No quita las reglas de WhatsApp, de tu móvil ni de tu buzón.

1. 01  
### WhatsApp es no oficial, y el spam hace que bloqueen números  
Tu número se vincula como un dispositivo, fuera de la plataforma Business de Meta. Escribir a clientes registrados que esperan el mensaje es de bajo riesgo; los envíos masivos a desconocidos pueden hacer que bloqueen el número. Usa WhatsApp para mensajes transaccionales.
2. 02  
### El SMS necesita un móvil Android encendido  
Los SMS salen de la SIM del móvil, con tu tarifa. Android pide confirmación a partir de 30 SMS en 30 minutos, así que la app espacia los envíos a unos 30 cada 30 minutos: bien para registros y pedidos, no para un envío masivo el día del lanzamiento.
3. 03  
### El email sigue los límites de tu buzón  
Los emails salen de tu buzón por SMTP, así que se aplica su tope diario: 500 al día en una cuenta de Gmail. Para newsletters a miles de personas, usa un servicio de email masivo.
4. 04  
### Los mensajes del plan Free llevan una firma  
En el plan Free, los mensajes terminan con una línea corta "Sent with UnlimitedMessaging.app", y los archivos multimedia y los webhooks son de pago. Medium y Max quitan la línea.
5. 05  
### El insert no espera al mensaje  
pg\_net envía la petición de forma asíncrona: una función que falla nunca deshace el insert. Registra la respuesta de la API en la función y vigila sus logs.
6. 06  
### La clave se queda en el servidor  
Cualquiera que abra tu bundle del frontend puede reutilizar una clave que esté ahí. La clave va en los secretos de la Edge Function, y el secreto del webhook impide que desconocidos llamen a tu función.

Cuándo elegir otra cosa

### ¿Miles de emails al día, o WhatsApp oficial?

Para newsletters o email en gran volumen, encaja mejor una API de email dedicada como Resend o SendGrid. Para la plataforma oficial WhatsApp Business de Meta, usa la Cloud API o un proveedor como Twilio. Unlimited Messaging encaja con los mensajes que un SaaS envía uno a uno, bienvenida, pedido, recordatorio, alerta, desde tus propias cuentas, gratis mientras pruebas y creces.

FAQ

## Preguntas sobre enviar mensajes desde Supabase

Solo los emails de Auth. El servicio integrado envía 2 emails por hora, solo a miembros del equipo del proyecto, y no está pensado para producción. Para los emails de tu app, llama a una API de email desde una Edge Function disparada por un database webhook.

Desde una Edge Function, con fetch. Con Unlimited Messaging, POST /message con el canal SMS envía desde la SIM de tu móvil Android, sin coste por SMS de nuestra parte; el móvil tiene que estar encendido y conectado.

Crea un database webhook en INSERT que llame a una Edge Function y envía POST /message con el canal WHATSAPP y el número de la fila nueva, en formato E.164 (+34612345678).

Las dos cosas: el database webhook es el disparador, la Edge Function guarda el código y el secreto. También puedes llamar a la función desde tu app justo después de un registro, o llamar a la API desde cualquier otro código de servidor.

El plan Free de Unlimited Messaging es permanente, sin tarjeta y sin coste por mensaje en ningún canal; los mensajes llevan una firma corta. El plan Free de Supabase incluye 500.000 invocaciones de Edge Functions. Los SMS cuentan en tu tarifa móvil.

Sí, si el proyecto usa Supabase. Pega el prompt de arriba y comprueba que el editor guarda la clave como secreto de Supabase, no en el frontend.

En código Node.js, sí: npm i @unlimited-messaging/sdk te da un cliente tipado. En una Edge Function de Deno, un fetch simple basta, sin ninguna dependencia.

Fuentes

## Fuentes y referencias

Para verificar por ti mismo la información de este artículo:

1. [01Database Webhooks↗Supabase Docs](https://supabase.com/docs/guides/database/webhooks)
2. [02Managing secrets (environment variables) for Edge Functions↗Supabase Docs](https://supabase.com/docs/guides/functions/secrets)
3. [03Function configuration (verify\_jwt)↗Supabase Docs](https://supabase.com/docs/guides/functions/function-configuration)
4. [04Send emails with custom SMTP (límite integrado: 2 mensajes por hora)↗Supabase Docs](https://supabase.com/docs/guides/auth/auth-smtp)
5. [05Pricing (500.000 invocaciones de Edge Functions en Free)↗Supabase](https://supabase.com/pricing)
6. [06Pricing (Free: 3.000 emails al mes, 100 al día)↗Resend](https://resend.com/pricing)
7. [07How to use your free trial account (Messaging)↗Twilio Docs](https://www.twilio.com/docs/messaging/guides/how-to-use-your-free-trial-account)
8. [08Message templates↗Meta for Developers](https://developers.facebook.com/docs/whatsapp/business-management-api/message-templates)
9. [09Límites de envío y recepción (500 emails al día)↗Ayuda de Gmail](https://support.google.com/mail/answer/22839?hl=es)
10. [10SmsUsageMonitor (umbral de 30 SMS en 30 minutos)↗Android Open Source Project](https://android.googlesource.com/platform/frameworks/opt/telephony/+/refs/heads/main/src/java/com/android/internal/telephony/SmsUsageMonitor.java)
11. [11Referencia de la API: POST /message↗Unlimited Messaging Docs](https://docs.unlimitedmessaging.app)

![Ilian, ingeniero de software senior](https://ilianazz.com/images/iliazz.png)

Escrito por

[Ilian](https://unlimitedmessaging.app/es/authors/ilian) · Ingeniero de software senior

Ingeniero de software senior, funda y dirige varias empresas tecnológicas. Diseña productos en torno a las API de mensajería, la automatización y la integración de la IA, y comparte aquí lo que aprende construyendo.

[Ver el perfil de LinkedIn↗](https://www.linkedin.com/in/ilianAzz/)Actualizado el 9 de noviembre de 2026

![](https://unlimitedmessaging.app/assets/logos/whatsapp.svg)![](https://unlimitedmessaging.app/assets/logos/email.svg)![](https://unlimitedmessaging.app/assets/logos/sms.svg)

## Envía hoy tu primera notificación desde Supabase.

Crea una cuenta gratis, conecta un buzón o un número de WhatsApp y pega la función. Sin tarjeta, sin coste por mensaje.

[Empezar gratis→](https://app.unlimitedmessaging.app)

Artículos similares
* [![](https://unlimitedmessaging.app/_next/image?url=%2Fassets%2Farticles%2Fcovers%2Femail-whatsapp-single-api-request-es.png&w=3840&q=75)Una petición API, dos canales: email y WhatsApp a la vezEnvía el mismo mensaje por WhatsApp y por email en una llamada, desde tu número y tu buzón, gratis en todos los planes.](https://unlimitedmessaging.app/es/articles/email-whatsapp-single-api-request)
* [![](https://unlimitedmessaging.app/_next/image?url=%2Fassets%2Farticles%2Fcovers%2Ffree-sms-api-es.png&w=3840&q=75)API SMS gratis: lo que es gratis, y lo que solo es una pruebaFreePrueba de Twilio, clave gratuita de Textbelt y pasarelas Android que envían con tu tarifa: la comparativa honesta.](https://unlimitedmessaging.app/es/articles/free-sms-api)
* [![](https://unlimitedmessaging.app/_next/image?url=%2Fassets%2Farticles%2Fcovers%2Ftypescript-sdk-es.png&w=3840&q=75)Envía WhatsApp desde Node.js con un SDK tipadoPaquete npm completamente tipado para Node.js, Next.js y cualquier entorno JS.](https://unlimitedmessaging.app/es/articles/typescript-sdk)
