tapscrollWIKI

Price intelligence

How Gavel estimates what an item is worth — weighted median of completed sales, decay, trimming, confidence tiers and sell-through.

Gavel v1.0.0Paper · Folia supported1.21 – 1.21.x

The price assistant answers two questions: what is this worth and will it actually sell. Both come from the same sample of completed sales.

Sales, not asking prices

Active listings are excluded from every estimate. They are what sellers hope for, and using them creates a feedback loop where each listing anchors on the last optimist's price and the "market value" climbs forever.

Active listings are used for exactly one thing: showing the cheapest one available right now.

Building the sample

plugins/Gavel/config.yml
pricing:  enabled: true  window-days: 30  half-life-days: 5.0  min-samples: 5  confidence:    high: 25    medium: 10  max-share-per-seller: 0.30  outlier-iqr-factor: 1.5

Four filters, in order:

1. Window. Only sales from the last window-days (30) count.

2. Time decay. A sale half-life-days old counts half as much as one from today. Lower it and the estimate reacts faster to a shifting market; raise it and the estimate is steadier but slower.

3. Outlier trimming. Samples further than outlier-iqr-factor interquartile ranges from the median are dropped. This removes the accidental "sold a netherite sword for 1" without needing a hand-maintained sanity list.

4. Seller cap. No single seller may contribute more than max-share-per-seller (30%) of the weighted sample. One player with twenty listings does not get to define the market price.

Confidence

SamplesTier
25 or moreHigh
10–24Medium
5–9Low
Fewer than min-samples (5)Not trusted — fallback cascade

The tier is shown in the GUI next to the estimate. An estimate without its confidence is a guess wearing a suit.

The fallback cascade

Below min-samples, an exact-match estimate is not trustworthy, so Gavel steps down:

YAML
pricing:  fallback:    relaxed-key: true    component-estimate: true    component-confidence-penalty: 0.75
  1. Exact key — this item with these enchantments and this NBT.
  2. Relaxed key — the material alone, ignoring enchantments.
  3. Component estimate — base material value plus the value of each enchantment, derived from enchanted-book sales.

The component estimate is what lets Gavel price a combination nobody has ever sold on your server. It is inherently rough, so component-confidence-penalty discounts it to read as conservative rather than authoritative.

Three suggestions, not one

YAML
pricing:  suggestions:    quick-percentile: 25    fair-percentile: 50    patient-percentile: 75
SuggestionPercentileReads as
Quick25thSells fast, below market
Fair50thThe market rate
Patient75thHigher yield, may take the full duration

Why not one number

A single suggested price becomes self-fulfilling: everyone lists at it, every sale happens at it, and the median stops moving. Three percentiles keep the sample spread and the market alive.

Sell-through

YAML
pricing:  sell-through:    enabled: true    min-outcomes: 8

For each price band, Gavel shows what share of listings in that band actually sold rather than expiring. This is the number that answers "will it sell?" — and it is often more useful than the price itself. A player who sees "at 12,000: 34% sell-through" understands the trade-off immediately.

Bands with fewer than min-outcomes results are hidden rather than shown as noise.

Warnings and deal badges

YAML
pricing:  warnings:    overpriced-factor: 2.5    underpriced-factor: 0.5  deal-badges:    enabled: true    great-below: 0.75    good-below: 0.90    fair-below: 1.15

On the confirmation screen, a price 2.5× above or 0.5× below the median raises an advisory warning. Both are advisory — the player can always continue. The underpriced warning matters more than it looks: it protects newcomers from listing a valuable item for a fraction of its worth and being sniped within seconds.

In the browse menu, listings are badged great / good / fair / overpriced as a multiple of the median, so a player can scan the page without opening the price checker on every item.

History and rollups

YAML
pricing:  rollups:    enabled: true    raw-retention-days: 45    run-at-hour: 4  sparkline-days: 14

Every night at run-at-hour, raw market-log rows older than raw-retention-days are folded into daily rollups and deleted. Rollups are tiny and kept forever, so long-term history is not lost — only the row-level detail behind it.

The 14-day sparkline in the price checker is drawn from those rollups.

Integrity feeds pricing

Trades flagged by market integrity are excluded from the sample by default. This is what makes the price data hard to manipulate: pumping an item's median by trading it back and forth with an alt does not work, because those trades never enter the calculation.