Data and cache
IntensiveReports does not ask Microsoft 365 every time someone opens a page. It keeps the data in memory and refreshes it in the background. This page explains how, and what you can change.
Three kinds of report
Section titled “Three kinds of report”| Kind | How it gets its data | What people see |
|---|---|---|
| Cached | built from data sets (users, groups, devices, licences …) that the app keeps in memory and refreshes on a timer | opens at once |
| On demand | read from Microsoft 365 when someone first opens it, then kept for a while (1 hour unless changed) | the first visitor waits; later visitors get the kept result |
| Scan | runs only when someone presses Run scan (or an API client starts it). Scans read a lot, for example every mailbox or every site, and can take minutes. | the last result until the next scan |
Each report’s page in the report reference says which kind it is. Reports that read through PowerShell (Exchange Online, SharePoint, Teams, Purview) are on open or scan reports and take longer than Graph reports.
How the background refresh works
Section titled “How the background refresh works”- At start, the app reads the core data sets first (users, groups, devices, licences, Conditional Access and others), then the rest. Pages are usable while this runs and show a loading state until their data is in.
- Every data set has its own refresh interval, from 5 minutes (users) to 6 hours (usage and storage reports). A timer checks every minute which data sets are due and refreshes up to four at once.
- A data set that nobody used for twice its interval (at least an hour) is not refreshed on the timer. The next time a page, report, API call or the dashboard needs it, it is refreshed at once; the page shows the last data until the new data is in. The data behind the dashboard is always kept current.
- A failed refresh keeps the previous data and is retried after at most 5 minutes.
- Refresh on a report page reloads that report’s data now, whatever the interval.
| What | Value |
|---|---|
| Timer | every 60 seconds |
| Refresh interval per data set | 5 minutes to 6 hours (users 5 min, groups and devices 10 min, licences 30 min, usage and storage reports 6 h) |
| Parallel refreshes | 4 |
| Retry after a failure | the interval, at most 5 minutes |
| Not refreshed when unused for | 2 x the interval, at least 1 hour |
| On-open and scan results kept | 60 minutes (5 to 1,440), unless a report sets its own time; 5 minutes when a result has notes |
| A PowerShell report is stopped after | 20 minutes (IntensiveReportsConfig:PowerShellTimeoutMinutes) |
| Dashboard history kept | 400 days |
Settings > Data & cache
Section titled “Settings > Data & cache”Administrators change these settings for everyone; press Save after a change.
| Setting | Effect |
|---|---|
| Refresh pace | multiplies every interval: Faster (half), Normal (as designed), Relaxed (twice), Minimal (four times). Slower means fewer Microsoft Graph calls and less throttling, but older data. |
| Pause background refresh | data only changes when someone presses Refresh. The first load after a restart still runs. |
| Keep on-demand reports for | how long on-open reports and scan results are kept, in minutes (default 60) |
| Fetch switch per data set | turns a data set off for everyone. It is then never read from Microsoft 365, not even by Refresh or the API. Reports that need it say that their data is switched off instead of showing an error. Use it for data you do not want read at all, or for a workload you do not have. |
| Reset to defaults | the cache settings as shipped |
The Cache status table lists every data set with its number of items, interval, last and next refresh, state and Last error. Data sets that are not refreshed because nobody used them say when used; on-open reports say on request; scans say when a scan is started. Refresh reloads one data set, Refresh all now all of them.
The memory line shows how much memory the app uses. Measure now first runs a full clean-up (the app pauses for a moment), so the figure counts only what is really in use (Operations).
Settings > Report thresholds
Section titled “Settings > Report thresholds”Some reports decide by a limit, for example how many days without sign-in make a user inactive. Administrators set these limits for everyone:
| Threshold | Default | Used by |
|---|---|---|
| Inactive user (days without sign-in) | 90 | Inactive Entra ID Users, Licence Reclamation Candidates, Unused Mailboxes |
| Inactive guest (days without sign-in) | 90 | Guest Lifecycle |
| Grace period before ‘never signed in’ is flagged (days) | 30 | Guest Lifecycle, Licence Reclamation Candidates |
| Stale device (days since last Intune sync) | 30 | Devices Not Synced Recently, Intune Compliance Posture |
| Inactive privileged account (days) | 30 | Stale Administrators |
| Password age warning (days since last change) | 90 | Days Since Last Password Reset for Users, Break-glass Account Health, Service Accounts Disguised as Users |
| Secret / certificate expiry warning (days ahead) | 30 | App & Service Principal Credential Expiry |
| Device naming convention (regular expression) | none | Device Naming & Category Compliance |
The tab also shows the allowed range of each threshold. The dashboard widgets for sign-ins, guests, licences and credentials use the same values. Reports already open pick up a new value when they are opened again.
After a restart
Section titled “After a restart”An update, an app pool recycle or a server reboot empties the memory:
- the app reads all data again (about a minute for a small tenant, longer for a large one);
- on-open reports load again when someone opens them;
- scan results are gone; run the scans again;
- settings, the dashboard history and API clients are kept (they are files in
App_Data).
IIS stops an idle app pool after 20 minutes and recycles it every 29 hours by default. Both empty the memory. Set the
pool to always running with setup\Set-IrIisAlwaysRunning.ps1 -Apply (Installation).
Throttling
Section titled “Throttling”Microsoft Graph limits how many calls an app may make. IntensiveReports refreshes at most four data sets at once and
retries failed ones later. If the log shows many 429 warnings, choose a slower Refresh pace or switch off data
sets you do not need.