CtrlK
BlogDocsLog inGet started
Tessl Logo
SkillPublic

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, on-demand invoice PDF links, and formatting raw transaction totals (lowest-unit conversion + Intl.NumberFormat, with the zero-decimal currency special case for JPY/KRW/VND/CLP).

64

Quality

81%

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

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

SKILL.md
Quality
Evals
Security

Quality

Content

77%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.

An actionable, well-verified skill: complete copy-paste code, a strong security model (server-side customer resolution, ownership checks), and an explicit validation checklist. Weaknesses are repetition of a few key warnings and a monolithic structure that inlines material (Supabase helpers, formatting details) better suited to one-level-deep reference files.

Suggestions

State each warning once: the zero-decimal currency rule and the customer-id security guarantee each appear in three places — keep the canonical statement in its main section and reference it from 'Common pitfalls'.

Move the Supabase client helper implementations and the currency/formatting deep dive into a references/ file (e.g. references/formatting.md), keeping SKILL.md's section headers as one-level-deep pointers.

Trim the ~45-line Supabase boilerplate to the naming gotcha and a link to the starter-kit file it mirrors, since the wrapper code itself is standard @supabase/ssr usage.

DimensionReasoningScore

Conciseness

The body is dense with genuinely non-obvious Paddle knowledge (TransactionCollection semantics, grandTotal vs total, zero-decimal currencies), but key points are repeated three times (zero-decimal currency in the code comment, 'Common formatting traps', and 'Common pitfalls'; the customer-id security guarantee likewise appears three times), and ~45 lines of standard Supabase client setup boilerplate are inlined. This fits 'mostly efficient but includes some unnecessary explanation or could be tightened' rather than the minor-trimming anchor at 4.

3 / 5

Actionability

Every stage ships complete, executable TypeScript: the full Server Action with imports, the on-demand invoice action, the entire parse-money utility, the load-more client component, and the env var block. The code is copy-paste ready and covers the common cases (empty customer, logged-out, cross-customer access), matching the fully-executable anchor.

5 / 5

Workflow Clarity

The implementation flow is coherent (when-to-use, build-vs-portal decision, prerequisites, list mechanics, full action, then display concerns), with numbered inline comments (1-6) sequencing the action, and an explicit 8-step 'Verify the integration' checklist that includes a critical cross-customer isolation check and expected-error cases. This matches the clear-sequence-with-explicit-validation anchor; the read-only nature of the skill means the destructive-operation cap does not apply.

5 / 5

Progressive Disclosure

No bundle files exist (references/, scripts/, assets/ are absent), and the ~450-line body is a single monolithic file. Section headers are clear, but content that would fit reference files — the Supabase helper implementations, the status-meaning table, and the currency-formatting deep dive — is inlined in SKILL.md. This fits 'some structure but content that should be separate is inline' rather than the minimal-structure anchor at 2, since internal navigation is genuinely good.

3 / 5

Total

16

/

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 comprehensively enumerates the skill's capabilities in third person. Its main weakness is the absence of an explicit 'Use when...' trigger clause, which caps completeness, and a few missing natural synonyms for billing history.

Suggestions

Add an explicit trigger clause, e.g. 'Use when adding a billing history or invoices section to an authenticated user's account page in a Next.js app using Paddle.'

Include common user phrasings such as 'payment history', 'past transactions', or 'charges' alongside 'billing history' to broaden trigger coverage.

Briefly distinguish from the hosted alternative (e.g. 'for a custom in-app view; use customer-portal for Paddle's hosted UI') to further reduce overlap risk.

DimensionReasoningScore

Specificity

The description enumerates six concrete capabilities ("listing transactions via the Paddle Node SDK", "the mandatory customer-id filter", "pagination via .next()/.hasMore", "status filtering", "on-demand invoice PDF links", "formatting raw transaction totals") with comprehensive coverage of the skill's scope. It clearly matches the anchor for multiple specific concrete actions rather than the score-4 anchor, which anticipates minor coverage gaps.

5 / 5

Completeness

The 'what' is explicit and detailed, but there is no 'Use when...' clause or equivalent explicit trigger guidance; the when-to-use context is only weakly implied by the Next.js framing. Per the rubric guideline, a missing explicit trigger clause caps completeness at 3.

3 / 5

Trigger Term Quality

Natural terms like "billing history", "invoice PDF", "transactions", "Next.js", and "Paddle" are present, but common synonyms a user might say — "payment history", "charges", "receipts" — are missing. This fits the 'good keyword coverage; a few natural terms missing' anchor, short of the comprehensive-synonyms anchor.

4 / 5

Distinctiveness Conflict Risk

The description occupies a clear niche — rendering a customer's Paddle transaction history in Next.js with specific SDK mechanics (.next()/.hasMore, lowest-unit conversion) — so it is unlikely to trigger for unrelated skills. It matches the 'clear niche with distinct triggers' anchor; at most a sibling customer-portal skill shares Paddle billing context, but the triggers (building your own billing-history listing) remain distinct.

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

Path

providers/codex/plugin/skills/billing-history/SKILL.md

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.