Open source, MIT licensed
Web analytics without cookies, on Cloudflare's free tier.
Conveyor is a privacy-first, Umami-compatible analytics service. One Worker, one D1 database and static assets. No servers to run and no bill to pay at small scale.
<script defer
src="https://your-instance.example/script.js"
data-website-id="…"></script>
Already use Umami? Keep your existing data-website-id snippet and
umami.track() calls. They work as they are.
Features
Everything a small site needs to read its traffic.
-
Core metrics
Pageviews, visitors, visits, bounce rate and visit duration, with top pages, referrers, channels and UTM parameters.
-
Realtime
A live view of who is on your site right now and which pages they are reading.
-
Where visitors are
Countries, regions and cities on a world map, plus browsers, operating systems and device types.
-
Custom events
Track signups, clicks and anything else with conveyor.track(), or add a data-conveyor-event attribute.
-
Filters and comparison
Narrow any report by page, source, country or device, and compare a period with the previous one.
-
Share and export
Public share links for read-only dashboards, and CSV export when you want the numbers elsewhere.
-
Sites and users
Track multiple websites from one instance and give each person their own login.
-
A small tracker
About 1.4 KB gzipped, no CORS preflight, and it ignores bots and automated browsers.
Privacy
Count visits, not people.
Conveyor is designed so you don't need a cookie banner. It keeps no persistent identifier for a visitor, so there is nothing to follow across days or across sites.
This is a description of how the software works, not legal advice. Check the rules that apply to you.
-
No cookies
The tracker sets no cookies and writes nothing to local storage.
-
No IP address stored
IP addresses and raw user agent strings are used to derive country and device, then discarded.
-
Daily-rotating visitor id
A visitor is a salted hash that changes every day. The salts are deleted daily, so yesterday's ids cannot be recomputed or linked to today's.
-
Your data, your account
Everything lives in a D1 database in your own Cloudflare account. Nothing is sent to us.
Free on Cloudflare
Sized to stay inside the free plan.
There is no separate server or database service to pay for. Conveyor keeps its write volume low on purpose, so a personal site or small project can run without a bill.
- Parts
- One Worker, one D1 database and static assets for the dashboard and tracker.
- Traffic
- The free plan fits roughly 100,000 requests per day.
- Writes
- One event is one D1 row write. A typical event needs no reads.
- History
- Daily rollups are kept forever, so long-term charts stay cheap.
- Raw events
- Kept for 90 days by default, and configurable.
Deploy
Up and running in five steps.
You need a Cloudflare account, Node.js 22 or newer and Wrangler. Use a custom domain or route for production, because visit tracking relies on the Cache API, which is a no-op on workers.dev.
-
Clone and install
Terminal git clone <repository-url> conveyor cd conveyor npm install -
Create the database
Copy the printed database_id into apps/worker/wrangler.jsonc.
Terminal cd apps/worker npx wrangler d1 create conveyor -
Set two secrets
AUTH_SECRET signs sessions. SETUP_TOKEN protects first-run setup.
Terminal npx wrangler secret put AUTH_SECRET npx wrangler secret put SETUP_TOKEN -
Deploy
Run it from the repository root. It builds the dashboard and tracker, applies migrations and deploys.
Terminal npm run deploy -
Create the first admin
Open /setup on your new URL and enter your SETUP_TOKEN. Then add your site and paste the tracking tag.
Browser https://<your-worker-domain>/setup
See it with real data.
The demo is a live Conveyor instance. Look through the reports, filters and map before you install anything.