Integration Runtime Layer
webhooks
Outbound webhook delivery — self-hosted custom dispatcher, signed payloads, retry with exponential backoff, subscriber portal for self-serve.
https://api.example.com/v1/hooks
Activelast delivered 2m agoRecent deliveries5
| Status | Event | Code | Attempts | Latency | When |
|---|---|---|---|---|---|
| 2xx | invoice.paid | 200 | 1/5 | 184ms | 2m ago |
| 2xx | user.created | 201 | 1/5 | 142ms | 5m ago |
| subscription.canceled | 503 | 3/5retrying | 4 821ms | just now | |
| 4xx | user.updated | 429 | 2/5 | 312ms | 12m ago |
| 5xx | invoice.paid | 500 | 5/5 | 1 204ms | 1h ago |
99.2% success · p95 248ms · signed HMAC
In code
webhooks.ts
1import { getWebhooks } from "@nebutra/webhooks";
2
3const webhooks = await getWebhooks();
4
5await webhooks.sendEvent({
6 id: crypto.randomUUID(),
7 eventType: "user.created",
8 payload: { userId: user.id, email: user.email },
9 timestamp: new Date().toISOString(),
10 tenantId: org.id,
11});More in nebutra.com
- admin-toolingSelf-serve operator dashboards — tenants, billing overrides, feature-flag flips — all gated by @nebutra/permissions.
- cacheTag-based cache with Redis, Upstash, or in-memory backend. Same get/set/invalidate(tags) for serverless and self-hosted.
- collabRealtime co-editing primitives — Yjs CRDT, WebSocket transport, presence cursors. The piece every multi-user app eventually needs.
- emailRender React Email templates, dispatch through Resend / SES / SMTP. One sendEmail(template, props, recipient) for every transactional flow.
- event-busIn-process pub/sub with cross-app fanout. Used by audit, billing, and notifications to react to commerce events without circular imports.
- integration-vaultPer-tenant credential store for OAuth integrations and API keys — Creem, Gmail OAuth, Notion API. KMS-wrapped, refresh-rotated.