03 · Ingresos
Conecta Lemon Squeezy y vincula sus pedidos con visitas
Tally lee los pedidos y las facturas de suscripción de tu tienda, y añade su propio webhook.
01Conectar Lemon Squeezy
Crea una clave de API en Lemon Squeezy
Las claves de API de Lemon Squeezy no se pueden limitar, así que crea una solo para Tally: Tally solo lee los pedidos de tu tienda y añade su propio webhook, y puedes borrar la clave cuando quieras. En Lemon Squeezy, abre Settings, API y crea una clave. Esto es todo lo que Tally hace con ella:
Permiso Acceso Por qué Orders Lectura Cada venta: su importe, impuestos y reembolsos, y el email del cliente (convertido en hash al instante, nunca guardado). Subscription invoices Lectura Renovaciones y cambios de plan. Webhooks Escritura Tally añade su propio webhook a la tienda, para que los pagos lleguen en segundos. Una clave creada en modo de prueba solo ve pedidos de prueba: usa una para probar primero.
Pega la clave de API
En la página Integrations de tu sitio (o en el paso Payments al añadir un sitio), abre Lemon Squeezy y rellena:
- API key: Tally la guarda cifrada y nunca vuelve a mostrarla.
- Store (optional): solo si tu clave ve más de una tienda: su dirección, nombre o ID.
Después pulsa Connect Lemon Squeezy.
Tally lo comprueba e importa el último año
Comprueba la clave contra tu tienda, añade su propio webhook para que los pedidos nuevos lleguen en cuanto ocurren e importa los últimos 365 días. Lemon Squeezy solo envía los datos personalizados de un checkout en los webhooks, así que los pedidos importados se vinculan por el email del cliente; los pedidos de ahora en adelante llevan el ID del visitante.
02Pasa el ID del visitante como datos personalizados
En las páginas con enlaces de compra, unas pocas líneas añaden el valor de la cookie _tally_vid como checkout[custom][tally_visitor_id] a cada enlace de checkout de Lemon Squeezy. Un checkout que crea tu servidor lo recibe en checkout_data.custom.
// On pages with Lemon Squeezy buy links: add the visitor id as custom data.
const visitorId = (document.cookie.match(/(?:^|; )_tally_vid=([\w-]+)/) || [])[1];
for (const link of document.querySelectorAll('a[href*=".lemonsqueezy.com/checkout/buy/"]')) {
const url = new URL(link.href);
if (visitorId && !url.searchParams.has('checkout[custom][tally_visitor_id]')) {
url.searchParams.set('checkout[custom][tally_visitor_id]', visitorId);
link.href = url.href;
}
}
// Express with cookie-parser, where you create a Lemon Squeezy checkout.
app.post('/checkout', async (req, res) => {
const visitorId = req.cookies['_tally_vid'];
const response = await fetch('https://api.lemonsqueezy.com/v1/checkouts', {
method: 'POST',
headers: {
Accept: 'application/vnd.api+json',
'Content-Type': 'application/vnd.api+json',
Authorization: 'Bearer ' + process.env.LEMONSQUEEZY_API_KEY,
},
body: JSON.stringify({
data: {
type: 'checkouts',
attributes: { checkout_data: { custom: visitorId ? { 'tally_visitor_id': visitorId } : {} } },
relationships: {
store: { data: { type: 'stores', id: '1' } },
variant: { data: { type: 'variants', id: '1' } },
},
},
}),
});
const { data } = await response.json();
res.redirect(303, data.attributes.url);
});
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.