# Next.js: enviar email gratis, SMS y WhatsApp, ¿hay trampa?

> El plan gratis de Resend se para en 100 emails al día y Twilio cobra cada SMS. Un helper de servidor envía email, SMS y WhatsApp desde Next.js, gratis.

Source: https://unlimitedmessaging.app/es/articles/nextjs-transactional-email-sms-free

Guía Next.js

# Email, SMS y WhatsApp desde Next.js,  
_en una sola función de servidor._

Un archivo helper, llamado desde una Server Action o un Route Handler, envía el email de bienvenida, el SMS del pedido o el recordatorio por WhatsApp desde tu buzón, tu móvil y tu número. Sin código SMTP, sin coste por mensaje, y la clave nunca llega al navegador.

[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 Next.js gratis?

Pon un helper solo de servidor en lib/notify.ts que llame a POST /message de Unlimited Messaging y llámalo desde una [Server Action](https://nextjs.org/docs/app/getting-started/mutating-data) o un Route Handler. La misma petición envía el email desde tu buzón, el SMS desde tu móvil Android y el WhatsApp desde tu número, y el plan Free no cobra nada por mensaje.

Lo habitual es un servicio por canal. Nodemailer es gratis pero solo habla SMTP, necesita el runtime de Node.js y te deja con el tope de tu buzón, 500 emails al día en Gmail. Una API de email como Resend es gratis hasta 3.000 emails al mes y 100 al día. El SMS con Twilio se cobra por segmento al acabar la prueba, que solo llega a 5 números verificados. WhatsApp es una cuarta integración.

Next.js ya te da los dos puntos de entrada de servidor que necesitas. Una Server Action gestiona tus formularios (registro, pago), un Route Handler atiende a otros clientes (un cron, un worker, otro servicio). Los dos se ejecutan en el servidor, donde las variables de entorno sin el prefijo NEXT\_PUBLIC\_ quedan fuera del bundle del navegador.

Desde Next.js 15.1, after() es estable: ejecuta código cuando la respuesta ya se ha enviado, así que el usuario nunca espera a que salga un email o un SMS.

Lee también: [el SDK de TypeScript en detalle](https://unlimitedmessaging.app/es/articles/typescript-sdk), y [cómo conectar un buzón de Gmail con una contraseña de aplicación](https://unlimitedmessaging.app/es/articles/gmail-imap-smtp-app-password).

![Ilustración: una petición JSON a POST /message que responde 201, con el titular «Email, SMS y WhatsApp desde Next.js».](https://unlimitedmessaging.app/_next/image?url=%2Fassets%2Farticles%2Fcovers%2Fnextjs-transactional-email-sms-free-es.png&w=3840&q=75)

Definición
Server Action

Una función async marcada con 'use server' que se ejecuta en el servidor y que un formulario o un componente cliente llama con una petición POST. Puede leer variables de entorno que nunca llegan al navegador.

También llamada Server Function. Se puede llamar con un POST directo, así que valida su entrada y la autenticación como cualquier endpoint.

[Fuente: Next.js Docs, Mutating Data↗](https://nextjs.org/docs/app/getting-started/mutating-data)

Paso a paso

## ¿Cómo se añade a una app Next.js, paso a paso?

Cinco pasos, App Router, unos 10 minutos. Necesitas una cuenta gratis de Unlimited Messaging con al menos un canal conectado.

1. 01  
### Guarda la clave en el servidor  
Conecta tu buzón, tu número de WhatsApp o la app Android en Unlimited Messaging, crea una clave API y ponla en .env.local sin el prefijo NEXT\_PUBLIC\_. Next.js solo mete en el bundle del navegador las variables NEXT\_PUBLIC\_; las demás se quedan en el servidor.  
.env.local.env.local  
```  
# .env.local (gitignored by create-next-app)  
# No NEXT_PUBLIC_ prefix: the key stays on the server  
UM_API_KEY=um_live_xxxx  
# Only for the internal route handler of step 4  
INTERNAL_SECRET=change-me-to-a-long-random-string  
```
2. 02  
### Escribe un helper solo de servidor  
lib/notify.ts envuelve POST /message. import 'server-only' hace fallar el build si un componente cliente lo importa, así que la clave no puede filtrarse por error. Quita los canales sin destinatario y marca el mensaje como transaccional.  
lib/notify.tsTypeScript  
```  
// lib/notify.ts  
import 'server-only'; // the build fails if a client component imports this file  
export type Channel = 'EMAIL' | 'WHATSAPP' | 'SMS';  
export async function notify(input: {  
  email?: string;  
  phone?: string; // E.164, e.g. +33612345678  
  channels: Channel[];  
  subject: string;  
  text: string;  
}) {  
  // Drop the channels that have no destination  
  const channels = input.channels  
    .filter((c) => (c === 'EMAIL' ? input.email : input.phone))  
    .map((channel) => ({ channel }));  
  if (channels.length === 0) return null;  
  const res = await fetch('https://api.unlimitedmessaging.app/message', {  
    method: 'POST',  
    headers: {  
      Authorization: `Bearer ${process.env.UM_API_KEY}`,  
      'Content-Type': 'application/json',  
    },  
    body: JSON.stringify({  
      to: { email: input.email, phone: input.phone },  
      channels,  
      subject: input.subject,  
      text: input.text,  
      priority: 'transactional',  
    }),  
  });  
  if (!res.ok) throw new Error(`Unlimited Messaging ${res.status}: ${await res.text()}`);  
  return res.json(); // { dispatchId, messages: [...] }  
}  
```
3. 03  
### Llámalo desde una Server Action  
En el registro, envía el email y el WhatsApp de bienvenida dentro de after(): el formulario responde al instante y el mensaje sale justo después. Una Server Action acepta cualquier POST, así que valida la entrada y limita las peticiones como en un endpoint público.  
app/signup/actions.tsServer Action  
```  
// app/signup/actions.ts  
'use server';  
import { after } from 'next/server';  
import { notify } from '@/lib/notify';  
export async function signUp(formData: FormData) {  
  const email = String(formData.get('email'));  
  const phone = String(formData.get('phone') ?? '') || undefined;  
  // ...validate the input, rate limit, create the user  
  // Runs after the response is sent: the form never waits for the message  
  after(() =>  
    notify({  
      email,  
      phone,  
      channels: ['EMAIL', 'WHATSAPP'],  
      subject: 'Welcome to Acme',  
      text: 'Your account is ready. Reply to this message if you need help.',  
    }).catch(console.error),  
  );  
}  
```
4. 04  
### O desde un Route Handler  
Para clientes fuera de tus formularios, un cron, un worker de cola, otro servicio, expón un Route Handler protegido por un secreto compartido. Aquí envía un email y un SMS desde tu móvil Android.  
app/api/notify/route.tsRoute Handler  
```  
// app/api/notify/route.ts  
import { notify } from '@/lib/notify';  
export async function POST(req: Request) {  
  // For your own jobs and services only, never a public endpoint  
  if (req.headers.get('authorization') !== `Bearer ${process.env.INTERNAL_SECRET}`) {  
    return new Response('Unauthorized', { status: 401 });  
  }  
  const { email, phone, subject, text } = await req.json();  
  const result = await notify({ email, phone, channels: ['EMAIL', 'SMS'], subject, text });  
  return Response.json(result);  
}  
```
5. 05  
### Pruébalo  
Arranca next dev y llama a la ruta. La respuesta lista un mensaje por canal con su propio estado, agrupados por un dispatchId, y los mensajes aparecen en tu bandeja de Unlimited Messaging.  
Terminalcurl  
```  
curl -X POST http://localhost:3000/api/notify \  
  -H "Authorization: Bearer $INTERNAL_SECRET" \  
  -H "Content-Type: application/json" \  
  -d '{"email":"lea@example.com","phone":"+33612345678",  
       "subject":"Order #1042 shipped","text":"Your order #1042 is on its way."}'  
```

Vibe coding

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

El prompt le da a tu editor de IA el patrón seguro: un helper solo de servidor, la clave fuera de NEXT\_PUBLIC\_, after() para la velocidad. Te pide tus contactos de prueba antes de enviar nada.

Prompt para copiar

Añade el envío de mensajes transaccionales a este proyecto Next.js (App Router) con Unlimited Messaging: email, SMS y WhatsApp enviados desde mis propias cuentas.

1. Añade UM_API_KEY a .env.local y .env.example. No uses nunca un prefijo NEXT_PUBLIC_ y no leas nunca la clave en un componente cliente.
2. Crea lib/notify.ts empezando por import 'server-only'. Exporta notify({ email, phone, channels, subject, text }) que 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' | 'WHATSAPP' | 'SMS' }], subject, text, priority: 'transactional' }. Omite los canales sin destinatario; los números van en formato E.164.
3. Llama a notify desde mi Server Action de registro dentro de after() de next/server, para que el formulario no espere. Valida la entrada y mantén las comprobaciones de autenticación existentes.
4. Añade un Route Handler app/api/notify/route.ts protegido con Authorization: Bearer INTERNAL_SECRET para mis crons.
5. Referencia de la API: https://docs.unlimitedmessaging.app. Creo la clave API en https://app.unlimitedmessaging.app.

Enséñame el diff y pregúntame mi email y mi número de prueba antes de enviar nada.

Las opciones

## Nodemailer, Resend, Twilio o una sola API: ¿qué encaja con Next.js?

Cuatro formas habituales de enviar mensajes transaccionales desde Next.js, comparadas por lo que envían, lo que es gratis y lo que mantienes.

__Nodemailer, Resend, Twilio o una sola API: ¿qué encaja con Next.js?__
| [Nodemailer + Gmail](https://nodemailer.com)Librería SMTP | [Resend](https://resend.com/pricing)API de email  | [Twilio](https://www.twilio.com/en-us/sms/pricing)API de SMS y WhatsApp | Unlimited MessagingEmail, WhatsApp y SMS                  |                                                       |
| --------------------------------------------------------- | ------------------------------------------------- | ----------------------------------------------------------------------- | --------------------------------------------------------- | ----------------------------------------------------- |
| Canales                                                   | Email                                             | Email                                                                   | SMS y WhatsApp, cobrados por mensaje                      | Email, WhatsApp y SMS en una petición                 |
| Gratis                                                    | Librería gratis, Gmail limita a 500 emails al día | 3.000 emails al mes, 100 al día                                         | Prueba: hasta 5 números verificados                       | Plan Free sin coste por mensaje                       |
| Runtime                                                   | Solo Node.js (sockets SMTP)                       | Cualquier runtime (HTTP)                                                | Cualquier runtime (HTTP)                                  | Cualquier runtime (HTTP)                              |
| Remitente                                                 | Tu buzón                                          | 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     |
| Qué mantienes                                             | Ajustes SMTP, errores, reintentos                 | Un SDK, registros DNS                                                   | Un SDK por producto, plantillas de Meta para WhatsApp     | Un solo fetch para todos los canales                  |
| Ideal para                                                | Unos pocos emails desde tu buzón                  | 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 nodemailer.com, resend.com/pricing, la documentación de prueba de Twilio y la ayuda de Gmail (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 y el código SMTP. No quita la seguridad, las reglas de WhatsApp ni el ritmo de un móvil.

1. 01  
### Una acción pública se puede abusar  
Una acción de registro que envía mensajes permite a cualquiera disparar un WhatsApp o un SMS a cualquier número. Añade un captcha o un límite de peticiones, y escribe a un número solo cuando sea de fiar.
2. 02  
### 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. Los mensajes que el usuario pidió son de bajo riesgo; los envíos masivos a desconocidos pueden hacer que bloqueen el número. Usa WhatsApp para lo transaccional.
3. 03  
### El SMS va al ritmo de un móvil  
Los SMS salen de la SIM de tu móvil Android, 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, y el móvil tiene que estar encendido.
4. 04  
### 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, usa un servicio de email masivo.
5. 05  
### 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.
6. 06  
### after() no es una cola  
Si la llamada falla después de enviar la respuesta, nada la reintenta. Para un recibo que no puedes perder, guarda la tarea en tu base de datos o en una cola y reintenta desde ahí.

Cuándo elegir otra cosa

### ¿Gran volumen, paneles de entregabilidad, WhatsApp oficial?

Si envías decenas de miles de emails al mes y necesitas estadísticas de entregabilidad, Resend o Postmark están hechos para eso. Para la plataforma oficial WhatsApp Business de Meta o números cortos, usa Twilio. Unlimited Messaging encaja con un SaaS en Next.js que envía registros, pedidos y recordatorios desde sus propias cuentas, gratis mientras prueba y crece.

FAQ

## Preguntas sobre enviar mensajes desde Next.js

Llama a una API de email desde código de servidor, una Server Action o un Route Handler. Con Unlimited Messaging, el email sale de tu propio buzón (Gmail, tu dominio) sin coste por mensaje en el plan Free. Nodemailer también es gratis, pero solo email y solo en el runtime de Node.js.

Una API HTTP: funciona en todos los runtimes, Edge incluido, sin código SMTP. Con Unlimited Messaging, la misma llamada envía también SMS y WhatsApp.

Envía POST /message con el canal SMS desde un Route Handler o una Server Action. El SMS sale de la SIM de tu móvil Android a través de la app gratuita, con tu tarifa.

Una Server Action para tus propios formularios y botones, un Route Handler para todo lo demás que llame a tu app por HTTP (crons, webhooks, otro servicio). Los dos pueden llamar al mismo lib/notify.ts.

En .env.local en local y en las variables de entorno de tu hosting en producción, sin el prefijo NEXT\_PUBLIC\_. Léela solo en código de servidor; import 'server-only' protege el helper.

Sí, es una petición HTTPS normal. after() funciona en Vercel, en un servidor Node.js y en Docker. Un export estático no tiene servidor, así que no puede enviar.

Sí: npm i @unlimited-messaging/sdk, luego new UnlimitedMessagingApiClient({ token }) y client.messages.messageSend(...). Esta guía usa fetch para que el ejemplo no tenga dependencias.

Fuentes

## Fuentes y referencias

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

1. [01Mutating Data (Server Functions y Server Actions)↗Next.js Docs](https://nextjs.org/docs/app/getting-started/mutating-data)
2. [02after (estable desde la v15.1.0)↗Next.js Docs](https://nextjs.org/docs/app/api-reference/functions/after)
3. [03How to use environment variables in Next.js↗Next.js Docs](https://nextjs.org/docs/app/guides/environment-variables)
4. [04Server and Client Components (server-only)↗Next.js Docs](https://nextjs.org/docs/app/getting-started/server-and-client-components)
5. [05Nodemailer↗nodemailer.com](https://nodemailer.com)
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. [08Límites de envío y recepción (500 emails al día)↗Ayuda de Gmail](https://support.google.com/mail/answer/22839?hl=es)
9. [09SmsUsageMonitor (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)
10. [10Referencia 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)

## Añade hoy email, SMS y WhatsApp a tu app Next.js.

Crea una cuenta gratis, conecta un buzón, un número de WhatsApp o un móvil Android y pega el helper. Sin tarjeta, sin coste por mensaje.

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

Artículos similares
* [![](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)
* [![](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)
