What this audit checks
Authentication & access
- BTP OAuth2 token resolves against the tenant subdomain + region (not the sandbox default)
- Scopes cover API_JOURNALENTRYITEM, API_BUSINESS_PARTNER, API_MATERIAL_STOCK, API_SALES_ORDER, API_BILLING_DOCUMENT
- CompanyCode(s) for every active legal entity are configured (multi-entity installs)
- OData $batch enabled to keep high-volume reads within the per-tenant rate limit
GL health
- Unposted (open) journal entries below 50 (idoc EXPORT/IMPORT queue clean)
- Zero imbalanced documents (debit != credit) persisting past validation
- Idoc error queue (status 51/56/64) below 10 in the last 24h
- Manual journals (FB50/FB60) 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 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 Material on-hand gone negative in any Plant (double-posting / UoM error)
- SKUs below safety stock flagged for reorder
- Slow-moving / dead stock under 10% of inventory value
Period close
- Period close not past deadline on any CompanyCode (> 5 days blocks consolidation)
- Zero intercompany imbalances across the CompanyCode group
- Accrual reversals from the last close within expected range
Cross-channel: revenue reconciliation
- Ecom orders with a matching SAP Sales Document + Billing Document of equal value within the period (sibling = shopify/bigcommerce/adobe.order)
- Ecom customers with completed orders present in SAP Business Partner master (no AR-posting gap)
- AR aging on customers with active ecom orders (credit-control gap: ordering while past due)
- Unbilled revenue forecast (commerce cleared value minus matched SAP billing value, FX-translated at TCURR rate type M)
Severity thresholds
| Signal | Warn | Critical |
|---|---|---|
open_journal_count | 25 | 50 |
journal_imbalance_count | 1 | 5 |
ar_aging_60d_pct | 10 | 15 |
dso_days | 45 | 60 |
inventory_variance_pct | 3 | 5 |
period_close_overdue_days | 2 | 5 |
customer_master_drift | 5 | 10 |
Data sources
GET https://api.s4hana.cloud.sap/sap/opu/odata/sap/API_JOURNALENTRYITEMBASIC- Journal entries: posting status, debit/credit, reference documentGET https://api.s4hana.cloud.sap/sap/opu/odata/sap/API_BUSINESS_PARTNER- Customer + vendor master, credit limit, AR aging, blocked flagGET https://api.s4hana.cloud.sap/sap/opu/odata/sap/API_MATERIAL_STOCK_SRV- Plant-level on-hand, safety stock, standard priceGET https://api.s4hana.cloud.sap/sap/opu/odata/sap/API_SALES_ORDER_SRV- Sales documents: status, credit/inventory hold, ecom referenceGET https://api.s4hana.cloud.sap/sap/opu/odata/sap/API_BILLING_DOCUMENT_SRV- Billing documents for order-to-invoice reconciliation