📊 OpenPanel : analytics open-source, self-hosté, sans cookie
📚 Introduction
Je viens de basculer arkoder.dev sur OpenPanel après plusieurs années passées chez Vercel Analytics, et avant ça chez Plausible. À chaque migration, la même question revient : qui regarde mes données, où sont-elles hébergées, et combien ça me coûte vraiment quand le trafic monte.
OpenPanel répond aux trois questions d’un coup. C’est open-source sous AGPL-3.0, ça s’auto-héberge en quelques commandes Docker, et la version managée démarre à 20 $/mois pour 5 000 events (auto-hébergement gratuit et illimité). Surtout, le périmètre fonctionnel dépasse largement Plausible : events typés, funnels, rétention, session replay, A/B testing. Quelque part entre Plausible et Mixpanel, sans le tarif de Mixpanel.
Dans ce post, je raconte pourquoi j’ai migré, comment j’ai installé OpenPanel à côté de mes sites Coolify, et ce qui m’a plu (et un peu moins) après quelques jours d’utilisation.
🎯 Pourquoi pas Plausible ou Posthog
J’aime Plausible. Son tracking est minimaliste, le script pèse 1 Ko, et le dashboard est lisible. Mais dès qu’on veut suivre des conversions ou comprendre un parcours sur plusieurs pages, on atteint vite le plafond. Plausible reste un outil de pageviews enrichi, pas un outil produit.
Posthog est l’inverse : l’outil produit complet, mais avec un dashboard qui ressemble à un cockpit d’avion. Pour un site vitrine et un blog, c’est trop. Et l’auto-hébergement nécessite un cluster Kubernetes que je n’ai pas envie de maintenir pour 500 visiteurs/jour.
OpenPanel atterrit pile au milieu. UI inspirée de Plausible, capacités proches de Mixpanel, et une stack Docker compose qui tourne sur un VPS modeste.
🛠️ Le stub script
OpenPanel propose un script web minuscule qui crée un proxy en attendant que le vrai SDK soit chargé. Les events appelés avant le chargement sont mis en queue puis rejoués. Pratique avec un defer :
<script>
window.op =
window.op ||
(function () {
var n = [];
return new Proxy(
function () {
arguments.length && n.push([].slice.call(arguments));
},
{
get: function (t, r) {
return 'q' === r
? n
: function () {
n.push([r].concat([].slice.call(arguments)));
};
},
has: function (t, r) {
return 'q' === r;
}
}
);
})();
window.op('init', {
apiUrl: 'https://openpanel.arkoder.dev/api',
clientId: 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
trackScreenViews: true,
trackOutgoingLinks: true,
trackAttributes: true,
sessionReplay: { enabled: true }
});
</script>
<script src="https://openpanel.dev/op1.js" defer></script>trackAttributes: true permet d’attacher un event sur n’importe quel élément en ajoutant data-track="signup_click" (et autant de data-* supplémentaires que tu veux pour les propriétés) sans toucher au JS. Très propre pour les boutons CTA d’une landing.
🚀 Self-hosting avec Docker
L’install se résume à un fichier docker-compose.yml officiel. Quelques services :
op-api: le service Node qui ingère les eventsop-dashboard: l’UI Next.jsop-worker: le consumer qui traite les events en batchop-ch: ClickHouse, la base colonne qui stocke les eventsop-db: PostgreSQL, pour les comptes, projets, dashboardsop-kv: Redis, utilisé comme queue (BullMQ) et cacheop-proxy: Caddy en frontal, géré nativement
C’est costaud sur le papier, mais sur un VPS 4 Go ça tient. Le repo officiel fournit même un coolify.yml prêt à l’emploi. J’ai déployé via la fonctionnalité “Docker Compose” de Coolify en pointant sur le repo, ajusté les .env, et c’était debout. Le TLS est terminé en amont par Coolify, le Caddy interne d’OpenPanel s’occupe du routage applicatif. J’en parle d’ailleurs dans Coolify : le Heroku self-hosted.
🔍 Session replay : utile ou voyeur ?
C’est la feature qui peut faire grincer des dents côté privacy. OpenPanel masque par défaut les champs d’input (maskAllInputs: true) et permet de marquer des éléments avec data-openpanel-replay-mask pour exclure des zones sensibles. Le replay reste local au compte OpenPanel, pas envoyé à un tiers.
Pour un site vitrine, je l’ai activée pour les premières semaines : voir comment les visiteurs naviguent entre le hero et les CTAs vaut largement n’importe quel heatmap. Je couperai sans doute après la phase de réglage UX, car les vidéos pèsent et la valeur diminue vite quand on a stabilisé le funnel.
🧩 Intégrations et stack
Côté serveur, OpenPanel propose un SDK Node officiel et plusieurs SDKs maintenus par la communauté. Pour Laravel, le package qui fait référence aujourd’hui est bleckert/openpanel-laravel, un provider tiers très propre :
composer require bleckert/openpanel-laravelTu déclares les credentials dans .env :
OPENPANEL_CLIENT_ID=...
OPENPANEL_CLIENT_SECRET=...
OPENPANEL_URL=https://openpanel.arkoder.devEt côté code, tu dispatches un event applicatif :
use Bleckert\OpenpanelLaravel\Openpanel;
$openpanel = app(Openpanel::class);
$openpanel->setProfileId($user->id);
$openpanel->track(name: 'order.completed', properties: [
'amount' => $order->total,
'currency' => 'EUR',
'product_count' => $order->items()->count(),
]);C’est exactement le pattern qu’on voit aussi côté Laravel AI SDK : une intégration alignée sur les conventions Laravel, pas un wrapper bricolé.
⚠️ Quelques précautions
- Adblockers :
openpanel.dev/op1.jsest connu de la plupart des listes. Je recommande de servir le script depuis un sous-domaine de ton site (/op1.jsproxifié), même OpenPanel le suggère. - CORS : sur l’auto-hébergement, pense à autoriser ton domaine dans le projet OpenPanel sinon les events POST seront rejetés.
- Coût Clickhouse : à volume élevé, c’est Clickhouse qui consomme. Surveille la RAM et le stockage, et configure les TTL d’events pour ne pas garder 5 ans de pageviews.
- AGPL : si tu forkes pour intégrer dans un produit propriétaire, lis la licence. Pour un usage interne ou un blog, aucun souci.
🎉 Conclusion
OpenPanel comble un vrai trou : un outil analytics qui couvre à la fois le webmaster d’arkoder.dev et le développeur produit qui veut suivre des funnels précis, le tout sans envoyer une seule donnée chez Google ou Vercel. Le tarif managé est honnête, et l’auto-hébergement reste tenable à la main.
Si tu utilises déjà Plausible et que tu commences à vouloir des events typés ou des funnels, c’est probablement la prochaine étape logique. Si tu utilises Mixpanel et que tu trouves la facture lourde, c’est l’occasion de tester avant le prochain renouvellement.
🔗 Liens utiles
/faq
Questions fréquentes
Qu'est-ce qu'OpenPanel ?
+
Une plateforme analytics open-source (AGPL-3.0) auto-hébergeable, sans cookie et compatible RGPD, qui se situe entre Plausible et Mixpanel : events typés, funnels, rétention, session replay et A/B testing.
OpenPanel est-il vraiment gratuit ?
+
L'auto-hébergement est gratuit et illimité. La version managée démarre à 20 $/mois pour 5 000 events.
Comment auto-héberger OpenPanel ?
+
Via le docker-compose.yml officiel (services op-api, op-dashboard, op-worker, ClickHouse, PostgreSQL, Redis et Caddy). Un coolify.yml prêt à l'emploi est fourni, et la stack tient sur un VPS 4 Go.
OpenPanel s'intègre-t-il à Laravel ?
+
Oui, via le package communautaire bleckert/openpanel-laravel : on déclare les credentials dans .env, puis on dispatche les events applicatifs avec la méthode track() du service Openpanel.