Receive and verify Paddle webhooks in a Next.js Route Handler — signature verification, idempotency, retry semantics, and local testing.
87
80%
Does it follow best practices?
Impact
99%
1.13xAverage score across 3 eval scenarios
Advisory
Suggest reviewing before use
Fix and improve this skill with Tessl
tessl review fix ./skills/webhooks/SKILL.mdWebhook route handler with signature verification
SDK singleton file location
100%
100%
Imports from correct package
50%
87%
LogLevel.error set
0%
100%
PADDLE_API_KEY guard
100%
100%
Route handler location
100%
100%
Raw body read with request.text()
100%
100%
Reads paddle-signature header
100%
100%
400 for missing inputs only
37%
100%
Uses unmarshal for verification
100%
100%
Single catch, single non-2xx
30%
100%
No 2xx on verification failure
100%
100%
WEBHOOK_SECRET from env
100%
100%
TypeScript event routing with idempotent handlers
Correct output file path
66%
100%
Imports from @paddle/paddle-node-sdk
100%
100%
EventName enum for routing
100%
100%
Typed handler parameters
100%
100%
Handles all 6 event types
100%
100%
Default case returns without throwing
100%
100%
UPSERT idempotency strategy
100%
100%
eventId for non-idempotent effects
100%
100%
DESIGN.md explains type narrowing
100%
100%
No string literal comparisons
100%
100%
processEvent accepts EventEntity
100%
100%
Fast acknowledgment with background queue pattern
Raw body via request.text()
100%
100%
unmarshal for verification
0%
100%
PDF generation is queued
100%
100%
Email sending is queued
100%
100%
Paddle API call is queued
100%
100%
Fast 200 acknowledgment
100%
100%
Verify then queue pattern
100%
100%
Non-2xx catch block
37%
100%
ARCHITECTURE.md: 5-second constraint
100%
100%
ARCHITECTURE.md: queue rationale
100%
100%
enqueueJob used correctly
100%
100%
72e6fdf
Table of Contents
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.