base on Openpanel is an open-source web and product analytics platform that combines the power of Mixpanel with the ease of Plausible and one of the best Google Analytics replacements. ![hero](apps/public/public/ogimage.png) <p align="center"> <h1 align="center"><b>Openpanel</b></h1> <p align="center"> An open-source alternative to Mixpanel <br /> <br /> <a href="https://openpanel.dev">Website</a> · <a href="https://openpanel.dev/docs">Docs</a> · <a href="https://dashboard.openpanel.dev">Sign in</a> · <a href="https://go.openpanel.dev/discord">Discord</a> · <a href="https://twitter.com/OpenPanelDev">X/Twitter</a> · <a href="https://twitter.com/CarlLindesvard">Creator</a> · </p> <br /> <br /> </p> Openpanel is an open-source web and product analytics platform that combines the power of Mixpanel with the ease of Plausible and one of the best Google Analytics replacements. ## ✨ Features - **🔍 Advanced Analytics**: Funnels, cohorts, user profiles, and session history - **📊 Real-time Dashboards**: Live data updates and interactive charts - **🎯 A/B Testing**: Built-in variant testing with detailed breakdowns - **🔔 Smart Notifications**: Event and funnel-based alerts - **🌍 Privacy-First**: Cookieless tracking and GDPR compliance - **🚀 Developer-Friendly**: Comprehensive SDKs and API access - **📦 Self-Hosted**: Full control over your data and infrastructure - **💸 Transparent Pricing**: No hidden costs or usage limits - **🛠️ Custom Dashboards**: Flexible chart creation and data visualization - **📱 Multi-Platform**: Web, mobile (iOS/Android), and server-side tracking ## 📊 Analytics Platform Comparison | Feature | OpenPanel | Mixpanel | GA4 | Plausible | |----------------------------------------|-----------|----------|-----------|-----------| | ✅ Open-source | ✅ | ❌ | ❌ | ✅ | | 🧩 Self-hosting supported | ✅ | ❌ | ❌ | ✅ | | 🔒 Cookieless by default | ✅ | ❌ | ❌ | ✅ | | 🔁 Real-time dashboards | ✅ | ✅ | ❌ | ✅ | | 🔍 Funnels & cohort analysis | ✅ | ✅ | ✅* | ✅*** | | 👤 User profiles & session history | ✅ | ✅ | ❌ | ❌ | | 📈 Custom dashboards & charts | ✅ | ✅ | ✅ | ❌ | | 💬 Event & funnel notifications | ✅ | ✅ | ❌ | ❌ | | 🌍 GDPR-compliant tracking | ✅ | ✅ | ❌** | ✅ | | 📦 SDKs (Web, Swift, Kotlin, ReactNative) | ✅ | ✅ | ✅ | ❌ | | 💸 Transparent pricing | ✅ | ❌ | ✅* | ✅ | | 🚀 Built for developers | ✅ | ✅ | ❌ | ✅ | | 🔧 A/B testing & variant breakdowns | ✅ | ✅ | ❌ | ❌ | > ✅* GA4 has a free tier but often requires BigQuery (paid) for raw data access. > ❌** GA4 has faced GDPR bans in several EU countries due to data transfers to US-based servers. > ✅*** Plausible has simple goals ## Stack - **Nextjs** - the dashboard - **Fastify** - event api - **Postgres** - storing basic information - **Clickhouse** - storing events - **Redis** - cache layer, pub/sub and queue - **BullMQ** - queue - **GroupMQ** - for grouped queue - **Resend** - email - **Arctic** - oauth - **Oslo** - auth - **tRPC** - api - **Tailwind** - styling - **Shadcn** - ui ## Self-hosting OpenPanel can be self-hosted and we have tried to make it as simple as possible. You can find the how to [here](https://openpanel.dev/docs/self-hosting/self-hosting) **Give us a star if you like it!** [![Star History Chart](https://api.star-history.com/svg?repos=Openpanel-dev/openpanel&type=Date)](https://star-history.com/#Openpanel-dev/openpanel&Date) ## Development ### Prerequisites - Docker - Docker Compose - Node - pnpm ### Start ```bash pnpm install cp .env.example .env echo "API_URL=http://localhost:3333" > apps/start/.env pnpm dock:up pnpm codegen pnpm migrate:deploy # once to setup the db pnpm dev ``` You can now access the following: - Dashboard: https://localhost:3000 - API: https://api.localhost:3333 - Bullboard (queue): http://localhost:9999 - `pnpm dock:ch` to access clickhouse terminal - `pnpm dock:redis` to access redis terminal ", Assign "at most 3 tags" to the expected json: {"id":"9026","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"