Hookdeck — Ingress Gateway
Platform 3 of 12·OS Layer 8 (Event Layer)·Required in all deployment modes
Scope of this page. Reference material for the Hookdeck platform: what it is, what it is normally used for, and how and why Synedrix OS uses it. It is descriptive, not normative — where this page and a canonical spec in
docs/os/disagree, the canonical spec wins. Platform responsibilities are set by Tech Stack §2; the event contract Hookdeck delivers against is the Event Taxonomy Standard.This page covers inbound only. Hookdeck (the Event Gateway) and Hookdeck Outpost (outbound delivery) are separate products with separate licences and separate deployment stories. Outpost is covered on its own page: Hookdeck Outpost — Egress Gateway.
What Hookdeck is
Hookdeck describes itself as providing “reliable infrastructure to work with webhooks and external events — without managing it yourself.” The inbound product is the Event Gateway, which “enables you to manage inbound webhooks and events before they hit your app, including receiving, transforming, and routing events, with full observability and control.”
Architecturally it is a proxy and a queue: “Hookdeck acts as an HTTP proxy and queue between the webhook producer and your application.” An inbound HTTP call becomes a request; a request matched to a connection becomes an event; each delivery of that event is an attempt.
| Concept | Official definition |
|---|---|
| Source | “A source is a representation of a service that sends HTTP requests to the Hookdeck Event Gateway.” |
| Destination | “A destination is any endpoint to which your events can be routed.” |
| Connection | “A connection lets you route events from a Source to a Destination.” |
| Request | “Requests are HTTP requests that Hookdeck receives from a source.” |
| Event | “An event is created when a request is associated with a connection. The event moves through the connection’s rules pipeline (filters, transformations, deduplication) and, if it passes all rules, is queued for delivery.” |
| Attempt | An “attempt is a specific delivery attempt that Hookdeck makes for a queued event.” |
| Filter | “Filters allow you to permit and route events conditionally based on the contents of their Headers, Body, Query, or Path.” |
| Transformation | “A transformation lets you modify the payload of a event prior to delivery.” |
| Deduplication | “Deduplication removes redundant events by comparing them against previously processed events within a configurable time window.” |
| Retry | “Webhook retries are automatic re-attempts to deliver an event after a failed delivery.” |
| Bookmark | “A bookmark lets you conveniently store and replay a specific request.” |
| Issue | “Issues let you track problems in your project and communicate resolution steps with your team.” |
The details that matter for a governed system:
- Delivery guarantee. “Hookdeck operates on an ‘at least once’ delivery guarantee, meaning an Event may be delivered more than once.” Ordering is explicitly not guaranteed: “There’s no guarantee of the order in which Events will arrive.” Hookdeck’s own advice is to use payload data such as an
updated_atvalue to reconcile out-of-order arrival. - Buffering. “If your destination is unreachable, events are held in the queue and delivered when your server recovers.”
- Retries. Automatic retries use a linear or exponential strategy — “with a linear strategy, retries occur at regular intervals; with an exponential strategy, each retry is delayed twice as long as the previous.” “Events are limited to 50 automatic retries, but can be manually retried as many times as you like.” A failed event “remains stored in Hookdeck and can be manually retried or bulk retried at any time after the underlying problem is resolved.”
- Replay. Bookmarks are the replay primitive, and the semantics are worth reading twice: “Contrary to an event retry, triggering a bookmark creates a new event instead of a new attempt.”
- Filters discard. Events not matching a filter “are disregarded by Hookdeck and recorded as ignored events” and “will not appear in your list of events or generate delivery attempts.”
- Transformations are sandboxed. They run as JavaScript (ES6) in a V8 isolate, capped at 1 second of execution and 5 MB, with no network or filesystem I/O and no async/await.
- Source authentication. Sources support HMAC (configurable algorithm and encoding), Basic Auth, API keys and generic schemes, with pre-configured settings for known providers; secrets are AES encrypted. Sources ingest requests up to 10 MiB and support custom domains.
- Delivery rate. “Setting a delivery rate allows you to define a maximum rate at which Hookdeck will send delivery attempts to a destination” — per second, per minute, per hour, or a concurrency cap. Excess events queue as
Pending. - Observability. “Every request, event, and delivery attempt is logged with full headers, payloads, and response data,” with metrics and issue notifications to email, webhook, Slack, Discord, Microsoft Teams, PagerDuty, OpsGenie, Better Stack Uptime and incident.io.
Configuration surfaces are the dashboard, the REST API, the CLI, an MCP server, and an official Terraform provider — the last of which is the supported path for version-controlling connections, filters and transformations.
What Hookdeck is normally used for
The use cases Hookdeck’s own documentation leads with:
- Receiving webhooks — putting a durable queue in front of an application so that provider retries, bursts and downstream outages do not lose events.
- Localhost testing — the CLI’s
hookdeck listenforwards inbound events tohttp://localhost:$PORT/$DESTINATION_PATHso a developer can debug against real provider traffic. - Third-party routing — fanning one inbound source out to many destinations, each with its own filters, transformations and retry policy.
- Async APIs — accepting an HTTP call at the edge, acknowledging immediately, and letting the queue absorb the processing.
The common thread is that Hookdeck owns arrival: authenticating the caller, absorbing the burst, deciding what is a duplicate, and holding the event until something downstream is ready for it — not what the event means.
How Synedrix OS uses it
Hookdeck is the ingress gateway of Synedrix OS and sits at Layer 8 (Event Layer) of the twelve-layer taxonomy, alongside Hookdeck Outpost on the egress side. Per Tech Stack it is required in all three deployment modes, with an external write access pattern and a sub-second latency profile.
flowchart LR
n1([Hookdeck]):::term
subgraph What it owns
n2[Inbound event validation]:::agent
n3[Schema enforcement]:::agent
n4[Buffering]:::agent
n5[Replay]:::agent
n6[Fan-out]:::agent
end
n1 --> n2
subgraph What it does not own
n7[Outbound and callback delivery to external systems]:::warn
n8[Hookdeck Outpost]:::term
n7 --> n8
n9[Canonical business state]:::warn
n10[Supabase PG17]:::term
n9 --> n10
n11[Lineage graph and audit trail]:::warn
n12[Neo4j]:::term
n11 --> n12
end
n1 --> n7
subgraph Why Hookdeck
n13[Replay is a first-class primitive]:::term
n14[Fan-out is configuration not code]:::term
n15[It is declarable]:::term
end
n1 --> n13
What it owns
Per Tech Stack §2, Hookdeck owns:
- Inbound event validation
- Schema enforcement
- Buffering
- Replay
- Fan-out
In contract terms, Hookdeck is the platform that satisfies trigger_source for every workflow declared with trigger_type: event under the Workflow Contract Spec. It is the boundary at which an untrusted external HTTP call becomes a candidate Synedrix OS event, and the buffer that decouples a provider’s retry behaviour from n8n’s availability.
What it does not own
| Concern | Owner |
|---|---|
| Outbound and callback delivery to external systems | Hookdeck Outpost (Layer 8, egress) |
| The event envelope, naming rules and lifecycle rules | Event Taxonomy Standard |
| Workflow sequencing, retries of business steps, approval routing | n8n (Layer 3) |
| Policy decisions on whether an event may cause a side effect | Policy Guard (os-agt-002, Layer 9) |
| Canonical business state | Supabase PG17 (Layer 7) |
| Lineage graph and audit trail | Neo4j (Layer 7) and the Layer 10 observability platforms |
Three boundaries worth stating explicitly
Envelope compliance is an OS responsibility, not a Hookdeck feature. Hookdeck validates transport — signature, auth, payload size, content type — and can shape a payload with a transformation. It does not know about the fifteen-field envelope. The Event Taxonomy Standard requires that “an event that omits any required field is non-compliant and must be rejected by the event layer,” and requires correlation_id and causation_id on every event. An inbound provider webhook carries neither. Envelope construction — minting event_id, assigning domain, entity_type, source_type: external_system, and either propagating an inbound correlation_id or minting one at the boundary — must happen deliberately, either in a Hookdeck transformation or in the first n8n node. Whichever is chosen, it should be chosen once and applied uniformly; envelope assembly split across both is how lineage gaps start.
Filters silently discard. Non-matching events are “recorded as ignored events” and generate no delivery attempts. That is a legitimate ingress optimisation and a lineage hazard: an event dropped at Layer 8 never reaches Neo4j, QuestDB or the audit trail. Filters should be used for genuine noise (irrelevant provider event types), not for anything a reviewer might later need to account for. Anything that resembles a policy decision belongs at Layer 9, behind governance, not in an ingress filter.
Deduplication overlaps with Redis. Hookdeck’s deduplication window is configurable between one second and one hour. Redis at Layer 7 owns idempotency keys and deduplication windows for the OS. These are two deduplication mechanisms at two layers with different retention and different visibility, and the idempotency_strategy field of the workflow contract must name which one a given workflow relies on. Collapsing both onto “it is deduplicated somewhere” is how at-least-once delivery turns into duplicate side effects.
At-least-once is the design constraint
Hookdeck guarantees at-least-once delivery and no ordering. Both are load-bearing for anything downstream that writes:
- Every event-triggered workflow needs a real
idempotency_strategy, not an assumption of exactly-once arrival. - Ordering must be reconstructed from payload data or from
causation_id, never from arrival sequence. - Replay via a bookmark creates a new event, not a retry — so a replayed inbound request produces a second
event_id, and correlation must be handled explicitly rather than inferred.
Why Hookdeck
- It moves ingress failure out of the orchestration layer. Provider webhooks arrive whether or not n8n is up. A queue at the edge means an n8n restart is a delay, not a data-loss event — which is what Layer 8’s decoupling role exists for.
- Replay is a first-class primitive. A governed system needs to be able to re-run an inbound signal against a corrected workflow. Bookmarks make that an operation rather than a reconstruction exercise.
- Signature verification happens before the OS trusts anything. HMAC and provider-specific verification at the source means n8n never sees an unauthenticated external payload, which is the precondition for treating an inbound event as a governed trigger at all.
- Fan-out is configuration, not code. One source to many connections, each with its own filters and retry policy, keeps ingress routing out of workflow logic.
- It is declarable. The Terraform provider and API mean connections, filters and transformations can live in version control alongside the specs that describe them.
The counterweight to all of this is in the next section, and it is significant.
Deployment and licensing
Managed cloud. The Hookdeck Event Gateway is a hosted service. Plans are Developer (free), Team, Growth and Enterprise. Configuration is via dashboard, API, CLI, MCP server or the Terraform provider.
Self-hosting — this does not exist for the Event Gateway. Hookdeck’s public documentation, pricing page and product site describe no self-hosted, on-premise or private-cloud deployment of the Event Gateway. Hookdeck’s self-hosting documentation lives entirely under the Outpost namespace (/docs/outpost/self-hosting/), and Hookdeck’s public GitHub organisation contains the CLI, SDKs, the Terraform provider and Outpost — but no Event Gateway server. The Event Gateway source is not published.
The CLI is not an offline mode. hookdeck listen forwards events to localhost, but it does so by tunnelling through Hookdeck’s cloud. It is a development convenience, not a local deployment of the gateway.
Licence. The Event Gateway is proprietary and closed-source. Outpost, by contrast, is Apache 2.0 and genuinely self-hostable — the two products are frequently conflated because they share a vendor and a docs site, but their licensing and deployment characteristics are not the same. See Hookdeck Outpost — Egress Gateway.
Mode 3 is the hard problem
Deployment Model Spec defines Mode 3 (air-gapped) as: “No external API calls of any kind. No data leaves the customer’s infrastructure under any circumstances,” with “Zero external connections permitted” and network egress rules configured to block all outbound traffic.
A managed cloud Event Gateway cannot exist inside that definition. In Mode 3, every inbound event would have to traverse Hookdeck’s infrastructure before reaching the customer’s network — meaning external data flow, an inbound hole in the perimeter, and third-party custody of payloads that Mode 3 exists specifically to prevent. Marking Hookdeck as required “in all modes” and marking Mode 3 as permitting zero external connections cannot both be true.
Four options were considered. This page does not choose between them; the decision-maker did, in ADR-OS-013 (rejected), selecting the last:
| Option | Consequence |
|---|---|
| Restrict Hookdeck to Modes 1 and 2 | Mode 3 needs a different Layer 8 ingress implementation, and “required in all modes” must be corrected in Tech Stack and Deployment Model Spec. |
| Define a Mode 3 ingress substitute | A self-hostable queue plus signature verification in front of n8n. Loses replay, issue tracking and the managed retry pipeline; those capabilities would need owners. |
| Pursue an Enterprise arrangement | Hookdeck’s Enterprise tier is custom-priced and undocumented publicly; whether any on-premise arrangement exists is unknown from official sources and would need to be established directly with the vendor. |
| Accept the exception explicitly | Record Hookdeck as a documented deviation from Principle 11 and from the Mode 3 zero-egress rule. Honest, but it changes what “air-gapped” means in a sales conversation. |
Decision. The last option was chosen: Hookdeck stays required in all modes and the deviation is accepted. “Hookdeck, all modes” is therefore a settled specification, with Mode 3 carrying one declared external dependency — the inbound Hookdeck path. The Deployment Model Spec §1 states what that means for an air-gapped instance, including who it is not suitable for. The Enterprise option above remains available as a commercial convenience, not a requirement.
Official documentation
- Hookdeck documentation home
- Hookdeck — product and Event Gateway description
- Pricing — Developer, Team, Growth, Enterprise
- Sources — source types, authentication, custom domains
- Destinations — destination types, delivery rate
- Connections — rules pipeline and execution order
- Filters — matching syntax and ignored events
- Transformations — V8 isolate, limits, testing
- Deduplication — strategies and time window
- Retries — automatic, manual and bulk retry
- Events — event statuses and attempts
- Bookmarks — replay semantics
- Issues — issue tracking and notification channels
- Receive webhooks — at-least-once guarantee, queueing, ordering
- CLI —
hookdeck listenand localhost forwarding - Hookdeck on GitHub — CLI, SDKs, Terraform provider, Outpost
Related Synedrix OS documents
- Synedrix OS Tech Stack — normative platform responsibilities; §2 covers Hookdeck.
- Event Taxonomy Standard — the fifteen-field envelope, naming rules and lifecycle rules every ingested event must satisfy.
- Layer Taxonomy Table — Layer 8 definition and platform mapping.
- Workflow Contract Spec —
trigger_type,trigger_source,input_contractandidempotency_strategyfor event-triggered workflows. - Deployment Model Spec — the three modes, the air-gapped constraint, and the open-source component inventory.
- Core Principles — Principle 8 (Event-driven execution) and Principle 11 (Open by default, sovereign by design).
- Interoperability Protocol Strategy — how external systems reach the OS, and the rule that no protocol interaction bypasses governance.
- Hookdeck Outpost — the egress counterpart at Layer 8.
Synedrix OS · Platform reference · Hookdeck