Webhook Subscriptions
Taxi & Private Hire › Products › Webhook › Webhook Subscriptions
Generally available
Tenant-configured outbound webhook subscriptions: subscribe a destination URL to platform events (trip.created, trip.status_changed, trip.late_predicted, etc.) with HMAC signing, retry on 5xx, and optional decision-tree filtering to narrow which entities fire which subscription. Used heavily for downstream integrations (dispatcher CRM, billing systems, customer notification channels).
Fields
| Field | Type | Description |
|---|---|---|
name | string | Operator-facing label for the subscription. Surfaced on the webhook-management UI and in delivery-log filtering. |
active | boolean | Whether the subscription fires on matching events. Set false to mute without deleting the configuration. |
eventName | string | Event-name key the subscription listens for (e.g. `trip.created`, `trip.status_changed`, `trip.late_predicted`). Resolved from the WebhookEvent registry. |
url | string | Destination URL the platform POSTs to when this subscription fires. HTTPS recommended; the platform signs every payload with the configured auth headers. |
method | WebhookMethod · GET | POST | PUT | PATCH | HTTP method (POST / PUT / PATCH). Default POST — change only if the receiver explicitly requires a different verb. |
headers | json | Additional outbound HTTP headers (e.g. integration-specific routing keys). Authentication headers are configured separately via the auth fields below; this is for extras. |
bodyMode | WebhookBodyMode · STANDARD | CUSTOM_TEMPLATE | NONE | Payload shape: STANDARD (full platform JSON envelope) or TEMPLATE (renders `bodyTemplate` against the event variables — for receivers that need a specific schema). |
bodyTemplate | text | Twig-style template for the outbound body — used only when `bodyMode` = TEMPLATE. Event variables (trip, customer, etc.) are available as template scope. |
decisionTree | JsonStorage | JsonCondition decision tree filtering which entities fire this subscription. Empty / null = fire on every matching event-name; populated = only fire when the tree evaluates true for the trigger entity. |
authType | WebhookAuthType · NONE | BEARER | BASIC | API_KEY | Auth mode for the outbound request: NONE / BEARER / BASIC / HEADER. Drives which of the auth* fields below get used to compute the signing headers. |
authToken | string | |
authUsername | string | |
authPassword | string | |
authHeaderName | string | |
retryEnabled | boolean | Whether the platform retries on non-success responses. When false, a single failed delivery is logged and dropped. |
retryMaxAttempts | integer | How many times the platform will retry a failed delivery before giving up. Active only when `retryEnabled` = true. Default 3. |
retryDelaySeconds | integer | Seconds to wait before the first retry. Subsequent retries multiply this by `retryBackoffMultiplier`. |
retryBackoffMultiplier | float | Exponential-backoff multiplier between retry attempts. 2.0 means each retry waits 2× the previous delay (30s, 60s, 120s, ...). |
successCodePattern | string | HTTP status pattern treated as success — `2xx` (any 2xx) or an exact code like `204`. Anything else triggers the retry path (when enabled) or marks the delivery failed. |
debounceSeconds | integer | Coalesce-debounce window in seconds. When > 0, repeated events for the same target entity collapse into a single delivery at the end of the window — useful for high-frequency status changes. |
consecutiveFailures | integer | Running count of consecutive failed deliveries. The auto-disable circuit-breaker trips this against a tenant-configured threshold — too many failures sets `active = false` + `disabledReason`. |
disabledReason | string | Reason the subscription was auto-disabled (e.g. "exceeded 50 consecutive failures"). Null when the subscription is healthy or manually disabled. |
lastDeliveryDate | integer | |
lastResponseCode | integer | |
clientId | bigint | Tenant scope. Every tenant-aware entity carries this; `ClientFilter` enforces row-level isolation on read; the multi-tenancy routing layer (`/client/{clientId}`) sets it at create time. Surfaced only under `admin` / `tripLog` groups — never to end users. |
internalKey | string | Optional client-supplied external reference / idempotency key. When present, lets external systems correlate platform-side records back to their own source-of-truth ids. Not persisted to a column — populated by the request handler when the caller sets it. |
__objectType | string | Discriminator string (entity class short-name) emitted alongside the id in serialized output. Resolved at read time by `getObjectType()`; lets the FE dispatch entity-specific rendering without inspecting the URL. |
id | bigint | Snowflake-style primary key (unsigned BIGINT). Generated by `IdFactory` at create time; surfaced to the FE / API as a `G`-prefixed string and stripped back to plain bigint server-side before Doctrine lookup. |
createdDate | integer | Unix timestamp the row was first persisted. Set in the entity's PrePersist hook; never rewritten on subsequent updates. |
updatedDate | integer | Unix timestamp the row was last touched. Bumped on every commit that hits the Doctrine UoW for this entity; drives FE invalidation + the listing change cursor. |
passiveUpdatedDate | int | Read-through alias for `updatedDate` exposed under different serializer groups. Lets the FE distinguish "real edit" from "background touch" projections without changing the underlying column. |
listingUpdatedDate | int | Listing-projection timestamp surfaced only under the `listMode` group. Driven by `TripCache` and other listing-shape refreshers separately from `updatedDate` so a listing rebuild doesn't trigger detail-page invalidation. |