M365Con 2027 – free online conference · 11–22 Jan 2027 · 120 sessions→ m365con.net

2025-08-05

Financial Forecasting with Dynamics 365 Finance and Fabric

Financial Forecasting with Dynamics 365 Finance and Fabric
Rolling forecasts miss the mark when D365 F&O actuals, sub-ledgers, and budgets live in silos. This episode shows how Microsoft Fabric unifies GL, AP/AR/FA and budget data into a single, governed model—so forecasts refresh with reality, variances reconcile themselves, and finance stops babysitting…

From five exports to one source of truth.


Outcomes (you’ll walk away with)

  • A pragmatic pipeline blueprint to land GL, sub-ledgers, and budgets in Fabric.

  • A semantic model for finance (CoA, dimensions, periods) that drills from P&L to line item.

  • A rolling-forecast pattern that updates as transactions post—no spreadsheet heroics.

  • Built-in variance analytics (Actual vs. Budget vs. Forecast) that reconcile, not argue.

  • Governance & lineage practices auditors love (and teams trust).


Why your forecast drifts

  • Siloed modules (GL, AP/AR/FA, Projects, Budgets) close on different cadences.

  • Dimensional drift (cost centers/projects) + stale Excel uploads.

  • Non-standard period calendars + late adjustments = timing noise masquerading as performance.

  • No single, governed dataset → five reports, five “truths.”


Fabric architecture at a glance

Sources → Ingest → Transform → Model → Serve → Govern

  1. Sources (D365 F&O):

    • GL: LedgerEntry, LedgerJournalTrans

    • Sub-ledgers: VendTrans, CustTrans, AssetTrans, Project trans

    • Budgets/Forecasts: BudgetRegisterEntry (+ department submissions)

  2. Ingest (Fabric Dataflows Gen2 / Synapse Link):

    • OData/Synapse Link connections with least privilege AAD auth

    • Incremental refresh (date-based filters) + scheduled pulls aligned to close cadence

  3. Transform (Power Query in Fabric):

    • Standardize Chart of Accounts, cost center, BU, project codes (translation tables)

    • Conform fiscal calendars; map sub-ledger dims → GL dims

    • Create validation rules (missing dims, future periods, out-of-range amounts)

  4. Model (Lakehouse + Power BI semantic model):

    • Dimensions: DimAccount, DimCostCenter, DimBU, DimProject, DimVendor, DimCustomer, DimPeriod

    • Facts: FactGL, FactAP, FactAR, FactFA, FactBudget, FactForecast

    • DAX measures: Actuals, Budget, Forecast, Variance (Abs/%), YTD/MTD, FX impact

  5. Serve (Power BI):

    • P&L, Cost center drilldowns, Cash flow, AR aging vs. cash forecast, Capex vs. plan

    • Drill-through to transaction proof (line-item to journal)

  6. Govern (End to end):

    • Lineage graphs, sensitivity labels, RLS by BU/region, audit logs, refresh SLAs & alerts


Data model essentials (copy-ready)

  • Star schema:
    FactGL (Amount, PostingDate, Period, AccountId, CostCenterId, BUId, ProjectId, Currency)
    FactBudget (Amount, Version, Scenario)
    FactForecast (Amount, Version, Scenario, RunTimestamp)

  • Key measures:

    • Actual = SUM(FactGL[Amount])

    • Budget = SUM(FactBudget[Amount])

    • Forecast = SUM(FactForecast[Amount])

    • Var vs Budget = [Actual] - [Budget]

    • Var vs Forecast = [Actual] - [Forecast]

    • % Var = DIVIDE([Var], [Budget])

    • YTD/MTD via DimPeriod with fiscal flags

  • Dimensions to lock early: CoA segments, fiscal calendar, currency tables, FX rates.


Rolling forecast pattern

  1. Unify actuals daily (or intra-day) into FactGL + sub-ledgers.

  2. Seed forecast from last 3/6/12 months (moving average/regression) into FactForecast.

  3. Overlay drivers: headcount, pipeline, seasonality, pricing/cost indices.

  4. Auto-adjust on new postings: recompute forecast deltas for impacted accounts/cost centers.

  5. Scenario layers: Base / Best / Worst → slicer-driven in Power BI.

  6. Write-back (optional): Dataverse/OneLake table for finance-owned forecast adjustments (with approver + reason code).


Variance analytics that explain themselves

  • Bridges: Prior Forecast → Mix → Volume → Price/Rate → Timing → Actual

  • Timing detector: postings outside expected period windows flag as “timing variance.”

  • Attribution: AR days drift → cash forecast shortfall; AP terms change → working capital impact.

  • Drill path: P&L line → cost center → document → journal ID.


Data quality & governance checklist

  • Controls: Required dims, valid period, FX rate availability, duplicate prevention.

  • Lineage: Source table → Dataflow → Lakehouse → Model → Report (Fabric lineage view).

  • Security: AAD groups for Finance/FP&A; RLS by BU/Region; sensitivity labels.

  • Auditability: Refresh logs, dataflow run outcomes, change history on mapping tables.

  • Alerts: Refresh failures, late sub-ledgers, reconciliation thresholds breached.


10-step implementation (pilot in 2–3 days)

  1. Inventory must-have tables (GL, AP, AR, FA, Budget).

  2. Create Fabric workspace + lakehouse; set AAD groups & labels.

  3. Stand up Dataflows Gen2 (incremental) for each source.

  4. Build translation tables for dimensions; codify naming standards.

  5. Conform fiscal calendar; generate DimPeriod.

  6. Model star schema; define core DAX measures.

  7. Publish P&L + Variance report with drill-through to line.

  8. Add forecast table + driver sheet (Dataverse/OneLake) + measures.

  9. Wire alerts (refresh, reconciliation thresholds, variance spikes).

  10. Document lineage, access, refresh SLA; socialize runbook.


Common pitfalls (and fixes)

  • GL ≠ sub-ledger totals → Staggered closes/timing → add “posting window” & timing variance logic.

  • Budget misaligns → Inconsistent dims/codes → enforce translation & validation pre-landing.

  • Stale reports → Manual refresh reliance → schedule + failure alerts + incremental refresh.

  • Drill fails → Missing natural keys → include journal/document IDs end-to-end.

  • Trust gap → No lineage/audit → enable Fabric lineage, log dataflow runs, document mappings.


Performance tips

  • Push heavy prep into Dataflows Gen2; keep the model thin with calculated measures (not columns).

  • Use aggregations for long history; segment hot/cold data.

  • Incremental refresh by Period/PostingDate; partition budgets by Version/Scenario.

  • Avoid bi-directional relationships; use role-playing DimPeriod for multiple date views.

Apple Podcasts · Spotify · YouTube

Host: Mirko Peters

Related articles

← Microsoft Teams Project Management: A Practical GuideCustomize Dataverse for Complex Business Apps →