Rastreo de e-commerce
Los SDK de Joryio incluyen rastreo de e-commerce integrado para la interacción con productos, la actividad de los carritos y las transacciones de compra. El rastreador funciona igual en todas las plataformas: los mismos métodos, los mismos nombres de evento estándar y la misma semántica de propiedades; solo cambia la sintaxis del lenguaje.
Elige tu plataforma en cualquiera de los ejemplos de código de abajo; la elección se sincroniza en toda la página. Para instalación y configuración, consulta las guías de plataforma: SDK web, SDK de iOS, SDK de Android, SDK de React Native. React Native no tiene un rastreador dedicado: su pestaña muestra las llamadas Joryio.track() equivalentes (consulta React Native más abajo).
Convención de nombres de ID
Joryio usa una convención clara para los identificadores:
| Tu ID | Descripción | Ejemplo |
|---|---|---|
productId | Tu identificador de producto (SKU o ID de producto de tu plataforma de e-commerce). | "SKU-12345" |
orderId | Tu identificador de pedido (número de pedido de tu plataforma). | "ORD-2024-001" |
userId | Tu identificador de usuario (enviado a identify()). | "user-123" |
Usa tus propios identificadores con naturalidad: no necesitas prefijos especiales.
Inicializar el rastreador de e-commerce
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Obtén el rastreador de e-commerce desde la instancia de tu SDK
// (joryio es la instancia creada con `new JoryioSDK({ sdkKey: ... })`)
const ecommerce = joryio.ecommerce({
currency: 'USD' // Moneda predeterminada para todos los eventos
});
// Obtén el rastreador de e-commerce con la moneda predeterminada
let ecommerce = Joryio.shared.ecommerce(config: EcommerceConfig(currency: "USD"))
import io.joryio.sdk.ecommerce.*
// Obtén el rastreador de e-commerce con la moneda predeterminada
val ecommerce = Joryio.getInstance().ecommerce(EcommerceConfig(currency = "USD"))
// The React Native SDK has a typed e-commerce tracker, same as web, iOS and
// Android. Use it rather than Joryio.track() with hand-written names: it
// applies the platform's canonical event names and property keys for you, and
// a name that is close but not exact is stored verbatim and matches no report.
import Joryio from '@joryio/react-native-sdk';
const product = {
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt',
price: 29.99,
category: 'Clothing/T-Shirts',
brand: 'Acme Apparel',
imageUrl: 'https://example.com/images/blue-tshirt.jpg',
url: 'https://example.com/products/blue-tshirt',
};
Rastrear vistas y búsquedas de producto
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Cuando el usuario ve una página de producto
ecommerce.viewProduct({
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt',
price: 29.99,
category: 'Clothing/T-Shirts',
brand: 'Acme Apparel',
imageUrl: 'https://example.com/images/blue-tshirt.jpg',
url: 'https://example.com/products/blue-tshirt'
});
// Cuando el usuario ve una página de categoría
ecommerce.viewCategory('tshirts', 'T-Shirts');
// Cuando el usuario realiza una búsqueda
ecommerce.search('blue shirts', 42); // consulta, número de resultados
// Registra la vista de producto
let product = EcommerceProduct(
productId: "SKU-12345",
name: "Classic Blue T-Shirt",
price: 29.99,
category: "Clothing",
brand: "Acme Apparel",
variant: "Size M",
sku: "BTS-001-M"
)
ecommerce.viewProduct(product)
// Registra la vista de categoría
ecommerce.viewCategory(categoryId: "cat_123", categoryName: "T-Shirts", properties: [
"sort_by": "popularity"
])
// Registra la búsqueda de producto
ecommerce.search(query: "blue shirts", resultCount: 42)
// Registra la vista de producto
val product = EcommerceProduct(
productId = "SKU-12345",
name = "Classic Blue T-Shirt",
price = 29.99,
category = "Clothing",
brand = "Acme Apparel",
variant = "Size M",
sku = "BTS-001-M"
)
ecommerce.viewProduct(product)
// Registra la vista de categoría
ecommerce.viewCategory(
categoryId = "cat_123",
categoryName = "T-Shirts",
properties = mapOf("sort_by" to "popularity")
)
// Registra la búsqueda de producto
ecommerce.search(query = "blue shirts", resultCount = 42)
// When user views a product page
Joryio.ecommerce.viewProduct(product);
// When user views a category page
Joryio.ecommerce.viewCategory('tshirts', 'T-Shirts');
// When user searches
Joryio.ecommerce.search('blue shirts', 42);
Rastrear actividad de carrito
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Añade un artículo al carrito
ecommerce.addToCart({
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt',
price: 29.99,
quantity: 1,
variantId: 'var-medium',
sku: 'BTS-001-M'
}, 59.98); // Opcional: valor actual del carrito
// Elimina un artículo del carrito
ecommerce.removeFromCart({
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt',
price: 29.99
}, 1); // cantidad que se eliminará
// Actualiza todo el carrito
ecommerce.updateCart([
{ productId: 'SKU-12345', name: 'Blue T-Shirt', price: 29.99, quantity: 2 },
{ productId: 'SKU-67890', name: 'Black Jeans', price: 49.99, quantity: 1 }
], 109.97); // matriz de artículos, valor total del carrito
// Añade un artículo al carrito
let cartItem = EcommerceCartItem(
productId: "SKU-12345",
name: "Classic Blue T-Shirt",
price: 29.99,
quantity: 2,
category: "Clothing"
)
ecommerce.addToCart(item: cartItem, cartValue: 59.98)
// Elimina del carrito
ecommerce.removeFromCart(product: product, quantity: 1)
// Actualiza el carrito
ecommerce.updateCart(items: [cartItem1, cartItem2], cartValue: 89.97)
// Añade un artículo al carrito
val cartItem = EcommerceCartItem(
productId = "SKU-12345",
name = "Classic Blue T-Shirt",
price = 29.99,
quantity = 2,
category = "Clothing"
)
ecommerce.addToCart(item = cartItem, cartValue = 59.98)
// Elimina del carrito
ecommerce.removeFromCart(product = product, quantity = 1)
// Actualiza el carrito
ecommerce.updateCart(items = listOf(cartItem1, cartItem2), cartValue = 89.97)
// Add item to cart
Joryio.ecommerce.addToCart({...product, quantity: 2}, 59.98);
// Remove item from cart
Joryio.ecommerce.removeFromCart(product, 1);
// Cart contents changed
Joryio.ecommerce.updateCart([{...product, quantity: 2}], 59.98);
Rastrear el flujo de checkout
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Cuando el usuario inicia el checkout
ecommerce.startCheckout([
{ productId: 'SKU-12345', name: 'Blue T-Shirt', price: 29.99, quantity: 2 },
{ productId: 'SKU-67890', name: 'Black Jeans', price: 49.99, quantity: 1 }
], 109.97); // artículos, valor del carrito
// Cuando el usuario añade información de pago
ecommerce.addPaymentInfo('credit_card');
// Inicia el checkout
ecommerce.startCheckout(items: cartItems, cartValue: 59.98)
// Añade información de pago
ecommerce.addPaymentInfo(paymentMethod: "credit_card", properties: [
"card_type": "visa"
])
// Inicia el checkout
ecommerce.startCheckout(items = cartItems, cartValue = 59.98)
// Añade información de pago
ecommerce.addPaymentInfo(paymentMethod = "credit_card", properties = mapOf(
"card_type" to "visa"
))
// When user starts checkout
Joryio.ecommerce.startCheckout([{...product, quantity: 2}], 65.97);
// When payment details are entered
Joryio.ecommerce.addPaymentInfo('credit_card');
Rastrear compras
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Cuando se completa el pedido
ecommerce.purchase({
orderId: 'ORD-2024-001',
items: [
{
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt',
price: 29.99,
quantity: 2,
category: 'Clothing',
brand: 'Acme'
},
{
productId: 'SKU-67890',
name: 'Black Jeans',
price: 49.99,
quantity: 1
}
],
value: 109.97,
currency: 'USD',
shipping: 5.99,
tax: 8.80,
discount: 10.00,
coupon: 'SAVE10'
});
// Completa la compra
let order = EcommerceOrder(
orderId: "ORD-2024-001",
items: cartItems,
value: 59.98,
currency: "USD",
shipping: 5.99,
tax: 4.80,
discount: 10.00,
coupon: "SAVE10"
)
ecommerce.purchase(order: order)
// Completa la compra
val order = EcommerceOrder(
orderId = "ORD-2024-001",
items = cartItems,
value = 59.98,
currency = "USD",
shipping = 5.99,
tax = 4.80,
discount = 10.00,
coupon = "SAVE10"
)
ecommerce.purchase(order)
// When order is completed.
//
// `value` here is the ORDER OBJECT's field name; the tracker sends it as the
// `total` property the revenue pipeline reads. Sending a raw event with
// `value` instead would record the order at $0 - there is deliberately no
// alias layer, so a near-miss is stored verbatim and read by nothing.
Joryio.ecommerce.purchase({
orderId: 'ORD-2024-001',
items: [
{productId: 'SKU-12345', name: 'Classic Blue T-Shirt', price: 29.99, quantity: 2},
{productId: 'SKU-67890', name: 'Black Jeans', price: 49.99, quantity: 1},
],
value: 109.97,
currency: 'USD',
shipping: 5.99,
tax: 8.8,
discount: 10.0,
coupon: 'SAVE10',
});
El método purchase() exige que envíes los artículos del pedido explícitamente. El SDK no guarda el estado del carrito del lado cliente ni obtiene artículos automáticamente del carrito rastreado o del servidor. Así se garantiza la precisión, ya que la página o pantalla de confirmación conoce los artículos exactos que se compraron.
Rastrear cambios de estado de pedido
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Pedido enviado
ecommerce.orderFulfilled('ORD-2024-001', '1Z999AA10123456784', 'UPS');
// Pedido entregado
ecommerce.orderDelivered('ORD-2024-001');
// Pedido cancelado
ecommerce.orderCancelled('ORD-2024-001', 'Customer requested');
// Pedido reembolsado
ecommerce.orderRefunded('ORD-2024-001', 29.99, 'Product defective');
// Pedido completado (enviado)
ecommerce.orderFulfilled(orderId: "ORD-2024-001", trackingNumber: "1Z999AA10123456784", carrier: "UPS")
// Pedido entregado
ecommerce.orderDelivered(orderId: "ORD-2024-001")
// Pedido cancelado
ecommerce.orderCancelled(orderId: "ORD-2024-001", reason: "Customer requested cancellation")
// Pedido reembolsado
ecommerce.orderRefunded(orderId: "ORD-2024-001", refundAmount: 29.99, reason: "Product defective")
// Pedido completado (enviado)
ecommerce.orderFulfilled(orderId = "ORD-2024-001", trackingNumber = "1Z999AA10123456784", carrier = "UPS")
// Pedido entregado
ecommerce.orderDelivered(orderId = "ORD-2024-001")
// Pedido cancelado
ecommerce.orderCancelled(orderId = "ORD-2024-001", reason = "Customer requested cancellation")
// Pedido reembolsado
ecommerce.orderRefunded(orderId = "ORD-2024-001", refundAmount = 29.99, reason = "Product defective")
// Order shipped
Joryio.ecommerce.orderFulfilled('ORD-2024-001', '1Z999AA10123456784', 'UPS');
// Order delivered
Joryio.ecommerce.orderDelivered('ORD-2024-001');
// Order cancelled or refunded
Joryio.ecommerce.orderCancelled('ORD-2024-001', 'customer_request');
Joryio.ecommerce.orderRefunded('ORD-2024-001', 29.99, 'damaged');
Rastrear lista de deseos y compartidos
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Añade a la lista de deseos
ecommerce.addToWishlist({
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt',
price: 29.99
});
// Comparte el producto
ecommerce.shareProduct({
productId: 'SKU-12345',
name: 'Classic Blue T-Shirt'
}, 'facebook'); // método para compartir
// Lista de deseos
ecommerce.addToWishlist(product: product)
ecommerce.removeFromWishlist(product: product)
// Comparte el producto
ecommerce.shareProduct(product: product, shareMethod: "twitter")
// Lista de deseos
ecommerce.addToWishlist(product)
ecommerce.removeFromWishlist(product)
// Comparte el producto
ecommerce.shareProduct(product, shareMethod = "twitter")
// Add to wishlist
Joryio.ecommerce.addToWishlist(product);
// Remove from wishlist
Joryio.ecommerce.removeFromWishlist(product);
// Share a product
Joryio.ecommerce.shareProduct(product, 'whatsapp');
Rastrear cupones
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Cupón aplicado
ecommerce.applyCoupon('SAVE10', 10.00, 'percentage');
// Cupón eliminado
ecommerce.removeCoupon('SAVE10');
// Cupón
ecommerce.applyCoupon(couponCode: "SAVE10", discountAmount: 10.00, discountType: "percentage")
ecommerce.removeCoupon(couponCode: "SAVE10")
// Cupón
ecommerce.applyCoupon(couponCode = "SAVE10", discountAmount = 10.00, discountType = "percentage")
ecommerce.removeCoupon(couponCode = "SAVE10")
// Coupon applied
Joryio.ecommerce.applyCoupon('SAVE10', 10.0, 'percentage');
// Coupon removed
Joryio.ecommerce.removeCoupon('SAVE10');
Rastrear reseñas
- Web (JS)
- iOS (Swift)
- Android (Kotlin)
- React Native
// Reseña de producto enviada
ecommerce.submitReview('SKU-12345', 5, 'Great quality shirt!');
// Reseña
ecommerce.submitReview(productId: "SKU-12345", rating: 5, reviewText: "Great product!")
// Reseña
ecommerce.submitReview(productId = "SKU-12345", rating = 5, reviewText = "Great product!")
// Product review submitted
Joryio.ecommerce.submitReview('SKU-12345', 5, 'Great shirt, true to size.');
Eventos estándar de e-commerce
El rastreador de e-commerce envía los mismos eventos estándar en todas las plataformas:
| Nombre de evento | Descripción |
|---|---|
Product Viewed | El usuario ve una página de producto. |
Product List Viewed | El usuario ve una página de categoría. |
Products Searched | El usuario busca productos. |
Product Added | Se añadió un artículo al carrito. |
Product Removed | Se eliminó un artículo del carrito. |
Cart Updated | Cambió el contenido del carrito. |
Checkout Started | El usuario inicia checkout. |
Payment Info Entered | El usuario añade un método de pago. |
Order Completed | Pedido completado. |
Order Fulfilled | Pedido enviado. |
Order Delivered | Pedido entregado. |
Order Cancelled | Pedido cancelado. |
Order Refunded | Pedido reembolsado. |
Product Added to Wishlist | Producto añadido a la lista de deseos. |
Product Removed from Wishlist | Producto eliminado de la lista de deseos. |
Product Shared | Producto compartido. |
Coupon Applied | Cupón aplicado. |
Coupon Removed | Cupón eliminado. |
Product Reviewed | Reseña de producto enviada. |
React Native
El SDK de React Native no incluye un rastreador de e-commerce dedicado. Las apps de React Native envían los mismos eventos estándar mediante Joryio.track(), usando los mismos nombres de evento y nombres de propiedad en tránsito que emiten los rastreadores de los otros SDK (los rastreadores convierten sus entradas camelCase en propiedades de evento snake_case en tránsito). La pestaña React Native de cada sección anterior muestra la llamada Joryio.track() equivalente para cada método del rastreador.
Cuando una tienda (Shopify, WooCommerce, Magento) o la API de pedidos envía tus pedidos, Joryio emite por sí mismo Order Refunded y Order Cancelled: no llames también a orderRefunded / orderCancelled para esos pedidos, o cada reembolso se registrará dos veces. Los eventos del servidor usan las mismas claves order_id, refund_amount y reason que los trackers, así que una sola condición de journey coincide con ambos. Consulta Eventos de reembolso y cancelación.
Argumentos obligatorios
Todos los trackers rechazan una llamada incompleta de la misma forma, en todos los SDK: registran una advertencia y no envían nada - nunca un evento con un ID vacío o un importe cero, que un informe de ingresos contaría como real. Ninguna llamada lanza una excepción.
| Llamada | Obligatorio |
|---|---|
viewProduct, removeFromCart, addToWishlist, removeFromWishlist | Un producto con productId y un price finito |
addToCart | Un artículo con productId y un price finito |
shareProduct | Un producto como el anterior, y un shareMethod |
viewCategory | categoryId y categoryName |
search | query |
cartViewed, updateCart, startCheckout | Un array items, cada artículo con productId y un price finito, y un cartValue finito |
addPaymentInfo | paymentMethod |
purchase | Un orderId, un array items (puede estar vacío; cada artículo como el anterior) y un value finito |
orderFulfilled, orderDelivered, orderCancelled, orderRefunded | orderId |
applyCoupon, removeCoupon | couponCode |
submitReview | productId |
Un ID o una etiqueta vacíos, o que solo contienen espacios, cuentan como ausentes. Un importe opcional - cartValue en addToCart, shipping, tax y discount en un pedido, refundAmount, discountAmount - se puede omitir, pero el que pase debe ser un número finito: NaN o infinito rechaza toda la llamada en lugar de enviarla sin ese importe.
Las propiedades personalizadas que pases junto a la llamada siguen la regla general: un valor NaN o infinito ahí se descarta con un aviso y la llamada se envía sin esa clave - consulta Propiedades y tipos de datos.
En Unity los nombres van en PascalCase (ViewProduct, ProductId); las reglas son las mismas.
Siguientes pasos
- SDK web: instalación, configuración y referencia completa de API.
- SDK de iOS: integra el SDK de iOS.
- SDK de Android: integra el SDK de Android.
- SDK de React Native: integra el SDK de React Native.
- Eventos personalizados: rastrea eventos personalizados.
- API de e-commerce: integración de e-commerce del lado servidor.