Delivery queue
The Delivery queue is a live view of webhook deliveries waiting to fire. Most of the time it's empty — the queue drains within seconds. When it isn't, this is where you diagnose stuck or slow deliveries.
What's in the queue
Every Jira event is debounced (see Debounce and coalescing) and held in the queue as one row keyed by:
element_id — numeric id of the entity the event is about. For
updated:issueit's the issue id; forcommented:issueit's the comment id; etc.event_type — Forge event key, e.g.
avi:jira:updated:issue.
A row lives in the queue from the moment the event arrives until the debounce window expires and the delivery fires. If a new matching event arrives during the window, the existing row's debounce timestamp resets — that's how rapid edits collapse into a single delivery.
Columns
Column | Means |
|---|---|
Element ID |
|
Family | Event family lozenge ( |
Event | Human-readable label + raw |
Status |
|
Version | Optimistic-concurrency counter. Bumps every time a new event extends this row. |
Processing Version | Snapshot of Version at the moment PROCESSING started. |
Wake Scheduled |
|
Debounce Until | UTC timestamp the debounce window ends. Turns red with |
Action | Release (only on PROCESSING rows) + Delete (always). |
Rows in PROCESSING have a light amber background to stand out from PENDING.
Filters
Family — narrow the visible rows to a specific event family. Choices:
All families,Issue,Comment,Worklog,Attachment,Issue Link,Project,Version,Component,User,Filter,Issue Type,Field,Field Context,Workflow,Custom,Other.
The filter is client-side. Header actions (Flush, Delete all) operate on the full queue regardless of what's filtered.
Header actions
Flush now
Pushes every PENDING row into delivery immediately, skipping the rest of the debounce window. Good for:
Smoke-testing a webhook you just saved — you don't want to wait 25 seconds.
Clearing a backlog after a receiver outage where rows piled up while the receiver was down.
A confirmation message shows how many rows were flushed.
Refresh
Manual reload. The page also auto-refreshes every 10 seconds, so you rarely need this — but it's handy after Flush now to see the result immediately.
Delete all
Removes every queue row, regardless of status or filter. Confirmation: "Delete all N queue row(s)? This cannot be undone."
Use with care — dropped rows are not replayed and don't produce a delivery log entry. Intended for:
Cleaning up a test environment.
Recovering after a migration or schema change where queue state is no longer trustworthy.
Don't use Delete all as a routine "reset" — those events will never be sent.
Per-row actions
Release
Visible only on rows in PROCESSING. Resets the row to PENDING and clears its processing_version, so the next consumer wake picks it up fresh.
Use when a consumer crashed mid-delivery and a row is stuck in PROCESSING past its debounce window. The early warning is the Debounce Until column showing red with overdue.
A daily maintenance job also clears stuck rows automatically — Release is the manual way to unblock a specific row without waiting.
Delete
Always available. Removes the single row without firing the delivery. No confirmation dialog — one click is enough.
Use when a specific event was triggered by mistake (e.g. a scripted bulk edit) and you want to skip the webhook for that one entity without disabling the whole webhook.
Lifecycle in short
This is how Webhooks Pro guarantees that a late edit during processing isn't lost: the version bump signals that more state landed and another fire is owed.
When the queue is not empty for long
Symptom | Likely cause |
|---|---|
A few rows always present | Normal — the queue holds rows for the debounce window (default 25s). |
Many rows pile up | Either huge event volume (legitimate) or a slow / unreachable receiver causing PROCESSING rows to back up. |
Rows in | Consumer crashed. Release them, or wait for the daily cleanup. |
Rows never get to | Wake not scheduled — rare, usually a Forge platform incident. Check Tenant settings → Status tab. |
Delete all does nothing visible | The page is filtered. Header actions ignore filter; click Refresh to verify the count. |
What the queue does not show
Successful deliveries — they leave the queue immediately and live in Webhook logs.
Failed deliveries — same; the failure is in the log, not the queue.
Skipped deliveries (licence) — never enter the queue.
JQL-rejected events — never enter the queue.
Schedules waiting for their next CRON match — that's a different mechanism (Forge's 5-minute scheduled trigger), not the queue.
Related
Debounce and coalescing — why rows stay in the queue.
Webhook logs — what queue rows turn into after delivery.
Tenant settings → Debounce window — controls how long rows stay.
Status code 0 and network errors — why the queue might fill if the receiver is unreachable.