> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aftersell.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Référence AftersellQL (AQL)

> La référence du langage de requête AftersellQL : métriques et dimensions disponibles, syntaxe des clauses AQL avec exemples, et règles de fuseau horaire pour l'Explorer.

Chaque requête que vous construisez dans l'[Explorer](/fr/aftersell/reports_explorer) est une instruction **AftersellQL (AQL)**. La plupart du temps, vous construisez les requêtes visuellement et n'écrivez jamais d'AQL à la main ; cette page est la référence des métriques et dimensions que vous pouvez choisir, de la forme textuelle de l'AQL et des règles de fuseau horaire.

<div id="available-metrics">
  ## Métriques disponibles
</div>

Voici les métriques que vous pouvez choisir, regroupées de la même manière que dans le sélecteur de métriques.

<div id="revenue-profit">
  ### Revenus et profit
</div>

| Métrique | Description |
| - | - |
| **Revenue** | Revenus d'upsell dans la devise native de votre boutique. |
| **Revenue (USD)** | Revenus d'upsell normalisés en USD pour les comparaisons entre devises. |
| **Revenue Per Visit** | Revenus d'upsell par session d'impression. Ne peut pas être ventilé par produit, emplacement, funnel ou appareil. |
| **Avg. Conversion Value** | Revenus par offre acceptée. Également appelé Average Upsell Value. |
| **Upsell Revenue Per Order** | Revenus d'upsell (USD) divisés par le nombre total de commandes. Au niveau de la boutique uniquement. |
| **Product Profit** | Revenus moins le coût des marchandises vendues (COGS) pour les produits vendus en upsell. Repose sur le COGS configuré par le marchand, considérez-le donc comme une estimation : les produits sans coût suivi déclarent leurs revenus comme profit, et la couverture des coûts varie selon les boutiques. Granularité produit uniquement ; ne peut pas être ventilé par funnel, emplacement ou appareil. |

<div id="conversions">
  ### Conversions
</div>

| Métrique | Description |
| - | - |
| **Conversions** | Le nombre d'événements d'offre acceptée. Une offre acceptée correspond à une conversion ; une session qui accepte deux offres compte donc deux fois. |
| **Accept Rate** | Basé sur les sessions : la part des sessions ayant vu une offre et accepté au moins une offre. Calculé indépendamment de Conversions, à partir d'un autre agrégat ; ce n'est donc pas Conversions ÷ Impressions. |
| **Units Sold** | Nombre total d'unités vendues via les offres d'upsell. |
| **Decline Rate** | Pourcentage d'offres post-achat explicitement refusées. Post-achat uniquement. |

<div id="engagement">
  ### Engagement
</div>

| Métrique | Description |
| - | - |
| **Impressions** | Sessions uniques ayant vu une offre. |
| **Show Rate** | Pourcentage de décisions ayant abouti à une impression. |

<div id="store-performance">
  ### Performance de la boutique
</div>

| Métrique | Description |
| - | - |
| **Total Store Revenue** | Revenus totaux des commandes payées sur Shopify. Au niveau de la boutique uniquement ; ne peut pas être ventilé par surface, funnel, emplacement ou appareil. |
| **Orders** | Nombre total de commandes payées sur Shopify. Au niveau de la boutique uniquement. |
| **Average Total Order Value** | Revenus de la boutique divisés par le nombre de commandes. Panier moyen au niveau de la boutique. |

<div id="rokt-network">
  ### Réseau Rokt
</div>

| Métrique | Description |
| - | - |
| **Rokt Revenue** | Revenus du réseau Rokt attribués à votre boutique. |
| **Rokt Transactions** | Nombre de transactions du réseau Rokt pour votre boutique. |
| **Rokt Revenue / Transaction** | Revenus Rokt divisés par les transactions pour chaque intervalle de temps. |
| **Rokt Impressions** | Nombre total d'impressions du réseau Rokt sur les emplacements de votre boutique. Distinct des **Impressions** d'upsell. |
| **Rokt Referrals** | Recommandations du réseau Rokt, c'est-à-dire les engagements positifs ayant redirigé l'acheteur vers un partenaire Rokt. |

<div id="dimensions">
  ## Dimensions
</div>

Les dimensions ventilent une métrique selon un attribut. Toutes les dimensions ne sont pas compatibles avec toutes les métriques ; l'Explorer empêche automatiquement les combinaisons incompatibles (par exemple, **Decline rate** et **Show rate** ne peuvent pas être ventilés par **Currency**).

<div id="available-dimensions">
  ### Dimensions disponibles
</div>

| Dimension | Description |
| - | - |
| **Date** | Regroupe les résultats par jour, semaine ou mois. |
| **Surface** | La surface d'upsell : PPU (post-achat), Checkout, Thank You Page ou Cart. |
| **Funnel** | Le funnel spécifique auquel appartient l'offre. |
| **Product** | Le produit vendu en upsell. |
| **Placement** | L'emplacement au sein d'un funnel. |
| **Device** | Le type d'appareil : Mobile, Desktop ou Unknown. Il n'existe pas de valeur distincte pour les tablettes. |
| **Currency** | Le code de devise ISO (par exemple USD, EUR, GBP). Utile pour les boutiques multidevises. |

<div id="unavailable-dimensions">
  ### Dimensions non disponibles
</div>

Les dimensions suivantes sont en cours de développement. Elles apparaissent dans le sélecteur mais s'affichent comme « Not compatible » pour toutes les métriques jusqu'à leur implémentation.

| Dimension | Description |
| - | - |
| **Flow type** | Le type de flux d'upsell. |
| **Experiment** | La variante d'A/B test ou d'expérience. |
| **Outcome** | Le résultat de la décision (par exemple, éligible, en rupture de stock). |
| **Reason code** | La raison d'un résultat de décision. |
| **Scope** | La portée de la décision (Flow, Experience, Placement ou ItemSlot). |
| **Response type** | La réponse à l'offre (Accepted, Declined ou Timeout). |

<div id="aql-statement-syntax">
  ## Syntaxe des instructions AQL
</div>

Une instruction AQL est une question unique composée de clauses. Seuls `SELECT` et une plage de dates (`SINCE`) sont obligatoires ; tout le reste est facultatif. Lorsque vous incluez des clauses facultatives, elles doivent apparaître dans cet ordre :

```text theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
SELECT    <metrics>                    -- what to measure (required)
WHERE     <filters>                    -- narrow the data
GROUP BY  <dimensions>                 -- break the numbers down
SINCE     <time range>                 -- the period to cover (required)
GRAIN     <time grain>                 -- bucket size for time series
COMPARE   <comparison>                 -- compare against another period
CHART     <visualization>              -- how to display the result
TIMEZONE  "<timezone>"                 -- timezone for date buckets
ORDER BY  <field> <direction>          -- sort the results
LIMIT     <number>                     -- cap the number of rows
```

Un exemple minimal, les revenus d'upsell et le taux d'acceptation quotidiens sur les 30 derniers jours :

```aql theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
SELECT revenue, accept_rate
GROUP BY date
SINCE last_30d
GRAIN day
```

<Note>
  Les mots-clés ne sont pas sensibles à la casse (`SELECT` et `select` fonctionnent tous les deux) et les instructions ne se terminent pas par un point-virgule. Les valeurs de type chaîne sont entourées de guillemets doubles ; les nombres et les listes ne le sont pas.
</Note>

<div id="select-and-group-by">
  ### SELECT et GROUP BY
</div>

* **`SELECT`** liste les métriques à mesurer, séparées par des virgules, par exemple `SELECT revenue, impressions, accept_rate`.
* **`GROUP BY`** ventile ces métriques selon une ou plusieurs dimensions, comme `date`, `device`, `surface` ou `funnel`. Sans `GROUP BY`, vous obtenez un total unique pour toute la période.

<div id="filtering-with-where">
  ### Filtrer avec WHERE
</div>

`WHERE` restreint les données avant qu'elles ne soient mesurées. Combinez les conditions avec `AND`.

```aql theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
SELECT revenue
WHERE device = "mobile"
GROUP BY date
SINCE last_month
GRAIN day
```

<Warning>
  `impressions`, `accept_rate` et `rpv` **ne peuvent pas** être filtrés ni regroupés par appareil, funnel, emplacement ou produit ; leur agrégat source ne contient pas de telle colonne. Ajouter `WHERE device = "mobile"` à une requête sélectionnant l'une de ces métriques est rejeté avec `metric "impressions" cannot be filtered by "device"`.
</Warning>

Les comparaisons prises en charge sont `=`, `!=`, `IN`, `NOT IN`, `>`, `<`, `>=` et `<=`. Utilisez une liste avec `IN` pour faire correspondre plusieurs valeurs :

```aql theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
WHERE surface IN ["PPU", "Checkout"]
```

`experiment` n'est **pas** un champ filtrable ; il n'a pas d'agrégat source, donc `WHERE experiment IN [...]` est rejeté avec `filters on "experiment" are not supported.`

Le filtre **funnel** prend en charge la sélection multiple : **is one of** (`IN`) inclut uniquement les funnels sélectionnés, **is not one of** (`NOT IN`) les exclut. Lorsque vous regroupez par **Funnel** et appliquez un filtre **is one of**, le graphique affiche une ligne par funnel sélectionné, sans regroupement « Other ».

<div id="time-ranges-and-comparisons">
  ### Plages de dates et comparaisons
</div>

Chaque requête nécessite une plage de dates, définie avec `SINCE` :

| Forme | Exemple | Signification |
| - | - | - |
| Préréglage | `SINCE last_30d` | Une fenêtre glissante se terminant **hier** (UTC). Le jour en cours est volontairement exclu ; `last_1d` signifie donc hier uniquement, et `this_month` va du 1er du mois à hier. |
| Fenêtre personnalisée | `SINCE 2026-07-02 UNTIL 2026-07-05` | Une plage fixe, utilisant des dates ISO (`YYYY-MM-DD`). |

Préréglages disponibles : `last_1d`, `last_7d`, `last_30d`, `last_90d`, `this_month`, `last_month` et `this_year`.

* **`GRAIN`** définit la taille des intervalles pour les séries temporelles : `day`, `week` ou `month`. (`hour` est accepté syntaxiquement mais aucun agrégat ne fournit de données horaires, une telle requête est donc rejetée avec `group_by / time_grain combination is not supported.`)
* **`COMPARE`** superpose une seconde période. Utilisez `previous_period`, la fenêtre de même durée immédiatement antérieure. `previous_year` est masqué du sélecteur Compare car l'entrepôt de données ne contient aucune donnée antérieure à février 2026 ; il reste saisissable en AQL uniquement pour que les requêtes enregistrées auparavant continuent d'être analysées.

```aql theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
-- A four-day sale vs the four days immediately before it
SELECT revenue, impressions, accept_rate
GROUP BY date
SINCE 2026-07-02 UNTIL 2026-07-05
GRAIN day
COMPARE previous_period
```

<Note>
  Les données de reporting commencent en **février 2026** ; une fenêtre antérieure renvoie donc un résultat vide pour les deux périodes.
</Note>

<div id="choosing-a-chart">
  ### Choisir un graphique
</div>

* **`CHART`** définit comment le résultat est affiché : `scorecard`, `line_chart`, `bar_chart`, `area_chart`, `funnel_chart` ou `table`.
* **`TIMEZONE`** définit le fuseau horaire utilisé pour regrouper les dates, sous la forme d'un nom IANA entre guillemets, par exemple `TIMEZONE "America/New_York"`. Par défaut, UTC (voir [Fuseaux horaires](#timezones)).

Le type `funnel_chart` a des exigences spécifiques :

* **Mode emplacement.** Regroupez par `placement` et sélectionnez une métrique. Les étapes sont ordonnées selon la séquence canonique des emplacements (upsell par défaut, puis downsell, puis upsells supplémentaires). Seule la première métrique est tracée ; les métriques supplémentaires sont mentionnées dans une note de bas de page.
* **Mode métrique.** Sélectionnez deux métriques ou plus sans `GROUP BY`. Chaque métrique devient une étape du funnel dans l'ordre de la requête (par exemple, `SELECT impressions, conversions` affiche la déperdition des impressions vers les conversions). Toutes les métriques doivent partager la même unité.

```aql theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
-- Placement funnel: conversion drop-off across placements
SELECT conversions
GROUP BY placement
SINCE last_30d
CHART funnel_chart
```

<Warning>
  Le mode emplacement nécessite une métrique pouvant être ventilée par emplacement. `impressions`, `accept_rate` et `rpv` ne le peuvent pas ; pour celles-ci, le graphique en funnel affiche « These metrics can't be grouped by placement ».
</Warning>

```aql theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
-- Metric funnel: impressions to conversions drop-off
SELECT impressions, conversions
SINCE last_30d
CHART funnel_chart
```

<div id="sorting-and-limiting">
  ### Trier et limiter
</div>

* **`ORDER BY`** trie les résultats selon une métrique ou une dimension, avec `ASC` ou `DESC`.
* **`LIMIT`** plafonne le nombre de lignes renvoyées, utile pour les questions de type « top N ».

```aql theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
-- Top 20 products by upsell revenue this month
SELECT revenue, conversions, avg_conversion_value
GROUP BY product
SINCE this_month
ORDER BY revenue DESC
LIMIT 20
```

<div id="more-examples">
  ### Autres exemples
</div>

```aql theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
-- Daily performance vs the previous period
SELECT revenue, impressions, conversions, accept_rate
GROUP BY date
SINCE last_30d
GRAIN day
COMPARE previous_period
```

```aql theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
-- Mobile vs desktop revenue over the last 90 days
SELECT revenue
GROUP BY device
SINCE last_90d
ORDER BY revenue DESC
```

<Note>
  `impressions`, `accept_rate` et `rpv` ne peuvent pas être ventilés par appareil ; leur agrégat est boutique × surface × jour, sans colonne d'appareil. Utilisez `revenue` (ou une autre métrique issue des conversions) pour les comparaisons par appareil.
</Note>

```aql theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
-- Which surface is driving the most revenue?
SELECT revenue, impressions, accept_rate
GROUP BY surface
SINCE last_30d
ORDER BY revenue DESC
```

<div id="timezones">
  ## Fuseaux horaires
</div>

Par défaut, les requêtes s'exécutent en UTC. Vous pouvez remplacer le fuseau horaire afin que les résultats regroupés par date reflètent l'heure locale (consultez [Définir un fuseau horaire](/fr/aftersell/reports_explorer#setting-a-timezone) pour les étapes dans la barre d'outils).

<Note>
  Les requêtes qui incluent **Impressions**, **Accept Rate** ou **Revenue Per Visit** regroupent toujours les dates en UTC, quel que soit le fuseau horaire sélectionné, car ces métriques proviennent d'un agrégat quotidien établi en jours UTC. Si une requête mélange l'une d'elles avec d'autres métriques, l'ensemble des résultats repasse en UTC afin que les intervalles de dates restent alignés.
</Note>

<div id="the-timezone-clause">
  ### La clause TIMEZONE
</div>

Spécifiez un fuseau horaire directement en AQL avec la clause `TIMEZONE`, qui se place entre `CHART` et `ORDER BY` :

```aql theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
SELECT ...
CHART ...
TIMEZONE "Asia/Tokyo"
ORDER BY ...
```

Lorsqu'elle est présente, la clause remplace la sélection de la barre d'outils pour cette requête, et elle est conservée lorsque vous enregistrez et rechargez la requête.

<div id="available-timezones">
  ### Fuseaux horaires disponibles
</div>

Le sélecteur (et la clause `TIMEZONE`) accepte un ensemble fermé de dix fuseaux. Tout autre fuseau horaire IANA est rejeté comme non pris en charge.

| Fuseau horaire | Exemple de lieu |
| - | - |
| UTC | Temps universel coordonné |
| America/New\_York | New York (ET) |
| America/Chicago | Chicago (CT) |
| America/Denver | Denver (MT) |
| America/Los\_Angeles | Los Angeles (PT) |
| Europe/London | Londres (GMT/BST) |
| Europe/Paris | Paris (CET/CEST) |
| Asia/Tokyo | Tokyo (JST) |
| Asia/Singapore | Singapour (SGT) |
| Australia/Sydney | Sydney (AEST/AEDT) |

<div id="account-default-and-how-timezone-affects-results">
  ### Account default et effet du fuseau horaire sur les résultats
</div>

Si **Lock reporting timezone** est activé dans vos paramètres d'analytics, sélectionner **Account default** utilise ce fuseau horaire verrouillé (la barre d'outils affiche le fuseau résolu, par exemple **Timezone: Account default (Paris (CET))**). La page des paramètres d'analytics accepte la liste IANA complète, mais Reports ne prend en compte que les dix fuseaux ci-dessus ; si votre fuseau verrouillé n'en fait pas partie, **Account default** se résout silencieusement en UTC. Si **Lock reporting timezone** n'est pas activé, **Account default** revient à UTC.

Lorsqu'un fuseau horaire est défini, le regroupement par date utilise l'heure locale au lieu de l'UTC. Par exemple, un événement à `2026-03-29T01:30:00Z` tombe le 28 mars à New York (ET) mais le 29 mars à Paris (CET). Les requêtes sans fuseau horaire, y compris celles enregistrées auparavant, continuent de s'exécuter en UTC.
