Self-host

Your events.
Your Cloudflare account.

Slurp runs as one Worker, two Durable Object classes and an R2 bucket in your own Cloudflare account. No servers to run, no data leaving your account, and the Free plan is enough to start.

Deploy to Cloudflare

Self-host

Run Slurp in your own Cloudflare account.

Your Worker, Durable Objects and R2 bucket live in your account. Slurp does not host your events. The Free plan is enough to start.

One command installs the CLI, logs in to Cloudflare, creates the R2 bucket, deploys the Worker, sets a generated admin token and connects this computer. You need Node 20+ (slurp fetches wrangler itself) and a Cloudflare account, on macOS or Linux.

Install, deploy and connect
curl -LsSf https://slurp.run/install | sh
# or: npm install -g @hitslop/slurp
slurp cloud init

Then run slurp setup and slurp init --name "My app". Later: slurp cloud status, slurp cloud upgrade, slurp cloud destroy.

Prefer the one-click button?

The Deploy to Cloudflare button copies this project's backend folder into a new repository in your GitHub account and creates the R2 bucket and Durable Objects for you. When it asks for ADMIN_TOKEN, paste a long random value, for example from openssl rand -base64 32, and keep it: it controls your deployment. Then open your Worker's address (it looks like https://slurp.YOUR-SUBDOMAIN.workers.dev); the page there shows the command that connects the CLI:

Terminal
slurp connect https://slurp.YOUR-SUBDOMAIN.workers.dev \
  --token-stdin < admin-token.txt
slurp setup
slurp init --name "My app"
Deploy to Cloudflare
Prefer to run wrangler yourself?
Manual steps
cd backend
npm install
npx wrangler login
npx wrangler r2 bucket create slurp-archive
npx wrangler deploy
openssl rand -base64 32 > admin-token.txt
npx wrangler secret put ADMIN_TOKEN < admin-token.txt
slurp connect https://slurp.YOUR-SUBDOMAIN.workers.dev \
  --token-stdin < admin-token.txt

Replace YOUR-SUBDOMAIN with the URL wrangler deploy prints. Delete admin-token.txt once it is saved in your password manager.

Read the quickstart

Open source · MIT · Deploys with one command

01 / WHAT YOU GET

The whole pipeline, in your account.

1. Capture

Your app sends events with the SDK or plain HTTP to your Worker. Each one is validated and kept exactly as sent, in an envelope with the arrival time, the key's source and, unless you turn geo off, the visitor's country, region and city from Cloudflare.

2. Store

Events are buffered durably, then published as compressed archives in your R2 bucket. Archives are immutable and checksummed.

3. Ask

The CLI downloads new archives into a DuckDB file on your machine. Your coding agent queries it with SQL and builds reports.

02 / DEPLOY

One command.

slurp cloud init logs in to Cloudflare, creates the R2 bucket, deploys the Worker with its Durable Objects, sets a generated admin token and connects your computer. No checkout of the Worker source and no npm install: the Worker ships inside the CLI.

Deploy to Cloudflare

Self-host

Run Slurp in your own Cloudflare account.

Your Worker, Durable Objects and R2 bucket live in your account. Slurp does not host your events. The Free plan is enough to start.

One command installs the CLI, logs in to Cloudflare, creates the R2 bucket, deploys the Worker, sets a generated admin token and connects this computer. You need Node 20+ (slurp fetches wrangler itself) and a Cloudflare account, on macOS or Linux.

Install, deploy and connect
curl -LsSf https://slurp.run/install | sh
# or: npm install -g @hitslop/slurp
slurp cloud init

Then run slurp setup and slurp init --name "My app". Later: slurp cloud status, slurp cloud upgrade, slurp cloud destroy.

Prefer the one-click button?

The Deploy to Cloudflare button copies this project's backend folder into a new repository in your GitHub account and creates the R2 bucket and Durable Objects for you. When it asks for ADMIN_TOKEN, paste a long random value, for example from openssl rand -base64 32, and keep it: it controls your deployment. Then open your Worker's address (it looks like https://slurp.YOUR-SUBDOMAIN.workers.dev); the page there shows the command that connects the CLI:

Terminal
slurp connect https://slurp.YOUR-SUBDOMAIN.workers.dev \
  --token-stdin < admin-token.txt
slurp setup
slurp init --name "My app"
Deploy to Cloudflare
Prefer to run wrangler yourself?
Manual steps
cd backend
npm install
npx wrangler login
npx wrangler r2 bucket create slurp-archive
npx wrangler deploy
openssl rand -base64 32 > admin-token.txt
npx wrangler secret put ADMIN_TOKEN < admin-token.txt
slurp connect https://slurp.YOUR-SUBDOMAIN.workers.dev \
  --token-stdin < admin-token.txt

Replace YOUR-SUBDOMAIN with the URL wrangler deploy prints. Delete admin-token.txt once it is saved in your password manager.

Terminal
slurp cloud init
slurp setup
slurp init --name "My app"
slurp send signed_up --user-id demo --data '{"demo":true}'
slurp sync

Check on it any time with slurp cloud status or slurp cloud doctor. slurp cloud upgrade redeploys a newer Worker and keeps your data. slurp cloud destroy removes everything.

03 / WHAT IT COSTS

Cents to start. A few hundred to a few thousand at 10 billion.

You pay Cloudflare directly, at list price, for what your Worker uses. Most small and medium apps fit inside the Workers Free plan. Past that, Workers Paid is $5 a month plus usage. Hosted analytics tools bill by event volume, so the gap widens as you grow.

Monthly USD before tax, by events per month
Product1M10M50M100M1B10B
Slurp, self-hosted on CloudflareFree$0.43$7.96$11.21$42 to $280$420 to $3,200
PostHog · Product AnalyticsFree$324.40$1,528.40$2,618.40$11,618.40$92,618.40
Mixpanel · Growth (yearly billing)Free$840Contact salesContact salesContact salesContact sales
Amplitude · PlusFreeNot publishedNot publishedNot publishedNot publishedNot published
OpenPanel · Cloud (monthly)$90$350$900Custom planCustom planCustom plan

Prices read from each vendor's public pricing page on November 6, 2026; check them before deciding, they change. Mixpanel is yearly billing (monthly billing costs more). Amplitude does not publish paid event prices, and Mixpanel and OpenPanel direct high volumes to sales. OpenPanel can also be self-hosted for free.

How the Slurp row is estimated. It is the Cloudflare bill for running your own Worker, not a Slurp fee: 20 events per request, about 320 bytes per event stored, 12 months of archives kept, and Cloudflare's list prices (Workers Free until about 50K requests a day, then Workers Paid at $5 a month plus usage). Storage is billed on its own at $0.015 per GB-month above 10 GB; set a retention limit to cap it. Sending bigger batches lowers the cost; sending single events raises it. It is an estimate, so compare it with your own Cloudflare bill.

Why 1B and 10B are ranges. We load-tested one project at about 5,000 events a second (roughly 13 billion a month if it never let up), which is where the 10B row assumes peaks need 3 projects. Billed-side usage was measured at small scale and extrapolated; we have not run these volumes for a month. The low end assumes 200-byte events sent 100 to a request, the high end 1 KB events sent 5 to a request, 12 months kept either way. About two thirds of the bill is R2 storage, so event size and retention matter most. Hover a range for the central estimate.

04 / HOW IT WORKS

Built from Cloudflare primitives that last.

  • One Durable Object per project groups concurrent requests into one write, acknowledges only after the data is durable, and publishes about every 10 minutes (or at 8 MB) into jsonl.gz archives with a gapless sequence and a SHA-256 for each.
  • R2 keeps the archives. The CLI never gets R2 credentials: it downloads each archive from your Worker with its own key.
  • The CLI verifies every archive, imports it into DuckDB idempotently, and remembers where it stopped, so retries and overlaps never duplicate events. Content problems never stop a sync: they become rows you can read.
  • Keys come in two kinds: publishable keys can only send events (safe in a browser), secret keys can only read one project's archives.
05 / GOOD TO KNOW

Honest limits.

  • Freshness. New events show up in slurp sync after the next archive, about 10 minutes by default. Change it with SEAL_INTERVAL_MS, or run slurp sync --now to publish first.
  • Free plan cap. Cloudflare limits Free Workers and Durable Objects to 100,000 requests a day. At 20 events per request that is roughly 2M events a day. If you hit it, the SDK keeps events and retries; upgrade to Paid to lift it.
  • Retention. Archives stay in R2 until you delete them. Set RETENTION_DAYS to expire old ones.
  • Security. Anyone with your admin token controls the deployment. Store it in a password manager, and create a separate read key for each bot.
  • No accounts or billing. There are no logins, plans or invoices from Slurp. The admin token is the only credential.