Worker Templates
Production-ready Cloudflare Worker templates.
Lead Capture Worker
// src/index.ts).bind(data.name, data.email, data.phone || null).first();interface Env {
DB: D1Database;
PROPTECH_API_KEY: string;
SLACK_WEBHOOK: string;
}
export default {
async fetch(request: Request, env: Env): Promise<Response> {
// CORS headers
const headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'POST, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type',
};
if (request.method === 'OPTIONS') {
return new Response(null, { headers });
}
if (request.method !== 'POST') {
return new Response('Method not allowed', { status: 405, headers });
}
try {
const data = await request.json();
// Validate
if (!data.email || !data.name) {
return Response.json(
{ error: 'Name and email required' },
{ status: 400, headers }
);
}
// Store in D1
const result = await env.DB.prepare(
INSERT INTO leads (name, email, phone, created_at)
VALUES (?, ?, ?, datetime('now'))
RETURNING id
// Notify Slack
await fetch(env.SLACK_WEBHOOK, {
method: 'POST',
body: JSON.stringify({
text:
🏠 New lead: ${data.name} (${data.email}),}),
});
return Response.json(
{ success: true, id: result?.id },
{ headers }
);
} catch (error) {
return Response.json(
{ error: 'Internal server error' },
{ status: 500, headers }
);
}
},
};
wrangler.toml
name = "lead-capture"
main = "src/index.ts"
compatibility_date = "2024-01-01"
[[d1_databases]]
binding = "DB"
database_name = "leads"
database_id = "your-database-id"
[vars]
SLACK_WEBHOOK = "https://hooks.slack.com/services/xxx"
# Set via wrangler secret
# wrangler secret put PROPTECH_API_KEY