Overview 1 / 7
Next: SNB Account
TheNex Insights

Why Your Odoo "Shipped Not Billed" Account Keeps Growing

A root cause breakdown of one of the most common — and most misunderstood — Odoo accounting issues blocking month-end close.

Odoo Accounting Month-End Close Reconciliation ERP Consulting

It starts with a familiar conversation at month-end: the accounting team can't close the books. A reconciliation doesn't balance. Someone pulls up the trial balance and notices one account has been accumulating balances for months — the Shipped Not Billed (SNB) account.

No one touched it intentionally. No one knows exactly when it started. And now it's blocking close.

This is a pattern TheNex encountered firsthand with a manufacturing client running Odoo. We were brought in to diagnose why the SNB account was piling up, identify every impacted transaction, and chart a path forward. Here's what we found — and what any Odoo-powered business should know before this happens to them.

What Is the Shipped Not Billed Account?

In Odoo, the Shipped Not Billed account (sometimes called the Goods Delivered Not Yet Invoiced account) is an accrual account used in the perpetual inventory valuation method. When a delivery order is validated — goods leave your warehouse — Odoo debits SNB and credits the inventory account. The SNB balance is then expected to clear when the corresponding customer invoice is posted, which credits SNB and records revenue.

In a clean, well-configured Odoo environment, the SNB account should always tend toward zero at period end — because every shipment should have a matching invoice.

The Red Flag

If the SNB account balance is growing month over month, it means deliveries are being recorded but invoices are either not being generated, being generated incorrectly, or being posted in a way that bypasses the intended matching workflow.

Left unaddressed, this creates a snowball effect: the account grows larger, reconciliation becomes more complex, and the finance team loses confidence in the accuracy of their books.

01

Mismatch Between Delivery Orders and Billing Policies

In Odoo, each product's invoicing policy controls when a customer can be invoiced: either on Ordered Quantity (invoice as soon as the sale is confirmed) or on Delivered Quantity (invoice only after delivery is validated).

The SNB account is designed for the Delivered Quantity flow — it acts as the bridge between delivery and invoice. However, when billing policies are inconsistently configured across products, or when the policy is changed mid-operation, the SNB account can accumulate balances that never clear.

In the engagement we analyzed, this surfaced in several specific ways:

  • Sales orders were confirmed with products set to Ordered Quantity billing, but deliveries were validated without the corresponding invoice ever being generated — leaving SNB in a permanent debit state for those transactions.
  • Certain product lines had billing policies updated in the product master after active sales orders were already in progress, causing a disconnect between what the SO expected and what the delivery triggered in the GL.
  • Partial deliveries were validated in multiple shipments, but invoicing was only done against the first delivery — leaving subsequent delivery lines unmatched in the SNB account.

Why This Is Easy to Miss

Odoo does not prevent these mismatches from occurring — it will validate a delivery and post the SNB entry regardless of whether the corresponding invoice flow is correctly configured. The gap only becomes visible in the GL, often weeks or months later when someone reviews the SNB account balance.

02

Manual Journal Entries Bypassing the Workflow

The second root cause was more operationally significant and harder to trace: manual journal entries (MJEs) posted directly against the SNB account, outside of Odoo's standard order-to-cash workflow.

In some cases, these entries were made to correct what appeared to be discrepancies — adjustments to reconcile individual transactions, revenue recognition corrections, or period-end accrual entries. The intent was reasonable. The problem was the method.

When a manual journal entry posts a credit to SNB without a corresponding delivery-invoice match in the source documents, Odoo's automated reconciliation engine has no way to link it to the underlying business transaction. The SNB account accumulates orphaned debits and unmatched credits — and the account balance becomes unreliable as a reference.

What the MJEs Were Trying to Fix

  • → Apparent imbalances at period close
  • → Revenue timing corrections
  • → Adjustments to previously posted deliveries

What the MJEs Actually Created

  • → Broken audit trail from SO to GL
  • → SNB entries with no source document reference
  • → Accumulating, unreconcilable balances

The core principle in Odoo — and in any well-governed ERP — is that the general ledger should always be derivable from source documents: sales orders, delivery orders, and customer invoices. Manual journal entries to operational accounts like SNB break that chain and make reconciliation exponentially harder.

How We Diagnosed It: A Transaction-Level Approach

When TheNex was brought in, the first step was not to start making corrections — it was to understand the full scope of the problem before touching anything. We conducted a structured root cause analysis that covered:

GL Account Review

Full extraction and analysis of every entry posted to the SNB account — categorized by source (automated workflow vs. manual journal entry) and period.

Source Document Tracing

Each SNB debit was traced back to its originating delivery order and matched (or flagged as unmatched) against a corresponding customer invoice.

Billing Policy Audit

Reviewed invoicing policy settings across all impacted products and cross-referenced against the sales orders and delivery orders in scope.

MJE Identification

Isolated all manual journal entries posted to the SNB account, documented their intent based on descriptions and context, and flagged each as a contributing factor to the imbalance.

The output was a detailed, record-by-record mapping of the SNB account — every entry, its source document (or lack thereof), its reconciliation status, and its contribution to the piling balance. The client had full visibility into exactly why each dollar was sitting in that account.

Our Consulting Boundary

The actual manual reconciliation — matching and clearing individual transactions against their source documents — is a business activity that requires the client's own operational context, approvals, and judgment on each record. Our role was to deliver the diagnostic, the root cause analysis, and the roadmap. Executing the reconciliation is the client's responsibility and properly sits with their finance team. We recommended a structured, source-document-driven approach to clear the account systematically.

What We Recommended

1

Standardize Billing Policies Across All Active Products

Define a clear, documented rule for each product category: when should invoicing occur — at order confirmation or at delivery? Apply this consistently and ensure it is enforced in the product master before new SOs are created.

2

Prohibit Direct Manual Journal Entries to SNB

Implement a policy — backed by access controls where possible — that prevents MJEs from being posted directly to the Shipped Not Billed account. Any correction to the SNB balance should flow through the proper order, delivery, and invoice workflow.

3

Perform Source-Document-Driven Manual Reconciliation

Work through each unmatched SNB entry in order of age, using the delivery order and corresponding sales order as the reference. Do not attempt to clear entries in bulk — each line requires individual review to determine whether an invoice needs to be created, corrected, or cancelled.

4

Implement a Monthly SNB Review as a Close Checklist Item

Add a standing review of the SNB account balance to the month-end close checklist. Any balance older than 30–45 days should trigger an immediate investigation before it compounds. Prevention is far less expensive than retrospective cleanup.

The Bigger Picture

The Shipped Not Billed account is not just a line item — it is a leading indicator of process integrity in your order-to-cash cycle. When it accumulates, it is telling you something: deliveries and invoices are not flowing together as designed.

In our experience, SNB issues almost never have a single root cause. They are usually a combination of configuration gaps (billing policies), operational workarounds (manual journal entries), and a lack of periodic review. Addressing only one of those three is not enough.

The good news: once the root causes are clearly mapped and the impacted records are documented, the path forward is clear — even if the reconciliation work itself is significant. Clarity is the hardest part. And it is exactly what a structured consulting engagement is designed to deliver.