Marketing Digital

Installation et tracking snippet Umami : tutoriel WordPress, Next.js, Astro 2026

12 min de lecture

📍 Article principal de la série : Umami Analytics 2026 : guide pratique.

Snippet Umami = 1 ligne HTML. Mais l’intégration optimale varie selon framework. Ce tutoriel détaille les méthodes propres pour WordPress, Next.js 15 (App Router), Astro 4, Vue, et site HTML statique.

Prérequis

  • Umami installé (voir tutoriel installation).
  • Site enregistré, Website ID copié.
  • Niveau attendu : débutant/intermédiaire.
  • Temps estimé : 10-30 minutes selon stack.

Snippet de base

<script defer src="https://analytics.votre-entreprise.com/script.js"
  data-website-id="VOTRE_UUID_WEBSITE"></script>

Coller dans <head> ou juste avant </body>.

WordPress

Méthode 1 — Plugin officiel

Extensions → Ajouter → « Umami Analytics ». Installer + Activer. Réglages → Umami :

  • Tracker URL : https://analytics.votre-entreprise.com/script.js.
  • Website ID : votre UUID.
  • Track admin : OFF.

Méthode 2 — Code dans theme

Si pas de plugin, dans functions.php du thème enfant :

add_action('wp_head', function() {
  if (is_admin()) return;
  echo '<script defer src="https://analytics.votre-entreprise.com/script.js" data-website-id="UUID"></script>';
});

Next.js 15 App Router

Dans app/layout.tsx :

import Script from 'next/script';

export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        {children}
        {process.env.NODE_ENV === 'production' && (
          <Script defer
            src="https://analytics.votre-entreprise.com/script.js"
            data-website-id={process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID}
            strategy="afterInteractive"
          />
        )}
      </body>
    </html>
  );
}

Astro 4

Dans src/layouts/Layout.astro :

---
const isProd = import.meta.env.PROD;
---
<html>
<head>
  <slot name="head" />
  {isProd && (
    <script defer
      src="https://analytics.votre-entreprise.com/script.js"
      data-website-id={import.meta.env.UMAMI_WEBSITE_ID}></script>
  )}
</head>
<body>
  <slot />
</body>
</html>

Vue 3

Dans main.ts :

if (import.meta.env.PROD) {
  const script = document.createElement('script');
  script.defer = true;
  script.src = 'https://analytics.votre-entreprise.com/script.js';
  script.setAttribute('data-website-id', import.meta.env.VITE_UMAMI_WEBSITE_ID);
  document.head.appendChild(script);
}

Site HTML statique

Coller dans <head> de chaque page (ou template global) :

<script defer src="https://analytics.votre-entreprise.com/script.js"
  data-website-id="UUID"></script>

Options avancées

Auto-track outbound clicks

data-auto-track="true"
data-track-outbound="true"

Honor Do Not Track

data-do-not-track="true"

Domains specific only

data-domains="boutique.com,blog.boutique.com"

Cache et tag-manager

Pour Google Tag Manager (legacy), créer Custom HTML tag avec snippet. Trigger : All Pages.

Vérification

1. Console browser

F12 → Network → filter « umami ». Visite page = requête POST /api/send avec status 200.

2. Real-time Umami

Dashboard Umami → Real-time. Compteur visiteurs incrément à chaque visite.

3. Custom event de test

Dans console browser : umami.track('test-event'). Voir dans Events Umami.

Erreurs fréquentes

Erreur Cause Solution
404 script.js URL incorrecte Vérifier sans typo
403 CORS Domain pas dans whitelist Settings Umami site → permissions
Adblockers bloquent Pattern reconnu Configurer reverse proxy via votre domaine
Stats admin uniquement Pas IP exclude Settings Umami exclude IPs admin
Pageviews multipliées SPA navigation events Auto-detect activé par défaut
Track sur dev Pas de production check Conditionner avec NODE_ENV

Réalités du terrain en Afrique francophone

Trois précisions. Performance mobile : 2 Ko script + defer = aucun impact perçu sur 3G/4G. Reverse proxy domain : analytics.votre-domaine.com = pas de blocage adblocker. Multi-langue : un seul Umami site couvre /fr/ et /ar/, dashboard filtre par path.

Tutoriels frères

FAQ

SPA single-page applications ? Auto-detect par défaut. Sur Next.js, Vue, React : navigation traquée automatiquement.

WordPress sans plugin ? Possible via mu-plugin custom. Plugin officiel plus simple.

SSR vs SSG ? Pour SSG (Astro), tracking client-side identique. Aucune diff perçue.

iframe tracking ? Non par défaut. Custom code requis.

AMP pages ? AMP analytics protocol différent. Umami pas natif AMP.

Sur un angle proche

Vous voulez confier la création de votre site web ?

Conception sur mesure : nom de domaine 1 an gratuit, hébergement 1 an gratuit, formation à la gestion du site, support technique 6 mois. Accès et code livrés.

À partir de 350 000 FCFA

📧 E-mail
💬 WhatsApp

Pourquoi Umami plutot que Google Analytics 4 en 2026

Pour un site qui cible Dakar, Abidjan ou Lome, Google Analytics 4 pose deux problemes concrets : la lourdeur du script (90+ Ko gzip qui plombent le LCP sur 4G africaine) et la conformite RGPD qui impose un bandeau cookies anxiogene avant tout tracking. Umami repond aux deux : 2 Ko gzip, pas de cookies, pas de PII collectee, dashboards lisibles. Le tarif self-hosted demarre a zero (binaire Docker sur un VPS Hetzner CX22 a 4,90 EUR / mois, soit ~3 215 FCFA).

L objectif de ce tutoriel : installer Umami v2.x en self-hosted derriere un reverse proxy HTTPS, generer le snippet de tracking, et l integrer sur trois stacks frequentes en 2026 — WordPress (theme custom et page builder), Next.js 15 App Router, Astro 5. A la fin, vos analytics tournent en moins de 30 minutes, sans bandeau cookies, avec un dashboard accessible depuis n importe quel navigateur.

Etape 1 : Provisionner un VPS et une base Postgres

Umami v2 exige Postgres 12+ ou MySQL 8+. Pour rester simple, on lance Postgres en conteneur a cote d Umami. Verifiez d abord que Docker et Docker Compose sont installes sur votre VPS Ubuntu 24.04.

docker --version
docker compose version

Sortie attendue : Docker version 27.x et Docker Compose version v2.29+. Si une commande renvoie command not found, installez Docker via le script officiel curl -fsSL https://get.docker.com | sh. Sans ces deux outils, la suite du tutoriel ne fonctionnera pas.

Etape 2 : Lancer Umami avec docker-compose

Creez un dossier /opt/umami et un fichier docker-compose.yml minimaliste. Umami v2 se compose de deux services : l app Node et la base Postgres. Le mot de passe Postgres doit etre genere aleatoirement (32 caracteres minimum), pas celui de l exemple.

services:
  umami:
    image: ghcr.io/umami-software/umami:postgresql-v2.13.0
    ports:
      - "127.0.0.1:3000:3000"
    environment:
      DATABASE_URL: postgresql://umami:VOTRE_MOT_DE_PASSE@db:5432/umami
      DATABASE_TYPE: postgresql
      APP_SECRET: VOTRE_SECRET_ALEATOIRE
    depends_on:
      - db
    restart: always
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: umami
      POSTGRES_USER: umami
      POSTGRES_PASSWORD: VOTRE_MOT_DE_PASSE
    volumes:
      - ./pg_data:/var/lib/postgresql/data
    restart: always

Lancez avec docker compose up -d. La sortie attendue affiche Container umami-umami-1 Started et Container umami-db-1 Started. Verifiez avec docker compose ps que les deux services sont en running (healthy).

Etape 3 : Configurer le reverse proxy HTTPS avec Caddy

Umami ecoute sur 127.0.0.1:3000 (acces local uniquement). Caddy expose le service en HTTPS sur votre domaine analytics. Le Caddyfile tient en trois lignes.

analytics.example.com {
  reverse_proxy 127.0.0.1:3000
}

Rechargez Caddy avec sudo systemctl reload caddy. Visitez https://analytics.example.com dans votre navigateur : la page de login Umami doit s afficher avec le cadenas vert. Le compte par defaut est admin / umami. Changez immediatement ce mot de passe : c est le compte super-admin.

Etape 4 : Creer un site et recuperer le snippet

Dans l admin Umami, cliquez Settings > Websites > Add website. Renseignez le nom et le domaine (sans https://, juste monsite.com). Validez : Umami genere un Website ID au format UUID et un snippet HTML pret a copier.

<script defer src="https://analytics.example.com/script.js" data-website-id="VOTRE_UUID"></script>

Notez bien ce snippet : c est ce qu on integre sur les trois stacks ci-dessous. L attribut defer garantit que le script ne bloque pas le rendu initial de la page, critique pour les visiteurs en 4G a Dakar ou Bamako.

Etape 5 : Integrer Umami sur WordPress

Trois methodes selon votre setup. Methode 1 (theme custom) : ajoutez le snippet dans functions.php via un hook wp_head. C est la maniere la plus propre, le script est inline dans le head HTML.

add_action('wp_head', function() {
  echo '<script defer src="https://analytics.example.com/script.js" data-website-id="VOTRE_UUID"></script>';
});

La sortie attendue : ouvrez votre site, View Source, cherchez analytics.example.com. La balise doit apparaitre dans le <head>. Methode 2 (Elementor / page builder) : Settings > Custom Code > Add new > Location <head>. Collez le snippet, publiez. Methode 3 (plugin dedie) : « Integrate Umami » sur le repository WordPress, configuration GUI. Plus simple mais ajoute une dependance plugin.

Etape 6 : Integrer Umami sur Next.js 15 App Router

Sur Next.js 15 avec l App Router, on utilise le composant Script de next/script avec la strategie afterInteractive. C est l equivalent du defer en Vanilla JS, mais geree proprement par le bundler.

// app/layout.tsx
import Script from 'next/script';

export default function RootLayout({ children }) {
  return (
    <html>
      <body>
        {children}
        <Script defer src="https://analytics.example.com/script.js" data-website-id="VOTRE_UUID" />
      </body>
    </html>
  );
}

Apres deploiement, ouvrez le DevTools onglet Network, filtrez sur script.js : la requete doit retourner 200 OK avec un payload de ~2 Ko. Si elle renvoie 404, verifiez le sous-domaine analytics dans l URL.

Etape 7 : Integrer Umami sur Astro 5

Astro est devenu un choix frequent pour les sites de contenu en 2026 — blog itskillscenter, vitrines d agence Dakar, docs techniques. L integration tient en deux lignes dans le composant Layout principal.

---
// src/layouts/BaseLayout.astro
---
<html>
  <head>
    <script is:inline defer src="https://analytics.example.com/script.js" data-website-id="VOTRE_UUID"></script>
  </head>
  <body><slot /></body>
</html>

Le directive is:inline indique a Astro de ne pas bundler ce script (il est deja minifie cote Umami). Apres npm run build puis npm run preview, ouvrez la page : le snippet doit etre present dans le HTML statique genere.

Etape 8 : Verifier le tracking et debugger

Visitez votre site dans un navigateur en navigation privee (sans bloqueurs). Retournez sur Umami, dashboard du site : le compteur Visiteurs en ligne doit passer a 1 dans les 30 secondes. Si rien ne s affiche apres 1 minute, trois causes courantes.

Cause 1 : adblocker. uBlock Origin bloque par defaut tout chemin contenant /script.js hebergiseur tiers. Solution : whitelistez le domaine analytics ou renommez le script via la variable d env TRACKER_SCRIPT_NAME. Cause 2 : domaine non declare dans Umami. Le script verifie le document.referrer face au domaine declare. Cause 3 : CSP qui bloque l origin analytics.example.com. Verifiez la console DevTools pour le message d erreur explicite.

À lire ensuite sur l auto-hebergement de services analytics et tracking, consultez notre tutoriel Forgejo Actions CI/CD pour automatiser les deploiements de votre instance Umami, et le guide Docker / Podman avance 2026 pour durcir le runtime.

Annexe : evenements custom et conversions

Au-dela du pageview, Umami capte des evenements nommes (clic CTA, soumission formulaire, scroll depth). L API JS s appelle umami.track('nom_event', { propriete: 'valeur' }). Exemple sur un bouton WhatsApp Business critique pour les sites senegalais.

document.querySelector('.btn-whatsapp').addEventListener('click', () => {
  umami.track('whatsapp_click', { source: 'pricing_page' });
});

L evenement remonte instantanement dans Umami > Events. Filtrez par propriete pour voir quelle page convertit le mieux. Aucune donnee personnelle n est envoyee : seul le nom de l evenement et les proprietes que vous declarez.

Annexe : sauvegarde Postgres et migration

Umami stocke tout dans Postgres. La sauvegarde quotidienne tient en une commande cron qui dump la base et l envoie sur Scaleway Object Storage Paris (le plus proche de l Afrique de l Ouest, latence acceptable depuis Dakar).

0 4 * * * docker exec umami-db-1 pg_dump -U umami umami | gzip > /tmp/umami_$(date +\%Y\%m\%d).sql.gz

Pour la migration vers un nouveau VPS, restaurez le dump avec gunzip -c umami_xxx.sql.gz | docker exec -i umami-db-1 psql -U umami umami apres avoir relance le compose. Tous les dashboards, sites declares et evenements sont preserves.

FAQ Umami self-hosted

Combien de visiteurs supporte Umami sur un VPS 1 vCPU ? Largement 100 000 pageviews / mois sans accroc. Postgres consomme l essentiel des ressources : optez pour 2 Go RAM minimum si vous franchissez 500 000 pageviews mensuels.

Umami capte-t-il les visiteurs en mode incognito ? Oui, contrairement a GA4 qui depend des cookies. Umami genere un hash anonyme base sur user-agent + IP + sel du jour : un meme visiteur en navigation privee est compte une fois par jour.

Peut-on exporter les donnees brutes ? Oui, Umami expose une API REST documentee et permet l export CSV depuis chaque dashboard. Pratique pour brancher Metabase ou Grafana en aval.

Compatible avec un site multi-domaines ? Oui, declarez chaque domaine comme un site separe dans Umami. Vous obtenez un Website ID par domaine et des dashboards isoles. Pour un suivi cross-domain, utilisez la propriete data-domains sur le snippet.

Le tracker est-il bloque par les bloqueurs de pub ? uBlock Origin et certaines listes EasyPrivacy bloquent les chemins /script.js connus. La parade : variable d env TRACKER_SCRIPT_NAME=stats.js et COLLECT_API_ENDPOINT=/api/send. Le tracker s appelle alors stats.js et echappe aux listes generiques.

Faut-il afficher un bandeau cookies ? Non, Umami ne pose aucun cookie et ne stocke aucune PII. La CNIL francaise et la Commission de Protection des Donnees du Senegal acceptent ce mode « analytics anonymes » sans consentement prealable, comme le precise la CNIL pour les outils equivalents (Matomo configure sans cookies).

Bonus : Umami derriere Cloudflare et tunnel zero-trust

Si votre infra passe par Cloudflare, Umami fonctionne sans modification. Activez Full (strict) en mode SSL, et autorisez les requetes POST sur /api/send dans les Page Rules. Pour les utilisateurs ultra-sensibles a la latence depuis Bamako ou Conakry, activez Cloudflare Argo : la latence chute de 200 ms a 80 ms en moyenne sur les chemins Afrique de l Ouest vers Paris. Cout reel : 5 USD / mois plus le bandwidth.

Pour exposer une instance Umami hebergee sur un poste local sans IP publique (cas des laboratoires de formation Dakar), Cloudflare Tunnel fait le travail : cloudflared tunnel create umami, cloudflared tunnel route dns umami analytics.example.com, et cloudflared tunnel run umami. Aucun port a ouvrir cote firewall, certificat TLS gere par Cloudflare.

Partager