Work / Tatty's
An AI Pricing Assistant for Tatty's
A suggested price, with a confidence band, inside the stock-entry screen staff already use.
The constraint
Tatty's is a New Zealand consignment retailer. Staff receive second-hand clothing and accessories, price each item by hand, and list it for a fixed sales cycle.
A large share of consigned stock was not selling inside that cycle. Every unsold item had already cost intake, photography, listing and storage, and returned nothing. Price was the variable the shop controlled, and it depended on the judgement of whichever staff member was at the counter.
What we built
A pricing assistant inside the stock-entry screen staff already use. As an item is entered, the screen shows a suggested price and a confidence band beside the price field. The staff member still sets the price.
Two models sit behind the screen. The first suggests the price. The second flags items that are unlikely to sell at all, so staff can make that call at intake rather than at the end of the cycle.
Both models were trained on Tatty's own history, around 500K records after exclusions. Every prediction is written to the database alongside the price the staff member actually chose. Over time that gives the shop its own record of how the model performs against real sales, independent of our test results.
How it's built
The models are LightGBM, served from a Python FastAPI service on Azure. The existing .NET stock-entry application calls the service in line, as the staff member types. At the 95th percentile a suggestion returns in 14 to 16 milliseconds against a 100 millisecond budget, well inside the time it takes to type the next field.
On held-out data the price model's average error was $19.76, 21 percent lower than the baseline pricing method. The hard-to-sell classifier is the weaker of the two: an AUC of 0.71, with 62 percent precision at the threshold we chose.
We wrote down every design decision and had it signed off before writing code. Nine decisions and four architecture decision records came before any model was trained. We also set the ship gates, the performance bar each model had to clear, before seeing any results, so a model could not be graded against a bar moved to fit it.
What still takes judgement
Setting the gates first only helps if you keep to them. The hard-to-sell classifier missed its recall gate on the first run and again after tuning. We did not quietly lower the bar. We wrote a superseding decision record which said the original threshold had been a guess made before we had data, that two separate measurements disagreed with it, and that the measurement should win.
The commercial estimate needed the same care. The client report says it directly: "The estimate is not a measurement. We cannot observe what buyers would actually have done at different prices. We can only apply explicit assumptions to historical data."
With that caveat, a backtest on five years of the client's own sales data estimated a 17 percentage point lift in sell-through. We committed three sets of assumptions about buyer behaviour before running it: a baseline, a stricter set where buyers are more sensitive to price, and a looser set where they are less so. The lift held across all three, between 16.4 and 17.7 percentage points.
One figure needs no assumption about buyers. Of the 19,959 items that did not sell, 93.7 percent would have carried a lower price under the model.
What it means in practice
The prediction log will show how its suggestions compare with the prices staff choose and with what actually sells.
Most established retailers already hold a few years of sales history. It usually sits in the point-of-sale system and gets used for reporting. For Tatty's it became the training data for a pricing system the staff govern, built at a project cost sized for a small business.
Pattern partners with Tatty's on data, engineering and cloud infrastructure.