App generada por IA con backend Supabase
WhatsApp en Lovable: Edge Function de Supabase, Secrets y el prompt correcto
Lovable genera apps a partir de una conversación y, con la integración con Supabase, usa un proyecto tuyo como backend, incluidas las edge functions (funciones de servidor). Según su documentación (leída el 11/11/2026), llamar APIs externas con claves secretas es un uso típico de las edge functions, y los secretos se guardan en Supabase, fuera del código de la app. Ahí es exactamente donde va la clave de ZapZap.
Actualizado el
Por qué conectar
Describes el producto (un agendador, un CRM de leads, un portal de pedidos) y Lovable arma la pantalla. Lo que no debe hacer es llamar a la API de WhatsApp directo desde el navegador, porque la clave quedaría expuesta. La solución es una edge function que recibe el pedido de la app y habla con ZapZap. ZapZap conecta números por un canal no oficial: WhatsApp puede limitar o bloquear cualquier número, así que el ritmo, el consentimiento y el calentamiento importan. Cuesta R$15 por número activo al mes, prepago, sin cobro por mensaje, y empiezas con un crédito de bienvenida al verificar el teléfono, sujeto a la campaña vigente.
Paso a paso
- 1
Conecta Supabase al proyecto
En la documentación de Lovable, la integración con Supabase enlaza un proyecto tuyo como backend y permite desplegar edge functions. Conéctalo antes de pedir cualquier envío de WhatsApp.
- 2
Agrega los tres secrets
En More > Settings > Secrets (o cuando Lovable lo pida por el campo seguro del chat), crea ZAPZAP_API_KEY, ZAPZAP_API_SECRET y ZAPZAP_INSTANCE_ID. La documentación dice que los secrets se inyectan en las edge functions en tiempo de ejecución y nunca llegan al código del frontend ni al navegador. Las claves salen de Settings > API en app.zapzapapi.com.
- 3
Pide la función con un prompt cerrado
Ejemplo: "Crea una edge function send-whatsapp que reciba number y text, valide un número de 10 a 15 dígitos y llame a POST https://api.zapzapapi.com/api/v1/{instanceId}/send/text con las cabeceras x-api-key y x-api-secret leídas de los secrets. No uses la clave en el frontend." Pega el código del ejemplo como referencia.
- 4
Llama a la función desde la app, con usuario autenticado
En el frontend, la app usa el cliente de Supabase para invocar send-whatsapp. Exige login antes: una función abierta que envía mensajes se convierte en un canal de spam con tu número. Limita el tamaño del texto y la frecuencia por usuario.
- 5
Recibe mensajes con otra edge function
Crea una segunda función y registra su URL con PUT /instances/{id}/webhook (webhook_url y events). ZapZap devuelve el secreto whsec_ de la instancia: guárdalo como secret y valida la cabecera X-ZapZap-Signature (t=<unix>,v1=<hmac_hex>, HMAC-SHA256 sobre t + punto + cuerpo bruto, tolerancia de 5 minutos).
- 6
Prueba con tu propio número
Antes de salir con clientes, envíate un mensaje, revisa la respuesta HTTP y mira el log de la función. Usa GET /{instanceId}/instance/status para saber si la instancia está conectada.
Ejemplo
// Supabase Edge Function (Deno): supabase/functions/send-whatsapp/index.ts
// Secrets: ZAPZAP_API_KEY, ZAPZAP_API_SECRET, ZAPZAP_INSTANCE_ID (never in the frontend)
const cors = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Headers": "authorization, x-client-info, apikey, content-type",
};
Deno.serve(async (req: Request) => {
if (req.method === "OPTIONS") return new Response("ok", { headers: cors });
const { number, text } = await req.json();
if (!/^\d{10,15}$/.test(String(number)) || !text) {
return new Response(JSON.stringify({ error: "invalid number or text" }), { status: 400, headers: cors });
}
const r = await fetch("https://api.zapzapapi.com/api/v1/" + Deno.env.get("ZAPZAP_INSTANCE_ID") + "/send/text", {
method: "POST",
headers: {
"Content-Type": "application/json",
"x-api-key": Deno.env.get("ZAPZAP_API_KEY") ?? "",
"x-api-secret": Deno.env.get("ZAPZAP_API_SECRET") ?? "",
},
body: JSON.stringify({ number, text }),
});
return new Response(await r.text(), { status: r.status, headers: { ...cors, "Content-Type": "application/json" } });
});Ilustrativo. Los campos y endpoints exactos están en la documentación.
Qué resuelve Lovable y qué sigue contigo
| Parte | Quién lo hace | Observación |
|---|---|---|
| Pantalla y flujo de la app | Lovable | A partir de tu prompt |
| Edge function y secrets | Lovable + Supabase | Los secrets quedan en Supabase, no en el código (documentación leída el 11/11/2026) |
| Conexión del número por código QR | Tú, en el panel de ZapZap | Una vez por número |
| Ritmo, consentimiento y calentamiento | Tú | Mira la guía de calentamiento de chip |
Preguntas frecuentes
¿Puedo llamar a ZapZap directo desde el frontend de Lovable?
No deberías. La clave y el secreto darían acceso total a tu número si estuvieran en el navegador. Usa una edge function y guarda las claves en Secrets.
¿Dónde quedan los secrets?
En tu proyecto Supabase. La documentación de Lovable (leída el 11/11/2026) dice que no aparecen en el código ni en el repositorio y se inyectan en las edge functions en tiempo de ejecución.
¿Lovable escribe la función solo?
Escribe y publica la función a partir de tu descripción. Revisa el código generado: confirma que usa los secrets, valida el número y exige usuario autenticado.
¿Cómo recibo las respuestas de los clientes?
Con un webhook que apunte a otra edge function. Valida la X-ZapZap-Signature y usa delivery_id para ignorar entregas repetidas.
¿Cuánto cuesta?
Cuesta R$15 por número activo al mes, prepago, sin cobro por mensaje, y empiezas con un crédito de bienvenida al verificar el teléfono, sujeto a la campaña vigente.
Empieza ahora
Crea tu cuenta, conecta un número en minutos y prueba la API con calentamiento y anti-bloqueo. R$15 por número activo/mes, prepago, sin permanencia.
