User activity
Notification database (wpndatabase.db)
Windows notification database cheat sheet: wpndatabase.db tables, toast Payload XML, FILETIME ArrivalTime and ExpiryTime, WAL recovery and legacy appdb.dat.
- Location
- C:\Users\<user>\AppData\Local\Microsoft\Windows\Notifications\wpndatabase.db
- Proves
- Which app showed which notification text to the user, and when it arrived
- Timestamps
- ArrivalTime and ExpiryTime per notification as FILETIME, UTC; push channel and handler times; legacy appdb.dat header time
- Retention
- Rows deleted after ExpiryTime or on dismissal; remnants in the WAL and free pages; legacy appdb.dat reuses about 256 chunks
- Access
- User profile file held open by the notification service: copy .db, -wal and -shm together via VSS (esentutl /y /vss)
- Evidence of
- User activity
- Type
- Database
- Windows
- 1011
- KAPE target
- WindowsNotificationsDB
- Velociraptor
- Windows.Triage.Targets:WindowsNotificationsDB
Tools
Compare all toolsWhat it is
The Windows Push Notification (WPN) platform stores the notifications that apps raise (toasts, tiles and badges) so that Action Center / Notification Center can display them. Each user has a SQLite database, wpndatabase.db, introduced with Windows 10 version 1607. Earlier Windows 10 builds used a custom binary file, appdb.dat.
Notifications carry text that the user saw on screen: e-mail subjects and senders, chat message previews from Teams, Slack, WhatsApp or Signal, calendar reminders, download or security alerts. Because apps copy content into the notification, the database can hold message text that the app itself encrypts or has since deleted.
Location
| Windows version | Path | Format |
|---|---|---|
| 10 1607+ / 11 (per user) | %LOCALAPPDATA%\Microsoft\Windows\Notifications\wpndatabase.db | SQLite, with wpndatabase.db-wal and wpndatabase.db-shm |
| 10 1607+ / 11 (system) | C:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\Notifications\wpndatabase.db | SQLite, system-level notifications |
| 10 1607+ / 11 | %LOCALAPPDATA%\Microsoft\Windows\Notifications\wpnidm\ | Images referenced by notifications |
| 10 before 1607 | %LOCALAPPDATA%\Microsoft\Windows\Notifications\appdb.dat | Binary, DNPW signature |
The database runs in WAL mode: recent and recently deleted entries are frequently only in wpndatabase.db-wal (SQLite WAL).
What it proves
- Content displayed: the text (and sometimes image) of a notification shown to the user, such as a message preview or an e-mail subject.
- Source app: which application or service raised it (
PrimaryIdof the handler, for example an AppUserModelID). - Timing: when the notification arrived and when it was due to expire.
- App presence: handler records show which apps registered for notifications on this profile.
- It does not prove the user read or clicked the notification, nor that the app was in the foreground.
Key fields
| Table / field | Meaning |
|---|---|
Notification.Id, Order | Notification identifier and ordering |
Notification.HandlerId | Link to NotificationHandler.RecordId |
Notification.Type | Notification kind (toast, tile or badge) |
Notification.Payload | Notification content, usually XML (<toast>…<text>…</text>); can be binary |
Notification.PayloadType, Tag, Group | Payload format and app-defined grouping |
Notification.ArrivalTime, ExpiryTime | Arrival and scheduled deletion |
Notification.BootId, ExpiresOnReboot, ActivityId | Boot session reference, reboot expiry flag, activity link |
NotificationHandler.PrimaryId | Application identifier that owns the notification |
NotificationHandler.HandlerType, CreatedTime, ModifiedTime | Handler kind and when it was registered/updated |
WNSPushChannel.ChannelId, Uri, CreatedTime, ExpiryTime | Push channel registered with the Windows Notification Service |
Other tables include HandlerAssets, NotificationData and TransientTable.
Timestamps
| Timestamp | Set when | Format | Pitfalls |
|---|---|---|---|
ArrivalTime | Notification received | FILETIME, UTC | The event (message, e-mail) may have occurred earlier if the device was offline |
ExpiryTime | Scheduled removal from the database | FILETIME, UTC | Set by the app or the system; the row can disappear earlier on user dismissal |
WNSPushChannel.CreatedTime, ExpiryTime | Push channel created / expires | FILETIME, UTC | Relates to app registration, not to user activity |
NotificationHandler.CreatedTime, ModifiedTime | Handler registered / updated | Converted by parsers | Approximates when an app first used notifications |
appdb.dat header time | Last notification shown (legacy) | FILETIME, UTC | Only in the first chunk's header |
Retention and clearing
- Notifications are short-lived: rows are deleted after
ExpiryTimeor once the user acknowledges or dismisses them, so the live table often holds only recent items. - Deleted rows can survive in
wpndatabase.db-waland in SQLite free pages until overwritten; carve them (file carving) and check volume shadow copies. - Users can turn off notifications per app or globally, in which case no new rows are written for those apps.
appdb.datuses fixed chunks (about 256 by default) that are reused, so older entries are overwritten.
Collection
- KAPE target:
WindowsNotificationsDB(collectswpndatabase.db*including WAL/SHM, andappdb.dat).PushNotificationcollects onlywpndatabase.dbandappdb.dat, without the WAL. Neither covers the system profile database or thewpnidmfolder. - Velociraptor (
Windows.Triage.Targets):WindowsNotificationsDB. - Built-in: the database is held open by the notification service; copy the three files together through a shadow copy (
esentutl /y /vsscopies any locked file, not only ESE databases).
esentutl.exe /y C:\Users\alice\AppData\Local\Microsoft\Windows\Notifications\wpndatabase.db /vss /d E:\case\Notifications\wpndatabase.db
esentutl.exe /y C:\Users\alice\AppData\Local\Microsoft\Windows\Notifications\wpndatabase.db-wal /vss /d E:\case\Notifications\wpndatabase.db-wal
esentutl.exe /y C:\Users\alice\AppData\Local\Microsoft\Windows\Notifications\wpndatabase.db-shm /vss /d E:\case\Notifications\wpndatabase.db-shm
robocopy C:\Users\alice\AppData\Local\Microsoft\Windows\Notifications\wpnidm E:\case\Notifications\wpnidm /E /COPY:DAT
Parsing tools
- SQLECmd (Eric Zimmerman): the
WPNDatabase_Notificationsmap joins notifications to handlers and converts FILETIMEs. - DB Browser for SQLite: open a working copy with the
-walbeside it and readPayloadas text. - Velociraptor: Exchange artifact
Windows.Forensics.NotificationsDatabase, or theGeneric.Forensic.SQLiteHunterextra. - Plaso: the
windows_push_notificationSQLite plugin adds notification and handler events to a super timeline. - Legacy
appdb.dat: Yogesh Khatri's Python script and 010 Editor template.
Investigation tips
- Search
Payloadfor chat previews from Teams or messaging apps: it may hold message text the app has encrypted or wiped. - Group by
PrimaryIdto list apps that notified the user, including remote-access tools, VPN clients or cloud storage apps you did not expect. - Security alerts from Microsoft Defender or third-party tools shown as toasts confirm the user was warned; pair them with the Windows event logs.
- Always parse the WAL: a clean-looking table with a large
-walfile often hides recently dismissed or deleted notifications. - Convert
ArrivalTimeto UTC and place it on the Windows Timeline and session data to show the user was logged on at that moment.
Related artifacts
- Microsoft Teams (classic and new client)Microsoft Teams cheat sheet: classic vs new Teams data folders, IndexedDB LevelDB messages and call logs, logs, and Purview or Graph exports as the reference.
- Desktop messaging apps (Slack, Signal, WhatsApp…)Desktop messaging forensics: where Slack, Signal, WhatsApp, Telegram and Discord keep data on Windows, what is encrypted, timestamps and export options.
- Windows Timeline (ActivitiesCache.db)Windows Timeline cheat sheet: ActivitiesCache.db and WAL, Activity tables, ActivityType values, focus duration, clipboard, 30-day expiry and Windows 11 status.
- Windows event logs (EVTX)Windows event log cheat sheet: EVTX locations, must-know event IDs for logons, processes, services and log clearing, retention, audit policy and parsing tools.
- Sticky Notes (plum.sqlite and StickyNotes.snt)Sticky Notes cheat sheet: plum.sqlite Note table and .NET tick timestamps on Windows 10/11, legacy StickyNotes.snt, WAL recovery, collection and parsing.
Glossary terms
- SQLite write-ahead log (-wal)The -wal sidecar file where SQLite writes recent changes before merging them into the main database; often holds the newest evidence.
- FILETIMEThe 64-bit Windows timestamp format counting 100-nanosecond intervals since 1 January 1601 UTC, used by NTFS, the registry and many artifacts.
- UTC vs local time in Windows artifactsWhy some Windows artifacts record UTC and others local time, and how the TimeZoneInformation registry key helps normalize a forensic timeline.
- File carvingRecovering files from raw disk data using content signatures such as headers and footers, without relying on file system metadata.