Paddle
GET transactions with transaction.read. Amounts are minor-unit strings. Paging is a cursor.
What you can track
Completed transactions: sum of details.totals.total by created_at, for the user’s own Paddle Billing account (not tlly’s subscription). One page is at most 30 (per_page default 30, maximum 30). The next page is after, a Paddle id in meta.pagination.next, not a number. tlly will not follow that cursor. Say that the series is the latest page only, or push a daily total.
This is separate from tlly’s own Paddle checkout. Do not point this job at tlly’s billing.
Credential
A Paddle API key (pdl_live_apikey_… or pdl_sdbx_apikey_…), Bearer. Permission: transaction.read. Do not grant write permissions. Set an expiry. The key is shown once.
Host: api.paddle.com for live, sandbox-api.paddle.com for sandbox. Suggested name: PADDLE_KEY. The secret’s host must match the URL.
Where to get it
Paddle → My account → Settings → Authentication → API keys → New API key. Authentication.
tlly job
details.totals.total is a string in the currency’s minor unit (“10 USD = 1000”). Scale by 0.01 for dollars. Filter status=completed in the query so drafts are not summed. Confirm the path in test_job; the list reference describes details.totals.total as that string.
{"series":"paddle_revenue","cron":"0 7 * * *","request":{"url":"https://api.paddle.com/transactions?status=completed&per_page=30","headers":{"Authorization":"Bearer {{secret:PADDLE_KEY}}"}},"extract":{"format":"json","items":"data","date":"created_at","value":"details.totals.total","aggregate":"sum"},"transform":[{"op":"scale","factor":0.01}]}
Gotchas
- More than 30 completed transactions in the window you care about will be truncated. Do not set request.pages with a made-up page number.
- Mixed currencies must not be summed. currency_code is on the transaction.
- Legacy 50-character keys have no permissions. Prefer a new key.
- Client-side tokens (pdl_… that are not apikey) cannot call this.
Alert ideas
Red when completed revenue for the latest day is zero. Yellow when a past-due count (only if you preview a status you can count) is above zero.
Verification
Checked 2026-10-26: Bearer auth, key format, the settings path, and permission selection. GET /transactions, transaction.read, per_page max 30, after cursor, and minor-unit strings on details.totals.total. The sandbox host is the one tlly’s own billing code uses for PADDLE_ENV=sandbox (https://sandbox-api.paddle.com); the list page fetched was the live reference.