CtrlK
BlogDocsLog inGet started
Tessl Logo

paddle-webhooks

Receive and verify Paddle webhooks in a Next.js Route Handler — signature verification, idempotency, retry semantics, and local testing.

85

1.13x
Quality

78%

Does it follow best practices?

Impact

99%

1.13x

Average score across 3 eval scenarios

SecuritybySnyk

Medium

Suggest reviewing before use

Fix and improve this skill with Tessl

tessl review fix ./providers/codex/plugin/skills/webhooks/SKILL.md

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

SKILL.md
Quality
Evals
Security

Quality

Content

81%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 exceptionally actionable skill with complete executable code and a genuine verify-with-feedback-loop workflow, weakened only by token efficiency — the retry-semantics rule is restated many times and MCP conventions are repeated as detours. Structure is solid but the ~320-line monolith could split its conventions/pitfalls detail into reference files.

Suggestions

State the "only 2xx means delivered; every non-2xx retries on the same budget" rule once in "The delivery contract" and have the Step 3 code comment and pitfalls reference it rather than restate it.

Move the Paddle MCP conventions blockquote and the MCP callouts (Steps 1 and the verify section) into a separate reference file (e.g. references/paddle-mcp.md), linked once, to cut a substantial detour from the core webhook flow.

Merge the overlapping pitfalls "Returning 2xx on a failed verification" and "Splitting the catch into..." into one entry, since both argue the same single non-2xx policy.

DimensionReasoningScore

Conciseness

Mostly dense and useful (no basic-concept padding), but the core "only 2xx means delivered / every non-2xx retries" point is repeated roughly five times — in "The delivery contract", the Step 3 intro, the inline code comments, the post-code "Why a single catch..." paragraph, and twice in "Common pitfalls" — which is unnecessary explanation that could be tightened. It is not a 4 because the duplication is substantive, not minor trimming, and the large MCP-conventions blockquote is a repeated detour from the skill's core task.

3 / 5

Actionability

Fully executable, copy-paste-ready code: the Route Handler, the SDK helper, the event router with typed imports, the UPSERT shape, the event-id ledger, the SQL table definition, plus concrete commands ("npm install @paddle/paddle-node-sdk", "ngrok http 3000") and exact env vars. It is not a 4 because the common cases (verify, route, dedupe, ack) are completely covered, with only intentionally-left TODO stubs for app-specific persistence.

5 / 5

Workflow Clarity

Steps 1–6 are clearly sequenced (create destination → SDK helper → route handler → event routing → idempotency → queue heavy work) and the "Verify the integration" section provides an explicit validation feedback loop: run a simulation, confirm the 200 in the dashboard logs, deliberately tamper the secret, confirm the non-2xx and queued retry, then restore the secret and confirm the retry succeeds. This matches the top anchor with validation checkpoints and error-recovery steps.

5 / 5

Progressive Disclosure

The single SKILL.md has clean, well-labeled sections (delivery contract, prerequisites, steps 1–6, local testing, pitfalls, verify, related docs) with one-level-deep references to official docs and sibling skills, making navigation easy. It is not a 5 because there are no bundle files at all while the file is ~320 lines — the MCP conventions blockquote, the retry-schedule details, and the pitfalls catalog are candidates for separate reference files — and not a 3 because the structure that is present is genuinely good and everything is discoverable in one pass.

4 / 5

Total

17

/

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, third-person description with strong action coverage and low conflict risk, but it omits any explicit "when to use" trigger clause, which caps its completeness. Adding a "Use when building a Paddle webhook endpoint in Next.js..." sentence would raise it to the top anchor tier.

Suggestions

Append an explicit trigger clause, e.g. "Use when setting up a Paddle webhook endpoint, verifying webhook signatures, or handling Paddle subscription/transaction events in a Next.js app."

Include natural user phrasings such as "webhook endpoint", "incoming Paddle events", or "notification destination" to broaden trigger coverage.

DimensionReasoningScore

Specificity

The description lists multiple concrete, domain-anchored actions — "Receive and verify Paddle webhooks", "signature verification, idempotency, retry semantics, and local testing" — scoped to "a Next.js Route Handler", matching the comprehensive-coverage anchor. It is not the level below (4) because there is no meaningful gap in the action inventory for this domain.

5 / 5

Completeness

The "what" is explicit and clear (receive, verify, handle retries/idempotency, test locally), but there is no "Use when..." clause or equivalent explicit trigger guidance — the rubric guidelines cap completeness at 3 in that case. It is not a 2 because the "what" is fully concrete rather than vague, and not a 4 because the "when" is entirely absent rather than merely weakly implied.

3 / 5

Trigger Term Quality

Good natural keyword coverage: "Paddle webhooks", "signature verification", "idempotency", "retry semantics", "local testing" are phrases a user would naturally say. It falls short of the 5 anchor because common variations like "webhook endpoint", "notifications", or "handle incoming webhooks" are absent, so a few natural entry phrases are missing.

4 / 5

Distinctiveness Conflict Risk

"Paddle webhooks in a Next.js Route Handler" carves out a clear niche with distinct triggers (Paddle-specific, webhook-specific, Next.js-specific), so the risk of triggering for the wrong skill is minimal. A neighboring skill like a general Next.js API skill would not match these 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
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.