Ir al contenido

Pregunta a la doc

Las respuestas vienen solo de esta documentación, con fuentes. Para temas específicos de tu cuenta, la doc te dirige al responsable correcto.

¿Qué estás buscando?

Estás hablando con un asistente de IA. Puede equivocarse, así que verifica la información importante.

Tracking SDK personalizado

Cuando Dialog está instalado vía el SDK, los componentes React o los componentes Vue, los eventos dentro del asistente se trackean automáticamente. Los eventos side-cart y checkout que pasan fuera del asistente no: los conectas llamando a dos métodos del SDK.

Dos eventos:

  • user_added_to_cart: cuando el usuario añade un producto al carrito fuera del asistente (ej. desde tus botones de PDP).
  • user_submitted_checkout: cuando el usuario completa el checkout, haya usado Dialog o no.

Ambos son necesarios para que el dashboard calcule tu baseline real de add-to-cart rate, el checkout / conversion rate y la atribución de revenue. Ver por qué importa.

Llámalo desde donde tu sitio añade un producto al carrito: típicamente el click handler de tu botón “Add to cart”, o justo después de que tu API de mutación de carrito devuelva éxito.

client.registerAddToCartEvent({
productId: 'product-123',
quantity: 1,
currency: 'EUR',
variantId: 'variant-456',
price: 29.99,
})
Campo Tipo Requerido Descripción
productId string El ID del producto, matcheando tu catálogo.
quantity number Número de unidades añadidas.
currency string No Código ISO de moneda, ej. 'EUR'.
variantId string No ID de variante si aplica.
price number No Precio unitario.

Llámalo una vez por pedido completado, desde tu página de confirmación de pedido (o donde sepas que el checkout tuvo éxito). Pasa el total del pedido en orderValue: es lo que lee el KPI «Ingresos generados» del dashboard.

client.registerSubmitCheckoutEvent({
orderValue: 59.98,
currency: 'EUR',
transactionId: 'order-789',
items: [
{ productId: 'product-123', quantity: 1, price: 29.99, variantId: 'variant-456' },
{ productId: 'product-456', quantity: 1, price: 29.99 },
],
})
Campo Tipo Requerido Descripción
orderValue number El total del pedido. Es a partir de esto que se calculan los ingresos.
currency string No Código de moneda ISO, ej. 'EUR'.
transactionId string No ID del pedido. Se usa para deduplicar si la página de confirmación se recarga. Muy recomendado.
items array No Líneas del pedido, solo para atribución por producto. Los ingresos nunca se suman desde estas líneas: vienen de orderValue.

onAssistantEvent: reenviar a tus propios analytics

Sección titulada «onAssistantEvent: reenviar a tus propios analytics»

Suscríbete a los eventos emitidos por el asistente y reenvíalos donde quieras: GA4, Segment, Mixpanel, tu warehouse.

const unsubscribe = client.onAssistantEvent((event) => {
switch (event.type) {
case 'userAddedToCart':
analytics.track('dialog_conversion', {
productId: event.payload.productId,
variantId: event.payload.variantId,
timestamp: event.payload.date,
})
break
case 'userSendNegativeFeedback':
console.warn('Dialog negative feedback at:', event.payload.url)
break
}
})
// Más tarde, en unmount / cambio de ruta SPA
unsubscribe()
  • userOpenedAssistant
  • userClosedAssistant
  • userSentMessage
  • userClickedOnProductCard
  • userOpenedRecommendation
  • userAddedToCart
  • userSendPositiveFeedback
  • userSendNegativeFeedback
interface AssistantEvent {
type: string
payload: {
date: string // timestamp ISO
locale: string // locale actual
url: string // URL de la página actual
userId?: string // presente cuando se conoce
productId?: string // presente para eventos scopeados a producto
variantId?: string // presente para eventos scopeados a variante
}
}

Un setup mínimo, aplicable a React, Vue o vanilla:

import { Dialog } from '@askdialog/dialog-sdk'
const client = new Dialog({
apiKey: 'YOUR_PUBLIC_API_KEY',
locale: 'es',
callbacks: {
addToCart: async ({ productId, quantity, variantId, currency }) => {
await fetch('/api/cart', {
method: 'POST',
body: JSON.stringify({ productId, variantId, quantity }),
})
window.dispatchEvent(new CustomEvent('cart:updated'))
},
getProduct: async (productId, variantId) => {
const res = await fetch(`/api/products/${productId}?variant=${variantId ?? ''}`)
return res.json()
},
},
})
// Add-to-cart side-cart (botón fuera del asistente)
document.querySelector('#pdp-add-to-cart')!.addEventListener('click', async () => {
await addToCart({ productId, variantId, quantity: 1 })
client.registerAddToCartEvent({
productId,
variantId,
quantity: 1,
price: 29.99,
currency: 'EUR',
})
})
// Página de éxito de checkout: una vez por pedido, con el total
client.registerSubmitCheckoutEvent({
orderValue: 59.98,
currency: 'EUR',
transactionId: orderId,
items: [{ productId, variantId, quantity: 1, price: 59.98 }],
})