De agencia a proveedor de tecnología WhatsApp: cómo implementar Embedded Signup con Coexistence
Guía técnica para convertirse en proveedor verificado por Meta, implementar Embedded Signup en Astro y activar WhatsApp Coexistence para múltiples clientes.
Antonio Soler
imorillas — Consultoría Tecnológica, Almería
De agencia a proveedor de tecnología WhatsApp: cómo implementar Embedded Signup con Coexistence
Por Antonio José Soler Morillas · Imorillas · Junio 2026
El primer artículo de esta serie explicaba cómo conectar un chatbot de IA con la WhatsApp Business API para un negocio concreto. Este segundo capítulo da un paso más: convertir ese trabajo puntual en un servicio replicable, donde puedas incorporar nuevos clientes de forma autónoma sin depender de Meta para cada alta.
El camino pasa por tres cosas: convertirte en proveedor de tecnología verificado por Meta, implementar el flujo de Embedded Signup en tu propia web, y activar WhatsApp Coexistence para que los negocios mantengan su número y su app mientras añaden automatización.
El problema que resuelve este artículo
Cuando configuras WhatsApp Cloud API para un cliente, el proceso manual es largo: crear la WABA, registrar el número, verificarlo, configurar el webhook, generar el token permanente. Si vas a hacer esto para diez clientes, necesitas automatizarlo.
La solución de Meta se llama Embedded Signup: un flujo OAuth que puedes incrustar en tu web y que permite a un cliente conectar su número de WhatsApp a tu plataforma en pocos minutos, sin intervención técnica por tu parte.
Pero para poder lanzar ese flujo, Meta primero necesita verificarte como proveedor de tecnología. Eso requiere un proceso de revisión que vamos a documentar aquí paso a paso.
Arquitectura del sistema de onboarding
Antes de entrar en los pasos, la imagen completa:
imorillas.com/whatsapp-onboarding
↓ clic en botón
SDK de Facebook (popup)
↓ cliente completa el flujo
Meta devuelve un code
↓
whatsapp-callback.php
↓ intercambia code por token
↓ obtiene WABA ID + Phone Number ID
↓ guarda JSON del cliente
↓ envía email de notificación
Página de confirmación al cliente
Con Coexistence activado, el cliente mantiene su app de WhatsApp Business en el móvil mientras el número queda conectado a la Cloud API simultáneamente.
Parte 1: La página de onboarding
Estructura del proyecto
El proyecto imorillas.com está construido en Astro + Tailwind, desplegado en Plesk vía GitHub. La página de onboarding se crea como una ruta estática:
src/pages/whatsapp-onboarding.astro → /whatsapp-onboarding
public/whatsapp-callback.php → /whatsapp-callback.php
public/whatsapp-clients/.htaccess → bloqueado al acceso web
Variables de entorno
El sistema usa cuatro variables. Las dos primeras se compilan en el build de Astro (son públicas por diseño); las dos últimas solo viven en el servidor:
# Compiladas en build (públicas — no son secretos)
IMORILLAS_META_APP_ID=tu_app_id
IMORILLAS_WA_CONFIG_ID=tu_config_id
# Solo en servidor (nunca en repositorio)
IMORILLAS_META_APP_SECRET=tu_app_secret
IMORILLAS_WA_SOLUTION_ID=opcional
Truco importante: Astro lee las variables en tiempo de build, no en tiempo de ejecución. Si el .env está en el servidor pero el build se ejecuta en tu máquina local, las variables del servidor no llegan al HTML generado. La solución es tener el .env también en local para las variables públicas, y reservar el .env del servidor solo para los secretos que usa el PHP en tiempo de ejecución.
El botón y el SDK de Facebook
El SDK de Facebook se carga de forma asíncrona y el botón lanza el popup de Embedded Signup:
FB.login(function(response) {
if (response.authResponse && response.authResponse.code) {
window.location.href = '/whatsapp-callback.php?code=' + response.authResponse.code;
}
}, {
config_id: 'TU_CONFIG_ID',
response_type: 'code',
override_default_response_type: true,
extras: {
setup: {} // aquí va el solutionID si lo tienes
}
});
El parámetro config_id es el identificador de la configuración de Embedded Signup que creas en Meta Business Manager. Sin él, el popup no sabe qué permisos solicitar ni a qué WABA asociar el número.
El callback PHP
Cuando el cliente completa el flujo, Meta redirige a tu callback con un code temporal. El PHP hace tres cosas:
1. Intercambiar el code por un token:
POST https://graph.facebook.com/v19.0/oauth/access_token
client_id=TU_APP_ID
client_secret=TU_APP_SECRET
code=el_code_recibido
2. Obtener los IDs del cliente (WABA ID y Phone Number ID) usando el token.
3. Guardar el resultado en un JSON fuera del webroot:
{
"timestamp": "2026-06-03T10:30:00",
"waba_id": "123456789",
"phone_number_id": "987654321",
"access_token": "EAAI...",
"status": "pending_config"
}
Sobre la persistencia: los archivos en dist/ se borran en cada deploy de Astro. Los JSON de clientes deben guardarse fuera de dist/, en una ruta que sobreviva los deploys — por ejemplo httpdocs/whatsapp-clients/ — bloqueada con .htaccess:
Require all denied
Options -Indexes
Parte 2: Configurar el Embedded Signup en Meta
Crear la configuración
En Meta for Developers → Tu App → Casos de uso → Conectar en WhatsApp → Creador de registro insertado, creas una nueva configuración que define:
- Qué permisos se solicitan al cliente
- Qué tipo de acceso se genera (token de usuario del sistema permanente)
- La versión del flujo (v4 es la actual)
Meta genera un config_id que usas en el FB.login(). Sin este ID, el botón no funciona.
Habilitar el SDK de JavaScript
En Inicio de sesión con Facebook → Configuración, activa “Inicio de sesión con el SDK de JavaScript” e introduce tu dominio. Sin esto, el popup devuelve un error de JSSDK no activado.
También necesitas añadir tu callback URL como URI de redireccionamiento OAuth válido:
https://tudominio.com/whatsapp-callback.php
Parte 3: Convertirse en proveedor de tecnología
Este es el requisito que desbloquea todo. Sin el acceso avanzado de proveedor de tecnología, Meta muestra este error al intentar incorporar un cliente:
“[Tu empresa] no puede incorporar clientes actualmente.”
El proceso tiene dos etapas:
Etapa 1: Verificación de empresa
Ya la tenías completada del proceso anterior. Meta verifica que eres una empresa real con CIF, dirección y actividad legítima.
Etapa 2: Revisión de la aplicación para acceso avanzado
Necesitas acceso avanzado a dos permisos:
| Permiso | Para qué sirve |
|---|---|
whatsapp_business_messaging (avanzado) | Enviar mensajes a cualquier usuario, no solo testers |
whatsapp_business_management (avanzado) | Gestionar WABAs y plantillas de clientes |
Para cada permiso Meta pide:
a) Descripción de uso:
Explica concretamente qué hace tu aplicación con ese permiso. Sin tecnicismos, sin texto generado por IA (Meta los detecta y puede rechazar la solicitud). Ejemplo para whatsapp_business_management:
“We use whatsapp_business_management to onboard new clients onto our WhatsApp chatbot service. This includes creating and managing WhatsApp Business Accounts for our clients, registering their phone numbers, and creating message templates for automated notifications.”
b) Vídeo de demostración:
Para whatsapp_business_messaging: muestra un mensaje enviado desde tu app llegando a un teléfono real con WhatsApp.
Para whatsapp_business_management: muestra el proceso de creación de una plantilla de mensaje desde tu cuenta de Meta.
Los vídeos deben grabarse en primera persona, mostrando claramente la interfaz. Loom funciona bien para esto.
c) Llamadas de prueba a la API:
Meta requiere llamadas reales registradas antes de aprobar. Para whatsapp_business_management, una llamada a la API de plantillas cuenta:
GET https://graph.facebook.com/v19.0/TU_WABA_ID/message_templates
?access_token=TU_TOKEN_PERMANENTE
Desde el navegador es suficiente — pega la URL con el token en la barra de direcciones de Chrome. Importante: Meta puede tardar hasta 24 horas en registrar las llamadas. Si aparece “llamadas pendientes” en el panel, guarda y vuelve al día siguiente.
Parte 4: WhatsApp Coexistence
Qué es y por qué importa
Históricamente, registrar un número en la Cloud API lo desconectaba de la app de WhatsApp Business. El negocio tenía que elegir: automatización o uso manual. Desde mayo de 2025, Meta permite ambas cosas simultáneamente con Coexistence.
Con Coexistence activado:
- Los mensajes se sincronizan en tiempo real entre la app y la API
- El negocio sigue usando WhatsApp Web en el ordenador de la oficina
- El bot responde automáticamente desde la Cloud API con el mismo número
- El historial y los contactos se conservan
Lo que no funciona en modo Coexistence:
- Mensajes temporales (disappearing messages)
- Ubicación en tiempo real
- Mensajes de visualización única
- Chats de grupo (no se sincronizan)
Cómo se activa
Coexistence se activa durante el proceso de Embedded Signup. En la primera pantalla del popup, el cliente debe seleccionar “Connect a WhatsApp Business App” en vez de crear un número nuevo. Esta opción solo aparece si:
- Tu app tiene el acceso avanzado de proveedor de tecnología aprobado
- El número ya está activo en la WhatsApp Business App del móvil
- La versión de la app es 2.24.17 o superior
Resumen del proceso completo
Día 1-2: Crear página de onboarding en tu web
Configurar Embedded Signup en Meta
Habilitar SDK de JavaScript
Día 3: Iniciar revisión de la aplicación en Meta
Subir vídeos de demostración
Realizar llamadas de prueba a la API
Día 4-7: Esperar aprobación de Meta (24h-5 días laborables)
Aprobado: Activar config_id en el .env
Probar el flujo completo con un número real
Primer cliente incorporado con Coexistence
Lecciones aprendidas
Las variables de entorno en Astro: distingue entre las que necesitas en build time (públicas, van en el .env local) y las que necesitas en runtime (secretos del servidor, solo en Plesk).
Los archivos de clientes fuera de dist/: cualquier archivo que deba persistir entre deploys no puede vivir en dist/. Guárdalos en httpdocs/ directamente, fuera del webroot de Astro.
Las llamadas de prueba tardan: no esperes que Meta registre una llamada en segundos. Haz la llamada, cierra el panel y vuelve al día siguiente. Insistir en el mismo día no acelera nada.
El texto de las descripciones: escríbelo tú, en inglés, concreto y sin adornos. Meta tiene detectores de texto generado por IA y puede usar ese motivo para ralentizar o rechazar la revisión.
Qué viene después
Con el acceso avanzado aprobado y el Embedded Signup funcionando, el servicio queda completamente automatizado para el onboarding. El consultor recibe un email con los IDs del nuevo cliente, configura el webhook y el system prompt en el servidor, y el bot está activo en 24-48 horas.
El siguiente paso natural es automatizar también esa configuración: un panel donde el consultor vea los clientes pendientes, configure el system prompt desde una interfaz, y active el webhook con un clic. Pero eso es material para un tercer artículo.
¿Quieres montar este sistema para tu agencia o negocio? En Imorillas ayudamos a agencias y consultores a productizar sus servicios de IA y WhatsApp. Contacta con nosotros.
¿Quieres que esto funcione en tu negocio?
Diagnosticamos qué necesitas y lo ponemos en marcha. Sin tecnicismos, sin perder tu tiempo.
Solicitar diagnóstico gratuito