Use your files
Input format and limits / Download example files
Browser limits: 16 MiB per file, 32 MiB total, and 45 seconds per run. Files are processed on this device.
Or paste JSON input
Selected files take priority over JSON. With empty inputs, either run button uses the included example.
Result and method
A deterministic ZIP you can reopen and rerun next billing cycle: client and SKU balance sheets (accounts.csv), the unmatched-movement list (unresolved.csv), full lineage (movement-lineage.csv), opening-close.json, the policy you ran, and hashes.json for verification. Byte-identical output for identical input.
How the calculation works
Every movement is one immutable ID with a UTC-offset timestamp, source account, destination account, SKU, quantity and unit. Each movement posts equal negative and positive integer entries across accounts, so internal deltas sum to zero per SKU and unit. A reversal cancels one named original movement; a reversal plus a corrected movement equals the direct corrected history. Replaying the same movement ID twice is idempotent; the same ID with a different payload is refused.
Limits
- If an SKU has no opening balance, the absolute closing balance is reported UNKNOWN while known movement totals are still shown — it never invents a number. It does not match unequal counts, infer wash yield, or accept fractional or boolean quantities. Conflicting or malformed rows produce a clear FAIL, not a silent zero.
- LinenBalance reconstructs counts from data you supply. We do not connect to your laundry system, we make no integration or certification claims, and we never see your data unless you send it.
Reproducibility
Example source: synthetic input supplied with this engine. Example computation checked: 2026-09-10T04:20:45.765318+00:00.
Offline batch edition
View exact files, fixed version and availability
Checkout unavailable on this free tool page. Availability is checked on the offline edition page.
Contact US Tech Automations / operations@ustechautomations.com