Migrate from Umami to Muon
Muon is Umami-compatible — keep your existing tracker and bring your history.
How do I migrate from Umami to Muon?
Muon accepts Umami-compatible tracking payloads on the same /api/send endpoint, so you can point an existing Umami tracker at Muon and use the importer to bring historical data. No tracking code rewrite required.
Same tracker shape, same endpoint.
Umami and Muon speak the same wire format. Muon exposes an Umami-compatible /api/send endpoint that accepts the exact payload your existing tracker already sends — the same event shape, the same website identifier, the same pageview and custom-event calls. Migration is mostly a matter of where the tracker points, not what it sends.
- Umami-compatible endpoint. Events post to /api/send in the same format Umami uses.
- No event rewrite. Your data-website-id maps to a Muon project; existing custom events keep working.
- Bring your history. A best-effort importer reads your Umami PostgreSQL database directly.
Stand up Muon.
Clone the repository and start the full stack — backend, dashboard, tracker and PostgreSQL — with Docker Compose.
# clone, enter, and bring the stack up
git clone https://github.com/runmuon/muon && cd muon && docker compose up -d
Once it's up, open the dashboard and create a project. You'll use that project's website id in the next step. For a production install, see the Kubernetes deployment guide.
Point your tracker at Muon.
Swap the tracker src and host from your Umami instance to your Muon instance. The data-website-id maps to a Muon project — keep the rest of your events exactly as they are.
<!-- before: Umami --> <script defer src="https://umami.example.com/script.js" data-website-id="a1b2c3d4-…"></script> <!-- after: Muon (same website id, new host) --> <script defer src="https://muon.example.com/script.js" data-website-id="a1b2c3d4-…"></script>
Only the host changes. Custom events keep firing to the Umami-compatible /api/send endpoint on your Muon instance — no changes to your event code.
Import historical data.
Run the Umami importer against your existing Umami PostgreSQL database to bring your history across. The importer is best-effort — verify counts once it finishes.
# point the importer at your existing Umami database docker compose run --rm backend muon import umami \ --source "postgres://user:pass@umami-db:5432/umami"
This is a best-effort import — spot-check pageview, session and event counts against your old Umami dashboard before you decommission it.
What comes across, and what to watch.
The importer maps your Umami entities onto Muon's project and event model. Aggregates land close to your originals; derived metrics may shift slightly because Muon computes them server-side.
Expect very close aggregates rather than an exact match — session and visitor derivation differs between the two systems.
What you unlock on Muon.
Once your tracker points at Muon and your history is in, you get more than a faster Umami — you get change detection and investigation on top of the same data.
- Findings. Muon detects meaningful changes with statistics first, then explains them in plain language. How Findings work →
- Investigation. When a metric moves, Muon narrows it to the segment where it actually changed.
- Browser health. Frontend failures, connected to product metrics — so you can see when a broken build costs conversions.
Weighing the move? See the full side-by-side in Muon vs Umami.
Questions, answered directly.
Is Muon compatible with the Umami tracker?
Do I have to change my tracking code?
Can I import my Umami history?
Will my numbers match exactly?
Is Muon faster than Umami?
Move to Muon without a rewrite.
Stand up Muon, repoint your tracker, and import your history. Keep the events you have — gain findings and investigation.