Notification operations
The Admin route /system/notifications/operations provides an app-scoped view of notification execution. It exposes only tenant/App-scoped, sanitized business projections—not River Args, device tokens, full payloads, credentials, stacks, or raw provider responses.
Four URL-restorable tabs
Tabs, filters, and pagination are encoded in the URL. The page polls every 15 seconds only while it is visible and unfinished work exists; polling pauses when the browser tab is hidden, while manual refresh remains available.
Run states
A message run can be scheduled, queued, running, completed, completed_with_failures, failed, cancelled, or expired.
A task can be scheduled, queued, running, retry_wait, succeeded, failed, or cancelled. River remains the live scheduling source of truth, while the workbench reads tenant/App-scoped business projections. A reconciliation job repairs projection drift caused by abrupt worker exits.
Safe retry rules
- Retry only terminal tasks for which the server returns
retryable=true. transientandthrottledtasks can be retried after automatic attempts are exhausted.- For
auth_config_error, repair the push channel and pass preflight first. unknown_after_writemay already have reached the provider. It permits only a single-item retry with explicit duplicate-risk acknowledgement.- A batch contains at most 100 items; the server returns an accept/reject decision for each item.
- A retry creates a new task linked to the original. It never overwrites the original run or attempt history.
Running tasks, future scheduled tasks, cancelled messages, and expired messages cannot be retried manually. The workbench does not edit task arguments, force-stop a running task, or directly update River records.
Recommended investigation order
- In Overview, check whether queue depth, oldest wait, P95 queue latency, or fault counts keep increasing.
- In Message runs, find whether the pipeline stopped at publish, fanout, or device delivery, then compare recipient, evaluated, delivery, and skip counts.
- In Queue tasks, inspect task kind, attempt count, next retry, normalized error code, and Trace ID.
- Repair a provider authentication failure before replaying delivery work.
- Use the Trace ID in OpenTelemetry, Loki, or Tempo for a full trace. Admin retains only a sanitized summary.
Permissions
Button visibility is not authorization. SQL queries always filter both tenant and app. Retry operations audit the operator, original task, new task, and decision.
Retention and monitoring
Task, attempt, and message-run details are retained for 90 days; daily aggregates remain for 13 months. Cleanup removes only terminal data that has completed aggregation, never scheduled, queued, running, or retry_wait records.
Alerts should cover sustained queue depth and oldest-wait growth, permanent failures, retry spikes, provider latency, invalid-token rate, repeated authentication failures, and pipeline duration. Metric labels must not contain user IDs, tokens, Trace IDs, or message bodies.
Read Notification and push architecture for the publish/fanout/delivery flow and Notification API for service integration.