CtrlK
BlogDocsLog inGet started
Tessl Logo
SkillPublic

paddle-subscription-cancel

Cancel a Paddle subscription from a Next.js Server Action — auth, ownership check, safe `effectiveFrom` default, revalidation, and the `canceled` vs `scheduledChange` distinction.

Quality

77%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

Medium

Suggest reviewing before use

Fix and improve this skill with Tessl

tessl review fix ./providers/claude/plugin/skills/subscription-cancel/SKILL.md

The canonical home for this skill is paddle-subscription-cancel in PaddleHQ/paddle-agent-skills

SKILL.md
Quality
Evals
Security

Quality

Content

73%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 executable skill: complete Server Action code with auth/ownership checks, a full undo path, a clear event-timeline explanation, and an unusually thorough verification checklist. Its weaknesses are moderate redundancy between the pitfalls section and inline code comments, inlined Supabase boilerplate, and a fully single-file layout with no reference split.

Suggestions

Trim the "Common pitfalls" bullets that restate the inline code comments (effectiveFrom default, revalidatePath, slim DTO) — the table and numbered comments already carry that guidance.

Move the Supabase helper implementations to a reference file (e.g., references/supabase-helpers.md), keeping a one-line pointer in SKILL.md since they match the Paddle starter kit and are likely already present in the user's project.

Make `undoCancelSubscription` fully self-contained (inline the auth and ownership checks) or at least reference a named shared helper, so the second action is copy-paste ready like the first.

DimensionReasoningScore

Conciseness

Mostly efficient and rich in domain knowledge Claude doesn't have (effectiveFrom semantics, the 30-minute lock, the webhook event timeline, paused-subscription 400 behavior), but noticeably tighten-able: the "Common pitfalls" bullets re-explain what the inline code comments already state ("Defaulting to `effectiveFrom: 'immediately'`", "Missing `revalidatePath`", "Returning the raw `Subscription`"), and ~45 lines of Supabase helper boilerplate are fully inlined. Matches the 'mostly efficient but includes some unnecessary explanation or could be tightened' anchor rather than the minor-trim score of 4.

3 / 5

Actionability

The full `cancelSubscription` Server Action is complete, executable code with imports, an error-code map, and a slim DTO; verification steps state expected outputs ("Return `{ success: true, status: 'active', scheduledChange: '<some date>' }`"). Minor gaps keep it from a 5: `undoCancelSubscription` elides steps ("1–2. Run the same auth and ownership checks as cancelSubscription") rather than including them, and `getPaddleInstance` is imported but never defined here. Well above the pseudocode level of a 3.

4 / 5

Workflow Clarity

The action is sequenced with explicit numbered steps ("1. Authenticate. Reject anonymous requests..." through "6. Turn Paddle API errors into a message the UI can show; rethrow anything else"), error recovery is built in via `CANCEL_ERRORS` mapping plus rethrow of non-ApiError failures, and "Verify the integration" is a 7-step checklist including negative tests ("Try the action while logged out (or with a forged `subscriptionId`)") and expected webhook outcomes. Validation checkpoints are explicit and comprehensive, fitting the score-5 anchor; the destructive-operation cap does not apply since undo and verification are provided.

5 / 5

Progressive Disclosure

No bundle files exist (references/, scripts/, assets/ are absent), and the ~250-line body is a single well-sectioned file with clear headers and well-signaled external links (sibling skills, Paddle docs, the starter-kit reference implementation). Structure and navigation are good — matching 'good structure; most content is appropriately placed; references mostly clear' — but the score-5 'content appropriately split' anchor isn't met: nothing is split out, and material like the Supabase helpers or pitfalls could live in a reference file.

4 / 5

Total

16

/

20

Passed

Description

70%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 specific, well-differentiated description with strong natural trigger terms for its niche, weakened by the absence of an explicit 'Use when...' clause, which caps completeness. Adding a trigger clause and a few synonyms (e.g., 'unsubscribe', 'end subscription') would round it out.

Suggestions

Add an explicit 'Use when...' clause, e.g., 'Use when building a cancel-subscription button on a Next.js billing or account page, or when the user mentions canceling/unsubscribing a Paddle subscription.'

Include common synonyms such as 'unsubscribe' or 'end subscription' so the description matches how users naturally phrase the request.

Consider mentioning the undo/scheduled-change reversal capability to close the coverage gap in the 'what' enumeration.

DimensionReasoningScore

Specificity

The description names the core action ("Cancel a Paddle subscription from a Next.js Server Action") plus several concrete supporting elements ("auth, ownership check, safe `effectiveFrom` default, revalidation, and the `canceled` vs `scheduledChange` distinction"), matching the 'lists several specific actions; minor gaps in coverage' anchor. Not 5 because coverage has gaps — undoing a scheduled cancellation and the portal/Retain alternatives covered in the body are not mentioned.

4 / 5

Completeness

The 'what' is clear ("Cancel a Paddle subscription from a Next.js Server Action — auth, ownership check, safe `effectiveFrom` default..."), but there is no explicit 'Use when...' clause or equivalent trigger guidance; the 'when' is only weakly implied by the action itself. Per the judging guideline, a missing 'Use when...' clause caps completeness at 3 — it has a clear 'what' but 'when' is only implied, matching the score-3 anchor exactly.

3 / 5

Trigger Term Quality

Includes natural phrases users would say for this task: "Cancel", "Paddle subscription", "Next.js", "Server Action" — good keyword coverage per the anchor. Not 5 because common synonyms like "unsubscribe", "end subscription", or "stop billing" are missing; not 3 because the terms present go beyond merely 'some relevant keywords'.

4 / 5

Distinctiveness Conflict Risk

"Cancel a Paddle subscription from a Next.js Server Action" carves out a clear niche with distinct triggers (Paddle + subscription + cancel + Next.js Server Action), with minimal conflict risk — sibling skills in this family (sync, webhooks, portal) cover different operations. It fits the 'clear niche with distinct triggers; minimal conflict risk' anchor; the enumerated specifics (effectiveFrom, scheduledChange) further distinguish it.

5 / 5

Total

16

/

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/claude/plugin/skills/subscription-cancel/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.