Saltar al contenido principal

Atribución de ingresos

Ingresos conecta un checkout con el video en el que la persona hizo clic. Las ventas aprobadas aparecen en Analytics → Ingresos, en el panel y en el video. Las cifras son las ventas que volvieron por el webhook, no una estimación.

Dónde encontrarlo​

  • Reporte: abre Analytics y selecciona Ingresos.
  • Configuración: abre Integraciones y APIs y selecciona Ingresos.

El reporte muestra los ingresos del mes, el total, los ingresos por reproducción, las ventas, los reembolsos, los ingresos en el tiempo, los ingresos por fuente de tráfico y los videos principales. La configuración no está en el reporte. Usa Configurar ingresos en el reporte para abrir la pantalla de conexión.

Conectar un checkout​

En Integraciones y APIs → Ingresos:

  1. Confirma la moneda del informe. Las ventas nuevas se convierten a esa moneda en el total. Los espacios en portugués empiezan en BRL. Los demás empiezan en USD. Puedes cambiarla. Las ventas ya guardadas conservan la tasa del día del cobro.
  2. Elige el checkout: AtomicPay, Hotmart, Kiwify, Cartpanda, Stripe o Personalizado.
  3. Elige el parámetro donde se escribe la clave de clic: src, sck, xcode, xcod, sid, subid, vtid o sub1. El formulario empieza en el parámetro que documenta ese checkout. Stripe no usa esa lista.
  4. En un checkout personalizado, indica el host del enlace de compra, como pay.example.com. Los checkouts con nombre ya conocen sus hosts.
  5. Selecciona Conectar, lee los pasos en la tarjeta y copia la URL del webhook en ese checkout. La URL contiene un token secreto. Trátala como una contraseña.

La moneda del informe es una lista: USD, BRL, EUR, GBP, MXN o JPY. Son las monedas que el total puede convertir. Cada pedido sigue guardado en la moneda en la que se cobró.

AtomicPay​

Suscríbete al webhook en centavos de compra aprobada, reembolso completado y contracargo completado. Usa sck. AtomicPay devuelve ese valor en la compra.

Hotmart​

En Hotmart, abre Herramientas → Webhook (API y notificaciones) y registra la URL. Selecciona Compra aprobada, Compra reembolsada y Chargeback. Usa src. Hotmart lo devuelve en purchase.origin.src en el webhook de compra. El id del pedido es purchase.transaction. El importe es purchase.full_price.value en la unidad mayor. Una solicitud de reembolso no es un reembolso. Espera PURCHASE_REFUNDED. Cómo registrar el webhook.

Kiwify​

En Kiwify, abre Apps → Webhooks y crea un webhook. Selecciona Compra aprovada, Compra reembolsada y Chargeback. Usa src. Kiwify lo devuelve en TrackingParameters. El id del pedido es order_id. Eventos del webhook.

Cartpanda​

En Cartpanda, abre Admin → Notificaciones → Webhooks. Envía order.paid y order.refunded a la URL. Usa src. Cartpanda guarda src y sck en el enlace de checkout, también en tiendas de mycartpanda.com. Parámetros del checkout. Eventos del webhook.

Stripe​

Los Payment Links de Stripe (buy.stripe.com) no guardan src ni los demás parámetros de seguimiento. Stripe solo guarda client_reference_id, y ese valor vuelve en checkout.session.completed. El reproductor escribe ese parámetro.

En el endpoint de webhook de Stripe, envía:

  • checkout.session.completed para la venta. Es el evento que trae la clave del clic.
  • charge.refunded y refund.created para un reembolso total. Stripe también envía charge.refunded en un reembolso parcial. El parcial permanece en los ingresos. El total sale del ingreso neto.
  • charge.dispute.created para una disputa. charge.dispute.closed con estado won devuelve ese cobro a los ingresos.

payment_intent.succeeded tiene importe y moneda en la unidad menor, pero no incluye client_reference_id. Ese evento puede registrar el cobro y no puede atribuirlo a un video. En la API actual de Stripe, invoice.paid no incluye el PaymentIntent. Una venta guardada solo con el id de la factura no coincide con un reembolso, que llega con el id del PaymentIntent. El importe usado es la moneda del cobro en el PaymentIntent o en la Checkout Session, no el importe de presentación de Adaptive Pricing que vio el cliente.

Una Checkout Session creada con la API de Stripe tiene que definir client_reference_id en la propia API. Añadirlo a checkout.stripe.com no cambia una sesión que ya existe. Un pago que ya terminó sin client_reference_id no se puede atribuir después. Haz un pago nuevo después de la actualización del reproductor. Una venta aprobada sin clave de clic aparece en la lista de configuración y queda fuera de los ingresos.

Checkouts personalizados​

Los checkouts con nombre tienen su propio parser. El personalizado no. Existe para un checkout que controlas, o para una plataforma que no está en la lista. Tiene que enviar este JSON a la URL del webhook:

{
"order_id": "order_123",
"order_amount_cents": 9700,
"currency": "USD",
"conversion_key": "ap1_clave_del_enlace",
"product_name": "Curso",
"category": "initial_sale",
"occurred_at": "2026-09-28T12:00:00Z"
}

order_amount_cents es un entero en la unidad menor. 9700 son 97,00 USD. conversion_key tiene que ser la clave que el reproductor añadió al enlace. category puede ser refund, chargeback, upsell o subscription_renewal. Cualquier otro payload se rechaza, porque cada plataforma usa nombres de campo distintos. Si la plataforma no puede mapear su webhook a estos campos, no se puede conectar como personalizada.

Envía una venta de prueba para confirmar el webhook. La venta de prueba entra en los ingresos y se puede eliminar.

Standard y Scale pueden conectar un checkout y ver los ingresos. Free y Starter ven la configuración, pero la conexión permanece bloqueada hasta que el plan la incluya.

Cómo se atribuye una venta​

El reproductor agrega una clave de clic a los enlaces de compra de la página y a los botones dentro del video, solo cuando el host del enlace coincide con un checkout conectado. Una clave que ya existe se conserva.

La venta se acredita al último clic en los 30 días anteriores al cobro. Una venta aprobada sin clave, con una clave desconocida o con un clic vencido no es ingreso. Queda en la lista de configuración para mostrar que el webhook llegó, y queda fuera del total, del gráfico y de cada video.

Un reembolso o contracargo actualiza ese pedido y lo saca del ingreso neto. Una aprobación posterior no convierte un pedido reembolsado en una venta otra vez.

Qué son las cifras​

El total es una moneda: la moneda de informe del espacio. Una venta cobrada en otra moneda se convierte con la tasa de la fecha de la venta y no se reescribe cuando cambia el tipo de cambio. Los ingresos por reproducción son ese total dividido por las reproducciones.

Esto no es atribución multi-touch, ingresos de píxel de anuncios, CPA ni ROAS.

Documentos relacionados​

Preguntas frecuentes​

¿Dónde conecto Hotmart, Kiwify, Cartpanda, Stripe o AtomicPay?

Abre Integraciones y APIs y selecciona Ingresos. Pega la URL del webhook en el checkout. La pestaña Ingresos de Analytics es el reporte, no el formulario de conexión.

¿Por qué Stripe ignoró el parámetro src?

Los Payment Links de Stripe solo guardan client_reference_id, y solo checkout.session.completed devuelve ese valor. payment_intent.succeeded tiene el importe y no tiene la clave del clic. Añade ese evento y haz un pago de prueba nuevo.

¿Qué tiene que enviar un webhook genérico?

order_id, order_amount_cents como entero en la unidad menor, currency y conversion_key con la clave del clic del enlace de compra. Otros formatos JSON se rechazan.

¿Qué clic recibe la venta?

El último clic en los 30 días anteriores al cobro. Solo los enlaces cuyo host coincide con un checkout conectado reciben la clave.

¿Los reembolsos se quedan en el total?

No. Un reembolso completado o un contracargo sale del ingreso neto y aparece en reembolsos. Una solicitud de reembolso que no se ha completado no es un reembolso.

¿Por qué el total no es la suma de las filas de video?

Una venta aprobada sin un clic coincidente entra en el total y no en un video. Las filas de video son solo ventas coincidentes.