Skip to content

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.

KindHow it gets its dataWhat people see
Cachedbuilt from data sets (users, groups, devices, licences …) that the app keeps in memory and refreshes on a timeropens at once
On demandread 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
Scanruns 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.

  • 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.
WhatValue
Timerevery 60 seconds
Refresh interval per data set5 minutes to 6 hours (users 5 min, groups and devices 10 min, licences 30 min, usage and storage reports 6 h)
Parallel refreshes4
Retry after a failurethe interval, at most 5 minutes
Not refreshed when unused for2 x the interval, at least 1 hour
On-open and scan results kept60 minutes (5 to 1,440), unless a report sets its own time; 5 minutes when a result has notes
A PowerShell report is stopped after20 minutes (IntensiveReportsConfig:PowerShellTimeoutMinutes)
Dashboard history kept400 days

Administrators change these settings for everyone; press Save after a change.

SettingEffect
Refresh pacemultiplies 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 refreshdata only changes when someone presses Refresh. The first load after a restart still runs.
Keep on-demand reports forhow long on-open reports and scan results are kept, in minutes (default 60)
Fetch switch per data setturns 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 defaultsthe 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).

Some reports decide by a limit, for example how many days without sign-in make a user inactive. Administrators set these limits for everyone:

ThresholdDefaultUsed by
Inactive user (days without sign-in)90Inactive Entra ID Users, Licence Reclamation Candidates, Unused Mailboxes
Inactive guest (days without sign-in)90Guest Lifecycle
Grace period before ‘never signed in’ is flagged (days)30Guest Lifecycle, Licence Reclamation Candidates
Stale device (days since last Intune sync)30Devices Not Synced Recently, Intune Compliance Posture
Inactive privileged account (days)30Stale Administrators
Password age warning (days since last change)90Days Since Last Password Reset for Users, Break-glass Account Health, Service Accounts Disguised as Users
Secret / certificate expiry warning (days ahead)30App & Service Principal Credential Expiry
Device naming convention (regular expression)noneDevice 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.

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).

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.