Smart Notify vs Unread: Internal Notifications in GLPI

Comparison between the Smart Notify module (NexTool) and the Unread plugin for internal notifications in GLPI, without relying on email. Criterion-by-criterion table, verdict by scenario, the polling trade-off that matters in operations, and the config we use in production.

In this article7 sections

Email is not real-time notification. For a technician to know the moment a ticket changes, the alert has to appear inside GLPI. Two solutions solve this in opposite ways: the Unread plugin highlights, in the lists, what has not been seen yet, while the Smart Notify module (NexTool) adds a global bell to the navbar, with sound and per-user preferences. And one factor decides everything before any feature: which GLPI version you run.

Context: why email alone is not enough

In stock GLPI, every notification goes out by email. In practice, the technician who keeps the system open all day ends up having to:

  1. Constantly switch between the GLPI queue and the inbox;
  2. Dig GLPI emails out from among dozens of others;
  3. Click the email link just to return to a ticket that was already on screen.

The result is familiar: delayed replies, follow-ups nobody saw, validations stuck waiting for a click. Internal notification cuts that back-and-forth - but "internal" has two very different meanings, and that is exactly where the two plugins diverge.

Two different philosophies

Unread is a community plugin with a lean scope: to visually flag, in the lists, the items (tickets, follow-ups) you have not opened yet. It is passive - the highlight shows up when you are already looking at the list. No sound, no bell, no per-user preference. Its big advantage is a near-zero operating cost: nothing runs in the background.

Smart Notify (a NexTool module, GLPI 11) is active. It aggregates 11 event sources that already exist in GLPI - follow-ups, tasks, validations and solutions for tickets, problems and changes, plus attached documents and manual admin broadcasts - and presents them all in a navbar bell, visible on any screen. It brings an unread counter, priority-based sound, cross-tab synchronization and a preferences panel where each technician turns on or off what they want to receive. One key point: it does not create new events, it only gathers and flags what GLPI has already recorded.

Head-to-head comparison

CriterionSmart Notify (NexTool)Unread
NatureNexTool module for GLPI 11Community plugin
Where the alert appearsGlobal bell in the navbar, on any screenHighlight in the item list
Update modelBackground polling (15 to 120s)When the list loads
Event sources11 (follow-up, task, validation, solution, document and manual alerts for ticket/problem/change)Read / unread state of items
Priority-based soundYes (4 tones: subtle, default, alert, alarm)No
Per-user preferencesYes (11 types + sound, per technician)No
Cross-tab synchronizationYes (BroadcastChannel + localStorage fallback)No
"New messages" separator in the timelineYesNo
Indicator in the listsRed dots per unread itemRow/item highlight
Manual admin broadcastYes (targeting: everyone, user, group, entity)No
Automatic cleanupYes (daily cron, configurable retention)Not applicable
Database cost per active user1 query per polling cycleNear zero in the background
Supported GLPI11 (glpi_major 11 in the manifest)Depends on the installed plugin version
PriceFreeFree

The trade-off that matters in operations

Maintaining GLPI for clients, the point that always comes up is not the feature list - it is the cost of polling. Smart Notify refreshes the bell by polling (a configurable interval from 15 to 120 seconds), not by WebSocket. Each technician with the screen open fires one database query per cycle. In an operation with dozens of concurrent technicians, leaving the interval at 15s multiplies those queries with no real gain in perception. That is why, in production, we tune it between 30 and 45 seconds: imperceptible to the user and easy on the database. The module helps in two ways - it pauses polling when the tab goes inactive (the visibilitychange event) and calls session_write_close() at the start of the read request, so the poll is not stuck behind the user's own session lock.

The most common mistake we see in support is the technician complaining that they "do not get a notification for their own follow-up". That is by design: Smart Notify excludes the user's own actions - you are not alerted about what you wrote yourself. Another tweak we always make is to turn off document notifications by default (they are noisy on instances that attach many files) and keep only the events that require action. And the factor that decides the project up front: Smart Notify is GLPI 11. If the client is still on GLPI 10, the conversation changes - the realistic option there is Unread (or an equivalent list highlight), because the bell does not run on 10.

Configuration we use in production

# Smart Notify - base configuration (GLPI 11)
# NexTool panel > Modules > Smart Notify > Settings tab
refresh_interval   = 30      # seconds (range 15-120); 30-45 is the sweet spot
max_notifications  = 50
retention_days     = 90      # automatic cleanup via the smartnotify_cleanup cron
notify_document    = 0       # off: attachments generate too much noise
notify_new_problem = 0       # off: infrequent event
sound_urgent       = alarm   # tones by priority: subtle | default | alert | alarm

# 1) Check the effective config directly in the database
SELECT config FROM glpi_plugin_nextool_main_modules WHERE module_key = 'smartnotify';

# 2) Reset the FPM OPcache after enabling/updating (validate_timestamps=Off)
docker exec glpi_app_prod kill -USR2 $(docker exec glpi_app_prod pgrep -o php-fpm)

# 3) Confirm the automatic cleanup in GLPI:
#    Setup > Automatic actions > smartnotify_cleanup

Verdict by scenario

Choose Smart Notify when: the operation runs on GLPI 11, technicians keep the interface open all day, there are multiple entities and profiles, and you need an active alert (bell + sound) with per-person preferences and admin broadcast. This is the high-volume service desk scenario, where a missed follow-up costs SLA.

Choose Unread when: you are on GLPI 10, or you just want to highlight what has not been seen in the lists with nothing running in the background, or the team is small and email already covers the alert - Unread only solves "what I have not opened yet". It is the minimal-footprint option.

The two are not direct competitors: Unread covers one slice (list unread state) that Smart Notify also delivers, with red dots in the lists and a "New messages" separator in the timeline. Running both together on GLPI 11 is redundancy - pick one.

Cost and effort

Both are free. What differs is the effort: Unread installs and that is it, with no configuration and no maintenance. Smart Notify needs an initial setup (polling interval, event types, authorized profiles) and has a cron task (smartnotify_cleanup) that clears read notifications and logs according to retention - runs daily, no intervention. Once tuned it is also "install and forget", but tuning the polling and the event types is what separates a clean rollout from a noisy one.

Need notifications outside GLPI too - WhatsApp, Telegram, Teams? The bell reaches whoever is inside the system; to reach those outside it, combine it with the external notification modules from NexTool. If you like, we can help design the alerting flow while maintaining your GLPI.


Reviewed by the NexTool Solutions team.

Frequently Asked Questions

No. Natively, every notification goes out by email. Plugins like Smart Notify (NexTool) and Unread add the alert inside the interface. Smart Notify refreshes the bell by polling (an interval of 15 to 120 seconds), not by WebSocket - so it is 'near real-time', with the latency of the configured interval.

No. Smart Notify is a module for GLPI 11 (the manifest declares glpi_major 11). If you are still on GLPI 10, the realistic option to flag what has not been seen is the Unread plugin or an equivalent list highlight - the navbar bell does not run on 10.

It depends on the interval and the number of concurrent technicians: each open tab makes one query per cycle. In production we use 30 to 45 seconds as the balance; 15s multiplies queries with no real gain in perception. The module also pauses polling when the tab goes inactive and calls session_write_close() on the read, keeping the poll from getting stuck behind the user's own session lock.

It is intentional. The module excludes the user's own actions - you are not alerted about the follow-up, task or solution you wrote yourself, only about what others did on the items you are involved in (requester, assigned, watcher or group).

On GLPI 11, no. Smart Notify already covers the Unread scenario - it flags unread items with red dots in the lists and adds a 'New messages' separator to the timeline. Running both is redundant. Unread makes sense on its own when you are on GLPI 10 or want the minimal footprint of just highlighting what has not been opened.

Need help?