CtrlK
BlogDocsLog inGet started
Tessl Logo

paddle-billing-history

Render the authenticated user's billing history in Next.js — listing transactions via the Paddle Node SDK, the mandatory customer-id filter, pagination via `.next()`/`.hasMore`, status filtering, and formatting raw transaction totals (lowest-unit conversion + Intl.NumberFormat, with the zero-decimal currency special case for JPY/KRW/CLP).

62

Quality

72%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide

SecuritybySnyk

Passed

No findings from the security scan

Fix and improve this skill with Tessl

tessl review fix ./providers/cursor/plugin/skills/billing-history/SKILL.md

The canonical home for this skill is paddle-billing-history in PaddleHQ/paddle-agent-skills

SKILL.md
Quality
Evals
Security

Quality

Content

70%Weight 40%Scale 1-5

Reviews the quality of instructions and guidance provided to agents. Good implementation is clear, handles edge cases, and produces reliable results.

A strong, highly actionable single-file skill: executable code, a clear operation sequence, and explicit verification including a security-scoping check. Its weaknesses are redundancy (the same three pitfalls restated across three sections) and a monolithic structure with no offloading of detail into reference files.

Suggestions

Merge 'Common formatting traps' into 'Common pitfalls' (or vice versa) — the zero-decimal-currency and summing-line-items warnings currently appear nearly verbatim in both places, plus a third time in the formatting section.

Move the parse-money helper implementations and the status-filter table into a references/ file and link to them from the body, keeping SKILL.md as an overview.

Complete the client pagination snippet — define the Props type and replace items.map(/* render */) with a minimal render so the example is copy-paste runnable like the rest of the skill.

DimensionReasoningScore

Conciseness

The body is dense with genuinely non-obvious Paddle-specific knowledge (the customerId filter as a security guarantee, TransactionCollection not being an array, no formattedTotals on Transaction), but key points are repeated at length: the JPY/KRW/CLP zero-decimal rule appears three times ('format the raw amount', 'Common formatting traps', 'Common pitfalls'), the summing-line-items warning twice, and the mandatory customerId filter three times. Merging the overlapping 'Common formatting traps' and 'Common pitfalls' sections would tighten the document.

3 / 5

Actionability

The full Server Action, parse-money helpers, and status table are complete and copy-paste ready, and the 'Verify the integration' steps are concrete. Minor gaps: the client component leaves `items.map(/* render */)` and an undefined `Props` type as placeholders, and it imports `get-paddle-instance` whose implementation is not shown here.

4 / 5

Workflow Clarity

The action is sequenced with numbered, commented steps (authenticate → resolve customer_id → list → fetch one page → map DTO), the 'Verify the integration' section provides explicit checkpoints including a security check ('Confirm those transactions do NOT appear in the response') and an error-recovery path ('if "error" in result'). This is a read-only operation, so the destructive/batch cap does not apply.

5 / 5

Progressive Disclosure

No bundle files exist, so everything (~280 lines) is inlined in a single SKILL.md: the full parse-money implementation, the status-filter table, and two overlapping pitfall sections. Section headers are clear and navigation is easy, but content that would naturally live in a references/ file (the formatting helpers, the pitfalls catalog) is inline, and the body relies on sibling skill names (subscription-sync, webhooks, pricing-pages) that are not present in this bundle.

3 / 5

Total

15

/

20

Passed

Description

75%Weight 40%Scale 1-5

Based on the skill's description, can an agent find and select it at the right time? Clear, specific descriptions lead to better discovery.

A highly specific, distinctive description that names concrete mechanisms down to the JPY/KRW/CLP edge case. Its one structural gap is the absence of any explicit 'Use when...' trigger, which both caps completeness and leaves natural user phrasings like 'invoices' and 'payment history' unsurfaced.

Suggestions

Append an explicit trigger clause, e.g. 'Use when adding a billing history, invoices, or past-payments section to a Next.js account page using Paddle.'

Add natural synonyms users would say — 'invoices', 'payments', 'charges' — rather than only the technical terms 'transactions' and 'totals'.

DimensionReasoningScore

Specificity

Multiple concrete, specific actions are enumerated: 'listing transactions via the Paddle Node SDK', 'the mandatory customer-id filter', 'pagination via .next()/.hasMore', 'status filtering', 'formatting raw transaction totals (lowest-unit conversion + Intl.NumberFormat, with the zero-decimal currency special case for JPY/KRW/CLP)'. Nothing is generic; each capability names the exact mechanism, including the edge case.

5 / 5

Completeness

The 'what' is clearly and comprehensively answered, but there is no 'Use when...' clause or equivalent explicit trigger guidance anywhere in the description — usage context is only weakly implied by 'Render the authenticated user's billing history'. Per the judging guidelines, a missing explicit trigger caps completeness at 3; it is not a 2 because the 'what' half is detailed and concrete.

3 / 5

Trigger Term Quality

Good natural keywords: 'billing history', 'transactions', 'Paddle', 'Next.js', and concrete technical terms like 'customer-id filter'. But common user phrasings such as 'invoices', 'payments', 'charges', or 'download receipts' are missing — the body shows the skill covers an 'Invoices' section, which the description never surfaces.

4 / 5

Distinctiveness Conflict Risk

A clear niche with minimal conflict risk: 'Paddle Node SDK' + 'billing history' + 'Next.js' pins it to one vendor's transaction-listing workflow and distinguishes it from sibling skills like customer-portal, pricing-pages, or subscription-sync. It is not a 4, because the mention of the customer-id filter, .next()/.hasMore pagination, and lowest-unit formatting leaves essentially no overlap with any other plausible skill.

5 / 5

Total

17

/

20

Passed

Validation

100%

Checks the skill against the spec for correct structure and formatting. All validation checks must pass before discovery and implementation can be scored.

Validation — 16 / 16 Passed

Validation for skill structure

No warnings or errors.

Repository
PaddleHQ/paddle-agent-skills
Reviewed

Table of Contents

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.