BondOS · stock-account reconciliation

Run HMRC's 3-way test before the supervising officer does.

A customs warehouse keeps its authorisation on one thing: the stock account agreeing with the CDS-declared removals and with the goods actually on the floor. This runs those three against each other and returns every break — undeclared removal, quantity mismatch, negative balance, orphan physical — ranked by severity and by the duty riding on it.

3
Sources tested
4
Break types detected
0
Ledger rows stored
Human
Files every removal
The check · /api/reconcile

Ledger in. Breaks out.

Paste your movement ledger and your stock-take — a WMS export, or the example below. The engine rolls entries minus removals to an expected on-hand per rotation, carries the suspended duty and import VAT with it, and compares that to the count on the floor and to whether each removal actually has a CDS declaration reference against it.

Printed on the audit pack header. Not validated against HMRC here.
The date the physical count was taken. Labels the pack.
One movement per line, comma-separated. Lines starting # are ignored.
direction(in|out), rotation, quantity, valueGbp, dutyGbp, vatGbp, removalType, declaration_ref Leave declaration_ref empty on an out row to see an undeclared removal flagged.
One rotation per line: rotation, quantity counted. A rotation counted on the floor with no ledger history is flagged as orphan physical.

Nothing is stored — the ledger is posted to the reconciliation endpoint and the result returned. Stateless.

The four breaks

What the engine is actually looking for — and why each one hurts.

critical

Undeclared removal

Goods left the warehouse on an out movement with no CDS removal declaration reference against it. Duty may have escaped. Duty at risk = the duty carried on that removal row.

critical

Negative balance

More units removed from a rotation than were ever entered. The stock account is over-drawn — the arithmetic itself doesn't hold, which is the fastest way to lose credibility in an audit.

warning

Quantity mismatch

Physical count differs from the ledger-expected on-hand. Duty at risk is estimated from the per-unit duty on that rotation's entries — indicative, and it points you at which rotation to recount.

warning

Orphan physical

Stock counted on the floor for a rotation with no entry in the stock account at all. No duty figure can be attributed to it, so duty at risk shows as £0 — that is a gap in the evidence, not a clean result.

FAQ

Does this file anything with HMRC or CDS?
No. It reads three sources and reports where they disagree. Every removal is still declared and discharged by a human at the CDS gate, and every break is resolved by a human. The engine detects — it does not discharge.
Where does "duty at risk" come from?
From the duty figures you supply on the ledger rows. An undeclared removal carries the duty on that removal row. A quantity mismatch is estimated at the rotation's average per-unit entry duty × the units missing — that one is indicative, not an assessment. Orphan physical has no duty basis at all, so it reports £0.
What is the open liability figure?
The suspended duty plus suspended import VAT still riding on the stock the ledger says is on hand — pro-rated from what you entered against the entry movements. It is what would fall due if everything remaining went to home use, on the figures you supplied. Actual duty is calculated at release, on the rate and valuation in force then.
Is my ledger stored?
No. The endpoint is stateless — it takes the ledger, computes, and returns. Nothing is written to a database and nothing is retained after the response.
Is this customs advice?
No. It's decision support with the arithmetic on the table. The warehousekeeper and the declarant stay accountable. For regulated advice, speak to your customs broker or HMRC.
Decision support, not customs advice. The warehousekeeper stays accountable.