Saltar al contenido principal

Analítica y seguimiento

El widget reporta dos tipos de eventos al backend:

  • Eventos automáticos (clicks de producto, conversiones detectadas) emitidos por el widget en respuesta a la interacción del usuario.
  • Eventos manuales (eventos de negocio custom) enviados desde tu host vía POST /api/widget/analytics/event o el endpoint de batch.

Todo el tráfico va por la cabecera X-Widget-Token y comparte el rate-limit del filtro WidgetRateLimitFilter.

Eventos automáticos

EventoEndpointCuándo
Click de productoPOST /api/widget/track/clickUsuario hace click en una card o CTA de un resultado.
Conversión asistidaPOST /api/widget/track/conversionEl widget detecta una conversión por el conversionSelector (cuando tracking.conversions = true).

Ambos endpoints están definidos en WidgetTrackingController.java. El payload incluye searchLogId y productId (más orderId, orderValue, currency, timeToConversionMs, userSessionId opcionales en conversion) para cerrar el bucle de attribution.

Eventos manuales

Para eventos que el widget no detecta (impresión de banner, click en categoría, etc.) usa el endpoint genérico:

POST/api/widget/analytics/event
curl -X POST https://api.neuroon.ai/api/widget/analytics/event \
-H "X-Widget-Token: $WIDGET_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"eventType": "category_click",
"searchLogId": "log_abc",
"productId": "p_1",
"metadata": { "category": "running" }
}'

Controlador: WidgetAnalyticsController.java.

Batch

Para reducir round-trips desde clientes con alto volumen:

POST/api/widget/analytics/events/batch
curl -X POST https://api.neuroon.ai/api/widget/analytics/events/batch \
-H "X-Widget-Token: $WIDGET_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"events": [
{ "eventType": "result_impression", "searchLogId": "log_abc", "productId": "p_1", "position": 1 },
{ "eventType": "result_impression", "searchLogId": "log_abc", "productId": "p_2", "position": 2 }
]
}'

El batch acepta hasta 100 eventos por petición (@Size(min = 1, max = 100) en BatchRequest).

Recomendación: acumula 5–20 eventos o flushea cada 2 s, lo que ocurra antes. navigator.sendBeacon es ideal para flush en unload.

Schema de un evento

CampoTipoRequeridoNotas
eventTypestring (max 30)Identificador del evento. Debe coincidir con un valor de WidgetAnalyticsEventType.
searchLogIdstring (max 255)recomendadoVincula el evento a la sesión de búsqueda.
conversationIdstring (max 36)noUUID de la conversación.
productIdstring (max 255)noID del producto relacionado, si aplica.
userSessionIdstring (max 255)noSesión de usuario opaca.
responseTypestring (max 20)noTipo de respuesta del agente cuando proceda.
enricherTypestring (max 30)noEnricher que originó el evento.
positionintegernoPosición en la lista (impresión/click).
metadataobjectnoPares libres key → string | number | boolean (hasta 20 entradas).

Validación exacta: EventRequest en WidgetAnalyticsController.java.

Rate limits

El filtro WidgetRateLimitFilter aplica un límite distinto por familia de endpoint (todos son por minuto, por shop):

Familia de endpointLímite/min
/api/widget/search/*200
/api/widget/suggestions300
/api/widget/compare10
/api/widget/analytics/* (event y events/batch)500
/api/widget/track/* (click, conversion) y demás100

Si te pasas, recibes 429 Too Many Requests con Retry-After, X-RateLimit-Limit y X-RateLimit-Remaining. Ver Autenticación → Rate Limits.

Próximas lecturas