projectadg last reviewed 2026-05-21

Aspire smart-dashboard โ€” internal BI + KPIs

Context

Aspire staff need cross-brand KPI visibility (revenue, bookings, payroll cadence, supplier spend) without logging into 8 different vendor tools. smart-dashboard is the internal BI layer that pulls data from connected MCPs (Xero, Tanda, STAAH, PowerEPOS, GA4) and surfaces it as a single dashboard.

Architecture

graph LR X["Xero x5 orgs"] --> SD T["Tanda"] --> SD P["PowerEPOS"] --> SD G["GA4 x7 brands"] --> SD CL["Clarity"] --> SD SD["smart-dashboard<br/>BI / KPIs"] --> HUB["Aspire Hub SSO"] classDef app fill:#715EE3,color:#fff,stroke:#291F50; class SD app;

Detail

What's live

Data sources (connected MCPs)

SourceWhat it pulls
Xero (5 orgs)Revenue, expenses, P&L by entity
TandaRoster, timesheet, leave, payroll spend
PowerEPOSPOS sales, top items, daily totals (3 venues)
STAAH โ†’ Zinga CMAccommodation bookings, occupancy
GA4 (7 brands)Web traffic, conversions per brand
Microsoft Clarity (8 brand tokens)UX friction, session recordings
Search Console + BingOrganic search performance

SSO pilot status (2026-05-12 LIVE)

Per aspire-hub, smart-dashboard was the first app onboarded to Aspire Hub OIDC SSO. The pattern that worked:

  1. Add signIn() client helper to smart-dashboard
  2. Set AUTH_TRUST_HOST=true
  3. Set HUB_* env trio (URL, client ID, client secret) from Hub /apps UI
  4. Click Enable SSO in Hub /apps
  5. Discovery doc at <hub>/.well-known/openid-configuration
  6. NextAuth v5 rejects GET to /api/auth/signin/{provider} โ€” known gotcha

This template is now reusable for other internal apps.

Stack

Coverage gaps (per MEMORY.md project_brand_ecosystem)

Open questions

  1. Real-time vs daily-batch โ€” currently daily aggregation. Real-time hits MCP rate limits + cost.
  2. Who has dashboard access? Currently any Aspire Hub staff member; should be role-gated (e.g., venue managers see only their venue).
  3. Mobile view โ€” currently desktop-first; staff often need to check on-the-go.

Related

๐Ÿ”— Relationships

graph LR smart_dashboard["smart-dashboard"]:::self smart_dashboard --> aspire_hub["aspire-hub"] smart_dashboard --> aspire_mcp_ecosystem["aspire-mcp-ecosystem"] classDef self fill:#715EE3,color:#fff,stroke:#291F50;