Webhook Manager
The inbound half of the gateway. Every external delivery passes eight stages before it reaches the Integration Event Bus, and no platform reaches an AI-EOS module directly. Signature parsing, replay windows and the event-type mapping are real; the MAC comparison is a declared port with nothing wired behind it, so no endpoint currently verifies.
4 of 6 endpoints active at 83/100, with 3 events in flight.
83/100Registered endpoints6
all verified| Provider | Path | Scope | Signature | Events | Retry | Last received | State | Action |
|---|---|---|---|---|---|---|---|---|
| GitHub | /api/webhooks/default/ai-automation-agency/githubGitHub signature (sha256) signs the body but not a timestamp, so a captured delivery can be replayed unchanged for as long as the secret lives. | default / ai-automation-agency | github-sha256 | 10 | Standard | 5h ago | active | |
| Google Workspace | /api/webhooks/default/ecommerce-brand/google-workspaceGoogle OIDC bearer proves the caller holds a credential but does not bind it to the body, so a captured delivery can be replayed with altered contents. | default / ecommerce-brand | google-oidc | 4 | Cautious | 58m ago | active | |
| Slack | /api/webhooks/default/shared/slackNo secret reference is configured, so the signature cannot be checked and no delivery can be verified. | default / — | slack-v0 | 0 | Standard | — | pending-verification | awaiting first delivery |
| Shopify | /api/webhooks/default/ecommerce-brand/shopifyShopify HMAC (base64) signs the body but not a timestamp, so a captured delivery can be replayed unchanged for as long as the secret lives. | default / ecommerce-brand | shopify-hmac-sha256 | 8 | Aggressive | 5h ago | active | |
| Stripe | /api/webhooks/default/ai-automation-agency/stripe | default / ai-automation-agency | stripe-v1 | 12 | Aggressive | 4h ago | active | |
| Webhook | /api/webhooks/default/ai-automation-agency/webhookNo secret reference is configured, so the signature cannot be checked and no delivery can be verified. | default / ai-automation-agency | generic-hmac-sha256 | 0 | Standard | — | pending-verification | awaiting first delivery |
Recent events13
- GitHub
release:publishedsucceeded1h ago→ github.release.published · release release_38412
- Shopify
orders/fulfilledsucceeded3h ago→ shopify.order.fulfilled · order order_55234
- Google Workspace
permissionChangesucceeded3h ago→ google.permission.granted · permission permission_81619
- Shopify
products/updateretrying4h ago→ shopify.product.updated · product product_26581
- Shopify
products/createsucceeded5h ago→ shopify.product.created · product product_48568
- Stripe
payment_intent.payment_failedpending8h ago→ stripe.payment.failed · payment payment_67361
- Stripe
charge.refundedretrying8h ago→ stripe.payment.refunded · payment payment_31534
- GitHub
pull_request_review:submittedsucceeded12h ago→ github.pull_request.approved · pull_request pull_request_34614
5 further events received.
Inbound health
83/10083/100 — 1 active endpoint uses a scheme that does not bind the credential to the body. Google OIDC bearer proves the caller holds a credential but does not bind it to the body, so a captured delivery can be replayed with altered contents. 1 further penalty applied.
- Active endpoints
- 4
- Unverified
- 0
- Success rate
- 100%
- Retry rate
- 11.1%
- Queue depth
- 3
- Dead letters
- 0
- −9 Weak signature schemes — 1 active endpoint uses a scheme that does not bind the credential to the body. Google OIDC bearer proves the caller holds a credential but does not bind it to the body, so a captured delivery can be replayed with altered contents.
- −8 Retry rate — 11.1% of settled events needed a retry, above the 10% threshold. The inbound path is succeeding, but not first time.
Error queue1
0 dead-lettered| Provider | Event | Error | Attempts | Last attempt | Next retry | Scope | State | Action |
|---|---|---|---|---|---|---|---|---|
| Google Workspace | updatefile_69397 | downstream The subscribing module returned an error while handling the event. | 1 | 16h ago | — | default / ecommerce-brand | failed |
Retry stages a new pending entry and leaves the dead-lettered original in the record — nothing processes it yet, because the Task Orchestrator does not exist. Ignore removes the event from the estate, and is the only control here that raises the inbound health score; use it where the failure should never have been counted, not to clear a queue. Resolvehides a dealt-with entry and leaves health alone, because the failure was real. None of the three edits the event’s own record, and resetting the estate brings all of them back.
Delivery pipeline8
- 1Endpoint identification
- 2Signature verification
- 3Payload validation
- 4Tenant resolution
- 5Normalisation
- 6Deduplication
- 7Queue admission
- 8Event routing
Every inbound delivery passes all eight stages in this order before it reaches the Integration Event Bus. No external platform reaches an AI-EOS module directly.
Signature schemes10
| Scheme | Header | Signs |
|---|---|---|
| Stripe signature (v1) | stripe-signature | timestamp.body |
| Shopify HMAC (base64) | x-shopify-hmac-sha256 | body |
| GitHub signature (sha256) | x-hub-signature-256 | body |
| Slack signature (v0) | x-slack-signature | v0:timestamp:body |
| Discord Ed25519 | x-signature-ed25519 | timestamp.body |
| Generic HMAC (SHA-256) | x-webhook-signature | timestamp.body |
| Google OIDC bearer | authorization | body |
| Bearer token | authorization | body |
| API key header | x-api-key | body |
| Unsigned | — | body |
Header parsing, prefix checking, signed-string assembly and the replay window are all real and tested. The MAC comparison itself is a port with no implementation wired — an endpoint whose signature cannot be checked is refused, not admitted.
Provider manifests7
- stripe12 events mapped
stripe-v1Stripe posts a single envelope with `type`, `id`, `created` and a `data.object` carrying the resource. The signature covers the timestamp and the raw body together, so the body must not be re-serialised before verification.
- shopify8 events mapped
shopify-hmac-sha256Shopify names the topic in `x-shopify-topic` and the delivery in `x-shopify-webhook-id`, with the resource itself as the whole body. The HMAC covers the body alone, so the trigger-time header bounds replay only as far as the sender is honest.
- github10 events mapped
github-sha256GitHub names the coarse event in `x-github-event` and the specific action in the body, so an event type here is the pair. The delivery id in `x-github-delivery` is stable across GitHub's own redeliveries, which makes it the correct idempotency key.
- google-workspace4 events mapped
google-oidcGoogle push notifications are content-free: `x-goog-resource-state` names the change and `x-goog-resource-id` names the resource, with no body describing what changed. Every event here is a trigger to fetch, not a fact to file.
- slackprepared, not mapped
slack-v0Signature verification is ready; the event map is not. Slack has no runtime plugin, so it declares no topics, and a row here would name a topic the bus cannot route. The rows arrive with the plugin.
- discordprepared, not mapped
discord-ed25519Signature verification is ready; the event map is not. Discord has no runtime plugin, so it declares no topics. Its Ed25519 scheme is checked against a public key rather than a shared secret.
- webhookprepared, not mapped
generic-hmac-sha256The unlisted-platform door. Accepts a signed POST from any sender the operator has configured a secret for, and maps nothing — an event arriving here is recorded and refused at validation until a manifest names its type.
Webhook Manager7
7 active2 endpoints are accepting deliveries without signature verification. The generic inbound door ships this way because its signing secret is per-sender — configure one per registered sender before treating the path as trusted.
/api/integrations/github/eventsactive7,756 in · 3% failed · 42m agoForwards github.repository.connected, github.repository.disconnected, github.issue.created
/api/integrations/google-workspace/eventsactive956 in · 3% failed · 2h agoForwards google.file.created, google.file.updated, google.file.deleted
/api/integrations/slack/eventsactive7,420 in · 2% failed · 6h agoForwards workflow.completed, workflow.blocked, approval.requested
/api/integrations/shopify/eventsactive8,903 in · 0% failed · 3h agoForwards shopify.product.created, shopify.product.updated, shopify.order.created
/api/integrations/stripe/eventsactive2,466 in · 1% failed · 3h agoForwards stripe.customer.created, stripe.customer.updated, stripe.payment.created
/api/integrations/webhook/eventsactiveUnverified6,878 in · 3% failed · 4h agoForwards operator-mapped
/api/integrations/webhook/events/1activeUnverified4,302 in · 0% failed · 2h agoForwards operator-mapped