Cloudflare Worker + D1 backend for booking management.
Live database: alma-sonora-bookings (D1, ENAM region, MIA primary)
| Layer | Tech |
|---|---|
| Compute | Cloudflare Worker (ES modules) |
| Storage | Cloudflare D1 (SQLite) |
| Payments | Square (webhook-driven) |
npm install# From Square Developer Dashboard → Webhooks → your endpoint → Signature key
wrangler secret put SQUARE_WEBHOOK_SIGNATURE_KEY
# Choose a strong random string (used to protect admin endpoints)
wrangler secret put ADMIN_SECRETnpm run deployThis deploys to https://alma-sonora-bookings.<your-subdomain>.workers.dev
- Square Developer Dashboard → your app → Webhooks → Add endpoint
- URL:
https://alma-sonora-bookings.<subdomain>.workers.dev/webhooks/square(orhttps://api.alma-sonora.com/webhooks/squareafter custom domain) - Subscribe to events:
payment.completedpayment.updatedorder.updatedorder.fulfillment.updatedrefund.created
- Copy the Signature key →
wrangler secret put SQUARE_WEBHOOK_SIGNATURE_KEY - Update
events.jsonwith the livesquare_checkout_url - Optionally update
eventstable:square_item_idandsquare_variation_id
GET /health
GET /api/events
GET /api/events/:id
POST /webhooks/square
GET /api/admin/bookings
GET /api/admin/bookings/:eventId
GET /api/admin/bookings?status=confirmed
# Check availability
npm run db:availability
# View all bookings
npm run db:bookings
# Raw query
npm run db:query -- "SELECT COUNT(*) FROM bookings WHERE status='confirmed'"
# Tail live logs
npm run tailSeeded with cacao-sonido-2026-05-24 (May 24, $65, cap 12).
Add square_item_id / square_variation_id after Square setup.
Created by webhook. Statuses: pending → confirmed | canceled | refunded | failed.
Every incoming Square webhook is logged here. square_event_id is UNIQUE to prevent double-processing.
To serve from api.alma-sonora.com instead of *.workers.dev:
- Cloudflare Dashboard → Workers → alma-sonora-bookings → Settings → Domains & Routes
- Add route:
api.alma-sonora.com/*(zone: alma-sonora.com) - Or uncomment the
routesblock inwrangler.toml