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. 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. 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. 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. 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. 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. 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

ParteQuién lo haceObservación
Pantalla y flujo de la appLovableA partir de tu prompt
Edge function y secretsLovable + SupabaseLos 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 QRTú, en el panel de ZapZapUna vez por número
Ritmo, consentimiento y calentamientoTú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.