File: C:/Users/fred/.codex/.tmp/plugins/plugins/zoom/skills/webhooks/RUNBOOK.md
# Webhooks 5-Minute Preflight Runbook
Use this before deep debugging. It catches common webhook failures quickly.
## Skill Doc Standard Note
- Agent-skill standard entrypoint is `SKILL.md`.
- This runbook is an operational convention (recommended), not a required skill file.
- `SKILL.md` is also a navigation convention for larger skill docs.
## 1) Confirm Endpoint Reachability
- Public HTTPS endpoint is reachable from Zoom.
- Reverse proxy routes to the correct service path.
## 2) Confirm Signature Verification
- Verify `x-zm-signature` with raw request body.
- Use `x-zm-request-timestamp` and reject stale timestamps.
- Do not re-serialize parsed JSON for signature material.
### Signature Formula Reminder
```text
payload = "v0:" + x-zm-request-timestamp + ":" + raw_body
expected = "v0=" + HMAC_SHA256(webhook_secret, payload)
```
If `raw_body` differs from original bytes (pretty print/re-stringify), verification fails.
## 3) Confirm URL Validation Handling
- Handle `endpoint.url_validation` challenge correctly.
- Return expected `plainToken` and computed `encryptedToken` when required.
### URL Validation Reminder
On `event = endpoint.url_validation`, hash `payload.plainToken` with your webhook secret and return both values exactly.
## 4) Confirm Event Subscription Setup
- Feature/Event subscriptions enabled in app config.
- Required event types selected and saved.
## 5) Confirm Processing Pattern
- Respond HTTP 200 quickly.
- Process business logic asynchronously.
- Make handlers idempotent for retries.
## 6) Quick Probes
- Local test payload verifies signature path.
- Zoom test event reaches endpoint and is logged.
- No repeated non-200 responses in logs.
### Copy/Paste Validation Commands
```bash
# 1) Reachability check (replace with your webhook route)
curl -sS -i "https://your-domain.example/webhook"
# 2) Check service logs quickly while sending test events
# (replace command with your runtime: pm2/docker/systemd)
pm2 logs your-service --lines 100
# 3) Basic endpoint health check if available
curl -sS -i "https://your-domain.example/health"
```
Expected: endpoint is reachable over HTTPS, events appear once, and responses are consistently 2xx.
## 7) Fast Decision Tree
- **No events received** -> endpoint unreachable or wrong subscription.
- **401 invalid signature** -> raw body mismatch/secret mismatch.
- **Duplicate events** -> no idempotency or delayed responses.
## 8) Retry and Idempotency Guardrail
- Treat webhook delivery as at-least-once.
- Deduplicate by event ID/timestamp/resource key before side effects.
- Keep handlers safe to re-run.