Acumatica · Gi

Acumatica GI on Dashboards — Best Practices

Acumatica GI on Dashboards — Best Practices sits at the intersection of three forces: what the user wants to see, what the database can deliver, and what the platform will let you.

John Kihiu12 min read

Every Acumatica dashboard widget is backed by a Generic Inquiry, which means every dashboard performance problem, every "the number looks wrong" ticket, and every "can we add one more filter" request is actually a GI design question wearing a dashboard's clothes. Treating dashboard GIs as a distinct discipline from ad hoc reporting GIs has saved me a lot of rework.

Design for the widget type, not for flexibility

A GI feeding an ad hoc grid can afford twelve columns and three optional parameters because a human is sitting there filtering interactively. A GI feeding a dashboard chart or indicator widget is rendered automatically on page load, usually for every user who has that dashboard, with no interactive filtering unless you deliberately wire dashboard-level filters. That changes the design goals:

Refresh behavior is a dashboard-level setting, not a GI setting

Dashboard widgets have their own auto-refresh interval configured on the dashboard designer, independent of anything in the underlying GI. A common mistake is assuming a GI marked for OData exposure or a "live" data source is automatically live on the dashboard — it is not; if the dashboard's refresh is set to manual or a long interval, users are looking at stale data regardless of how current the GI's own query is. Set refresh intervals deliberately per dashboard based on how volatile the underlying data actually is: an executive KPI dashboard refreshing every 30 seconds against GLTran is usually pointless load for data that only changes at batch-posting cadence.

Match refresh interval to posting cadence, not to nervousness

If GL postings happen in batches a few times a day, a dashboard refreshing every minute buys nothing but database load. Ask when the source data actually changes, and set the interval to match — often five or ten minutes is plenty, and for daily-cadence data, once per session load is enough.

Dashboard-level filters and drill-down wiring

Dashboard filters (the filter bar many dashboards expose) pass values into GI parameters by name-matching, which means your GI's parameter naming has to be deliberate and consistent across every widget you want a shared filter to control — a date-range filter on the dashboard only reaches widgets whose underlying GIs declare a parameter with the matching name. I keep a small naming convention (@FromDate/@ToDate, @BranchID) applied consistently across every dashboard-feeding GI in a project specifically so filters wire up without per-widget debugging.

Drill-down (clicking a dashboard tile to open the underlying GI or a target screen) depends on the GI exposing a sensible navigation target — usually a key field wired to open the source document. Test drill-down as a restricted user, not as admin: a manager dashboard tile that drills into a screen the viewing user has no access rights to produces an access-denied page instead of the expected document, which is a bad first impression on exactly the executive audience these dashboards are built for.

Wrapping up

Dashboard-feeding GIs need narrower scope, deliberate defaults (since nobody is filtering interactively), pre-aggregated results rather than raw rows, and parameter names that align with the dashboard's filter bar. Refresh intervals live on the dashboard, not the GI, and should track how often the underlying data actually changes rather than how anxious the request sounded.

John Kihiu
Acumatica ERP Developer · Laravel Engineer

Independent software engineer in Nairobi specialising in Acumatica customisations, Laravel backends, and tax fiscalisation integrations across East and Southern Africa.