Générateur de requêtes SQL
Exécutez des requêtes SQL brutes sur vos données analytiques. Accès complet aux événements, sessions, propriétés utilisateurs et pages vues — sans limites sur ce que vous pouvez analyser.
Ce que vous verrez
L'interface SQL est composée de trois zones :
Éditeur de requête
Un éditeur de code avec coloration syntaxique SQL, complétion automatique des noms de tables et de colonnes, et numérotation des lignes. Vous pouvez écrire des requêtes SELECT complexes avec des jointures, des agrégations, des fonctions de fenêtrage et des filtres sur n'importe quelle colonne.
Explorateur de schéma
Un panneau latéral liste toutes les tables disponibles et leurs colonnes avec les types de données. Cliquez sur un nom de table pour insérer automatiquement un SELECT * FROM table LIMIT 10 dans l'éditeur — pratique pour explorer la structure des données.
Résultats
Les résultats s'affichent dans un tableau paginé sous l'éditeur. Vous pouvez :
- Trier par n'importe quelle colonne en cliquant sur l'en-tête
- Exporter les résultats en CSV
- Basculer vers une visualisation graphique (histogramme ou courbe) si la requête retourne des données temporelles
Schéma des tables disponibles
events
Table principale contenant tous les événements collectés.
| Colonne | Type | Description |
|---|---|---|
id | UUID | Identifiant unique de l'événement |
site_id | UUID | Identifiant du site |
session_id | UUID | Identifiant de la session |
user_id | TEXT | Identifiant utilisateur (si identify() appelé) |
event_name | TEXT | Nom de l'événement (ex. : pageview, button_click) |
properties | JSONB | Propriétés de l'événement |
url | TEXT | URL de la page au moment de l'événement |
referrer | TEXT | URL référente |
timestamp | TIMESTAMPTZ | Horodatage UTC de l'événement |
device_type | TEXT | desktop, tablet, mobile |
browser | TEXT | Nom du navigateur |
country | TEXT | Code pays ISO 3166-1 |
os | TEXT | Système d'exploitation |
sessions
Une ligne par session utilisateur.
| Colonne | Type | Description |
|---|---|---|
id | UUID | Identifiant de la session |
site_id | UUID | Identifiant du site |
user_id | TEXT | Identifiant utilisateur (si identifié) |
started_at | TIMESTAMPTZ | Début de la session |
ended_at | TIMESTAMPTZ | Fin de la session (null si en cours) |
duration_seconds | INTEGER | Durée totale de la session |
pageview_count | INTEGER | Nombre de pages vues |
entry_url | TEXT | Première URL visitée |
exit_url | TEXT | Dernière URL visitée |
utm_source | TEXT | Paramètre UTM source |
utm_medium | TEXT | Paramètre UTM medium |
utm_campaign | TEXT | Paramètre UTM campaign |
users
Profils utilisateurs identifiés via QMTracker.identify().
| Colonne | Type | Description |
|---|---|---|
id | TEXT | Identifiant utilisateur (votre ID) |
site_id | UUID | Identifiant du site |
properties | JSONB | Propriétés définies via identify() |
first_seen_at | TIMESTAMPTZ | Première apparition dans le système |
last_seen_at | TIMESTAMPTZ | Dernière activité |
session_count | INTEGER | Nombre total de sessions |
event_count | INTEGER | Nombre total d'événements |
pageviews
Vue dénormalisée des événements de type pageview pour des requêtes simplifiées.
| Colonne | Type | Description |
|---|---|---|
id | UUID | Identifiant de l'événement |
session_id | UUID | Identifiant de la session |
url | TEXT | URL visitée |
title | TEXT | Titre de la page |
timestamp | TIMESTAMPTZ | Horodatage |
duration_seconds | INTEGER | Temps passé sur la page |
Comment l'utiliser
Exemples de requêtes courantes
Pages les plus visitées sur les 30 derniers jours :
SELECT
url,
COUNT(*) AS pageviews,
COUNT(DISTINCT session_id) AS unique_sessions
FROM pageviews
WHERE timestamp >= NOW() - INTERVAL '30 days'
AND site_id = 'YOUR_SITE_ID'
GROUP BY url
ORDER BY pageviews DESC
LIMIT 20;
Événements personnalisés par jour :
SELECT
DATE_TRUNC('day', timestamp) AS day,
event_name,
COUNT(*) AS count
FROM events
WHERE event_name != 'pageview'
AND timestamp >= NOW() - INTERVAL '7 days'
AND site_id = 'YOUR_SITE_ID'
GROUP BY day, event_name
ORDER BY day DESC, count DESC;
Taux de conversion d'un entonnoir personnalisé :
WITH funnel AS (
SELECT
session_id,
MAX(CASE WHEN event_name = 'page_view' AND url LIKE '%/tarifs%' THEN 1 ELSE 0 END) AS step1,
MAX(CASE WHEN event_name = 'signup_started' THEN 1 ELSE 0 END) AS step2,
MAX(CASE WHEN event_name = 'signup_completed' THEN 1 ELSE 0 END) AS step3
FROM events
WHERE timestamp >= NOW() - INTERVAL '30 days'
AND site_id = 'YOUR_SITE_ID'
GROUP BY session_id
)
SELECT
COUNT(*) FILTER (WHERE step1 = 1) AS visited_pricing,
COUNT(*) FILTER (WHERE step2 = 1) AS started_signup,
COUNT(*) FILTER (WHERE step3 = 1) AS completed_signup,
ROUND(100.0 * COUNT(*) FILTER (WHERE step3 = 1) / NULLIF(COUNT(*) FILTER (WHERE step1 = 1), 0), 2) AS conversion_rate
FROM funnel;
Revenus par source UTM :
SELECT
s.utm_source,
s.utm_campaign,
COUNT(DISTINCT e.session_id) AS purchases,
SUM((e.properties->>'revenue')::NUMERIC) AS total_revenue
FROM events e
JOIN sessions s ON e.session_id = s.id
WHERE e.event_name = 'purchase'
AND e.timestamp >= NOW() - INTERVAL '30 days'
AND e.site_id = 'YOUR_SITE_ID'
GROUP BY s.utm_source, s.utm_campaign
ORDER BY total_revenue DESC;
Sauvegarder et partager une requête
- Écrivez et testez votre requête.
- Cliquez sur Sauvegarder — donnez un nom et une description optionnelle.
- La requête sauvegardée apparaît dans la liste Mes requêtes à gauche.
- Cliquez sur Partager pour générer un lien de lecture seule utilisable dans un tableau de bord personnalisé.
Créer une visualisation depuis SQL
Après exécution d'une requête retournant une colonne de dates et une colonne numérique, cliquez sur Visualiser pour basculer vers un graphique. Sélectionnez :
- Courbe — pour des séries temporelles
- Barres — pour des comparaisons de catégories
- Secteurs — pour des répartitions proportionnelles
Condition de validation
Cet achievement est débloqué lorsque : vous avez exécuté au moins une requête SQL qui retourne des résultats non vides, et sauvegardé cette requête dans votre liste de requêtes.
Problèmes courants
Erreur « permission denied » sur certaines tables
Les requêtes SQL dans QuickMonitoring sont limitées aux données de votre propre site (filtrées automatiquement par site_id). Vous ne pouvez pas accéder aux données d'autres sites. Les requêtes qui tentent de contourner ce filtre sont rejetées.
Les requêtes sont lentes sur de grandes périodes
Pour des analyses sur plusieurs mois, ajoutez toujours un filtre sur timestamp pour limiter le volume scanné. Les tables sont partitionnées par date — un filtre timestamp >= ... permet au moteur d'ignorer les partitions non pertinentes et d'accélérer considérablement la requête.
Les propriétés JSONB ne sont pas accessibles Pour accéder aux champs d'une colonne JSONB, utilisez la syntaxe PostgreSQL :
-- Accéder à une propriété string
properties->>'revenue'
-- Accéder à une propriété numérique avec cast
(properties->>'revenue')::NUMERIC
-- Filtrer sur une propriété
WHERE properties->>'plan' = 'pro'
Résultats tronqués à 1 000 lignes
Par mesure de performance, les résultats sont limités à 1 000 lignes dans l'interface. Utilisez LIMIT et OFFSET pour paginer, ou exportez en CSV pour obtenir l'intégralité des données sans limite.