CtrlK
BlogDocsLog inGet started
Tessl Logo
SkillPublic

paddle-subscription-update

Change a Paddle subscription's plan from a Next.js Server Action — auth, ownership check, `prorationBillingMode`, items-array replace semantics, preview-before-commit, and `on_payment_failure` handling.

74

1.14x
Quality

78%

Does it follow best practices?

Impact

100%

1.14x

2 of 3 eval scenarios. Add 1 more for a full score.

SecuritybySnyk

Medium

Suggest reviewing before use

Fix and improve this skill with Tessl

tessl review fix ./skills/subscription-update/SKILL.md
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.

An expertly actionable, Paddle-specific guide: complete executable code, exact API values, error-code handling, and an outstanding verification checklist give it top marks for workflow clarity and near-top actionability. Its costs are token efficiency and progressive disclosure — generic Supabase boilerplate and repeated pitfalls content are inlined in a 333-line monolith with no reference files, where splitting shared helpers into a referenced file would serve both.

Suggestions

Move the Supabase client helpers (server.ts / server-internal.ts) into a shared reference file (e.g. references/supabase-helpers.md) since the skill itself says they mirror the Paddle starter kit and are shared with subscription-cancel, and keep only the security-relevant notes (RLS bypass, no cookies) inline.

Trim the "Common pitfalls" entries that restate guidance already covered in the proration-mode, items-replacement, and mixed-interval sections — keep pitfalls to the failure modes not previously explained (e.g. optimistic UI with apply_change).

Show the `getPaddleInstance` helper inline (it is one line of SDK initialization) and either define the `PricingTier` validation constant referenced in verification step 8 or drop that aside, so every symbol in the code is self-contained.

DimensionReasoningScore

Conciseness

Mostly efficient: the `prorationBillingMode` decision tables, status constraints, error codes, and `onPaymentFailure` semantics are Paddle-specific knowledge Claude cannot reliably be assumed to know, so those tokens earn their place. But ~50 lines of generic Supabase client boilerplate (the skill itself concedes "if your project already has equivalent helpers, use those instead") and notable duplication between the main sections and "Common pitfalls" (the mixed-interval rule appears at both "Same-billing-interval rule" and "Mixed billing intervals on items"; credit-not-refund appears in both the flow table and pitfalls) push it past the level-4 anchor. It is not level 2 because the majority of the body is dense, non-obvious domain content rather than padding.

3 / 5

Actionability

The body delivers a complete, copy-paste-ready Server Action ("use server", imports, auth check, ownership check via the email bridge, trialing-aware `prorationBillingMode`, `revalidatePath`, a slim DTO, and an `ApiError`-to-message map), an executable `previewUpdate` snippet, and an `onPaymentFailure: 'apply_change'` variant — concrete code with exact API values throughout. It stops short of level 5 because `getPaddleInstance` is imported from "@/utils/paddle/get-paddle-instance" and a `PricingTier` constant is invoked in verification step 8, yet neither is shown anywhere in the skill — minor gaps an implementer must fill from elsewhere. It is well above level 3: nothing shown is pseudocode or hand-waving.

4 / 5

Workflow Clarity

The workflow is clearly sequenced with explicit validation checkpoints: prerequisites and env vars, decision tables for proration mode and subscription status, "Preview before committing" as an explicit pre-commit checkpoint ("Don't try to compute the prorated amount yourself — the preview is the source of truth"), numbered steps 1–6 inside the action with auth rejected "before any DB query or SDK call", error-recovery feedback loops (declined payment → retry message; renewal lock → try again after renewal; rate limit → back off), and a 9-step "Verify the integration" checklist covering declining test cards, trialing subscriptions, invalid price IDs, and forged/anonymous access. This matches the level-5 anchor (clear sequence, explicit validation, feedback loops, checklist).

5 / 5

Progressive Disclosure

Section organization is good (clean headers, tables, and a clearly labeled one-level-deep "Related docs" list of external Paddle links), but this is a 333-line single-file skill with no references/scripts/assets bundle at all. Content that clearly belongs in a separate file is inlined — most notably the Supabase client helpers, which the text says are shared with `subscription-cancel` and match the Paddle starter kit, and therefore would be duplicated across sibling skills. That fits the level-3 anchor (some structure, content that should be separate is inline); it is not level 2 because structure and navigation within the file are strong, and not level 4 because at this length, with shared boilerplate inlined, the organization gaps exceed "minor".

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, well-scoped description that names six concrete capabilities in a distinct niche with no first/second-person voice issues. Its main weakness is the absence of an explicit "Use when..." trigger clause and of natural user phrasings like "upgrade" or "switch tier", which cap completeness and trigger-term quality below the top anchors.

Suggestions

Add an explicit trigger clause, e.g. "Use when building 'Upgrade plan', 'Switch tier', or 'Change subscription' actions in a Paddle + Next.js billing UI."

Include natural user-facing synonyms — upgrade, downgrade, switch tier, proration — alongside the API field names so the description matches how users phrase the request.

Optionally note the sibling-skill boundary (webhook sync, cancellation) in one clause to further reduce overlap ambiguity.

DimensionReasoningScore

Specificity

The description lists six concrete, named actions for a clearly identified domain: "auth, ownership check, `prorationBillingMode`, items-array replace semantics, preview-before-commit, and `on_payment_failure` handling" on top of "Change a Paddle subscription's plan from a Next.js Server Action". This is comprehensive coverage of the capability surface, matching the level-5 anchor (multiple specific concrete actions) rather than level 4 (minor gaps) or level 3 (only 1-2 actions). Voice is third person, so no specificity penalty applies.

5 / 5

Completeness

The "what" is clear and concrete (change a Paddle subscription's plan from a Next.js Server Action, with the enumerated sub-capabilities), but there is no "Use when..." clause or equivalent explicit trigger guidance — the "when" is only weakly implied by naming the stack. Per the judging guidelines, a missing explicit trigger clause caps completeness at 3; it is not 4 because the when-condition is never stated, and not 2 because the what is specific rather than vague.

3 / 5

Trigger Term Quality

Good keyword coverage: "Change a Paddle subscription's plan", "Next.js Server Action", plus searchable API terms (`prorationBillingMode`, `on_payment_failure`) that a developer stuck on this exact problem would use. A few natural terms are missing — "upgrade", "downgrade", "switch tier", "billing" — which the body itself names as the user-facing flows, so it stops short of the level-5 comprehensive-coverage anchor but sits above level 3 (missing common variations).

4 / 5

Distinctiveness Conflict Risk

"Change a Paddle subscription's plan from a Next.js Server Action" carves out a clear niche: a specific vendor (Paddle), a specific framework mechanism (Next.js Server Action), and a specific operation (plan change on an existing subscription). Trigger overlap with other skills is minimal — at most the sibling subscription-sync/cancel skills it distinguishes itself from — matching the level-5 anchor (clear niche with distinct triggers).

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

skills/subscription-update/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.