Acopla es un producto de Stackea Labs. Lo que se está construyendo ahora mismo lo cuento en su lab.
El problema
HubSpot no sabe qué es un RUC. Un vendedor que registra una empresa peruana copia el número, abre otra pestaña, busca la razón social, vuelve y la pega. Si la empresa está de baja o no habida, nadie se entera hasta que la factura rebota.
Cada equipo que lo resuelve construye su propia integración, y casi siempre la misma: una tarjeta, una llamada a una API y algo de código serverless. Que además solo funciona en los planes más caros de HubSpot, porque las funciones serverless no están en todos.
Lo que construí
Una sola app pública de HubSpot con varias tarjetas dentro de la ficha del contacto, la empresa o el negocio:
- RUC, DNI y tipo de cambio, con los datos oficiales que entrega Acredita. La tarjeta muestra el estado y la condición del contribuyente antes de que alguien facture.
- Escribir de vuelta en el CRM, en dos pasos. El servidor calcula la diferencia entre lo que hay en HubSpot y lo que dice la fuente oficial, el usuario la confirma y la escritura es idempotente y queda auditada. Ningún dato se pisa sin que una persona lo vea.
- Una tarjeta HTTP genérica para conectar cualquier API, con protección contra SSRF: no se puede usar para llegar a la red interna.
- El estudio con IA. Se pide en lenguaje natural —por ejemplo, «quiero ver las facturas pendientes de esta empresa»—, la IA lo convierte en una especificación validada, se previsualiza dentro de una ficha simulada de HubSpot y se publica al portal sin desplegar código. También crea las propiedades y los workflows que la tarjeta necesita.
Cómo está hecho
La decisión que define el producto: las tarjetas no usan funciones serverless de HubSpot. Llaman al backend propio de Acopla con hubspot.fetch, y por eso funcionan en cualquier plan. El costo es que el backend tiene que verificar cada firma de HubSpot y no confiar en nada de lo que llega.
Toda escritura en el CRM pasa por una confirmación obligada por tipos: el código que escribe no compila si no recibe una confirmación del usuario. No es una buena práctica que alguien recuerda; es una regla que el compilador impone.
Backend en NestJS 11 con Prisma sobre PostgreSQL con Row Level Security —cada portal ve solo lo suyo, garantizado por la base de datos—, colas con BullMQ, el estudio en Next.js 15 y la IA con la API de Claude. La caché se decide por la clase de cada dato: lo público se guarda, lo personal no.
Estado hoy
Funciona en producción, instalada en portales de prueba, y abre en acceso anticipado desde Stackea Labs. Medido: un p95 de 1.36 s con 15 peticiones simultáneas, 60 de 60 sin error, y una consulta repetida que pasa de 789 ms a 30 ms gracias a la caché.
Lo que aprendí
Que en HubSpot la limitación más cara no es técnica, es de plan. Diseñar alrededor de hubspot.fetch en vez de las funciones serverless obligó a construir más —firmas, multi-tenant, caché—, pero es lo que permite instalar la misma app en una empresa con el plan más básico.


