Template de integración desarrollado para implementar Empathy en tiendas VTEX. Esta aplicación inyecta un widget de búsqueda avanzada mediante VTEX Pixel, siguiendo las prácticas recomendadas por VTEX.
Tabla de Contenidos
- Descripción General
- Requisitos Previos
- Instalación
- Configuración
- Arquitectura
- Componentes Principales
- Flujo de Integración
- Configuración por Cliente
- Evolutivos Propuestos
- Debugging
- Contribución
Descripción General
Esta app es una solución template configurable que permite integrar el buscador de Empathy en tiendas VTEX. Cada cliente puede tener diferentes configuraciones según sus necesidades:
✅ Con o sin variantes de productos
✅ Con o sin botón de add to cart
✅ Con o sin quantity selector
✅ Con o sin wishlist
Funcionalidades Principales
- 🔍 Búsqueda avanzada mediante el widget de Empathy
- 🛒 Integración con carrito VTEX (add/remove/update)
- ❤️ Gestión de wishlist con sincronización visual
- 📊 Eventos de analítica GA4 personalizados
- 🔄 Comunicación bidireccional mediante el
setSnippetConfig
Requisitos Previos
⚠️ IMPORTANTE: Antes de instalar esta app, asegúrate de que:
- El conector backend de Empathy esté correctamente configurado
- El catálogo de VTEX se esté enviando como feed a Empathy
- El equipo de Empathy haya mapeado el feed correctamente
- Tengas acceso al script de Empathy de cada cliente (
app.js) provisto por el equipo de Empathy
Instalación
Esta aplicación está diseñada para operar como una App Privada. Sigue estos pasos para configurarla e instalarla bajo la cuenta correspondiente.
Prerrequisitos
Asegúrate de estar logueado en la cuenta objetivo:
_10 vtex login <account-name>
Pasos
-
Clona este repositorio:
_10git clone <repository-url>_10cd empathymx-pixel-app -
Configura el Vendor (Account Name): Abre el archivo manifest.json en la raíz del proyecto. Cambia el valor del campo vendor por el nombre de la cuenta (account name) donde se instalará la aplicación.
_10// manifest.json_10{_10"name": "pixel-app",_10"vendor": "TU_ACCOUNT_NAME",_10"version": "0.0.x",_10}
Nota: Esto cambiará el ID de la app a TU_ACCOUNT_NAME.empathy-pixel-app.
-
Instala la aplicación: Instala la versión recién publicada en el workspace actual:
_10vtex install -
Verifica la instalación:
_10vtex ls | grep empathymx.pixel-app
Configuración
1. Script de Empathy
Actualiza el archivo pixel/head.html con la URL del script de Empathy proporcionada por el equipo:
_10<script src="https://x.{env}.empathy.co/{client-id}/{build-id}/app.js" type="module"></script>
Ejemplo:
_10<script src="https://x.test.empathy.co/preview/674/app.js" type="module"></script>
2. Configuración InitX
En react/Components/EmpathySearchbar/index.tsx, configura los parámetros del cliente:
_10(window as any).initX = {_10 instance: "vtex", // Identificador del cliente_10 env: 'staging', // 'staging' o 'production'_10 lang: "es", // Idioma: 'es', 'en', 'pt', etc._10 scope: "desktop", // 'desktop' o 'mobile'_10 currency: "EUR", // 'EUR', 'USD', 'MXN', etc._10 consent: false,_10 viewMode: 'embedded',_10 callbacks: { ... }_10};
3. Agregar Componentes a la Store
En tu theme, agrega los siguientes bloques:
_10{_10 "store.home": {_10 "blocks": [_10 "empathy-searchbar",_10 "empathy-results"_10 ]_10 }_10}
Arquitectura
Estructura del Proyecto
_23empathymx-pixel-app/_23├── manifest.json # Configuración de la app VTEX_23├── pixel/_23│ └── head.html # Script de inicialización de Empathy_23├── store/_23│ ├── interfaces.json # Definición de componentes React_23│ └── plugins.json # Configuración de pixel manager_23├── react/_23│ ├── index.tsx # Entry point del pixel_23│ ├── Components/_23│ │ ├── EmpathySearchbar/ # 🔑 Componente principal_23│ │ │ ├── index.tsx_23│ │ │ ├── constants.tsx_23│ │ │ ├── utils/_23│ │ │ │ ├── index.tsx # Utilidades generales_23│ │ │ │ └── handleCart.ts # Lógica de carrito_23│ │ │ ├── hooks/_23│ │ │ │ ├── handleWishlist.ts_23│ │ │ │ └── useGAAnalytics.ts_23│ │ │ └── gql/ # GraphQL queries_23│ │ └── EmpathyResults/ # Overlay de resultados_23└── docs/_23 └── README.md
Dependencias VTEX
_10{_10 "vtex.pixel-interfaces": "1.x",_10 "vtex.order-items": "0.x",_10 "vtex.order-manager": "0.x",_10 "vtex.styleguide": "9.x",_10 "vtex.pixel-manager": "1.x",_10 "vtex.session-client": "1.x",_10 "vtex.wish-list": "1.x" // Opcional (solo si se usa wishlist)_10}
Componentes Principales
EmpathySearchbar
El componente principal que:
- Inicializa el widget de Empathy mediante
initX - Configura callbacks para interacciones del usuario
- Gestiona la comunicación con VTEX (carrito, wishlist)
- Envía eventos de analítica a GA4
Callbacks disponibles:
| Callback | Descripción |
|---|---|
UserClickedResultAddToCart | Click en "agregar al carrito" (producto simple) |
UserClickedResultVariantAddToCart | Click en "agregar al carrito" (con variantes) |
UserClickedResultRemoveFromCart | Click en "quitar del carrito" (producto simple) |
UserClickedResultVariantRemoveFromCart | Click en "quitar del carrito" (con variantes) |
UserClickedResultWishlist | Click en el icono de wishlist |
EmpathyResults
Contenedor overlay para mostrar los resultados de búsqueda. Empathy "teleporta" su UI a este componente usando data-teleport.
Utils y Hooks
handleCart.ts: Lógica centralizada para operaciones de carritohandleWishlist.ts: Gestión completa de wishlist con GraphQLuseGAAnalytics.ts: Envío de eventos personalizados a GA4index.tsx(utils): Funciones auxiliares (findProductBySkuId,mapProductForGA4)
Flujo de Integración
1. Inicialización (Carga de Página)
2. Flujo Add to Cart
3. Flujo Wishlist
Conceptos Clave
setSnippetConfig - API de Comunicación
Esta es la interfaz principal para comunicarse con el widget de Empathy:
_10(window as any).InterfaceX.setSnippetConfig({_10 cart: { _10 "123": 2, // SKU ID → Cantidad_10 "456": 1 _10 }, _10 wishlist: ["789", "101112"], // Array de SKU IDs en wishlist_10 // ... otros parámetros_10});
¿Qué hace?
- ✅ Actualiza el estado visual del widget
- ✅ Muestra cantidades en el carrito
- ✅ Marca productos con icono de wishlist "filled"
Eventos GA4
La app envía 3 eventos personalizados:
add_to_cart_empathy: Cuando se agrega un productoremove_from_cart_empathy: Cuando se quita un productoadd_to_wishlist_empathy: Cuando se agrega a favoritos
Todos incluyen:
search_term: El término de búsqueda que generó la interacciónecommerce.items[]: Datos del producto en formato GA4
Configuración por Cliente
Checklist de Implementación
Script de Empathy
- Cambiar URL en
pixel/head.htmlsegún entorno del cliente - Verificar que el script se cargue correctamente (
console.log(window.InterfaceX))
InitX Configuration
- Actualizar
instance(identificador del cliente en Empathy) - Configurar
env:'staging'o'production' - Ajustar
langsegún idioma del sitio - Configurar
currencysegún moneda de la tienda - Verificar
scope:'desktop'o'mobile'
Funcionalidades Opcionales
- ¿El cliente tiene variantes? → Mantener callbacks de
Variant - ¿El cliente tiene add to cart? → Configurar callbacks de
AddToCart - ¿El cliente tiene quantity selector? → Verificar
metadata.inputValue - ¿El cliente tiene wishlist? → Verificar dependencia
vtex.wish-list
Backend y Testing
- Verificar que el conector backend esté instalado
- Confirmar que el feed se envíe correctamente a Empathy
- Validar que Empathy haya mapeado el feed
- Probar búsqueda y resultados
- Probar add/remove from cart (con y sin variantes)
- Probar wishlist (agregar/remover)
- Verificar eventos GA4 en
window.dataLayer
Debugging
Verificaciones Básicas
_14// 1. Verificar que Empathy está cargado_14console.log(window.InterfaceX);_14_14// 2. Ver configuración actual_14console.log(window.InterfaceX.getSnippetConfig());_14_14// 3. Ver cart sincronizado_14console.log(window.InterfaceX.getSnippetConfig()?.cart);_14_14// 4. Ver wishlist sincronizada_14console.log(window.InterfaceX.getSnippetConfig()?.wishlist);_14_14// 5. Ver eventos GA4_14console.log(window.dataLayer);
Problemas Comunes
| Problema | Solución |
|---|---|
| Widget no se muestra | Verificar que el script en head.html se cargue correctamente |
InterfaceX is undefined | El script de Empathy no se cargó. Revisar URL y conectividad |
| Cart no sincroniza | Revisar que setSnippetConfig se llame después de init() |
| Wishlist no funciona | Verificar que vtex.wish-list esté instalada |
| Eventos GA4 no aparecen | Revisar que window.dataLayer exista antes de push |