Cloudflare
Cloudflare Workers
Framework — Cloudflare Workers

Webhook verification
at the edge.

Web Crypto API native. No Node.js dependencies. Runs in V8 isolates across Cloudflare's global network.

$ npm i @hookflo/tern
src/index.ts
import { createWebhookHandler } from '@hookflo/tern/cloudflare'
export interface Env {
WEBHOOK_SECRET: string
QSTASH_TOKEN: string
QSTASH_CURRENT_SIGNING_KEY: string
QSTASH_NEXT_SIGNING_KEY: string
[key: string]: unknown
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const handler = createWebhookHandler({
platform: 'stripe',
secret: env.WEBHOOK_SECRET, // ← env, not process.env
handler: async (payload) => {
return { received: true }
}
})
return handler(request, env) // ← pass env as second arg
}
}

Up and running
in three steps.

1
Create a worker
npm create cloudflare@latest my-webhook-worker cd my-webhook-worker npm i @hookflo/tern
2
Write your handler
# See the code examples below
3
Deploy
npx wrangler dev # local testing npx wrangler deploy # production
src/index.ts
import { createWebhookHandler } from '@hookflo/tern/cloudflare'
export interface Env {
WEBHOOK_SECRET: string
QSTASH_TOKEN: string
QSTASH_CURRENT_SIGNING_KEY: string
QSTASH_NEXT_SIGNING_KEY: string
[key: string]: unknown
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const handler = createWebhookHandler({
platform: 'stripe',
secret: env.WEBHOOK_SECRET, // ← env, not process.env
handler: async (payload) => {
return { received: true }
}
})
return handler(request, env) // ← pass env as second arg
}
}

Next.js vs
Cloudflare Workers.

PropertyNext.jsCloudflare Workers
RuntimeNode.jsV8 isolates
Env varsprocess.envenv parameter
queue: true
Import/nextjs/cloudflare
handler args(request)(request, env)
CryptoNode cryptoWeb Crypto API
DeployVercelwrangler deploy

Verify webhooks
at the edge.

Open source · MIT licensed · Built at Hookflo