03 · Ingresos
Conecta Paddle y vincula sus ventas con visitas
Tally lee las transacciones, los reembolsos y los contracargos de Paddle Billing con una clave que solo puede leer.
01Conectar Paddle
Crea una clave de API en Paddle
Tally solo lee tus transacciones; nunca necesita mover dinero. Una clave de API solo puede hacer lo que permitas, y puedes revocarla cuando quieras. En Paddle, abre Developer tools, Authentication, elige New API key y dale estos permisos:
Permiso Acceso Por qué Transaction Lectura Cada pago: su importe, impuestos, origen y datos personalizados. Adjustment Lectura Reembolsos y contracargos. Customer Lectura El email del cliente, para cotejarlo con tally('identify'): convertido en hash al instante, nunca guardado. Notification setting Escritura Tally añade su propio destino de notificaciones, para que los pagos lleguen en segundos. Deja desactivados todos los demás permisos. Para probar primero, usa una clave de sandbox de sandbox-vendors.paddle.com.
Pega la clave de API
En la página Integrations de tu sitio (o en el paso Payments al añadir un sitio), abre Paddle y rellena:
- API key: empieza por pdl_live_apikey_ (o por pdl_sdbx_apikey_ en el sandbox). Tally la guarda cifrada y nunca vuelve a mostrarla.
Después pulsa Connect Paddle.
Tally lo comprueba e importa el último año
Nombra cualquier permiso que le falte a la clave, añade su propio destino de notificaciones para que los pagos nuevos lleguen en cuanto ocurren e importa los últimos 365 días, reembolsos y contracargos incluidos.
02Pasa el ID del visitante en customData
Donde abras el checkout con Paddle.js, lee la cookie _tally_vid y pásala como tally_visitor_id en customData. Paddle la guarda en la transacción y la copia a la suscripción, así que las renovaciones la siguen. Una transacción que crea tu servidor la recibe en custom_data.
// Where you open the checkout (Paddle.js, after Paddle.Initialize).
const visitorId = (document.cookie.match(/(?:^|; )_tally_vid=([\w-]+)/) || [])[1];
Paddle.Checkout.open({
items: [{ priceId: 'pri_123', quantity: 1 }],
// customData needs at least one key, so it is left out without a visitor id.
...(visitorId ? { customData: { 'tally_visitor_id': visitorId } } : {}),
});
// Express with cookie-parser: a transaction your server creates for the checkout.
app.post('/checkout', async (req, res) => {
const visitorId = req.cookies['_tally_vid'];
const response = await fetch('https://api.paddle.com/transactions', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.PADDLE_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
items: [{ price_id: 'pri_123', quantity: 1 }],
custom_data: visitorId ? { 'tally_visitor_id': visitorId } : null,
}),
});
const { data } = await response.json();
// On the page: Paddle.Checkout.open({ transactionId: data.id }).
res.json({ transactionId: data.id });
});
04Comprueba que funciona
05Lo que no se lee
¿Falta algo o no coincide con lo que ves? Escribe a support@tallybyoutpost.com y dinos qué página.