What this audit checks
Authentication & access
- OAuth2 refresh against https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer succeeds (client_id + client_secret + refresh_token; rotated refresh token captured)
- Granted scope includes com.intuit.quickbooks.accounting (read access to Invoice / Bill / Customer / Vendor / Item / Account / report entities)
- realmId resolves - GET /v3/company//companyinfo/ returns the company without a 401 (bad token) or 403 (realmId mismatch)
- Throttle headroom - sustained 429 with Retry-After indicates the ~500 req/min per-realm or 10-concurrent limit is saturated by other integrations or the report-heavy cards
Order-to-books reconciliation
- Storefront orders with no matching QBO invoice / sales receipt after the sync window (revenue not on the books, tax base understated)
- Sync-app backlog - gap between latest ecom order timestamp and latest QBO invoice TxnDate widening beyond the expected sync cadence
- Invoices missing a sales-tax / VAT line (TxnTaxDetail) on taxable customers / taxable orders
- Duplicate invoices for the same ecom order reference (double-counted revenue from a misconfigured sync app)
AR & AP cycle health
- AR aged 60+ days above 15% of total AR balance (Aged Receivables report)
- Days Sales Outstanding (DSO) above 60 days
- Open invoices (Balance > 0) past DueDate concentrating on a small set of customers
- AP aged 60+ days above 30% of total AP - vendor relationship / cash-timing risk (Aged Payables report)
Inventory & GL hygiene
- Inventory Item QtyOnHand negative (oversell or receipt/shipment posting error - QBO Plus inventory only)
- Inventory items with QtyOnHand = 0 on SKUs with active ecom orders (stockout risk)
- Manual JournalEntry adjustments as an unusual share of total transactions (control weakness)
- Bank-classified accounts with stale CurrentBalance / no recent reconciliation
Cross-channel: QuickBooks vs ecommerce reconciliation
- Storefront order has no matching QBO invoice/sales-receipt after the sync window (sibling = bigcommerce.order / shopify.order / adobe_commerce.order, by DocNumber=order reference)
- QBO aggregate QtyOnHand drifts >5% from storefront available qty on SKUs with active orders (sibling = bigcommerce.product / shopify.product / adobe_commerce.product, by Sku=sku - QBO Plus inventory only)
- Ecom customer with completed orders absent from the QBO customer master after 7d (sibling = bigcommerce.customer / shopify.customer, by email)
- Customer with AR aged 60+ days still placing new ecom orders (credit risk compounding, sibling = ecommerce customer by email)
Data sources
GET /v3/company/{realmId}/companyinfo/{realmId}- Auth / company validation probeGET /v3/company/{realmId}/query- SQL-like read for Invoice / Bill / Customer / Vendor / Item / Account / JournalEntryGET /v3/company/{realmId}/reports/ProfitAndLoss- Net income, revenue, expense - P&L healthGET /v3/company/{realmId}/reports/AgedReceivables- AR aging buckets, DSO base, 60+ concentrationGET /v3/company/{realmId}/reports/AgedPayables- AP aging buckets, 60+ concentration