Amine Benamrouche · Proyectos
← Volver a los proyectos

Tall3: SaaS multi-tenant para concesionarios de automóviles

Resumen

Tall3 es una plataforma SaaS multi-tenant para concesionarios y showrooms de automóviles de Arabia Saudí, cada uno con su propia tienda en la plataforma. El backend es una aplicación Laravel que usa stancl/tenancy para el multi-tenant, junto con un frontend en Next.js.

Trabajé en Tall3 como desarrollador backend freelance durante unos dos meses, sobre una plataforma de producción ya existente que no construí desde cero. Mi trabajo abarcó el desarrollo de APIs REST, funciones específicas de cada tenant, una integración de WhatsApp autoalojada y el backend que permite a los tenants conectar su propio dominio a su tienda.

Contribuciones técnicas principales

  • Dominios personalizados de los tenants (Cloudflare for SaaS): diseño y construcción del backend para conectar el dominio propio de un tenant con su tienda, coordinando la compra del dominio a través de la pasarela de pago N-Genius, los productos Cloudflare Registrar y SSL for SaaS, la consulta asíncrona de estados y un CORS dinámico por dominio. Se explica en detalle más abajo.
  • Integración de WhatsApp (autoalojada, Evolution API): tras evaluar la API oficial de WhatsApp Business y descartarla, construcción de la conectividad de WhatsApp sobre una pasarela autoalojada: conexión de cuentas por QR, gestión de sesiones con varios números, notificaciones transaccionales específicas de cada tenant (confirmaciones de pedido, OTP) y un motor de campañas de marketing con importación de destinatarios por CSV, mensajes con plantillas, envío espaciado y seguimiento en vivo del progreso y los fallos.
  • Trabajo backend en la plataforma: desarrollo y mantenimiento de APIs REST y de funciones específicas de cada tenant sobre el código existente, integración de la API de Gemini para funciones asistidas por IA, herramientas que ayudan a los nuevos tenants a migrar datos desde plataformas de la competencia, y trabajo en la caché de Redis y en correcciones de rendimiento.

Dominios personalizados de los tenants

La parte más compleja del trabajo backend en Tall3: permitir que un tenant compre un dominio real y que este sirva al instante su tienda existente. theirbrand.com muestra el mismo sitio que su página habitual tall3.com/cars/{tenantId}, con un certificado SSL funcionando y sin trabajo manual de DNS por parte de nadie.

El flujo coordina una pasarela de pago, dos productos distintos de Cloudflare, y tanto el backend Laravel como el frontend Next.js:

Flujo del dominio personalizado de un tenant: el backend Laravel crea una sesión de pago con N-Genius, la pasarela de pago, que redirige al tenant a una página de pago alojada y más tarde confirma el pago mediante un callback. Después, el backend registra el dominio con Cloudflare Registrar, que crea una zona DNS antes de registrar Cloudflare SSL for SaaS para el certificado, con un poller en segundo plano que comprueba ambos y escribe el resultado en una máquina de estados tenant_domains, ya que ninguna de las dos APIs de Cloudflare envía webhooks. Debajo: el tráfico de los visitantes en el nuevo dominio termina en el borde de Cloudflare, se reenvía a un origen compartido que ejecuta el frontend Next.js, el cual identifica al tenant llamando al backend Laravel y hace llamadas a la API verificadas por CORS de vuelta hacia él
  1. Un tenant busca y elige un dominio; el backend crea una sesión de pago con N-Genius, la pasarela de pago de la plataforma, y se redirige al tenant a una página de pago alojada para que pague.
  2. Una vez confirmado el pago, el backend registra el dominio a través de la API de Registrar de Cloudflare. Es una operación asíncrona, así que una tarea programada la consulta hasta que termina.
  3. El registro crea automáticamente una nueva zona DNS; el backend inserta los registros que apuntan de vuelta a la infraestructura de Tall3.
  4. A continuación, el dominio se registra como «custom hostname» de Cloudflare en la zona propia de Tall3: el paso que realmente le consigue un certificado, también asíncrono y consultado periódicamente.
  5. Una vez activo, el tráfico del nuevo dominio termina en el borde de Cloudflare y se reenvía a un origen de respaldo compartido que ejecuta el frontend Next.js, un servidor sin configuración propia de ningún dominio.
  6. Como la configuración multi-tenant existente de la plataforma solo resuelve sus propios subdominios, el frontend llama a un endpoint dedicado del backend para asociar el nombre de host desconocido con un tenant y luego renderiza la tienda de ese tenant.
  7. Como esa tienda ahora se ejecuta en un dominio ajeno a Tall3, el backend permite CORS de forma dinámica para él, comprobándolo en la tabla de dominios activos y pagados en lugar de usar un comodín.

Ninguno de los endpoints asíncronos de Cloudflare envía un webhook, así que nada avisa al backend cuando termina un registro o un certificado. Un job en segundo plano consulta ambos cada minuto, con backoff exponencial acotado, y escribe cada resultado en una máquina de estados tenant_domains.status (pending_payment → registering → registered_pending_dns → configuring_dns → provisioning_ssl → active, con ramas failed/action_required). Retoma correctamente desde donde se quedó un dominio, incluso si la aplicación se reinició desde la última comprobación.

Stack técnico

ComponenteTecnologías
BackendPHP, Laravel
Multi-tenancystancl/tenancy
Dominios y SSLCloudflare Registrar, Cloudflare for SaaS (Custom Hostnames)
PagosN-Genius (pasarela de pago alojada)
MensajeríaEvolution API (pasarela de WhatsApp autoalojada)
CachéRedis
IAAPI de Gemini
ContenedoresDocker
FrontendNext.js

Plataforma en vivo

Explora la plataforma: tall3.com

Tall3 es una plataforma propietaria en la que contribuí como freelance. Este caso de estudio describe mis contribuciones sin exponer código confidencial, credenciales ni datos de tenants.