Client story · Sable Board · 2023
A few seconds, and the listing finished
Sable Board rewrote the listing service and rebuilt the form machinery under it. The screen did not change. People finished 16 seconds sooner, 4.17% more listings published, and revenue rose with the price left alone.
+4.17%listings that published
- Capture
- Model
- Insight
- Interface
- Test
- Hold
Summary
The posting service was one of the few paths Sable Board could not let stall. About a million listings start on a busy day. The service had been written in Python, years earlier, and the form infrastructure around it had grown by addition. By 2023 the median answer was still quick. The tail was not. A slow response did not look like a design problem. It looked like a spin, a failed publish, and a note to support.
The rewrite moved the service to Go and rebuilt how forms were assembled. Nothing in the steps, the fields, or the price of a listing was touched. The hope was reliability. The result was also commercial. Successful listings rose 4.17%. The average person reached a finished post 16 seconds earlier. Across a million posts a day, that is more than 4,400 hours handed back every day. Support cost fell. Revenue rose, with no change to the business model.
The latency record is the part that has to stay next to the revenue line. The median fell from 56 milliseconds to 25, a 55% cut. Nine in ten requests fell from 378 milliseconds to 97, a 74% cut. Ninety-nine in a hundred fell from 1,401 milliseconds to 250, an 82% cut. The page did not get a new layout. The wait behind the last step got shorter, including on the bad request.
A vital path that had become ordinary to wait on
Posting a listing is the act the rest of the marketplace depends on. If it fails, there is nothing to find, nothing to pay to promote, and a person who thinks the product is broken. Roxana Mehr, who runs posting, said people do not write in about the look of the form. They write in because it spun, or it failed, and the listing is not up.
The question was whether the screen was asking for too much, or whether the service behind the last step was failing the people who had already done the work. A new flow would have been easier to announce. It would also have mixed a design change into a speed change, and then nobody could say which one moved the number. The constraint, agreed before the rewrite, was that the steps stay.
The whole distribution, not the flattering average
Every post kept a start, each step, the response time of the service, and whether a listing actually published. Support tickets that named a failed post were joined back onto that request. Revenue was joined later, on the listings that existed, not on the ones that had been attempted.
An average would have hidden the work. A median of 56 milliseconds sounds finished. The 90th percentile was 378 milliseconds, and the 99th was 1,401. Those are the sessions a person feels, and they were common enough, at a million posts a day, to be a daily tax. Other companies have reported the same shape: a small cut in wait shows up in completion and in money. The measurement here did not borrow their rate. It kept Sable’s own percentiles, because a marketplace of listings is not a checkout, and the only honest comparison is this service against itself.
Failures stayed failures
Posts that never left the first field were dropped. They are abandons of intent, not evidence about the service. Timeouts were kept as failures. Treating a timeout as a missing row would have made the new service look cleaner by deleting the exact harm it was supposed to fix. Internal test listings and employee posts were removed before any rate was published.
Duplicate submits of the same draft inside a short window were collapsed to one attempt. A person who hit Publish twice because the first answer had not come back is one listing trying to exist, not two customers. Support costs were counted only for tickets whose note pointed at posting, so a cheaper support week caused by something else could not be claimed.
What the rewrite actually was
The service was rewritten from Python into Go. The infrastructure that built the forms was rebuilt with it, so each step was no longer paying for a stack of older decisions. Reliability was the stated goal: fewer failed publishes, a tail that did not stretch past a second. Speed was the mechanism. There was no new model of the person. The “model” was the latency distribution, read at three cuts, before and after, on the same screen.
A holdback left the old service on a slice of live requests. Published listings were the primary count. Time from the first field to a finished post was the hold. Revenue was watched and was not allowed to be explained by a price change, because there was none.
The same form, with the wait marked
The blueprint is the posting screen as it shipped: title, price, Publish. The dashed block is the wait at the 99th, and it carries the heat, because that is the part of the flow the person could not see and could not finish. Before, the same fields sat on a submit that sometimes took more than a second to answer. After, the fields are the same. The answer at the 99th is 250 milliseconds. The median is 25.
- Quiet
- Low
- Warm
- Hot
- Tension
Posting blueprint for Sable Board. The form is unchanged. Tension sits on the wait after submit.
Heat on the send, not on the questions
The heatmap of the old flow is hottest on the band where the listing is sent. The fields around it are only warm. People were not stuck choosing a title. They were stuck after they had chosen, waiting for the service to accept the post. That picture is why a redesign of the questions would have been the wrong job.
No new flow in the same quarter
Roxana could defend an engineering rewrite. She could not defend teaching every poster a new sequence in the same quarter. Leah’s condition was the one that made the revenue line believable: if published listings do not rise with the speed, the rewrite is not the fix, and it does not get to wear the revenue as a trophy.
Sixteen seconds, and the money that followed
People finished 16 seconds sooner on average. At about a million listings a day, that is more than 4,400 hours of posters’ time returned every day. Successful listings rose 4.17%. The median improved 55%, the 90th 74%, the 99th 82%. Support cost on posting tickets fell, because the failures that created the tickets were the slow tail.
The result nobody had put in the plan was revenue. The price of a listing did not change. The steps did not change. More listings existed, and the marketplace made more money because of that. A speed project that only makes a chart of milliseconds is a platform project. This one changed how many people got to the end, and the end is what the business sells.
| Control | The old posting service |
|---|---|
| Variant | The rewritten service, same screen |
| Sample | Live posts, split by request |
| Primary | +4.17% listings that published |
| Held | 16 seconds sooner to a finished post |