How we use dutch auctions to assist with automated pricing

Avatar CGeel
Posted

If you've tried to purchase hats or unusuals from us recently, you've probably seen something like this:

Example of a Dutch Auction

 

This system has been around for a while, and it's based on something known as a "dutch auction". This is basically the reverse of a normal auction; instead of the price starting low and getting higher, the price starts at a higher point and progressively gets lower until someone buys it. For example, we may start out a new hat at +15% price for the first hour that we own it, and then decrease the price down towards base price every 15 minutes or so. I got the idea from this blog post on Rust's alpha key sale system from 2013. 

The specifics

Let's get down to brass tacks. For the first hour that we own an item, its price is increased slightly -- usually around 15%, although it can vary. Every 15 minutes, its price drops until it's at +0%, or just normal price. After a week or two of remaining unsold at base price, we then decrease its price every few days in increments of 5%, down to a specific maximum discount. These numbers are not all the same between different banking types (stranges are different from unusuals, for instance).

Why use dutch auctions?

Dutch auctions can sound pretty greedy: on the surface, it may only seem to benefit us by grubbing up as much money as possible. In practice, it doesn't actually generate much profit at all; we use this system for a number of reasons besides pure profit.

First, pricing items in an automated manner is difficult. We use a variety of pricing sources, such as Backpack.tf and the Steam Community Market™©®, but these aren't as responsive and flexible as we'd like them. Prices are frequently out of date (especially for unusuals), and even when they are up-to-date, they're not a complete representation of the market. What our dutch auction system allows us to do is fetch the most realistic price for an item by initially requesting a marked-up price, and quickly lowering it until, at some point, it's accurately priced. 

Second, it helps combat bots. Trying to prevent bots on ScrapTF may seem a tad ironic, considering what we are, but they serve to frustrate our users. It's very annoying to see that all of the great deals have been immediately snatched up by bots, and even more annoying to have an item reserved by a bot right before you enter the queue. The dutch auction system helps combat bots by essentially creating a soft "safe period" on an item where, for the first hour or so, an item is visible but bots don't want to take the risk of automatically purchasing an item that's marked up. A human, however, can make their own judgements about whether the item is still worth the price when it is marked up, or they can decide to wait for it to decrease in price. Essentially it allows us to display an item as "coming soon" so users can see the item and either purchase it right away if the price is still right for them, or be ready and waiting for when the price decreases.

Finally, it serves as a good way to display new items for sale on ScrapTF. Items in the dutch auction process are displayed at the top above all items, which gives each new item that we receive its time in the spotlight.

The flipside

This system doesn't only serve to temporarily increase an item's price: it is also used to make items cheaper if we've had them for too long. After an item has made it past the first hour of being available on ScrapTF, it lowers to its base price. However, if it is still not purchased for some time (in terms of days) at base price, we slowly lower its price, sometimes down to as low as 20% off. This system takes effect on a slower timescale than the dutch auctions do, and that's necessary to prevent abuse of the system. In many cases we are actually taking a loss on an item if we discount it, so we have to give users plenty of time to purchase it before we begin the discount process.

Implementation

Implementing this system was a bit more complicated than you may think. Due to quirks in the Steam API, determining exactly when we acquired an item is difficult. However, we have a tool that can help us. For the past few years, we've been storing the progression of Item IDs in the TF economy. Every 5 minutes, we store the latest item ID in the bots. Simply put, what this allows us to do is take an item's ID and we can determine, within 5 minutes, when that item was traded or created. This is very useful for us as it allows us to easily figure out when we received an item on ScrapTF, using solely its ID. It also allows us to determine when you received your items, but we're not currently using that information for anything.

The future

In the future, we hope to use something like this system to assist with our buying prices as well. For example, we can increase the price we pay for an item if we see that nobody has sold that item to us in quite some time, which indicates that the price we pay is wrong. Or perhaps we can decrease the price we pay if users are suddenly flooding our bots with a particular item, which would indicate that its price has suddenly changed for some reason, and we're paying far too much for it. This is quite a complicated system, but I think it's worth heavily looking into.

 

I hope this post has given you a bit more insight into how we price items on ScrapTF. We're constantly evolving our systems to provide the best service to our users, and this is a part of that. See you next time!

Please login to view comments