03 · Umsatz
Paddle verbinden und seine Verkäufe mit Besuchen verknüpfen
Tally liest Transaktionen, Erstattungen und Rückbuchungen von Paddle Billing mit einem Schlüssel, der nur lesen kann.
01Paddle verbinden
Einen API-Schlüssel in Paddle erstellen
Tally liest nur deine Transaktionen und muss nie Geld bewegen. Ein API-Schlüssel kann nur, was du erlaubst, und du kannst ihn jederzeit widerrufen. Öffne in Paddle Developer tools, Authentication, wähle „New API key“ und gib ihm diese Berechtigungen:
Berechtigung Zugriff Wozu Transaction Lesen Jede Zahlung: Betrag, Steuer, Herkunft und Custom Data. Adjustment Lesen Erstattungen und Rückbuchungen. Customer Lesen Die E-Mail des Kunden für den Abgleich mit tally('identify'): sofort gehasht, nie gespeichert. Notification setting Schreiben Tally legt ein eigenes Benachrichtigungsziel an, damit Zahlungen binnen Sekunden ankommen. Lass jede andere Berechtigung aus. Zum Ausprobieren nutze zuerst einen Sandbox-Schlüssel von sandbox-vendors.paddle.com.
Den API-Schlüssel einfügen
Öffne auf der Seite Integrations deiner Website (oder im Schritt Payments, wenn du eine Website hinzufügst) Paddle und fülle aus:
- API key: Er beginnt mit pdl_live_apikey_ (oder pdl_sdbx_apikey_ in der Sandbox). Tally speichert ihn verschlüsselt und zeigt ihn nie wieder an.
Klicke dann auf Connect Paddle.
Tally prüft den Zugang und importiert das letzte Jahr
Jede fehlende Berechtigung des Schlüssels wird genannt, ein eigenes Benachrichtigungsziel kommt hinzu, damit neue Zahlungen sofort ankommen, und die letzten 365 Tage werden importiert, Erstattungen und Rückbuchungen inklusive.
02Die Besucher-ID in customData übergeben
Wo du den Checkout mit Paddle.js öffnest, lies das Cookie _tally_vid und übergib es als tally_visitor_id in customData. Paddle behält es an der Transaktion und kopiert es ins Abo, Verlängerungen folgen also. Eine Transaktion, die dein Server erstellt, nimmt es in custom_data auf.
// 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 });
});
04Prüfen, ob es geklappt hat
05Was nicht gelesen wird
Fehlt etwas, oder sieht es bei dir anders aus? Schreib an support@tallybyoutpost.com und nenne die Seite.