Skip to main content
Nerve Centre KPIs · Audit Profile · Sentiment Settings Microsoft Dynamics 365 Finance back-office health audit. Answers four questions: (1) are general journal entries posting cleanly (no stuck journals, no out-of-balance vouchers); (2) is AR collectible (aging, DSO, credit holds) across legal entities; (3) does on-hand inventory reconcile with ecom availability; (4) is the period close on track for consolidation. The cross-channel area joins D365 sales orders and customer invoices to commerce-sibling orders to size unbilled revenue and credit risk.

What this audit checks

Authentication & access

  • Azure AD OAuth2 token resolves for the D365 Finance environment (correct tenant + resource URL)
  • App registration granted OData access to GeneralJournalEntries, CustomersV3, SalesOrderHeadersV2, CustomerInvoiceJournalHeaders, InventOnhand
  • DataAreaId (legal entity) for every active company is configured
  • OData $filter + cross-company query enabled for multi-entity reads

GL health

  • Unposted general journals below 50 (no stuck batch from the ecom integration)
  • Zero out-of-balance vouchers persisting past posting
  • Batch job / Data Management import errors cleared in the last 24h
  • Manual journals under 25% of total postings (controls gap if higher)

AP/AR cycle

  • AR aging 60+ days below 15% of open receivables
  • DSO under 60 days and not rising > 10 days vsP
  • No single customer holding > 40% of 60+ day AR (concentration risk)
  • Cash application (settlement) rate at or above 95%; high-value invoices (> 50k) not overdue 60+ days

Inventory reconciliation

  • ERP-vs-ecom on-hand variance below 5% on top-50 velocity SKUs
  • No item on-hand gone negative in any warehouse / site
  • Items below safety stock / minimum coverage flagged
  • Slow-moving / dead stock under 10% of inventory value

Period close

  • Ledger period not past close deadline on any legal entity (> 5 days blocks consolidation)
  • Zero intercompany imbalances across the legal-entity group
  • Accrual reversals from the last close within expected range

Cross-channel: revenue reconciliation

  • Ecom orders with a matching D365 Sales Order + Customer Invoice of equal value within the period (sibling = shopify/bigcommerce/adobe.order)
  • Ecom customers with completed orders present in the D365 customer master (CustomersV3)
  • AR aging on customers with active ecom orders (credit-control gap)
  • Unbilled revenue forecast (commerce cleared value minus matched customer-invoice value)

Severity thresholds

SignalWarnCritical
open_journal_count2550
journal_imbalance_count15
ar_aging_60d_pct1015
dso_days4560
inventory_variance_pct35
period_close_overdue_days25
customer_master_drift510

Data sources

  • GET https://{env}.dynamics.com/data/GeneralJournalEntries - Posted + unposted journal entries, voucher balance
  • GET https://{env}.dynamics.com/data/CustomersV3 - Customer master, credit limit, blocked status
  • GET https://{env}.dynamics.com/data/SalesOrderHeadersV2 - Sales orders: status, hold, ecom reference
  • GET https://{env}.dynamics.com/data/CustomerInvoiceJournalHeaders - Customer invoices for order-to-invoice reconciliation
  • GET https://{env}.dynamics.com/data/InventOnhand - On-hand by warehouse/site vs ecom availability