Analytics Data Freshness
PortaAIM analytics are pre-aggregated from your billing engine on a regular schedule. Understanding the update cadence helps you interpret the numbers correctly.
Update Cadence
Analytics run every 15 minutes. Each run pulls the latest data from your billing engine and overwrites the relevant documents in the database. The dashboard and API always serve the most recently computed snapshot.
Between runs, data stays current automatically. You can also refresh on demand: the Refresh button on the dashboard requests a new aggregation for your account and reloads the page once it completes (this can take a few moments while the latest figures are recalculated from your billing engine). Hover the Refresh button to see when the data was last computed.
The "Today" Bucket
The current day's metrics are partial — they only include charges recorded so far today. As new usage events and subscription charges are posted throughout the day, the today bucket grows with each 15-minute run.
This means:
- Morning numbers are lower than end-of-day numbers — this is expected.
- Comparing "today" against "yesterday" will show today as lower until the day is complete.
- Month-to-date totals include the partial today figure.
Recent Months Keep Updating
Each run recomputes the last 30 days, so a charge posted late still lands in the right day, and the current and previous month keep correcting themselves while they stay inside that window.
Once a month falls entirely outside the last 30 days, its figures stop changing. They are not recomputed again unless someone asks for that date range explicitly.
Plan Changes and Prorated Credits
When a customer changes plans mid-month, the billing engine posts two charges once the customer's next day starts, which is the day after the change:
- A negative charge — prorated refund for the unused portion of the old plan.
- A positive charge — prorated fee for the new plan.
The net revenue on that day may be negative. This is financially correct: it reflects the revenue actually recognised after credits. So a one-day dip on the revenue chart is worth checking against plan changes made the day before, rather than reading it as lost business.
MRR is not affected by these credits. MRR is computed as a snapshot (sum of active customers' monthly fees), not from CDR sums, so it remains stable regardless of mid-month plan changes.
Sandbox vs. Live
Aggregation runs independently for each environment. Switching to Sandbox in the environment toggle shows data aggregated from your sandbox billing environment. The two datasets are completely separate and do not affect each other.
Stale Data
If the aggregator fails to connect to the billing engine for several consecutive runs, the dashboard continues to show the last successfully computed data. The figures remain accurate as of the last successful run — they are not zeroed out or hidden.
"Not stored" instead of an amount
A day computed by an older version of the aggregator can be missing a service's vendor cost, because that version kept only two decimals and a sub-cent cost rounded away. Where that happens the dashboard shows Not stored rather than $0.00, so a missing figure is never mistaken for a service that cost nothing:
- Service Costs tooltip, and the Others hovercard on that chart.
- Profit by service, where the margin is withheld for that row.
An amount only part of which was stored is marked with a *. It is not shown as a minimum or a maximum, because the missing figure could have been a charge or a refund, so nobody can say which way the total is wrong.
Selecting Refresh recomputes the last 30 days, which clears it for any recent day. An older period has to be re-aggregated for its own date range.