Configura la atribución de ingresos para rastrear qué canales de marketing generan ventas reales. Guía de implementación paso a paso.
Requisitos previos
Antes de comenzar:
- Script de seguimiento de Zenovay instalado
- Acceso al código de pago/compra
- Objetivo de ingresos habilitado
Configuración básica
Seguimiento simple de ingresos
Rastrea los ingresos cuando se completa una compra:
// On order confirmation page or in success callback
zenovay('revenue', 99.99, 'USD');
¡Eso es todo para el seguimiento básico!
Con nombre de objetivo
Asocia con un objetivo específico:
zenovay('goal', 'purchase', {
value: 99.99
});
Implementación completa
Objeto de ingresos completo
Incluye todos los datos relevantes:
zenovay('revenue', 149.99, 'USD', {
// Recommended
order_id: 'ORD-12345',
// Optional - for detailed analysis
items: [
{
id: 'SKU-001',
name: 'Product Name',
price: 49.99,
quantity: 2,
category: 'Electronics'
},
{
id: 'SKU-002',
name: 'Accessory',
price: 50.00,
quantity: 1,
category: 'Accessories'
}
],
// Optional metadata
coupon: 'SAVE10',
shipping: 9.99,
tax: 12.50
});
Implementación por plataforma
Shopify
Para tiendas Shopify:
- Ve a Configuración → Pago
- Añade a la "Página de estado del pedido":
{% if first_time_accessed %}
<script>
zenovay('revenue', {{ total_price | money_without_currency }}, '{{ currency }}', {
order_id: '{{ order_number }}',
items: [
{% for item in line_items %}
{
id: '{{ item.sku }}',
name: '{{ item.title | escape }}',
price: {{ item.final_price | money_without_currency }},
quantity: {{ item.quantity }}
}{% unless forloop.last %},{% endunless %}
{% endfor %}
]
});
</script>
{% endif %}
WooCommerce
Para WordPress/WooCommerce:
- Añade a la
functions.phpde tu tema o a un plugin:
add_action('woocommerce_thankyou', 'zenovay_track_revenue');
function zenovay_track_revenue($order_id) {
$order = wc_get_order($order_id);
?>
<script>
zenovay('revenue', <?php echo $order->get_total(); ?>, '<?php echo $order->get_currency(); ?>', {
order_id: '<?php echo $order_id; ?>'
});
</script>
<?php
}
React/Next.js
En tu componente de éxito del pago:
import { useEffect } from 'react';
function OrderConfirmation({ order }) {
useEffect(() => {
if (order && window.zenovay) {
window.zenovay('revenue', order.total, order.currency, {
order_id: order.id,
items: order.items.map(item => ({
id: item.sku,
name: item.name,
price: item.price,
quantity: item.quantity
}))
});
}
}, [order]);
return <div>Thank you for your order!</div>;
}
Seguimiento del lado del servidor
Enterprise PlanPara un seguimiento seguro del lado del servidor, usa el endpoint de seguimiento con tu código de seguimiento:
// Node.js example - use the tracking endpoint directly
app.post('/api/order/complete', async (req, res) => {
const order = await processOrder(req.body);
await fetch('https://api.zenovay.com/e/YOUR_TRACKING_CODE', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Forwarded-For': req.headers['x-forwarded-for'] || req.socket.remoteAddress,
},
body: JSON.stringify({
type: 'revenue',
url: req.headers.referer || 'https://yoursite.com/checkout',
revenue: order.total,
order_id: order.id,
currency: 'USD'
}),
});
res.json({ success: true });
});
Configuración de atribución
Modelo de atribución
Zenovay no te obliga a comprometerte con un único modelo de antemano. Abre el panel de tu sitio web, ve a la pestaña Ingresos, y cambia el modelo directamente en la tarjeta Atribución. Hay cinco modelos disponibles:
- Last Touch (predeterminado)
- First Touch
- Linear
- Position-Based
- Time-Decay
Puedes cambiar el modelo en cualquier momento para ver los mismos datos desde una perspectiva diferente — no hay una configuración separada de "modelo predeterminado" o "ventana de atribución" que debas configurar primero.
Elegir un modelo de atribución
La tarjeta Atribución de la pestaña Revenue te permite cambiar entre cinco modelos por informe. Elige el que coincida con tu pregunta:
| Modelo | Cuándo usarlo |
|---|---|
| Last-Touch (predeterminado) | Quieres saber qué cierra las ventas |
| First-Touch | Quieres saber qué impulsa el descubrimiento |
| Linear | Quieres una distribución equilibrada y neutral en el viaje |
| Position-Based | Quieres recompensar el descubrimiento (40%) y el cierre (40%) |
| Time-Decay | Tienes ciclos de venta más cortos — las interacciones recientes pesan más |
El modelo elegido se guarda en la URL, así que una recarga lo conserva. Si la mayoría de las conversiones de un período provienen de una única sesión, los modelos multi-touch se verán muy similares a Last-Touch — eso es esperado y se resuelve a medida que se acumulan más recorridos multi-sesión. Para un análisis más detallado de cómo las atribuciones de first-touch y last-touch difieren, consulta Atribución first-touch vs last-touch.
¿Por qué todos mis modelos de atribución muestran casi los mismos números?
Esto es lo esperado y no es un error. Cuando la mayoría de las conversiones provienen de visitantes que tuvieron una única sesión — o permanecieron en un único canal — antes de convertir, cada modelo le otorga a ese canal el 100% del crédito. Por eso Last-Touch, First-Touch, Linear, Position-Based y Time-Decay se ven prácticamente idénticos.
Los modelos empiezan a diferenciarse para los visitantes que genuinamente transitaron por varios canales y sesiones distintos antes de convertir; cuanto más recorridos multi-sesión se acumulen, mayores serán las diferencias.
Cambiar de modelo no modificará el canal de IA — el tráfico de IA siempre se acredita a su propio canal bajo cualquier modelo.
Consejo: para ver las mayores diferencias entre modelos, compara First-Touch con Last-Touch — divergen siempre que el primer y el último canal de un visitante sean distintos.
Una conversión sin valor monetario sigue contando para la atribución de conversiones; las cifras de ingresos solo aparecen cuando hay un ingreso asociado al objetivo.
IA como canal de atribución
Zenovay muestra IA como un canal de primer nivel en el panel de atribución, junto a Directo, Orgánico, Pago, Social y Referido. Cuando un visitante que convierte se identifica como tráfico de IA, esa conversión se atribuye a IA en lugar de mezclarse con Directo o con un canal UTM.
Despliega la fila IA para desglosarla por producto de IA:
- Productos identificados — ChatGPT, Claude, Perplexity, Gemini, Copilot, DeepSeek y otros, cuando la visita incluía un referente de IA o un parámetro UTM reconocible.
- Probable IA (sin especificar) — visitantes que la heurística Dark IA identificó como impulsados por IA aunque llegaron sin referente. No se pueden vincular a un producto concreto, así que se agrupan con honestidad bajo esta etiqueta en lugar de adivinarlos.
Ten en cuenta:
- Esta es una vista de conversiones. Un producto de IA que envía visitas pero ninguna conversión atribuible en el período seleccionado no aparecerá aquí — usa la vista Influencia de IA para el tráfico de IA por producto.
- Ver solo Probable IA (sin especificar) es exacto, no un dato que falte: significa que las conversiones de IA del período se detectaron por heurística sin un referente identificado.
- La atribución de IA aparece en el panel autenticado; no se muestra de forma intencionada en los paneles públicos o compartidos.
Atribución entre dispositivos
Enterprise PlanRastrea entre dispositivos:
- Identifica usuarios cuando inician sesión
- El recorrido se une automáticamente
- Ruta completa visible
// When user logs in
zenovay('identify', userId);
Configuración de parámetros UTM
Seguimiento de campañas
Asegúrate de que se usan los parámetros UTM:
https://yoursite.com/?utm_source=google
&utm_medium=cpc
&utm_campaign=spring_sale
&utm_content=banner_1
Parámetros UTM
| Parámetro | Propósito | Ejemplo |
|---|---|---|
| utm_source | Fuente de tráfico | google, facebook |
| utm_medium | Medio de marketing | cpc, email |
| utm_campaign | Nombre de la campaña | spring_sale |
| utm_content | Variante del anuncio | banner_a |
| utm_term | Palabras clave | blue shoes |
Configuración de pruebas
Modo de depuración
Activa el registro de depuración:
zenovay('debug');
Luego rastrea una compra de prueba y verifica la consola.
Compra de prueba
- Realiza un pedido de prueba
- Verifica la consola del navegador
- Verifica en la vista en tiempo real
- Confirma en el informe de ingresos
Lista de verificación de verificación
- Valor de ingresos correcto
- ID de pedido registrado
- Artículos rastreados (si se envían)
- Fuente atribuida correctamente
- Moneda correcta
Manejo de casos límite
Ingresos recurrentes
Para suscripciones:
// Track initial purchase
zenovay('revenue', 29.99, 'USD', {
order_id: 'SUB-001',
type: 'subscription',
interval: 'monthly'
});
// Track renewals
zenovay('revenue', 29.99, 'USD', {
order_id: 'SUB-001-RENEWAL',
type: 'subscription_renewal',
original_order: 'SUB-001'
});
Reembolsos
Maneja los reembolsos correctamente:
// Track refund
zenovay('revenue', -49.99, 'USD', {
order_id: 'REFUND-ORD-12345',
type: 'refund',
original_order: 'ORD-12345'
});
Envíos parciales
Si el ingreso se reconoce al envío:
// Track each shipment
zenovay('revenue', 50.00, 'USD', {
order_id: 'ORD-12345-SHIP-1',
parent_order: 'ORD-12345'
});
Calidad de datos
Prevenir duplicados
Asegúrate de que los ingresos no se rastreen dos veces:
// Using localStorage to prevent duplicates
function trackOrderOnce(order) {
const tracked = localStorage.getItem(`tracked_${order.id}`);
if (tracked) return;
zenovay('revenue', order.total, 'USD', {
order_id: order.id
});
localStorage.setItem(`tracked_${order.id}`, 'true');
}
Validar antes de enviar
Verifica la calidad de los datos:
function trackRevenue(orderData) {
// Validate
if (!orderData.value || orderData.value <= 0) {
console.warn('Invalid order value');
return;
}
if (!orderData.order_id) {
console.warn('Missing order ID');
return;
}
// Track
zenovay('revenue', orderData.value, orderData.currency || 'USD', {
order_id: orderData.order_id
});
}
Solución de problemas
Los ingresos no aparecen
Si los ingresos no se muestran:
-
Verifica que el seguimiento se dispare
- ¿Está el modo de depuración habilitado?
- ¿Errores de consola?
-
Verifica la configuración del objetivo
- ¿Se creó el objetivo de ingresos?
- ¿Está activo el objetivo?
-
Verifica el tiempo
- ¿Después de que la página se cargue por completo?
- ¿En la devolución correcta?
-
Valida los datos
- ¿El valor es un número?
- ¿No es $0?
Atribución faltante
Si la fuente no se atribuye:
- Verifica que los parámetros UTM estén presentes
- Verifica que el referente no esté bloqueado
- Intenta un modelo de atribución diferente en la tarjeta Atribución de la pestaña Revenue
- Confirma que la visita que convierte se rastreó en primer lugar (verifica la vista en tiempo real)
Los montos no coinciden
Si los totales difieren de la contabilidad:
- Compara rangos de fechas
- Verifica los reembolsos
- Verifica el manejo de monedas
- Busca pedidos faltantes
Consideraciones de seguridad
Limitaciones del seguimiento del lado del cliente
Ten en cuenta:
- Los valores se pueden manipular
- No es para propósitos de facturación
- Solo para análisis
Lado del servidor para la precisión
Para una precisión crítica:
- Implementa el seguimiento del lado del servidor
- Verifica contra el backend
- Usa para informes
Conectar un procesador de pagos (servidor a servidor)
Si ya procesa pagos a través de un procesador compatible, puede conectar su cuenta a Zenovay en lugar de modificar el código de su pago. Zenovay recibe webhooks del procesador, atribuye cada pago capturado a la sesión de origen y alimenta automáticamente el panel de ingresos — sin necesidad de llamadas zenovay('revenue', …) del lado del cliente.
La pestaña Configuración de ingresos te permite conectar Stripe, PayPal y Paddle. Cada uno tiene una guía de configuración paso a paso:
| Procesador | Guía de configuración | Qué se rastrea |
|---|---|---|
| Stripe | Integración de ingresos de Stripe | Capturas, reembolsos, facturas de suscripción |
| PayPal | Integración de ingresos de PayPal | Capturas y reembolsos |
| Paddle | Integración de ingresos de Paddle | Capturas y reembolsos |
Elige tu procesador en la pestaña Configuración de ingresos, pega tus credenciales, y Zenovay se encarga del resto.
Cuándo elegir la ingesta por webhook en lugar del rastreador JS:
- Precisión en el servidor — las cargas útiles de webhooks están firmadas por el procesador y no pueden ser manipuladas por navegadores ni bloqueadores de anuncios.
- Sin cambios en el código de pago — abre el panel de tu sitio web, ve a la pestaña Ingresos de configuración, elige tu procesador, y pega tus credenciales.
- Los reembolsos se gestionan automáticamente — cuando se emite un reembolso en el panel de tu procesador, Zenovay lo registra.
Cuándo seguir usando el rastreador JS:
- Necesitas datos a nivel de artículo (
items[]) que el procesador no incluye en los webhooks. - Tu procesador no está en la lista anterior.
- Quieres que el pedido aparezca en la vista de visitantes en tiempo real en el momento en que el cliente llega a la página de éxito (los webhooks llegan unos segundos después).
Puedes usar ambos enfoques en el mismo sitio — Zenovay deduplica por order_id, así que el mismo pedido no se contabilizará dos veces.