Easy Windows Notification Documentation

EASY WINDOWS NOTIFICATION 2.0.0
User Guide - Unreal Engine 5.7 and 5.8
CelestiaDominance

PURPOSE
Send native Windows notifications from Blueprint or C++, schedule reminders, inspect pending reminders and cancel them. This is an operating-system notification tool, not an in-game UMG popup system or a push-notification service.

Supported use: Windows 10/11, Win64 desktop editor/PIE and ordinary packaged Unreal games without MSIX/Store package identity. Call on Unreal's game thread. Commandlets, dedicated servers, background worker calls and non-Windows platforms are unsupported. Required Unreal plugins: none. The .uplugin declares no plugin dependencies. No third-party runtime download is required.

FIRST NOTIFICATION
From your own Blueprint event, call Send Notification To Windows. Enter a title and description. For a simple test, choose Do Nothing as Click Action and enable Silent in the advanced pins. Branch on Return Value. If false, immediately read Get Last Windows Notification Result and print its Message.

True means Windows accepted the request. It does not prove a banner appeared, was read, or was clicked. Notification settings, Do Not Disturb, full-screen behavior, Windows policy and the active user session can suppress banners. The plugin never overrides these settings or grants itself notification permission.

Use your own events or UI buttons to call the nodes. No input action, actor, widget, asset or fixed key binding is required. Avoid sending from Tick. Build user preference/rate-limit logic around the calls so your game sends relevant reminders at a sensible frequency.

AVAILABLE NODES
All nodes are under Windows Notification.

1. Send Notification To Windows
Inputs: Title, Description, Click Action, Custom Link and advanced Silent.
Returns true when the native Show call succeeds and Windows does not report a known notification block. Title or description may be empty individually; both cannot be blank. Silent controls this notification's sound, not Windows settings.

2. Schedule Notification To Windows
Inputs: Title, Description, Delivery Time, Click Action, Custom Link, Notification Id, advanced Replace Existing and Silent.
Delivery Time must be a future UTC date/time. Use Utc Now, not the local Now node. Notification Id is case-sensitive, at most 16 characters, with no whitespace or invalid control/Unicode characters. Simple names such as daily_reward or quest_42 work well.
Leaving the ID blank generates a 16-character ID. After a successful call, immediately get Get Last Windows Notification Result and save its Notification Id. A later operation replaces that last result.
A duplicate ID returns false by default and leaves the existing reminder in place. Enable Replace Existing to replace matching pending entries. Windows has no atomic replacement operation; if adding the replacement fails, the plugin attempts to restore entries it removed. If restoration also fails, the result tells you to re-query and reconcile the schedule.

3. Schedule Windows Notification After Delay
The same notification inputs, with Delay Seconds instead of a date/time. Delay must be finite, from 1 second through 365 days. The plugin calculates the UTC delivery time. This avoids local-time/DST conversion mistakes for relative reminders. It is a Windows schedule, not an Unreal timer that requires gameplay to keep ticking.

4. Cancel Scheduled Notification
Input: the saved Notification Id. Cancels all matching pending entries in this application's schedule. Supports the legacy tag field used by version 1. Returns false with Not Found when there is no match. Windows failures are reported, including a failure after earlier matching entries were removed. Already delivered notifications are unaffected.

5. Cancel All Scheduled Notifications
Cancels pending entries for the current application identity only. It does not cancel other applications' notifications and does not remove already delivered notifications from Notification Center. An empty schedule is a successful no-op. If Windows refuses a removal, the call returns false; earlier entries may already have been removed. Query the schedule after a failure.

6. Get Scheduled Windows Notifications
Returns an array of Notification Id and Delivery Time Utc records. The output is cleared on failure. Use it to reconcile your saved reminder IDs, inspect a replacement, or build your own reminder-management UI. Native Windows scheduling is the source of truth; the plugin does not keep a second in-memory reminder list.

7. Get Windows Notification Status
Returns whether querying succeeded plus a status: Enabled, Disabled For Application, Disabled For User, Disabled By Policy, Disabled By Manifest or Unknown. False means the query itself failed; inspect the last result. A successful query with a disabled status is different from a query failure. A newly registered application can report Unknown until Windows creates its settings record on first use. This is not treated as disabled. Enabled does not measure Do Not Disturb or guarantee visible banners.
This node also performs the first-time per-user registration, so it can be called before your first notification. Windows may need time to recognize a newly created Start-menu registration; do not spam retries if the first banner is not visible.

8. Get Last Windows Notification Result
Pure node returning Success, Error, Windows Error Code, Message and Notification Id. Read directly after the operation you want to diagnose. It does not change the saved result. Results are local to the calling thread; normal Blueprint use runs on the game thread. Before any operation, Success is false and the remaining fields are empty/default.
Error values: None, Unsupported Platform, Unsupported Context, Invalid Input, Notifications Disabled, Not Found, Duplicate Id and Windows Failure. Windows Error Code preserves the signed HRESULT; the plugin log also prints it in hexadecimal.

9. Get Windows Notification App Id
Pure node returning the identity used for this project's Windows schedule. It does not register anything. Useful in diagnostics when reminders seem to belong to another build or editor project.

CLICK ACTIONS
Open Game: uses a plugin-owned Windows protocol registered to this executable. It launches the executable and can create another running instance; it does not focus the existing game, route a Blueprint callback, restore a particular level, or resume a save. In the editor, the launch includes the current .uproject path. Use this action when starting another instance is acceptable. Windows may apply its own protocol-launch policy.

Open Custom Link: opens a valid absolute HTTPS URL through the user's registered browser. Example: https://example.com/events?event=42&source=game . The URL must have a host, contain no spaces and be at most 2048 characters. HTTP, file paths, executable links, arbitrary URI schemes and placeholder https:// are rejected. XML special characters in valid URLs are escaped automatically.

Do Nothing: supplies no game-launch or browser action. Clicking does not invoke a plugin callback. It is suitable for informational notifications. The plugin uses a stub notification activator; it does not implement custom COM activation, text-input replies or notification action buttons.

TEXT LIMITS
The title is limited to 1024 UTF-16 code units and the description to 4096. The complete escaped XML is additionally limited to 5000 UTF-8 bytes. Many non-ASCII characters or XML entities can reach that byte limit before the individual text limits. Short, readable text works best; Windows decides visual truncation.
Ampersands, angle brackets, quotation marks, apostrophes, valid Unicode and line breaks are handled as text. Invalid XML controls and malformed UTF-16 surrogate sequences are rejected. Title/body content is never interpreted as toast markup.

EXAMPLE: REMIND IN TEN MINUTES
Your event -> Schedule Windows Notification After Delay:
Title = Reward ready
Description = Your daily reward is available.
Delay Seconds = 600
Click Action = Do Nothing
Notification Id = daily_reward
Replace Existing = true
Silent = your player's preference
Branch on Return Value. On failure, read and display/log the last result. On success, save the ID alongside your own reminder data.

EXAMPLE: CANCEL WHEN A REWARD IS CLAIMED
When your game confirms the claim, call Cancel Scheduled Notification with daily_reward. Not Found means there is no pending entry to remove; the notification may already have been delivered. Other errors require diagnostics or a later retry. Do not treat cancelling a reminder as the authority for whether the reward was granted.

EXAMPLE: A SPECIFIC UTC TIME
Call Schedule Notification To Windows with a UTC DateTime supplied by your game/server, or Utc Now plus a Timespan. Never pass local Now as though it were UTC. If your UI accepts local calendar times, your project must resolve the intended time zone and daylight-saving ambiguity before calling this node. The plugin has no local-time conversion node.

LIFETIME, IDENTITY AND STORAGE
Windows owns accepted pending reminders and may deliver while the game is closed. This is not a guarantee across reboots, sign-out, disabled notifications, uninstall, executable relocation or missed delivery times. Persist important reminder intent in your own save/backend and reconcile with Get Scheduled Windows Notifications at a suitable point in your game.

Ordinary packaged games retain the version 1 identity for safe project names: UnrealEngine.ProjectName.Notification. Editor sessions use a separate project-path-based identity so PIE cancellation does not erase the packaged game's reminders. Different builds with the same project name share the game identity for the same Windows user. Renaming a project changes its identity. Moving an editor project changes its editor identity. Version 1 editor reminders may remain under the old shared identity; they are not automatically erased by this update.

On first use in each process, the plugin checks and writes its own per-user application identity, an EWN-prefixed Start-menu shortcut and a unique protocol command. No administrator privileges are requested. It does not overwrite a user's normal game shortcut or UnrealEditor.lnk. The command points only to the current executable and, for editor sessions, the saved project; no external URI is interpolated as a shell command. Keep the executable at a stable location for reminders that can be clicked later. Running from a new location updates registration on the next notification operation.

This registration is specific to ordinary desktop deployments. A game distributed with MSIX/Store package identity requires manifest-based registration and is rejected with an actionable message instead of pretending desktop registration works.

TROUBLESHOOTING
False immediately: read the last result. Check UTC time, input sizes, URL, duplicate ID, game-thread context and Windows settings.
True but no banner: check Notification Center and Windows notification settings / Do Not Disturb. The plugin cannot force delivery or infer that the user saw it.
Schedule at the wrong hour: replace local Now with Utc Now, or use the delay node.
Cancellation returns Not Found: confirm the ID and application identity, and query pending entries. Editor and packaged game schedules are intentionally separate.
Open Game starts another process: that is the documented protocol behavior. Existing-instance activation is not provided.
Windows Failure: include the result Message, Windows Error Code, UE version and whether this was PIE or a packaged game when reporting the issue.

C++
Add EasyWindowsNotification to your module dependencies and include WindowsNotificationBlueprintLibrary.h. The same static functions and WindowsNotificationTypes.h result types are available in C++. Marshal worker-thread requests to the game thread before calling notification operations. Blueprint nodes and C++ calls use the same implementation.

Support: https://discord.gg/9Zc4wbwqG9