Getting Started
What Is This Dashboard?

The AI Cost & Value Realization Tracker is a self-contained HTML dashboard that gives your MSP or consulting practice a single pane of glass for tracking AI tool spend, adoption rates, productivity gains, and estimated savings — all in one file with no server required.

Primary Use
Cost Visibility
Track monthly burn rate, per-seat cost, and annual projection against a defined budget across all AI tools and clients.
Primary Use
Value Realization
Measure ROI by combining cost data with manually entered productivity gains and estimated dollar savings per client or department.
Design Principle
Backend-Ready
All data lives in JavaScript arrays at the top of the file. Replace those arrays with API calls to connect any backend without changing the UI.
Audience
MSP / Consultants
Built for Senior Consultants presenting to clients or internal leadership. Three view modes: Client, Dept, and Tool rollups.
Getting Started
Quick Start

You can be up and running in under five minutes. The file is entirely self-contained — no npm, no build step, no server.

01
Open the file in a browser
Double-click ai-cost-value-tracker.html or drag it into Chrome/Edge/Firefox. All charts, gauges, and tables render immediately from built-in sample data.
02
Edit inline — no code required
Every white-underlined field in the Breakdown Table is directly editable. Click any value (Seats, Monthly $, Prod Gain %, Est Savings $) and type a new number. The dashboard recalculates the moment you tab or click away.
03
Set your annual budget constant
Open the HTML file in any text editor. Near the top of the <script> block, find const ANNUAL_BUDGET = 48000; and replace 48000 with your actual annual AI budget in dollars.
04
Replace sample data with real data
Find the three arrays — tableData, deptData, and toolData — and populate them with your actual client, department, and tool records. Each row is one object with seven fields (see Field Reference below).
05
Add qualitative Value Notes
Use the Value Notes panel in the bottom-right to capture observations that numbers can't show — adoption blockers, quick wins, stakeholder quotes. Type and press Enter or click Add.
06
Export when ready to share
Click Export CSV under the Breakdown Table to download the active view (Client, Dept, or Tool) as a comma-separated file for SharePoint, Excel, or Power BI ingestion.
Getting Started
Setup Checklist

Work through these items in order to get from sample data to production-ready reporting.

Download the HTML file — save ai-cost-value-tracker.html to a shared drive, SharePoint, or local folder accessible to your team.
Set ANNUAL_BUDGET — open in a text editor, update the constant to your real budget figure.
Populate tableData — replace the six sample client rows with your actual MSP clients. Include real seat counts and monthly spend per tool.
Populate deptData — if tracking by department internally, update these rows with real headcount and per-department spend.
Populate toolData — aggregate per-tool totals across all clients (Copilot, OpenAI/ChatGPT, other licenses).
Enter productivity gain estimates — use manager surveys, time studies, or benchmarks to fill in Prod Gain % per row. Even rough estimates unlock the ROI gauge.
Enter estimated savings — translate productivity gains to dollar values (hours saved × avg hourly rate). Update Est Savings $ per row.
Add Value Notes — seed the notes panel with 3–5 qualitative observations before your first stakeholder review.
Test Export CSV — verify the export works and the output file imports cleanly into your Power BI or Excel environment.
(Optional) Wire backend API — replace static arrays with fetch() calls to your data source. See Backend Wiring section.
Dashboard Panels
KPI Cards

Four top-line cards give at-a-glance status. All values recalculate automatically when you edit table data or click Recalculate.

CardWhat It ShowsHow It's Calculated
Monthly Spend AMBER Sum of all monthly $ values across the active view SUM(monthly) across all rows in activeData()
Active Users TEAL Average adoption rate across all rows AVG(active%) across all rows
Cost Per User BLUE Monthly cost divided by active seats totalMonthly / (totalSeats × avgActive%)
Annual Projection RED Current burn extrapolated to 12 months totalMonthly × 12, compared to ANNUAL_BUDGET
Delta Indicators
The small delta lines below each KPI are currently approximated at +8% month-over-month for spend and +5% for users. Once you wire a backend with historical data, replace the kpi-spend-delta and kpi-users-delta DOM updates in recalcAll() with real prior-month comparisons.
Dashboard Panels
Burn Rate Card

The wide card below the KPIs is your budget consumption view. It shows how far through the annual budget you are at the current monthly run rate, with forward projections.

FieldDescription
Monthly Burn RateLarge number on the left — total monthly spend across all active rows.
Budget Consumed barHorizontal bar showing (monthly × 12) ÷ ANNUAL_BUDGET as a percentage. Animates on load.
Q1 ProjectionMonthly × 3. Useful for quarterly business reviews.
Q2 ProjectionMonthly × 6. Half-year run rate.
Annual BudgetThe ANNUAL_BUDGET constant — update this in the script to match your org's actual number.
RemainingANNUAL_BUDGET minus (monthly × 12). Shows positive if under budget, negative if over.
Budget Constant
The default ANNUAL_BUDGET is set to $48,000. This is the first thing you should update before showing the dashboard to anyone. Find const ANNUAL_BUDGET = 48000; near the top of the <script> block.
Dashboard Panels
Dual-Axis Chart

The main chart overlays two different metrics that normally wouldn't share an axis — cost in dollars and adoption as a percentage. Three datasets are plotted simultaneously.

Dataset 1
Monthly Cost $
Bar chart on the left Y-axis. Shows actuals for past months with slight random variance to simulate real historical variance. Current month uses the live tableData sum.
Dataset 2
Active Users %
Smoothed line on the right Y-axis (0–100%). Past months show simulated adoption growth trending toward current average. Fill area beneath the line indicates cumulative adoption momentum.
Dataset 3
Cost Projection
Dashed blue line extending 2 months into the future. Projects at +4% per month from the current burn rate. Replace the growth factor in getChartData() with your own trend model.
Controls
6M / 9M / 12M Toggle
The segment toggle above the chart changes the time range. Switching to 12M will generate 12 months of historical data plus 2 future projection points. Data regenerates on toggle.
Connecting Real Historical Data
Historical data is currently simulated in getChartData(months). To use real data, fetch a time-series endpoint and populate the costData and userPct arrays directly, one entry per month in chronological order. The chart expects null for future months in the actuals datasets and null for past months in the projection dataset.
Dashboard Panels
ROI Value Gauge

The SVG gauge gives instant visual feedback on whether your AI investments are generating more value than they cost. The needle and arc both animate when data changes.

ROI Formula ROI % = ( ( Total Est. Savings − Total Monthly Cost ) ÷ Total Monthly Cost ) × 100
Gauge ZoneROI RangeInterpretation
Red Zone-100% to 0%Costs exceed estimated savings. Investigate adoption gaps or recalibrate savings estimates.
Amber Zone0% to ~75%Breaking even or modest positive return. Typical in early adoption phases (months 1–3).
Green Zone75% to 200%Strong return. AI tools delivering 1.75–3× their cost in productivity value.
Blue Zone200%+Exceptional ROI. Verify savings estimates are not overstated before presenting to leadership.
Getting Meaningful ROI Numbers
ROI is only as good as your Est Savings $ inputs. A reliable starting formula: Est Savings = (Avg Hours Saved/Week × 52 × Avg Hourly Rate) × Active Users. Use manager estimates for hours saved, and fully-loaded labor cost (salary + benefits) for hourly rate.
Dashboard Panels
Breakdown Table

The main data entry surface of the dashboard. All underlined fields are directly editable. Changes propagate to KPI cards, burn rate, gauge, and chart immediately.

ColumnEditableNotes
NameYesClient name, department, or tool name depending on active view.
ToolNoBadge showing copilot / openai / other. Change by editing the tool field in the data array.
SeatsYesTotal licensed seats for this row. Used to calculate Cost Per User KPI.
Monthly $YesTotal monthly spend for this row. Core input for all cost calculations.
Active %Display onlyRendered from the active field. Edit via the data array or backend. Color-coded: teal ≥70%, amber ≥50%, red below 50%.
Prod Gain %YesManually reported productivity improvement. Used for avg productivity gain in gauge stats.
Est Savings $YesDollar value of productivity gains. Key input for ROI calculation.
Inline Edits Are Session-Only
Changes made by clicking in the table are held in memory for the current browser session only. They are lost on page refresh. To persist edits, use Export CSV to capture the data, then update the source arrays in the HTML file or your backend. A future enhancement would add localStorage or an API save endpoint.
Button
+ Add Row
Appends a new blank row to the currently active dataset (Client, Dept, or Tool). Fill in the fields to include it in all calculations.
Button
Recalculate
Forces a full recalculation and re-render of all KPIs, burn rate, gauge, and chart. Updates the "Last Recalculated" timestamp in the footer.
Dashboard Panels
Value Notes Panel

Qualitative observations that numbers can't capture. This panel is intentionally low-friction — type and press Enter. Notes persist for the session and appear newest-first.

Good note categories to seed
Efficiency — hours saved, workflow improvements, error reduction.

Adoption Gap — clients or depts below 50% with a known reason.

Quick Win — a client or team that achieved ROI breakeven early.

Risk — compliance concerns, data governance questions, license issues.

Next Step — actions to increase adoption or expand to new teams.
Data & Integration
Data Model

All data is stored in three JavaScript arrays near the top of the script block. Each array drives one of the three table view modes.

Data Array Structure
// CLIENT VIEW — one object per managed client
let tableData = [
  {
    name:     'Apex Manufacturing',  // Display name
    tool:     'copilot',             // 'copilot' | 'openai' | 'other'
    seats:    25,                    // Total licensed seats
    monthly:  875,                   // Monthly spend in USD
    active:   72,                    // Active user % (0–100)
    prodGain: 18,                    // Reported productivity gain %
    savings:  2100,                  // Estimated monthly savings USD
  },
  // ... more rows
];
Three Parallel Arrays
tableData = Client view  |  deptData = Department view  |  toolData = Tool rollup view. All three use the same seven-field schema. The active view is determined by currentView and the activeData() function which returns the correct array.
Data & Integration
Backend Wiring

The dashboard is designed so that replacing static data with live API calls requires changes in exactly one place — the data arrays — with no other UI modifications needed.

🗄
Your API / DB
{ }
fetch() in init()
tableData array
recalcAll()
All UI Updates
Replace init() with an API fetch
async function init() {
  updatePeriod();

  // Replace this block with your real endpoint
  const res = await fetch('https://your-api/ai-costs');
  const json = await res.json();

  // Map API response to the expected schema
  tableData = json.clients.map(c => ({
    name:     c.clientName,
    tool:     c.primaryTool,       // normalize to 'copilot'|'openai'|'other'
    seats:    c.licensedSeats,
    monthly:  c.monthlySpendUsd,
    active:   c.adoptionPct,
    prodGain: c.productivityGainPct ?? 0,
    savings:  c.estimatedSavingsUsd ?? 0,
  }));

  renderTable();
  renderNotes();
  buildChart();
  recalcAll();
}
Wiring real historical chart data
// Replace getChartData() with your real time-series
async function loadChartHistory(months) {
  const res = await fetch(`/api/ai-costs/monthly?months=${months}`);
  const history = await res.json(); // [{month:'Jan 25', cost:3200, active:58}, ...]

  const labels   = history.map(h => h.month);
  const costData = history.map(h => h.cost);
  const userPct  = history.map(h => h.active);
  const projData = [...new Array(history.length).fill(null),
                   costData.at(-1) * 1.04,
                   costData.at(-1) * 1.08];

  return { labels, costData, userPct, projData };
}
ConnectWise / Autotask Integration
If you're pulling data from ConnectWise Manage or Autotask, map Agreement lines to monthly, product quantity to seats, and pull adoption metrics from your RMM or M365 usage reports. The TrendStart Finder agent can feed the active field once adoption tracking is in place.
Data & Integration
Formulas & Measures

All calculations performed in recalcAll(). These are equivalent to Power BI DAX measures if you replicate this logic there.

Total Monthly Spend SUM( row.monthly ) ← across all rows in activeData()
Average Adoption Rate AVG( row.active ) ← simple arithmetic mean across rows
Cost Per Active User (CPU) totalMonthly ÷ ( totalSeats × ( avgActive ÷ 100 ) )
Annual Projection totalMonthly × 12
Budget Consumed % MIN( ( totalMonthly × 12 ) ÷ ANNUAL_BUDGET × 100 , 100 )
ROI % ( ( totalSavings − totalMonthly ) ÷ totalMonthly ) × 100
Cost Projection (n months forward) currentMonthly × ( 1 + n × 0.04 ) ← 4% monthly growth assumption
Power BI Equivalents
These formulas map directly to DAX measures. For example, ROI % becomes: ROI % = DIVIDE( [Total Est Savings] - [Total Monthly Cost], [Total Monthly Cost] ) * 100. The CSV export provides a clean fact table to import as a Power BI data source.
Data & Integration
Export & CSV

The Export CSV button downloads the currently active view (Client, Dept, or Tool) as a flat CSV file. Columns match the seven fields in the data schema.

CSV Output Format
Name,Tool,Seats,Monthly $,Active %,Prod Gain %,Est Savings $
Apex Manufacturing,copilot,25,875,72,18,2100
Ridgeline Legal,copilot,12,420,58,12,840
...
Import into Power BI
In Power BI Desktop: Get Data → Text/CSV → select the exported file. Use Power Query to rename columns and set data types. Schedule a refresh if you automate the export from a backend endpoint.
Import into SharePoint / Excel
Upload the CSV to SharePoint as a Data source. In Excel: Data → From Text/CSV. The file can serve as the manual input sheet that Power BI pulls from on a schedule, letting non-technical staff update Prod Gain % and Savings fields without touching code.
Reference
FAQ

Inline edits are in-memory only. To persist: (1) use Export CSV after editing and save the file, then update the source arrays manually, or (2) wire a backend API that accepts POST requests from the inline edit handlers — add an onchange fetch to the editable inputs in buildRow().
In the CSS, add a new .tool-badge.yourtool rule with the desired border and text color. In buildRow(), the badge class is set directly from the tool field, so any value you put there will render as a badge — just add the matching CSS class.
Yes. Upload the HTML file to a SharePoint document library (not a pages library), get the direct file URL, and embed it using a SharePoint Embed web part. Note that SharePoint may require the file to be served from the same tenant domain. Alternatively host it as an Azure Static Web App for full control.
Check your Est Savings $ inputs. If savings are significantly higher than monthly cost, ROI will be high — which may be accurate, or may mean your savings estimates are inflated. A common mistake is entering annual savings when the field expects monthly savings. Keep all monetary fields on a monthly basis.
In getChartData(), find the line: projData.push(Math.round(baseMonthly * (1 + j * 0.04)));. The 0.04 is 4% per month. Change it to your expected monthly growth rate. For example, 0.02 = 2% per month growth.
Not in the current form — each browser session is independent. For multi-user collaboration, the backend needs a shared data store (database or SharePoint list) and the dashboard should fetch/push data via API. The architecture is ready for this; the HTML file has no server-side dependencies to remove.
Reference
Field Reference

FieldTypeRequiredNotes
namestringYesDisplay label for the row. Any string. Shown in table Name column and exported to CSV.
toolstringYesMust be one of: copilot, openai, other. Controls badge color. Add CSS for additional values.
seatsintegerYesTotal licensed seats regardless of usage. Used to calculate Cost Per User KPI.
monthlyintegerYesMonthly spend in USD. Core value driving all cost calculations. Do not use annual figures here.
activeinteger 0–100YesPercentage of licensed seats that are actively using the tool. Pull from M365 admin, RMM telemetry, or manual survey.
prodGaininteger 0–100RecommendedReported productivity improvement percentage. Used for avg productivity gain display. Safe to default to 0 until you have data.
savingsintegerRecommendedEstimated monthly dollar savings from productivity gains. Used directly in ROI calculation. Default to 0 if unknown — ROI gauge will show cost-only state.
Starting Without Savings Data
It's fine to launch with savings: 0 on all rows. The dashboard will show ROI at -100% (cost only, no savings), which is an honest starting point. Add savings estimates row by row as you collect data from clients and managers. The gauge will move as you fill in the numbers.