LinenBalance: Laundry Piece Movement Reconciliation avatar

LinenBalance: Laundry Piece Movement Reconciliation

Pricing

$0.50 / completed product packet

Go to Apify Store
LinenBalance: Laundry Piece Movement Reconciliation

LinenBalance: Laundry Piece Movement Reconciliation

Reconcile recorded laundry piece movements against opening balances. Download account closings, movement lineage and unresolved rows. Missing required openings stay UNKNOWN; no inferred inventory.

Pricing

$0.50 / completed product packet

Rating

0.0

(0)

Developer

US Tech Automations

US Tech Automations

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 hours ago

Last modified

Categories

Share

LinenBalance

LinenBalance is for a commercial laundry or linen service that already records integer piece counts (openings and movements) and needs a period close: per-account incoming, outgoing, net, and closing, with UNKNOWN when an opening is missing. It does not connect to a plant system, infer wash yield, attribute theft, raise invoices, or guess unmatched events.

The Actor produces a downloadable reconciliation packet from the records you supply.

What you get

A ZIP of the original engine files (leaf names only):

  • report.json — status, summary, tables, findings, provenance.
  • input.json — the exact input used.
  • accounts.csv — per account / SKU / unit: opening, in, out, net, closing, whether closing is known.
  • unresolved.csv — movements that could not be matched (for example a reversal of an unknown id).
  • movement-lineage.csv — every movement, UTC time, and whether it posted in the period.
  • opening-close.json, policy.json — snapshot and applied policy.
  • manifest.json, hashes.json — content hashes.
  • drilldown.html, styles.css — portable offline viewer using the shared USTA shell and current stylesheet (family domain-tools).
  • README.txt — package legend.

Adapter status is the engine status: PASS or UNKNOWN. Missing openings on a tracked account stay UNKNOWN. The adapter never upgrades that to PASS. Invalid input raises ValueError (it does not emit a FAIL ZIP).

Limits (from the engine)

  • Movement types: dispatch, receipt, disposal, correction, adjustment, reversal.
  • Quantities are integers. Booleans, fractions, and non-finite numbers are rejected. Absolute quantity at most 10^12. At most 200,000 rows per openings or movements list. Identifier strings at most 4,096 characters. Nesting depth 16.
  • Every timestamp must include an explicit UTC offset (or Z). Naive local times are rejected.
  • Period, if present, is half-open [start, end).
  • policy.tracked_accounts names accounts whose absolute closing must be known for PASS. A missing opening is never treated as zero.
  • Matching is exact and user-controlled. No wash-yield inference, unequal-count matching, theft attribution, invoicing, or system integration.
  • Adapter input is a JSON object of at most 1 MiB. Unknown top-level fields are rejected.

This is not hardware certification, domain certification, a laundry-system integration, or a professional assurance of inventory.

Complete input example

example.json matches samples/valid.json. Paste this object into the payload JSON field:

{
"movements": [
{
"destination": "PLANT",
"movement_id": "D-0001",
"quantity": 35,
"sku": "BATH_TOWEL",
"source": "CLIENT_A",
"timestamp": "2026-01-05T08:00:00-05:00",
"type": "dispatch",
"unit": "pieces"
},
{
"destination": "CLIENT_A",
"movement_id": "R-0001",
"quantity": 20,
"sku": "BATH_TOWEL",
"source": "PLANT",
"timestamp": "2026-01-06T08:00:00-05:00",
"type": "receipt",
"unit": "pieces"
}
],
"openings": [
{
"account": "CLIENT_A",
"quantity": 100,
"sku": "BATH_TOWEL",
"unit": "pieces"
}
],
"policy": {
"period": {
"end": "2026-02-01T00:00:00-05:00",
"start": "2026-01-01T00:00:00-05:00"
},
"timezone": "America/New_York",
"tracked_accounts": [
"CLIENT_A"
]
}
}

Under these rows, CLIENT_A closing is 85 (100 + 20 − 35). samples/unknown.json has movements on CLIENT_B with no opening: status stays UNKNOWN. samples/invalid.json (boolean quantity) is refused.

Cloud hosting

When you run this Actor, the JSON you submit is sent to Apify’s cloud and stored under your Apify account. It is not a local-only run. You control retention in that account. There is no lasting service-level agreement in this package.

Run and download

  1. Review the supported input and try the included synthetic example. Replace payload with your authorized records. For API runs, send an object with a single payload field containing that input.
  2. Run the Actor. Open Status and coverage to inspect the result.
  3. For a completed result, open Download completed ZIP or the artifact link in the dataset. Save and extract the ZIP before Apify retention expires. Open the HTML report where provided; retain the JSON and CSV evidence.

Price and unsuccessful runs

$0.50 per completed packet, with one packet per run and no start fee. A retry of the same run reuses the packet and the same billing identity. Starting a separate run is a separate request. Invalid input or an incomplete UNKNOWN result produces a diagnostic without a completed-packet charge. A completed conflict or shortage report can still require manual review; PASS does not mean every business problem was resolved.

The minimum run budget is $0.50. The example is a normal run and follows the same price; it is not a free preview promise. Apify handles account billing. These files are not permanent storage: download them promptly.

Access and support

Your input and output are processed on Apify under the run owner's account. Use authorized data and opaque IDs; do not upload passwords or sensitive personal records. Treat artifact URLs as access-bearing links and share them only intentionally. The USTA report may fetch the Satoshi font; it does not upload your report. For a product issue, use this Actor's Issues tab with the run ID and a redacted example. Never post private input or access-bearing links in a public issue.