The Sellable Layer: Not Every Asset Is Ready to Sell
One stock layer shared by Market and Auction, a seven-dimension quality score, and a hold that is not a delete.
Core inventory is “everything in the warehouse.” That includes devices being tested, devices that failed testing, devices routed to recycling, devices pending a re-grade. Putting all of those on the market would be a disaster. The sellable layer is the filter: a separate set of rows that represent what your team is actually prepared to sell, read by Market and Auction alike.
What qualifies
A device can be listed when it has an identity (serial, manufacturer, model, category), an overall grade A to D — F and R never reach resale — a list price with a currency, the disposition resale, a data-security grade of at least D1 if it is data-bearing, a seller company, at least one photo, and a refurbishment level. That last one is not a hurdle: As received is a valid level, the buyer sees it as such, and it blocks nothing. Sub-grades, fresh grading, an erasure report, three to five photos, specs and provenance are not required, but each one you skip shows up in the quality score.
The disposition gate
Core projects a device into the sellable layer only while its intended disposition is resale. Route an already projected device to recycle, scrap, return to client, donate or internal use, and its projection goes on hold — unavailable, reason: disposition — as long as it is not on a channel; route it back to resale and the hold releases by itself. A hold your team placed deliberately stays. A listed or reserved device cannot change disposition until it leaves the sale, and a device that failed a mandatory test never gets routed to resale in the first place. The sales layer follows the bench, never the other way round.
Quality score
Each sellable row carries seven quality dimensions, each scored 0 to 5: freshness, data security, grading completeness, media, specs completeness, provenance and seller trust. A weighted aggregate rolls them into one overall score; the weights have platform defaults and can be tuned per tenant. The score is recomputed on every change, and the item page in Market inventory shows the dimensions so your team can see which one is dragging. Re-importing the identical file does not reset freshness — a new hat on the same data is still the same data.
Availability is a separate lifecycle
Being free of a channel does not make a row sellable. Every row has an availability: available, unavailable (on hold, with a reason and optionally an until-date), or destroyed (terminal, with date, reason and reference). A hold blocks publication on Market and Auction alike and keeps the device out of both wizards; destruction is refused while the device sits in an open batch, listing or lot. In neither case is the row deleted — provenance, chain of custody and closed deals keep pointing at it.
Non-core inventory
The layer also holds stock that never went through Core: spares, accessories, decommissioning leftovers, or the inventory of a team that runs its warehouse elsewhere. It arrives through the four-step import wizard at /market/inventory/import (or its Auction twin) — upload a CSV, XLSX, XML or JSON file, map the columns, review a dry run, commit — or is pushed over the public API. Unknown columns are kept as specifications. Imported and API rows share every listing surface with Core-derived ones.
Stale cleanup
External stock that stops being refreshed is pulled from publication by a daily job: after sixty days for file imports, after seven for API-pushed rows. Core-sourced rows are never touched. The listing or lot comes down, the channel returns to free, the stock row stays, and your tenant is told what happened and how much. Nothing kills a marketplace faster than 200 listings for laptops that haven’t moved since February.