Slussen
Interactive demo · synthetic data · runs in your browser

Nobody tells you what rate a destination survives. Watch it get found.

Below is a destination that starts failing above a number you are not shown — because in production you are never shown it. Send a burst at it and watch the delivery rate walk down onto that number and sit there. Then look at the console a customer gets.

Everything on this page is made up. The destinations, the event IDs and every number are generated fresh in your browser each time you load it — there is no account, no server call, and no real customer traffic anywhere in it. It is a faithful model of how the delivery loop behaves, not a window onto a running system. If you want the real thing pointed at a real endpoint, that is a short conversation and we will measure yours with you.
01

Setting it up

One URL changes. Nothing else in your sender does.

Slussen sits in front of a destination you do not control. Your code keeps sending the same request with the same body and the same headers — it just sends it to us, and we forward it at a rate the far end can take.

1

We measure the destination with you

Before anything is switched over we run a capacity test against the endpoint and agree a rate that sits under its cliff rather than on it. You get an ingestion URL and an API key out of it. This part is a call, not a signup form — the number is the whole product and guessing it is how people get hurt.

2

Point your sender at the URL we give you

Same body, same headers. The key can go in Authorization or X-API-Key.

curl -X POST https://hooks.slussen.dev/wh/<your-endpoint> \
  -H "Authorization: Bearer $SLUSSEN_KEY" \
  -H "content-type: application/json" \
  -d '{"event":"call.completed","callId":"call_1","contactId":"c_42"}'

Do not put the key in the URL — query strings reach access logs, proxy logs and Referer headers.

3

Read the 202 correctly

{ "receivedId": "evt_kzesq2cnmbyx", "status": "queued" }

202 means we have it durably. It does not mean the destination has processed it. That distinction is the design: we answer in milliseconds so your sender is never blocked by a slow receiver, and we take on responsibility for getting it there. Retry only on 5xx and 429 — a retried 202 is a duplicate you created yourself.

4

Mark the urgent ones, if you have any

Optional, and most senders never need it. If your stream is mixed, say so on the request:

-H "x-sq-priority: 9"   # 0–9, higher goes first. Absent is 0.

It decides which events are served next — it never reorders events that share an ordering key, because that would break the guarantee ordering exists for. Use two lanes, not nine.

02

Watch it find the rate

The rust line is the one you never get to see.

acme-crm below starts refusing above some number of requests per second. In production that number is invisible: it is not in anyone's documentation, it changes over the day, and you discover it by exceeding it. Here it is drawn in rust so you can watch the delivery rate hunt for it — halving on every burst of 429s, creeping back up while things are quiet, and settling just underneath.

The configured ceiling is a hard cap, not a target. Slussen never goes above it even when the destination looks happy.

running at 5× · 1 tick = 1 second
Waiting
0
Sending at
0/s
Delivered
0
Refused by them
0

Events per second, acme-crm

last 2 minutes of simulated time
Our sending rate What it actually survives — invisible in production Configured ceiling

Nothing is dropped while it backs off. Everything above the line is still held, which is what the Waiting number is, and it drains when the destination recovers.

03

What your customer sees

Read-only, scoped to one tenant, and it can replay a dead letter.

This is the customer console, reproduced as it is rather than as it might look one day. Click a destination to see its events; a dead-lettered event can be replayed from here. What is deliberately absent: payload bodies, any other tenant's data, and the delivery rate — changing that is the capacity conversation, not a slider.

hooks.slussen.dev/app Simulated
Slussen Overview acme-nordic · Sign out

The console runs on the ingestion process, not the operator one. A token that opens it cannot mint credentials, read a payload or see another tenant — not because these views hide those things, but because no such session can be created on that port at all.

En sluss is a lock — the kind on a canal. A vessel enters the chamber, the gate closes behind it, the water finds the level of the next stretch, and it leaves at a pace that stretch can take. Nothing is turned away at the gate; nothing arrives faster than the water downstream allows.

Want this pointed at an endpoint that is actually giving you trouble?

Tell us what you send events to and roughly how many, and we will come back with what that destination looks like it can take. No call needed, and no obligation after it.

hello@slussen.dev Back to the overview