Resumen
Cotizaciones y facturas de Cord dentro de tu producto, con React, Vue, Web Components o Vanilla JS.
¿Qué son los Elements?
Cord Elements es el SDK oficial (@flouviahq/elements) que te permite integrar toda la experiencia de interacción comercial de Cord directamente en tu propio portal web corporativo.
En lugar de enviar al cliente a cordhq.app, tus clientes pueden ver cotizaciones, negociar en el chat interno, aprobar y firmar documentos, o pagar facturas sin abandonar tu marca. Todo ocurre de forma segura bajo tus propios dominios.
Métodos de Integración
Dependiendo de tu stack tecnológico, Cord ofrece tres maneras de consumir Elements:
1. El SDK de NPM (Recomendado)
Para aplicaciones modernas construidas en React, Next.js, Vue, o Nuxt, puedes instalar el paquete oficial de NPM. Este paquete provee componentes nativos, hooks (useQuoteBuilder) y tipos completos de TypeScript.
Instalación:
npm install @flouviahq/elements
Explora nuestras guías específicas:
- Guía para React y Next.js
- Guía para Web Components y Vue
- Headless: tu propia interfaz
- Formulario fiscal
- Proxy de servidor
2. Etiqueta Script (embed.js)
Para sitios sin bundlers, WordPress, o arquitecturas legacy, puedes cargar el entorno usando una sola etiqueta script y definir atributos data- en tu HTML.
<script src="https://cordhq.app/embed.js" async></script>
<div data-cord-token="a1b2c3d4e5f60718"></div>
Este script se encarga de inyectar dinámicamente un iframe y ajustar automáticamente su altura para evitar barras de desplazamiento.
3. Framer y Webflow
El SDK también exporta wrappers específicos listos para ser pegados como Code Components en editores visuales modernos. Revisa la documentación de Web Components para más detalles.
Arquitectura de Seguridad
Cord Elements utiliza seguridad de grado bancario. Por defecto, tu clave publicable (pk_live_...) expuesta en el frontend nunca podrá leer el directorio de tus clientes (para evitar fugas de datos de CRM). Si deseas funciones avanzadas, puedes operar el SDK a través de un backend proxy.
Explora la sección de Seguridad CSP para configurar tus dominios permitidos (allowlist) y evitar ataques de Clickjacking.
Errores de integración
Cuando algo de tu integración está mal, Elements lo dice en la consola del navegador con un código estable y un enlace a su explicación en esta sección, en el locale de tu <CordProvider> (Builder y hooks) o en el lang de tu página (lo demás):
[Cord] missing_token: Falta el token del documento. https://docs.cordhq.app/docs/desarrolladores/herramientas/elements/resumen#missing_token
Lo que impide montar o configurar un componente se lanza como CordIntegrationError, con code y docUrl; lo demás solo avisa y el componente sigue. Maneja cada caso por su code, nunca por el texto, que cambia con el idioma. Importa la clase del mismo paquete que usas (@flouviahq/elements, /react, /vue o /headless): cada uno trae la suya.
import { mountCotizador, CordIntegrationError } from '@flouviahq/elements';
try {
mountCotizador(document.querySelector('#cotizacion'), { token });
} catch (error) {
if (error instanceof CordIntegrationError && error.code === 'invalid_target') {
// El contenedor no existe en esta página.
}
}
Los errores que manda la API llegan como CordError y su docUrl lleva a Manejo de errores.
Del documento embebido
missing_token: Falta el token público de la cotización (/q/{token}) o de la factura (/i/{token}).mountCotizador()y el<CordCotizador>de Vue lanzan,<cord-quote>y<cord-invoice>avisan, y el<CordCotizador>de React muestra el aviso en su lugar.invalid_target:mountCotizador()recibiónullen vez de un elemento: el selector no encontró el contenedor en la página. Lanza.invalid_appearance_json: El atributoappearancede<cord-quote>o eldata-cord-appearancedeembed.jsno es JSON válido. Avisa y el documento se monta sin esa appearance.appearance_dropped: Uno o más valores deappearanceno pasan la validación (una variable que no existe, un color mal escrito, una fuente fuera de Google Fonts o Bunny Fonts) y Cord los descarta. El aviso los nombra, por ejemplovariables.colorPrimary. No avisa en una compilación conNODE_ENV=production. Ver Apariencia.appearance_too_big: La appearance pesa más de 8192 bytes como JSON. Cord la ignora completa y el documento conserva la que tenía.not_found: No existe un documento con ese token, o ya no está disponible. También llega comocord:error; ver Eventos.frame_blocked: El iframe cargó y Cord no respondió: tu dominio no está en Ajustes › Cotizador embebible, obaseUrlno es el origen de Cord. El aviso nombra tu dominio. También llega comocord:error.timeout: No llegócord:readydentro dereadyTimeout(10 segundos por defecto). También llega comocord:error; si el documento carga después, el error se limpia.
De React, Vue y headless
missing_provider: Un hook o componente de Cord quedó fuera de su<CordProvider>, o una pieza del Builder (<CordBuilder.Items>y las demás) fuera de<CordBuilder>. Lanza. El visor (<CordCotizador>) no necesita Provider.missing_key: El Builder necesitapublishableKeyoproxyUrl, solo uno.useQuoteBuilder()ycreateCordClient()lanzan sin ninguno, ycreateCordClient()también con los dos;useCreateQuote()lo deja en suerrorcomoCordError.invalid_publishable_key: La llave del navegador no empieza conpk_. Una secreta (sk_,rk_) va solo en tu servidor, detrás deproxyUrl; ver Proxy de servidor. Si ya la publicaste, revócala.<CordProvider>ycreateCordClient()lanzan.clients_require_proxy:useCordClients()con una llave publicable: unapk_no puede leer tus clientes. ConfiguraproxyUrlo pasaclientsa<CordBuilder>. Llega comoCordErroren suerror, sin pedir nada a Cord.iva_pct_deprecated:<CordProvider ivaPct>ya no se usa: cada línea toma su tasa del catálogo de impuestos de tu organización. Quita la prop. Solo avisa.