CtrlK
BlogDocsLog inGet started
Tessl Logo
SkillPublic

paddle-customer-portal

Mint a Paddle customer portal session URL from a Next.js Server Action — the portal-vs-custom-billing-screen trade-off, auth, ownership, URL structure (overview vs deep links), and the security model.

63

Quality

79%

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/codex/plugin/skills/customer-portal/SKILL.md

The canonical home for this skill is paddle-customer-portal 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.

A highly actionable, well-validated guide with copy-paste-ready code and an explicit verification checklist. Its weaknesses are structural repetition of the security guidance across three sections and a monolithic single-file layout that inlines reference-grade material (Supabase helpers, decision-table) instead of splitting it out.

Suggestions

State each security rule once: keep the numbered "Security model" section as the canonical statement and trim the duplicated commentary from the code comments and "Common pitfalls" entries (e.g. the customerId-from-input warning appears in all three places).

Move the ~50 lines of generic Supabase client boilerplate to a reference file (or to the sibling skill that already documents them), keeping only the service-role client note about cookies/RLS that is specific to this skill's security model.

Trim the client button example ("The client component calling this is trivial") to a two-line snippet showing only the onClick redirect pattern, cutting the boilerplate component wrapper.

DimensionReasoningScore

Conciseness

The three core security rules (auth before anything, customerId resolved server-side not from input, return only the URL) each appear three times — in the Server Action's comments, the "Security model" section, and "Common pitfalls" — and ~50 lines of Supabase helper boilerplate are inlined even though the skill says to skip them if equivalents exist. Not score 4 because the repetition and inline boilerplate go beyond minor trimmable instances; not score 2 because there is no padding that explains concepts Claude already knows.

3 / 5

Actionability

Fully executable, copy-paste-ready code throughout: the complete Server Action with imports, auth check, DB lookup, ApiError handling; both Supabase client helpers; env-var setup; and the client button component. Specific examples cover the common cases, including the no-customer and deep-link variants.

5 / 5

Workflow Clarity

The Server Action is annotated with a numbered 1-5 sequence, and the "Verify the integration" section is a 6-item validation checklist with expected outcomes including negative cases (logged out returns "Not authenticated", no customer returns "No Paddle customer", SDK not called). Error recovery is explicit: ApiError becomes a user-facing message, anything else is rethrown. Not a destructive/batch operation, so no validation cap applies.

5 / 5

Progressive Disclosure

A single ~240-line file with clear section headers and well-signaled external Paddle doc links, but content that belongs in separate files is inlined: the ~50-line generic Supabase helper boilerplate and the portal-vs-custom comparison table. No bundle files (references/, scripts/, assets/) exist at all. Not score 4 because the SKILL.md goes well beyond overview scope with detail that should be split out; not score 2 because sections are clear and navigable, not buried.

3 / 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, distinctive description with concrete action and good keyword coverage, weakened by the absence of any explicit "Use when..." trigger clause and missing natural user phrasings like "manage subscription" or "billing portal".

Suggestions

Add a "Use when..." clause with concrete triggers, e.g. "Use when a user clicks 'Manage subscription' and you want Paddle to host the billing self-service UI (viewing invoices, updating payment methods, canceling subscriptions) rather than building a custom billing screen."

Include natural trigger phrases users would actually say: "manage subscription", "billing portal", "Paddle dashboard", "cancel subscription link" — these are the phrases that should route to this skill.

DimensionReasoningScore

Specificity

"Mint a Paddle customer portal session URL from a Next.js Server Action" names a concrete action, and the trailing clause enumerates the specific topics covered (auth, ownership, URL structure, security model). It stops short of score 5 because it lists one concrete action plus topic areas rather than multiple distinct concrete actions.

4 / 5

Completeness

The "what" is explicit (mint a Paddle customer portal session URL from a Next.js Server Action), but there is no "Use when..." clause or equivalent explicit trigger guidance, so "when" is only weakly implied by the topic list. Per the rubric guideline, a missing explicit trigger clause caps completeness at 3.

3 / 5

Trigger Term Quality

Natural terms users would say are present: "Paddle customer portal", "session URL", "Next.js", "billing". A few common phrasings are missing — "manage subscription", "billing portal link", "invoices", "payment method" — which keeps it below comprehensive synonym coverage.

4 / 5

Distinctiveness Conflict Risk

"Paddle customer portal session URL from a Next.js Server Action" carves out a clear niche with distinct triggers; the explicit portal-vs-custom-billing-screen framing further distinguishes it from sibling skills like subscription-cancel/subscription-update. Minimal conflict risk.

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/codex/plugin/skills/customer-portal/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.