Thread.bi
Studio
Onboard New Client
Client Identity
Modules
Users
Users default to all selected modules above. Uncheck to restrict per user.
Fabric Workspace
Warehouse created automatically. Ensure TailoredBI-Fabric-Query SP has Member access.
Branding
ERP Connection
Refresh Schedule
UTC 7 = 1 AM MT, UTC 18 = 12 PM MT, UTC 23 = 5 PM MT
Execute Onboarding
Client Status
Clients
Users
Refresh Schedule
Reports
Client Branding
Feature Modules
ETL Engine
Loading from Azure DevOps...
Sync Health
Cross-tenant operator view: mirror pipelines, SWA + DB reachability, agent status. Silent sync failures show up here before anyone notices stale reports.
Loading health snapshot…
ETL Engine
Per-client source → warehouse mappings. Each row is a stored proc (or SQL) that loads one table into the Fabric warehouse.
pick a client
Select a client to see its table registry.
Recent Runs
How this works
Each registry row tells the ETL Engine: run source_query against the client's source (per etl_params.EPICOR_*), land rows in [sink_schema].[sink_table] of the Fabric warehouse.
Watermarked facts use {WATERMARK} placeholder — incremental loads upsert by PK
Full-load dims truncate + insert every run
Date sentinel tables are seeded once via init-date from a template tenant
• Column drift (new columns in source) auto-adds to warehouse; removed columns are kept but not populated
DAX Engine
Run TMDL/DAX scripts against Fabric semantic models — the Tabular Editor 2 workflow, inside Studio.
Prototype
Backend wiring status
This panel is a UI scaffold. For Execute to actually update a Fabric semantic model, we need:
• A new API action on threadbi-api: /dax/execute accepting {workspaceId, modelId, tmdl}
• That action calls Fabric REST POST /workspaces/{ws}/semanticModels/{model}/updateDefinition with TMDL payload (async job)
• Polls the returned job until complete, returns status to Studio
• Auth via the existing TailoredBI-Fabric-Query service principal (already configured in Function App env vars)

Workspace + Model dropdowns populate from Fabric API directly (no backend needed) — those should work once you're logged into Studio with MSAL.
Report Engine
Generate or regenerate a Power BI report for a client + module. Pushes a fresh SemanticModel + Report folder to the client's DevOps repo; Fabric Git sync imports them to the workspace.
How this works
Generate pulls the module template (Finance or Sales) from ThreadBI-Engine/templates/modules/<module>, substitutes per-client placeholders (warehouse, colors, IDs), and commits the SemanticModel + Report folders to the client's DevOps repo. A subsequent Fabric Git sync from the Clients panel imports the items into the workspace and updates embed.ReportCatalog so thread.bi can embed them.

Finance template: ARInvoice, APInvoice, GL — AR aging, DSO, gross margin
Sales template: SalesOrder, Shipment — order qty, ship rate, backlog
Data Model Engine
Inspect measures across tenant semantic models, apply measures from the shared library. Complements DAX Engine (freeform TMDL).
Prototype
Shared Measure Library
Reusable measures sourced from templates/shared/Measures/. Pick one, choose a target table in the loaded model, apply.
Click Reload library to fetch the shared measure catalog.
Operator Alerts
Single pane for operational signals across all tenants — pipelines, ETL runs, Fabric sync health. Replaces scattered email alerts. Auto-refreshes every 60 s while open.
Pipelines
loading…
ETL
loading…
Fabric Sync
loading…
Filter
Loading…