03 · Ingresos
Conecta Polar y vincula sus pedidos con visitas
Tally lee los pedidos, reembolsos y disputas perdidas de Polar con un token que solo tiene los ámbitos que necesita.
01Conectar Polar
Crea un token de acceso en Polar
Tally solo lee tus pedidos; nunca necesita mover dinero. En Polar, abre Settings, Access Tokens, crea un token de acceso de organización y dale solo estos ámbitos:
Permiso Acceso Por qué Organizations organizations:read El nombre de la organización, para que sepas cuál está conectada. Orders orders:read Cada pago: su importe, impuestos, metadatos y el email del cliente (convertido en hash al instante, nunca guardado). Refunds refunds:read Reembolsos. Disputes disputes:read Contracargos: las disputas que perdiste. Webhooks webhooks:write Tally añade su propio endpoint de webhook, para que los pagos lleguen en segundos. También sirve un token de sandbox: Tally prueba el sandbox de Polar cuando el entorno de producción no reconoce el token.
Pega el token de acceso
En la página Integrations de tu sitio (o en el paso Payments al añadir un sitio), abre Polar y rellena:
- Access token: empieza por polar_oat_. Tally lo guarda cifrado y nunca vuelve a mostrarlo.
Después pulsa Connect Polar.
Tally lo comprueba e importa el último año
Nombra cualquier ámbito que le falte al token, añade su propio endpoint de webhook para que los pedidos nuevos lleguen en cuanto ocurren e importa los últimos 365 días, reembolsos y disputas perdidas incluidos.
02Pasa el ID del visitante en los metadatos
Donde tu servidor cree el checkout, lee la cookie _tally_vid y pásala como tally_visitor_id en metadata: Polar la copia al pedido y a la suscripción, así que las renovaciones la siguen. En un enlace de checkout, añade el ID del visitante como reference_id, que Polar guarda en los metadatos del checkout.
// Express with cookie-parser, where you create the Polar checkout.
app.post('/checkout', async (req, res) => {
const visitorId = req.cookies['_tally_vid'];
const response = await fetch('https://api.polar.sh/v1/checkouts/', {
method: 'POST',
headers: {
Authorization: 'Bearer ' + process.env.POLAR_ACCESS_TOKEN,
'Content-Type': 'application/json',
},
body: JSON.stringify({
products: ['your-product-id'],
metadata: visitorId ? { 'tally_visitor_id': visitorId } : {},
success_url: 'https://example.com/thanks?checkout_id={CHECKOUT_ID}',
}),
});
const checkout = await response.json();
res.redirect(303, checkout.url);
});
// On pages with Polar checkout links: add the visitor id as reference_id. Polar's embed
// marks its links with data-polar-checkout; use your own selector for plain links.
const visitorId = (document.cookie.match(/(?:^|; )_tally_vid=([\w-]+)/) || [])[1];
for (const link of document.querySelectorAll('a[data-polar-checkout]')) {
const url = new URL(link.href);
if (visitorId && !url.searchParams.has('reference_id')) {
url.searchParams.set('reference_id', visitorId);
link.href = url.href;
}
}
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.