Producto propio · piloto con una tienda real 2026 En operación

Catálogo — Panel de tienda para vender por WhatsApp

Panel que es la única fuente de datos de una tienda: alimenta el catálogo de WhatsApp por la API de Meta, una tienda web con filtros y el catálogo hojeable armado sobre la plantilla de Canva.

  • Next.js
  • PostgreSQL
  • Meta Graph API
  • Cloudflare Tunnel
  • Cloudflare Access
  • Canvas 2D
  • Docker
  • VPS Ubuntu
Los cuatro catálogos de la tienda, cada uno con su portada hecha en Canva y el número de prendas y hojas

El problema

Una tienda de lencería en Perú que vende por WhatsApp, con más de 400 prendas. Todo se hacía a mano: subían el catálogo de WhatsApp producto por producto y armaban el catálogo visual en Canva, que ya había topado su límite de 250 imágenes y no tiene filtros. Cada cambio de precio había que hacerlo tres veces, en tres sitios, y ninguno de los tres estaba de acuerdo con los otros.

El encargo no era "una tienda web". Era que existiera un solo sitio donde una prenda se edita una vez: el inventario, el catálogo de WhatsApp, el catálogo web con filtros y las imágenes de difusión tienen que salir de ahí, no repetirse.

Y hay una restricción que ordena todo el diseño: quien lo usa a diario no es una persona técnica, y lo usa desde el celular, de pie, en la tienda.

Qué hace

  • 01 Panel de prendas pensado para el celular: alta, edición, tallas, unidades y fotos
  • 02 Sincronización automática con el catálogo de WhatsApp por la API de Meta
  • 03 Cada foto sabe dónde sale: la cubierta a WhatsApp, la buena al catálogo propio
  • 04 Tienda web pública con filtros de tipo, color, talla y detalle, con sus conteos
  • 05 Catálogo hojeable armado solo sobre la plantilla de Canva, y su PDF
  • 06 Ventas: cobro, boleta con correlativo y descuento de unidades
  • 07 Página de enlaces propia, con los clics de cada botón
  • 08 Estadísticas de qué se vende y qué se toca

Capturas

El enfoque técnico

Una sola aplicación Next.js contra PostgreSQL en un VPS, sin backend aparte. Son 400 prendas: un servicio separado habría sido una segunda cosa que desplegar, vigilar y actualizar sin ganar nada a cambio. El catálogo es público y el panel va detrás de Cloudflare Access, pero la aplicación vuelve a verificar el JWT por dentro — el túnel es por dónde entra el tráfico, no la puerta.

La sincronización con Meta es el corazón y está construida para poder repetirse sin miedo. Guardar una prenda no llama a Meta: solo la deja encolada (`sincronizado is null` hace de cola, sin tabla aparte) y un temporizador se lleva los lotes cada cinco minutos. La llave de idempotencia es el slug de la prenda, así que reintentar no duplica nada, y una sincronización completa se come el 12% del balde horario de la API: cabe de sobra.

Las fotos se reparten en dos mundos. La política del catálogo de Meta rechaza imágenes que para una tienda de lencería son normales, así que cada foto lleva apuntado dónde sale: la versión cubierta va a WhatsApp y la buena va al catálogo propio. El reparto lo hizo un script de una sola vez que, si no reconoce el catálogo que tiene delante, se planta en vez de dejar prendas sin foto en Meta — lo probé escondiéndole parte de los datos y avisó de 22 prendas sin escribir nada.

El catálogo visual es donde más aprendí, y no por acertar. Propuse dos veces generar el diseño por código —primero como catálogo web, después como A4 en HTML/CSS— y las dos veces el resultado no convenció, con razón. La solución fue partir el problema por la mitad: Canva pone el PNG de fondo, con los huecos de foto como cajas de color plano, y el código mide ese PNG y compone encima las fotos, el nombre, las tallas y el precio, de tres en tres. Salen 86 hojas sin que nadie arrastre nada, y la misma rutina de dibujo pinta la hoja en pantalla y la página del PDF, así que no hay dos maquetas que se puedan desincronizar.

El panel está escrito para un pulgar: nada que haya que tocar mide menos de 44px, los campos van a 16px (por debajo iOS hace zoom solo), la navegación va abajo y la lista son tarjetas con foto grande, porque "Babydoll" se repite en cien prendas y el catálogo se reconoce mirando, no leyendo. En escritorio hay otra pantalla distinta —la navegación al costado, los filtros en columna, el cobro como un mostrador—, y lo que decide cuál se usa es el puntero, nunca el ancho: una tablet de 1024px sigue siendo un dedo.

Aprendizajes

La lección cara fue la de Canva. Insistir en generar el diseño por código era resolver el problema que yo sabía resolver, no el que había. El valor estaba en los datos y en la automatización, no en volver a dibujar lo que ya estaba dibujado; el diseño se quedó donde estaba y el código se limitó a componer encima. Desde entonces lo propongo así de entrada: la maqueta la hace quien la sabe hacer, y se adapta por código en una sesión.

Lo frágil de esto no es el código, es la operación. El token de Meta caduca con fecha, y el día que caduque la sincronización deja de funcionar sin avisar a nadie: no hay excepción que se vea ni pantalla que se ponga roja. Un sistema que corre solo necesita que alguien se entere cuando deja de correr, y eso es lo siguiente que falta.

Cada tienda es un VPS con su base y su dominio, decidido así a propósito: las tablas de configuración son de una sola fila. Se gana aislamiento y se puede poner el dominio de cada quien en la URL, pero el precio es real y conviene decirlo — dar de alta un cliente nuevo es un despliegue nuevo, no una fila en una tabla.

¿Quieres algo similar?

Cuéntanos tu caso y te decimos, honestamente, si podemos ayudarte.