← All work
Tifosi Optics 2026

Sales Dashboard from Business Central

Sales reps and leadership see performance against budget on demand instead of waiting on a report.

Problem

Sales performance lived inside the ERP. Getting at it meant asking someone to run a report, export it, and format it. By the time a rep or a manager saw where they stood against budget, the number was days old, and nobody could ask a follow-up question without starting the request over.

The people who needed the number most were the ones least able to get it themselves.

Approach

A live sales dashboard that reads Microsoft Dynamics 365 Business Central directly and publishes itself on a schedule. No exports, no manual step, no analyst in the middle.

What it shows:

  • Performance against budget — every rep’s actuals versus budget, current month and year to date, with variance and percent attainment
  • Year over year — monthly comparisons across roughly two years of history, so a strong month reads against the same month last year rather than against last month
  • Customer detail — revenue by customer, who is growing and who has gone quiet
  • Item detail — what is actually selling, by product and category
  • Campaign performance — sales tied back to marketing campaigns recorded in the ERP
  • Forward visibility — open sales orders and booked revenue not yet shipped, so the pipeline sits alongside what has already closed

How it works:

  • Reads the ERP directly through the Business Central API using a dedicated read-only account, scoped to only the objects the dashboard needs. It cannot write, post, or alter anything in the accounting system.
  • Rebuilds itself twice a day. A scheduled job runs at 8:00 AM and 3:30 PM Eastern, pulls fresh data, rebuilds the page and deploys it. Morning numbers before the day starts, afternoon numbers before it ends.
  • Refresh on demand. A button triggers a rebuild for anyone who needs the number sooner, and disables itself while the job is running so it cannot be double-fired.
  • Caches history. Around two years of monthly history is stored rather than re-queried, so the page loads instantly instead of waiting on the ERP. Only recent months rebuild each run.
  • Runs without a server, hosted on Cloudflare’s edge. Nothing to patch, nothing to restart, no hosting bill that scales with use.
  • Fails loudly, not quietly. If a source returns nothing, the dashboard says so rather than rendering a confident zero. A blank number and a broken number look identical to a reader, so the difference is made explicit.

What made it hard

Getting to the right budget. The obvious budget figure in the ERP was not the one finance actually used. Reconciling the two sources and confirming which was authoritative took direct verification against the accounting team’s own numbers rather than assumption.

Permissions are separate from availability. Publishing a data object in Business Central and being permitted to read it are two different steps. Several tables were visible but not readable, which fails in a way that looks like a missing feature rather than a missing permission.

Verification before trust. Cached figures were checked against live ERP data month by month, to the cent, before being relied on. A dashboard that is wrong once stops being used.

Result

Sales performance against budget is now available to the whole team on demand rather than on request. It rebuilds and publishes itself twice a day, with nobody running anything by hand.

The wider point: the data already existed in the ERP. What was missing was a way for the people who needed it to look at it without asking permission first.