315 lines
9.3 KiB
Markdown
315 lines
9.3 KiB
Markdown
# 📊 PostHog Analytics - Guide d'Utilisation
|
|
|
|
## 🎯 Vue d'ensemble
|
|
|
|
PostHog est configuré pour tracker automatiquement les événements utilisateurs dans l'application Odentas Espace Paie.
|
|
|
|
## ✅ Configuration actuelle
|
|
|
|
### Installation
|
|
- **Package** : `posthog-js` (client) + `posthog-node` (serveur)
|
|
- **Région** : EU (https://eu.i.posthog.com)
|
|
- **Variables d'environnement** :
|
|
- `NEXT_PUBLIC_POSTHOG_KEY` : Clé API publique
|
|
- `NEXT_PUBLIC_POSTHOG_HOST` : URL du serveur PostHog
|
|
|
|
### Composants créés
|
|
1. **PostHogProvider** (`components/PostHogProvider.tsx`)
|
|
- Initialise PostHog au chargement de l'application
|
|
- Active le mode debug en développement
|
|
- Expose `window.posthog` pour les tests console en dev
|
|
- **Important** : Utilise `person_profiles: 'identified_only'` - les utilisateurs ne sont créés dans PostHog que lorsqu'ils sont explicitement identifiés
|
|
|
|
2. **PostHogPageView** (`components/PostHogPageView.tsx`)
|
|
- Track automatiquement chaque changement de page
|
|
- Capture l'URL complète avec query params
|
|
|
|
3. **PostHogIdentifier** (`components/PostHogIdentifier.tsx`)
|
|
- **Composant clé pour l'identification des utilisateurs** ⭐
|
|
- Identifie automatiquement les utilisateurs connectés via l'API `/api/me`
|
|
- Associe les propriétés utilisateur (email, nom, company, etc.)
|
|
- Réinitialise l'identité lors de la déconnexion
|
|
- **Note** : Si vous ne voyez pas les utilisateurs identifiés dans PostHog, vérifiez que ce composant est bien présent dans votre layout
|
|
|
|
## 🔍 Pourquoi les utilisateurs sont anonymes ?
|
|
|
|
Si vous voyez tous les utilisateurs anonymisés dans PostHog, c'est probablement parce que :
|
|
|
|
1. ❌ **Le composant `PostHogIdentifier` n'est pas présent** dans le layout
|
|
2. ❌ **L'API `/api/me` ne retourne pas les bonnes données** (vérifiez la structure JSON)
|
|
3. ❌ **L'utilisateur n'est pas authentifié** au moment où PostHog charge
|
|
4. ❌ **Les variables d'environnement PostHog sont manquantes**
|
|
|
|
### Solution :
|
|
- Vérifiez que `<PostHogIdentifier />` est bien dans `app/layout.tsx`
|
|
- Ouvrez la console du navigateur et regardez les logs : vous devriez voir `👤 PostHog: Utilisateur identifié: email@example.com`
|
|
- Si vous voyez une erreur, vérifiez que l'API `/api/me` fonctionne correctement
|
|
|
|
## 📈 Événements trackés automatiquement
|
|
|
|
### Événements système
|
|
- `$pageview` : Chaque changement de page
|
|
- `$pageleave` : Quand l'utilisateur quitte une page
|
|
- `$autocapture` : Clics et interactions (si activé)
|
|
|
|
### Propriétés utilisateur trackées
|
|
Lors de l'identification (connexion) :
|
|
- `email` : Email de l'utilisateur
|
|
- `first_name` : Prénom
|
|
- `display_name` : Nom d'affichage complet
|
|
- `company_name` : Nom de la société active (active_org_name)
|
|
- `company_id` : ID de la société active (active_org_id)
|
|
- `is_staff` : Membre du staff ou non
|
|
|
|
## 🔧 Utilisation avancée
|
|
|
|
### Tracker un événement personnalisé
|
|
|
|
```tsx
|
|
'use client';
|
|
import { usePostHog } from 'posthog-js/react';
|
|
|
|
function MonComposant() {
|
|
const posthog = usePostHog();
|
|
|
|
const handleAction = () => {
|
|
posthog.capture('nom_evenement', {
|
|
propriete1: 'valeur',
|
|
propriete2: 123,
|
|
timestamp: new Date().toISOString()
|
|
});
|
|
};
|
|
|
|
return <button onClick={handleAction}>Action</button>;
|
|
}
|
|
```
|
|
|
|
**Exemple concret : Tracking de création de contrat** ✨
|
|
|
|
```tsx
|
|
// Après création réussie d'un contrat
|
|
posthog?.capture('contract_created', {
|
|
contract_type: 'CDDU',
|
|
regime: 'CDDU_MONO',
|
|
categorie_professionnelle: 'Artiste',
|
|
contract_id: contractId,
|
|
validation_immediate: true,
|
|
});
|
|
```
|
|
|
|
> 💡 **Voir le guide complet** : `POSTHOG_SURVEY_CONTRATS.md` pour la mise en place d'un survey de satisfaction après création de contrats.
|
|
|
|
### Identifier un utilisateur manuellement
|
|
|
|
```typescript
|
|
posthog.identify('user_id_unique', {
|
|
email: 'user@example.com',
|
|
name: 'Nom Utilisateur',
|
|
plan: 'premium'
|
|
});
|
|
```
|
|
|
|
### Tracker une propriété super (persistante)
|
|
|
|
```typescript
|
|
// Sera ajoutée à tous les événements futurs
|
|
posthog.register({
|
|
app_version: '1.0.0',
|
|
environment: 'production'
|
|
});
|
|
```
|
|
|
|
### Réinitialiser l'identité
|
|
|
|
```typescript
|
|
// À la déconnexion (déjà fait dans LogoutButton)
|
|
posthog.reset();
|
|
```
|
|
|
|
## 🧪 Tests en développement
|
|
|
|
### Console du navigateur
|
|
|
|
En mode développement, PostHog est accessible via `window.posthog` :
|
|
|
|
```javascript
|
|
// Tester un événement
|
|
window.posthog.capture('test_event', { message: 'Hello' });
|
|
|
|
// Voir l'utilisateur actuel
|
|
window.posthog.get_distinct_id();
|
|
|
|
// Voir les propriétés
|
|
window.posthog.get_property('email');
|
|
```
|
|
|
|
### Vérifier les requêtes réseau
|
|
|
|
1. Ouvrez DevTools (F12)
|
|
2. Onglet Network
|
|
3. Filtrez par "batch" ou "posthog"
|
|
4. Les requêtes vers `eu.i.posthog.com/batch/` doivent être en status 200
|
|
|
|
### Logs console
|
|
|
|
Avec le mode debug activé, vous verrez :
|
|
```
|
|
[PostHog.js] "capture" {event: "$pageview", properties: {...}}
|
|
[PostHog.js] "identify" {distinctId: "user_id", properties: {...}}
|
|
```
|
|
|
|
## 📊 Dashboard PostHog
|
|
|
|
### Accès
|
|
https://eu.posthog.com/
|
|
|
|
### Vues utiles
|
|
|
|
1. **Activity / Live Events** : Voir les événements en temps réel
|
|
2. **Persons** : Liste des utilisateurs identifiés
|
|
3. **Insights** : Créer des graphiques et analyses
|
|
4. **Funnels** : Analyser les parcours utilisateurs
|
|
5. **Session Recordings** : Voir les replays de sessions (si activé)
|
|
|
|
### Filtres utiles
|
|
|
|
- Exclure dev : `$current_url does not contain localhost`
|
|
- Voir uniquement staff : `is_staff = true`
|
|
- Par société : `company_name = X`
|
|
|
|
## 🎯 Cas d'usage recommandés
|
|
|
|
### 1. Tracker les actions importantes
|
|
|
|
```typescript
|
|
// Création d'un contrat
|
|
posthog.capture('contrat_created', {
|
|
contrat_id: contratId,
|
|
type: typeContrat,
|
|
montant: montant
|
|
});
|
|
|
|
// Signature d'un document
|
|
posthog.capture('document_signed', {
|
|
document_type: 'contrat',
|
|
document_id: docId
|
|
});
|
|
|
|
// Téléchargement de fiche de paie
|
|
posthog.capture('payslip_downloaded', {
|
|
month: '2025-10',
|
|
employee_id: employeeId
|
|
});
|
|
```
|
|
|
|
### 2. Groupes (pour analytics par société)
|
|
|
|
```typescript
|
|
posthog.group('company', companyId, {
|
|
company_name: 'Société X',
|
|
plan: 'premium',
|
|
employees_count: 50
|
|
});
|
|
```
|
|
|
|
### 3. Feature Flags (A/B testing)
|
|
|
|
```typescript
|
|
const showNewFeature = posthog.isFeatureEnabled('new_ui_design');
|
|
|
|
if (showNewFeature) {
|
|
// Afficher la nouvelle interface
|
|
}
|
|
```
|
|
|
|
## 🔒 Confidentialité & RGPD
|
|
|
|
### Données collectées
|
|
- Événements de navigation et interactions
|
|
- Propriétés utilisateur (email, nom, société)
|
|
- Données techniques (navigateur, OS, résolution)
|
|
|
|
### Données NON collectées par défaut
|
|
- Mots de passe
|
|
- Données sensibles dans les formulaires
|
|
- Contenu des documents
|
|
|
|
### Respect du RGPD
|
|
- Hébergement EU (GDPR compliant)
|
|
- Possibilité d'anonymiser les IPs
|
|
- Droit à l'oubli via l'API PostHog
|
|
|
|
### Opt-out utilisateur
|
|
|
|
```typescript
|
|
// Si l'utilisateur refuse le tracking
|
|
posthog.opt_out_capturing();
|
|
|
|
// Pour réactiver
|
|
posthog.opt_in_capturing();
|
|
```
|
|
|
|
## 🚨 Troubleshooting
|
|
|
|
### Les événements n'arrivent pas
|
|
|
|
1. ✅ Vérifier que les variables `NEXT_PUBLIC_*` sont dans `.env.local`
|
|
2. ✅ Redémarrer le serveur après modification du `.env.local`
|
|
3. ✅ Vérifier la console : doit afficher "✅ PostHog initialisé"
|
|
4. ✅ Vérifier Network : requêtes `/batch/` en status 200
|
|
5. ✅ Vérifier la clé API dans le dashboard PostHog
|
|
|
|
### ❌ Les utilisateurs sont tous anonymes / non identifiés
|
|
|
|
**Symptôme** : Dans PostHog, vous voyez des utilisateurs avec des IDs anonymes (ex: `anon_xyz123`) au lieu des vrais utilisateurs.
|
|
|
|
**Cause** : Le composant `PostHogIdentifier` n'identifie pas correctement les utilisateurs.
|
|
|
|
**Solutions** :
|
|
|
|
1. **Vérifier la console du navigateur** :
|
|
- Vous devriez voir : `👤 PostHog: Utilisateur identifié: email@example.com ID: user-uuid`
|
|
- Si vous voyez une erreur, notez le message
|
|
|
|
2. **Vérifier que PostHogIdentifier est dans le layout** :
|
|
- Ouvrir `app/layout.tsx`
|
|
- Chercher `<PostHogIdentifier />`
|
|
- Doit être à l'intérieur du `<Providers>` ou `<PostHogProvider>`
|
|
|
|
3. **Tester l'API /api/me** :
|
|
```bash
|
|
# Dans la console du navigateur (quand vous êtes connecté)
|
|
fetch('/api/me').then(r => r.json()).then(console.log)
|
|
```
|
|
- Doit retourner : `{ user: { id: "...", email: "..." }, active_org_id: "...", ... }`
|
|
- Si `user.id` est undefined, il y a un problème avec l'API
|
|
|
|
4. **Vérifier la configuration PostHog** :
|
|
- Dans `PostHogProvider.tsx`, vous devez avoir : `person_profiles: 'identified_only'`
|
|
- Cela signifie que PostHog ne crée des profils que pour les utilisateurs identifiés explicitement
|
|
|
|
5. **Forcer une réidentification** :
|
|
```javascript
|
|
// Dans la console du navigateur
|
|
window.posthog.reset(); // Efface l'identité actuelle
|
|
window.location.reload(); // Recharge la page pour réidentifier
|
|
```
|
|
|
|
### Double initialisation
|
|
|
|
Si vous voyez "You have already initialized PostHog!", c'est normal en dev (React Strict Mode). En production, cela n'arrive pas.
|
|
|
|
### Événements en retard
|
|
|
|
PostHog batch les événements pour optimiser les performances. Ils peuvent apparaître avec 5-30s de délai dans le dashboard.
|
|
|
|
## 📚 Ressources
|
|
|
|
- [Documentation PostHog](https://posthog.com/docs)
|
|
- [API JavaScript](https://posthog.com/docs/libraries/js)
|
|
- [React Integration](https://posthog.com/docs/libraries/react)
|
|
- [Feature Flags](https://posthog.com/docs/feature-flags)
|
|
|
|
---
|
|
|
|
**Dernière mise à jour** : 13 octobre 2025
|