AzerothVault

A paid market tool for World of Warcraft players who trade on the auction house. It is our own product: we built it and we run it in production.

Industry
Gaming
Our role
Our own product, from the first line to production
Live since
2022
The AzerothVault landing page, with a live auction house board of the best-selling items

A market with no sales data.

World of Warcraft runs a player economy. Every server has an auction house, prices differ from server to server, and they move by the hour. Players who trade seriously need to know what is cheap where, what sells, and what a craft is worth at today's prices.

Blizzard publishes the raw listings and nothing else. There is no public record of what sold, and the main third-party source closed its API. Every number players need has to be worked out from the listings themselves.

164

connected realms scanned every hour, 81 in Europe and 83 in the US

10k

commodity prices recorded every hour, one median price and quantity per item and region

18k

items compared across realms for flips

What we built.

The Market Scanner, ranking top-selling European commodities by sell rate with daily sales and average price

The Market Scanner

The pipeline's front window: every commodity ranked by how fast it really sells, with daily sales and average price, fresh each hour.

The flipping table, listing items with their sell rate, profit, and the realms to buy and sell them on

A cross-realm flip finder

Finds items that are cheap on one realm and expensive on another, ranks them by profit after the auction house cut, and throws out bait listings that would fake a margin.

Gear Check for a level 90 mage, showing each equipped item and flagging an empty socket

Character and guild tools

Battle.net import, a free gear check that prices every missing enchant and gem, and raid prep for a whole guild with a shareable shopping list.

The paid dashboard, leading with the unrealized profit on open flips, then the best flips right now and the top crafts

The paid dashboard, billing and alerts

The paid dashboard opens on the profit sitting in your open flips, then the best flips and crafts right now. Behind it: free and paid tiers checked on the server, subscriptions with a trial, signed payment webhooks, and email and Discord alerts.

What broke, and what we changed.

The flip engine ran out of memory.

Comparing 18,000 items across every pair of realms is hundreds of millions of combinations. The first version held them all in memory and crashed, and because it shared a process with the API, it took the site down with it. It now keeps only the lowest price per realm, caps the realm pairs, streams results to the database in batches and runs in its own container. The worker can fall over without a single player noticing.

The database filled up.

Hourly churn in the flip results hit the storage limit three times and blocked writes. Expiry indexes, an index cleanup and a larger cluster fixed it. Every job now records its last run and its last error, so a stuck one shows up before a player does.

Sell rates that lied.

With no public sales feed, sell rates are estimated: a drop in listed quantity between two snapshots counts as sales. Measured region-wide, that misread gear and pets, which sell realm by realm. They now get a demand model of their own, per realm.

The API lived an ocean away from its data.

The server sat in Virginia, while the database and most players are in Europe. Every database call crossed the Atlantic, about 90 ms each, and so did every page request. Moving the API to Germany, next to the database, cut database calls to under 10 ms and made the site three to four times faster for European players.

One server ran every hourly job.

Price snapshots, flip scans, alert emails and Discord pushes all ran on a single worker. If that host died the data went stale, and if two ran, players got every alert twice. Now both servers run a worker and a lease in MongoDB decides which one works. Every run is claimed once by its scheduled time, so nothing runs twice even during a handover. In a live test the standby took over in 36 seconds without a single duplicate run.

What it runs on

React, TypeScript and Vite on S3 and CloudFront. Node and Express in Docker on a server in Germany, next to a MongoDB Atlas database in Frankfurt, with a standby on AWS: Route 53 moves traffic over if the main server stops answering, and the hourly jobs follow. GitHub Actions runs about 590 tests, builds one image per commit, scans it with Trivy and rolls it out blue-green, so a deploy drops no requests and a rollback is one command. Terraform describes the AWS and Hetzner setup. Nightly backups are restored and checked before they count, and a monthly drill restores 1.9 million documents in 30 seconds. Firebase for sign-in; Sentry, OpenTelemetry and Grafana for errors, metrics and alerts; PostHog for what gets used.

Launched in 2022. Still running, every hour.