Skip to content

System Notification

Type key: system_notification
Group: Notifications
Category: notification
Tier: CORE

The System Notification node sends native Filament Notifications to a target user.
It supports both persistent database notifications and real-time broadcast toasts, with full {{tag}} templating from upstream workflow data.

Handles

HandleDirectionDescription
inputInputReceives data used for {{tags}} and recipient resolution
outputOutputPasses through input and appends _notification metadata on success

Configuration

FieldTypeDefaultDescription
titlestring""Notification title. Supports {{tags}}.
bodystring""Optional notification body. Supports {{tags}}, loops and conditionals.
statusenuminfoVisual style: success, warning, danger, info, none.
iconstring|nullnullOptional icon override (e.g. heroicon-o-bell).
icon_colorstring|nullnullOptional icon color override. Only relevant when status is none (otherwise the status already defines the tone).
persistentbooleanfalseIf true, toast stays visible until dismissed.
duration_msinteger|nullnullAuto-dismiss timeout in milliseconds (ignored when persistent).
channelsarray["database"]Delivery channels: database, broadcast (one or both).
dispatch_database_eventbooleantrueDispatch DB notification refresh event when using database only.
recipient_user_idstring|int|nullnullTarget user id. Supports static id or {{tag}} (e.g. {{id}}).

Recipient Resolution

Recipient resolution follows this order:

  1. If recipient_user_id is configured, it is resolved (including {{tags}}).
  2. If resolved value is numeric, that user is targeted.
  3. If recipient_user_id is empty, fallback is the workflow owner user.
  4. If recipient_user_id is explicitly configured but cannot be resolved to a valid numeric id, the node fails.

This prevents accidental notifications being sent to the workflow owner when a tag is wrong or missing.

Tag Resolution Details

This node supports rich template resolution:

  • Simple tags: {{name}}, {{email}}, {{customer.id}}
  • Loops: {{#each items}}...{{/each}}
  • Conditionals: {{#if something}}...{{else}}...{{/if}}

When upstream nodes output collections (for example Data Model), System Notification automatically tries to expose the first record as root keys, so templates like {{id}}, {{name}}, and {{email}} work without verbose paths.

Channel Behavior

Database channel

  • Stores a notification row for the recipient user.
  • Can optionally dispatch Filament database refresh event (dispatch_database_event).

Broadcast channel

  • Sends real-time toast via broadcast.
  • When both database and broadcast are enabled, the node avoids forcing extra DB refresh events to reduce toast blinking/re-mount effects.

Output

On success, the node appends _notification metadata to the outgoing payload:

json
{
    "_notification": {
        "channels": ["database", "broadcast"],
        "recipient_user_id": 4,
        "title": "Technician alert",
        "status": "danger",
        "sent_at": "2026-03-27T16:00:00+00:00"
    }
}

Use Cases

System Notification receiving ForEach iterations

System Notification receiving ForEach iterationsSystem Notification receiving ForEach iterations

💾 Try this example

Download the workflow JSON — open an empty workflow and import the file.

System Notification with computed variables

System Notification with computed variablesSystem Notification with computed variables

💾 Try this example

Download the workflow JSON — open an empty workflow and import the file.

Notify assigned technician from Data Model

yaml
Data Model:
  model: App\Models\User
  conditions:
    - field: id
      operator: =
      value: 4

System Notification:
  recipient_user_id: "{{id}}"
  title: "New ticket assigned"
  body: "Hi {{name}}, a new ticket is waiting for you."
  channels: [database, broadcast]
  status: info

System alert for failed branch

yaml
Catch(error branch) -> System Notification

recipient_user_id: 1
title: "Workflow failed"
body: "Node {{_caught_error.node_id}} failed: {{_caught_error.message}}"
channels: [database]
status: danger
persistent: true

Quiet database-only operational feed

yaml
recipient_user_id: 1
title: "Nightly job completed"
body: "Processed {{count}} records."
channels: [database]
dispatch_database_event: false
status: success

Notes

  • At least one channel is required.
  • recipient_user_id can be dynamic, but must resolve to a real numeric user id.
  • If both channels are enabled, users get real-time toasts and persistent history in the notifications drawer.
  • icon_color is intended for neutral notifications (status: none) where you still want a colored icon.

Proprietary software — source-available. All rights reserved.