Inspect the outbound webhook outbox and delivery status. Useful for debugging event-driven integrations without leaving the terminal.
# View pending and recently delivered webhook events
nself webhooks outbox
# Check delivery status of recent webhook attempts
nself webhooks statusnself webhooks <SUBCOMMAND> [FLAGS]nSelf supports two distinct webhook systems — understand which one you need before using this command:
nself db hasura. These are database-level hooks.nself webhooks. These are infrastructure-level hooks.nself webhooks gives you visibility into the outbound webhook delivery queue — what events are pending, which were delivered successfully, and which failed with retries remaining.
To register or unregister webhook endpoints, edit the NSELF_WEBHOOK_ENDPOINTSvariable in your .env file and run nself build to apply the change.
Show the current outbox — events queued for delivery, pending retry, or recently delivered. By default shows the last 50 entries across all event types.
nself webhooks outbox
# ID EVENT STATUS ENDPOINT ATTEMPTS NEXT RETRY
# 9f2a1c deploy.completed delivered https://hooks.example.com/nsf 1/3 —
# 7d8b3e service.restarted delivered https://hooks.example.com/nsf 1/3 —
# 5c4d7f circuit_breaker.opened failed https://hooks.example.com/nsf 3/3 abandoned
# 3a2e9b deploy.started pending https://hooks.example.com/nsf 0/3 nownself webhooks outbox --status failed # show only failed events
nself webhooks outbox --event deploy.* # filter by event type glob
nself webhooks outbox --limit 100 # show more entries
nself webhooks outbox --json # machine-readableShow aggregate delivery statistics — success rate, failure rate, average latency, and count of events in each state.
nself webhooks status
# Webhook delivery summary (last 24h)
#
# Total events: 142
# Delivered: 138 (97.2%)
# Failed/abandoned: 4 (2.8%)
# Pending retry: 0
#
# Average latency: 312ms
# p95 latency: 890ms
#
# Endpoint: https://hooks.example.com/nsf
# Success: 138 / 142 (97.2%)
# Failures: 4 (circuit_breaker.opened × 4 — connection refused)| Flag | Applies to | Default | Description |
|---|---|---|---|
--status | outbox | all | Filter by delivery status: pending, delivered, failed, abandoned |
--event | outbox | — | Filter by event type (supports glob: deploy.*) |
--limit | outbox | 50 | Maximum rows to return |
--since | outbox, status | 24h | Time window: 24h, 7d, 2026-05-01 |
--json | all | false | Emit structured JSON |
--env | all | current | Target environment: local, staging, prod |
| Event | Fires when |
|---|---|
deploy.started | A deployment pipeline begins |
deploy.completed | A deployment completes successfully |
deploy.failed | A deployment fails |
service.restarted | The watchdog restarts a service |
service.stopped | A service stops unexpectedly |
circuit_breaker.opened | A circuit breaker trips |
circuit_breaker.closed | A circuit breaker resets |
license.renewed | A plugin license is successfully renewed |
license.expired | A plugin license expires or is revoked |
ssl.renewed | A TLS certificate is automatically renewed |
Failed webhook deliveries are retried automatically with exponential back-off:
After 3 attempts, the event is marked abandoned and no further retries are made. Abandoned events remain visible in the outbox for 7 days.
# 1. Check overall delivery health
nself webhooks status
# 2. Find failed events
nself webhooks outbox --status failed
# 3. Get full detail on a specific event
nself webhooks outbox --json | jq '.[] | select(.id == "5c4d7f")'# After deploying, wait for the deploy.completed event to be delivered
nself webhooks outbox --event deploy.completed --json | jq '.[0].status'nself webhooks status --since 7d --json | jq '{total, delivered, avg_latency_ms}'Add one or more webhook endpoints to your .env file:
# .env
NSELF_WEBHOOK_ENDPOINTS=https://hooks.example.com/nself,https://other.example.com/hook
NSELF_WEBHOOK_SECRET=your-hmac-signing-secretThen run nself build to apply. All events are signed withNSELF_WEBHOOK_SECRET via HMAC-SHA256 in theX-nSelf-Signature header so your receiver can verify authenticity.