track y algunas piezas sueltas. Los
tipos vienen del contrato OpenAPI y nunca se escriben a mano: si el contrato
cambia, el paquete cambia con él.
createStorefront(options): Storefront
La instancia:
resolveItemId, getCatalogItemByExternalId (con sus try…), cartId y
track.checkoutStarted todavía no están en la versión publicada en npm
(0.1.0). Hasta la próxima, resolvé el id con
GET /v1/catalog/items/by-external/{external_id} y mandá
cart_id y checkout_started por la API.Las opciones
Sólo las dos primeras son obligatorias.string
requerido
La clave
spk_… que copiás del admin. Por qué puede ser pública: Claves y seguridad.string
requerido
La conexión de tu tienda (
cn_…). Se valida contra la tienda de la clave.string | (() => string | null | undefined)
El id que tu tienda le da al carrito. Mandalo siempre que haya carrito: es lo único que ata la venta con la recomendación cuando entra la orden. Una función es lo normal, porque el carrito consigue su id con el primer producto y se lee en cada llamada.
string
predeterminado:"https://api.crossup.ai/salespilot"
El endpoint de la API. En producción,
https://salespilot.crossup.ai.typeof fetch
Un
fetch propio, para tests o para un runtime sin fetch global.boolean
predeterminado:"true"
true lo guarda en localStorage y cookie, espejados. false lo deja en memoria: sigue viajando, pero cada carga es un visitante nuevo. Usalo sin consentimiento.VisitorStorage
Un storage propio. Gana sobre
persistVisitor.string
Dominio de la cookie (
.mitienda.com): el mismo visitante en todos los subdominios.(() => Visitor | undefined) | false
Un visitante propio, para quien ya lo resolvió (un servidor).
false no manda visitante en ningún pedido.(error: unknown) => void
Se llama cuando el visitante no se pudo resolver y el pedido salió sin él. Nunca se llama con un error de la API.
(() => ClientContext | undefined) | false
El contexto del navegador (página, referrer, UTM, idioma, pantalla). Por defecto se lee en cada pedido;
false no lo manda; una función lo reemplaza. Nunca corta el pedido.(error: unknown) => void
Cada señal que no se pudo armar, que el servidor rechazó, que se descartó por un
4xx o que se cayó de la cola llena. Nunca se llama por un reintento.(result, signal) => void
Cada respuesta del servidor a una señal:
accepted, duplicate o rejected.SignalOptions
Cómo se agrupan y reintentan las señales:
flushIntervalMs (2000), maxQueueSize (200), maxBackoffMs (60000), storage. Ver Reportar señales.