Skip to content
Droptape

documentation

How to make it tell you.

Droptape watches everything Hetzner sells that moves and messages you when something crosses a line you drew. This page is how you draw the line, and how to read the numbers on the way there.

The overview, the auction table, the cloud grid and the history charts need no account. Only monitors do.

01start here

Start from a listing you already like

The fastest route to a working monitor is not the form. Find a machine on the auction table that is roughly the shape you want, open it, and press Watch this config. That prefills a monitor with the CPU vendor, the core count, the memory, the total disk and the region of the listing in front of you. Those bounds match at least one real machine, because they came from one.

Then loosen it. Widen the price, drop the CPU model, add a second region. Loosening a spec that already matches is far easier than tightening one that has never matched anything.

02monitor kinds

The four kinds of monitor

Every monitor has exactly one kind, chosen first, because the four watch different things.

Auction

Second-hand dedicated machines whose price falls on a timer. The busiest feed by far. Fires when a listing appears matching your bounds, or when an existing listing's price drops into them.

Cloud stock

A cloud server type coming back into stock in a location, or going out of it. The "CCX33 is finally orderable in Ashburn again" alert. Comes back in stock, goes out of stock, or changes either way.

Cloud price

A published cloud price changing. Rare, and worth knowing about when it happens. Falls, rises, or moves at all — optionally with a ceiling so only cheap-enough changes reach you.

Dedicated

New AX, EX, SX, GEX or DX machines becoming orderable, or their list price dropping. Polled every 10 minutes rather than every 60 seconds, because Hetzner's Robot API is rate limited per endpoint.

03the form

Building a monitor in the form

All present constraints AND together. Members of a list OR together. So price at most 45, regions FSN and HEL, NVMe drives at least 2 means (price ≤ 45) AND (region is FSN or HEL) AND (at least two NVMe drives).

Leave a field blank and it is not a constraint. Blank is not zero.

Price

Price at most / at least is monthly, in euros. Compare against decides whether that bound is checked against the net price or the price including your VAT rate; it defaults to your account setting. Setup fee at most is rarely useful — most auction listings have none.

Memory

RAM at least / at most in GB, and ECC memory as a three-way: either, required, excluded. ECC is the single most common reason a monitor that "should" match does not. Plenty of cheap listings are non-ECC.

CPU

CPU vendor (Intel or AMD), Cores at least, and two free-text lists: Model contains any of and Model contains none of. These substring-match the model string Hetzner publishes, so EPYC and Ryzen both work, and i7-7700 will exclude a great many old machines in one go.

Cores at least counts physical cores as derived from the model, not threads.

Disks

This is where specs go wrong, so it has the most fields.

  • Total disk at least / at most — every drive added up, in GB.
  • Drives at least / at most — the physical drive count.
  • Then, per class — NVMe, SATA SSD, HDD — three separate bounds: how many of that class, the size the smallest drive of that class must clear, and that class summed.

NVMe drives at least: 2 plus Each NVMe at least: 900 means two NVMe drives, neither smaller than 900 GB. It does not mean "at least 1.8 TB of NVMe somewhere" — that is NVMe total at least.

All sizes are decimal GB, straight from the feed. See §09.

Where

Regions are FSN (Falkenstein), NBG (Nuremberg) and HEL (Helsinki). Specific datacenters goes finer — FSN1-DC14 — and is validated against the datacenter list in Hetzner's own feed metadata, so it stays correct when Hetzner adds one.

Prefer regions. Prices differ between regions; DC5 and DC14 within Falkenstein do not, so pinning a datacenter narrows a monitor without buying you anything.

Features

GPU, Intel NIC, hardware RAID and redundant PSU, each three-way: either, required, excluded.

Value

The fields that make this more than a price alert.

  • At most, per TB — euros per terabyte of total disk. A storage monitor in one number.
  • At most, per GB of RAM — the same for memory.
  • Within this much of the 90-day low — a percentage. 10 means "no more than 10% above the cheapest this exact configuration has been in the last 90 days". Configuration means the fingerprint: CPU, memory, ECC, sorted disk sizes by class, region and specials — the same physical machine spec, not the same listing id. This catches a good price without you having to know what a good price is.

Predictive

Warn me before a scheduled cut takes it below — a euro figure. Every auction listing carries the exact timestamp of its next automatic reduction. Droptape projects the post-cut price from the observed reduction step and warns you before the drop lands, rather than after it. This is the feature that turns "you missed it" into "be ready in four minutes".

04plain english

Building a monitor in plain English

Press Describe it instead and type a sentence:

  • under 45 euros with at least 64 gigs of ECC ram and two NVMe drives, Finland only
  • tell me when a CCX33 is available in Singapore
  • AMD, 128GB or more, at least 2TB of NVMe, under 70 a month, not Nuremberg
  • any auction server under 30 euros per terabyte
  • alert me if an AX102 becomes orderable anywhere
  • cloud price drop on any CAX type

A language model turns that into a spec. Then deterministic code takes over: the output is JSON-parsed, validated against the same schema the form uses, and rendered back into the form so you can see exactly what it understood. Nothing saves until you look at it.

If the model returns something invalid it gets one retry with the validation errors attached. If that fails too, you get the empty form and a message saying so. It never silently guesses.

Voice works the same way where the browser supports the Web Speech API — the transcript is produced on your device at no cost, and everything after that is identical.

Two limits worth knowing. Parsing is rate limited to 20 an hour per account. And Droptape treats the text you type as untrusted input: a prompt injection produces a nonsensical monitor, which is exactly what the confirmation step is there to catch.

05test run

Test run — use it every time

Before saving, and any time afterwards, Test run answers three questions: how many subjects match right now, how many times the monitor would have fired in the last 7 days, and how many in the last 30. Read them together.

Now 7d 30d What it means
000 Matches nothing and has matched nothing. Loosen it — start with ECC and the disk-class bounds.
029 Healthy. Nothing matches this second, but roughly one a week does.
003 Tight, but alive. Expect long silences.
403001200 Far too loose. A message every few minutes until the daily cap stops it.

A monitor with zero 30-day matches is the most common support issue, and it is almost never a delivery bug. It is usually ECC, a datacenter pinned instead of a region, or a per-drive size bound where a total was meant.

06alerts

Alerts: what arrives, and what does not

Telegram is the real-time channel

Link it once in settings: press Connect, open the link, and the bot binds your chat. Messages carry the price and the delta in bold, the spec, the datacenter, the next scheduled reduction, and two buttons — Hetzner's order page and the Droptape detail page.

Bot commands are read-and-toggle only: /start, /monitors, /pause, /resume, /mute 2h, /status, /unlink. Monitor creation stays in the web app, because that is where the confirmation UI lives.

Email is digest-first, on purpose

Email is the only part of this system that can cost real money, so it is digest-only by default. Instant email is opt-in per monitor and capped at 5 a day. Your digest arrives at the hour you choose, in your timezone. Every message carries a one-click unsubscribe that works from the Gmail and Outlook header, not only from a link in the body.

Why a matching listing might not message you

Six suppression rules, applied in this order. Every one records a row on your alert history with the reason, so nothing disappears silently.

  1. Duplicate. One alert per (monitor, subject, channel), enforced by a database constraint. A listing that matched yesterday will not be re-announced today.
  2. Account-level de-dupe — on by default. If a listing matches four of your monitors, the first one to match sends and the other three are recorded as suppressed. Turn it off in settings if you are deliberately testing overlapping specs.
  3. Re-alert threshold. After the first alert for a listing, a further price drop only re-alerts if it exceeds the threshold — 10% by default. Hetzner cuts prices in small steps; without this, one machine would message you all day.
  4. Cooldown. Per monitor, in minutes, zero by default. One batch of simultaneous matches counts as one notification, so a cooldown never silently swallows four listings that arrived together.
  5. Daily cap. Per monitor, 50 by default, 500 maximum. Free accounts also have plan caps: 15 monitors, 20 emails a day, 200 Telegram messages a day.
  6. Quiet hours. Below.

And one that is not suppression but looks like it: cloud availability waits for two consecutive polls before it alerts. Stock flickers when it is thin, and a type can flip four times in a minute. Two-poll confirmation means a cloud alert lands up to 150 seconds after the flip, and a type that flaps five times in ten minutes produces at most one message. That is a deliberate trade.

Quiet hours and digests

Set a window like 23:00-07:00 in settings, in your timezone. Inside it, alerts are queued, never dropped. The moment the window ends, everything that accumulated is collapsed into one catch-up message rather than fifteen. A window that starts and ends at the same time counts as no quiet hours, not as permanent silence.

Email alerts and anything queued overnight arrive as one digest at your chosen digest hour, local time — one per user per local day. A missed digest hour does not strand anything: the daily job sweeps out whatever is older than the threshold regardless.

07the auction table

Reading the auction table

The auction page is every current listing, filterable on exactly the terms a monitor uses. The filter state lives in the URL, so a search you like is a link you can keep.

Column What it is
CPUModel string as Hetzner publishes it.
RAMTotal GB. ECC is a badge, not a column.
DisksGrouped by class — NVMe, SATA SSD, HDD. Count × size.
DCThe datacenter, e.g. FSN1-DC14. The region is the first three letters.
PriceMonthly, net of VAT.
€ / TBPrice divided by total disk in decimal TB. The storage-value column.
€ / GB RAMPrice divided by total memory. The memory-value column.
First → nowThe price when this listing first appeared, and its price now. The gap is how far it has already fallen.
Next dropWhen Hetzner has scheduled the next automatic reduction for this listing.

Every row carries an inline sparkline of its own price history.

A listing that vanishes is recorded as "no longer listed", never "sold." Sold, withdrawn, and reissued-under-a-new-id all look identical in the feed. Claiming otherwise would be a lie. An id that reappears within 24 hours counts as the same listing, not a new one.

Auction ids are numeric and change on every reissue, so a listing link that worked last month can point at nothing today. That is the feed, not a broken link.

08the cloud grid

Reading the cloud grid

The cloud page is server types down the rows and locations across the columns, in three cell states:

  • Filled — available. Orderable in that location right now.
  • Hollow — offered, out of stock. Hetzner sells it there, but not at this moment.
  • Empty — not offered. That type is not sold in that location at all.

The middle state is the interesting one, and it is the whole point of the page: "offered but out of stock" is a thing you can wait for. "Not offered" is not.

Hovering a cell tells you how long it has been in its current state.

Series tabs group the range the way Hetzner's own pages do. CX and CAX are cost-optimized shared vCPU, Intel and Ampere Arm. CPX is AMD shared. CCX is dedicated vCPU.

Per-location hourly and monthly prices sit alongside. The history page charts availability over time from the daily rollups, which answers whether a type is always scarce or had one bad afternoon.

09the numbers

What the numbers mean

Prices are net of VAT. Every figure on this site is what Hetzner publishes, which is the price before tax. Set your rate in settings and the app does the arithmetic. The default is 0, so out of the box you see Hetzner's own numbers unchanged.

Prices are monthly unless a column says otherwise. The feed carries hourly prices too; they are not the headline.

Both currencies are real. The feed publishes EUR and USD natively, so the USD figure is Hetzner's own price and not a conversion Droptape invented. There is no exchange rate anywhere in this codebase.

Disk sizes are decimal. A "4 TB" drive is 4,000 GB in the feed and 4,000 GB here. Your operating system will report about 3.64 TiB for the same drive. Neither is wrong; they count differently. € / TB uses the decimal TB, so it matches the number on the label.

Disk totals come from the per-class breakdown, never from the per-disk size field. That field is the size of one drive, and multiplying it by the drive count breaks on any machine with mixed sizes.

Cores are physical cores, derived from the CPU model rather than the feed's own count, which counts sockets.

Times are shown in your timezone, from settings. Everything is stored in UTC.

"Next drop" is Hetzner's scheduled time, not an estimate. The projected price after that drop is an estimate, derived from the reduction steps that listing has already taken.

A price that has not moved is not stale. Droptape writes nothing when nothing changes; that is the design.

10settings

Settings worth setting

VAT rateEntered as a percentage. 19 for Germany. Applies to every displayed price and, optionally, to monitor price bounds.
CurrencyEUR or USD. Both come from the feed.
TimezoneDrives quiet hours, the digest hour, and every timestamp shown to you.
Quiet hoursHH:MM-HH:MM. Queues, never drops.
Digest hour0–23, local. When the daily email lands.
De-duplicate alertsOn by default. Turn off only if you want every overlapping monitor to fire.
TelegramConnect or disconnect.
EmailUnsubscribe from everything, without deleting the account.
ThemeDark, light, or follow the system. Dark is the default; your OS preference is respected on the first visit.

11faq

Frequently asked

Is Droptape affiliated with Hetzner?
No. It is an independent project and reads only Hetzner’s public feeds and documented APIs. Hetzner Online GmbH does not operate, endorse or support it.
Does Droptape cost anything?
No. There is no paid tier, no ads and no affiliate links. It runs inside the allowances of a $5/month Cloudflare Workers plan that was already being paid for.
How often does Droptape check Hetzner?
The auction feed and cloud availability every 60 seconds. Dedicated servers every 10 minutes. Cloud pricing and the server-type catalog hourly. Rollups and digests daily at 03:17 UTC.
Can Droptape buy a server for me?
No, and it holds no Hetzner credential belonging to you. The data model tolerates a future auto-buy block so that adding it would not be a migration, but nothing here places an order and nothing calls a Robot write endpoint.
Why did my monitor not fire?
In order of likelihood. The spec is tighter than you think: run Test run, and a 30-day count of zero settles it. A suppression rule held it back: check /app/alerts, which records every suppression with a reason. The channel is not connected. Or, for cloud stock, the two-poll confirmation had not completed yet.
Why did I get one message when four of my monitors matched?
Account-level de-duplication, which is on by default. The first monitor to match sends, and the rest are recorded as suppressed so you can see what happened. Turn it off in settings.
Are Hetzner auction prices shown with or without VAT?
Without. Every price is net, exactly as Hetzner publishes it. Set your rate in settings and Droptape adds it for you. The default is 0, so out of the box you see Hetzner’s own numbers unchanged.
Why does a 4 TB drive show as 4,000 GB?
Because that is what the feed says, and it is decimal. Your operating system reports the same drive as roughly 3.64 TiB. The euros-per-terabyte column uses decimal TB so it matches the number on the drive label.
A listing disappeared. Was it sold?
Unknown, and Droptape will not guess. Sold, withdrawn, and reissued under a new id after a spec correction all look identical in the feed, so it says “no longer listed”.
How far behind reality can Droptape be?
Up to one poll interval, plus delivery. Auction alerts target 90 seconds from the listing appearing in the feed. Cloud stock alerts take up to 150 seconds because of the two-poll confirmation. A listing can appear and be bought before Droptape ever sees it, so this is not a race-winning tool.
Do I need an account to see the data?
No. The overview, the auction table, the cloud grid, the dedicated catalog and the history charts are all public. An account is needed only to create monitors and receive alerts.
Can I run my own copy of Droptape?
Yes. It is MIT licensed and the source is public. The repository README covers local setup and docs/SETUP.md walks through the credentials.

still stuck

When something looks wrong

The feeds are undocumented and have changed shape before. When one drifts, Droptape aborts that poll with zero writes and alerts the operator, rather than ingesting garbage. The visible symptom is data that has stopped moving, not data that has gone wrong.

Otherwise: open an issue. For an alert that did not arrive, use the "Monitor did not fire" template. It asks for the monitor spec, what you expected it to match, the listing id and the time in UTC — those four replay the moment against the archived feed.