> ## 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.

# AftersellQL (AQL)-referentie

> De referentie voor de querytaal AftersellQL: beschikbare statistieken en dimensies, AQL-clausulesyntaxis met voorbeelden en tijdzoneregels voor de Explorer.

Elke query die je in de [Explorer](/nl/aftersell/reports_explorer) bouwt, is een **AftersellQL (AQL)**-statement. Meestal bouw je queries visueel en schrijf je nooit handmatig AQL; deze pagina is de referentie voor de statistieken en dimensies die je kunt kiezen, de tekstvorm van AQL en de tijdzoneregels.

<div id="available-metrics">
  ## Beschikbare statistieken
</div>

Dit zijn de statistieken die je kunt kiezen, gegroepeerd op dezelfde manier als in de statistiekkiezer.

<div id="revenue-profit">
  ### Omzet en winst
</div>

| Statistiek | Beschrijving |
| - | - |
| **Revenue** | Upsellomzet in de eigen valuta van je winkel. |
| **Revenue (USD)** | Upsellomzet genormaliseerd naar USD voor vergelijkingen tussen valuta's. |
| **Revenue Per Visit** | Upsellomzet per impressiesessie. Kan niet worden uitgesplitst naar product, plaatsing, funnel of apparaat. |
| **Avg. Conversion Value** | Omzet per geaccepteerde aanbieding. Ook wel Average Upsell Value genoemd. |
| **Upsell Revenue Per Order** | Upsellomzet (USD) gedeeld door het totale aantal orders. Alleen op winkelniveau. |
| **Product Profit** | Omzet min kostprijs van verkochte goederen (COGS) voor geüpselde producten. Is afhankelijk van door de merchant geconfigureerde COGS, dus beschouw het als een schatting: producten zonder bijgehouden kostprijs rapporteren omzet als winst, en de dekking van kostprijzen verschilt per winkel. Alleen op productniveau; kan niet worden uitgesplitst naar funnel, plaatsing of apparaat. |

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

| Statistiek | Beschrijving |
| - | - |
| **Conversions** | Het aantal gebeurtenissen waarbij een aanbieding werd geaccepteerd. Eén geaccepteerde aanbieding is één conversie, dus een sessie die twee aanbiedingen accepteert, telt twee keer. |
| **Accept Rate** | Op basis van sessies: het aandeel sessies dat een aanbieding zag en er ten minste één accepteerde. Onafhankelijk van Conversions berekend, uit een andere rollup, dus het is niet Conversions ÷ Impressions. |
| **Units Sold** | Totaal aantal eenheden verkocht via upsellaanbiedingen. |
| **Decline Rate** | Percentage post-purchase-aanbiedingen dat expliciet is afgewezen. Alleen post-purchase. |

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

| Statistiek | Beschrijving |
| - | - |
| **Impressions** | Unieke sessies die een aanbieding zagen. |
| **Show Rate** | Percentage beslissingen dat resulteerde in een impressie. |

<div id="store-performance">
  ### Winkelprestaties
</div>

| Statistiek | Beschrijving |
| - | - |
| **Total Store Revenue** | Totale omzet uit door Shopify betaalde orders. Alleen op winkelniveau; kan niet worden uitgesplitst naar surface, funnel, plaatsing of apparaat. |
| **Orders** | Totaal aantal door Shopify betaalde orders. Alleen op winkelniveau. |
| **Average Total Order Value** | Winkelomzet gedeeld door het aantal orders. Gemiddelde orderwaarde op winkelniveau. |

<div id="rokt-network">
  ### Rokt-netwerk
</div>

| Statistiek | Beschrijving |
| - | - |
| **Rokt Revenue** | Omzet uit het Rokt-netwerk die aan je winkel wordt toegeschreven. |
| **Rokt Transactions** | Aantal transacties in het Rokt-netwerk voor je winkel. |
| **Rokt Revenue / Transaction** | Rokt-omzet gedeeld door transacties per tijdsinterval. |
| **Rokt Impressions** | Totaal aantal impressies in het Rokt-netwerk over de plaatsingen van je winkel. Verschilt van upsell-**Impressions**. |
| **Rokt Referrals** | Doorverwijzingen in het Rokt-netwerk: positieve interacties die de shopper naar een Rokt-partner stuurden. |

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

Dimensies splitsen een statistiek uit op basis van een kenmerk. Niet alle dimensies zijn compatibel met elke statistiek; de Explorer voorkomt automatisch incompatibele combinaties (bijvoorbeeld **Decline rate** en **Show rate** kunnen niet worden uitgesplitst naar **Currency**).

<div id="available-dimensions">
  ### Beschikbare dimensies
</div>

| Dimensie | Beschrijving |
| - | - |
| **Date** | Groepeert resultaten per dag, week of maand. |
| **Surface** | De upsell-surface: PPU (post-purchase), Checkout, Thank You Page of Cart. |
| **Funnel** | De specifieke funnel waartoe de aanbieding behoort. |
| **Product** | Het geüpselde product. |
| **Placement** | De plaatsing binnen een funnel. |
| **Device** | Het apparaattype: Mobile, Desktop of Unknown. Er is geen aparte waarde voor tablets. |
| **Currency** | De ISO-valutacode (bijvoorbeeld USD, EUR, GBP). Handig voor winkels met meerdere valuta's. |

<div id="unavailable-dimensions">
  ### Niet-beschikbare dimensies
</div>

De volgende dimensies zijn nog in ontwikkeling. Ze verschijnen in de kiezer, maar worden voor elke statistiek als 'Not compatible' weergegeven totdat ze zijn geïmplementeerd.

| Dimensie | Beschrijving |
| - | - |
| **Flow type** | Het type upsellflow. |
| **Experiment** | De A/B-test of experimentvariant. |
| **Outcome** | De uitkomst van de beslissing (bijvoorbeeld eligible, out of stock). |
| **Reason code** | De reden voor een beslissingsuitkomst. |
| **Scope** | De reikwijdte van de beslissing (Flow, Experience, Placement of ItemSlot). |
| **Response type** | De reactie op de aanbieding (Accepted, Declined of Timeout). |

<div id="aql-statement-syntax">
  ## Syntaxis van AQL-statements
</div>

Een AQL-statement is één vraag die uit clausules bestaat. Alleen `SELECT` en een tijdsbereik (`SINCE`) zijn verplicht; al het andere is optioneel. Wanneer je optionele clausules opneemt, moeten ze in deze volgorde staan:

```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
```

Een minimaal voorbeeld, dagelijkse upsellomzet en accept rate voor de afgelopen 30 dagen:

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

<Note>
  Trefwoorden zijn niet hoofdlettergevoelig (`SELECT` en `select` werken allebei) en statements eindigen niet met een puntkomma. Tekstwaarden staan tussen dubbele aanhalingstekens; getallen en lijsten niet.
</Note>

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

* **`SELECT`** somt de te meten statistieken op, gescheiden door komma's, bijvoorbeeld `SELECT revenue, impressions, accept_rate`.
* **`GROUP BY`** splitst die statistieken uit naar een of meer dimensies, zoals `date`, `device`, `surface` of `funnel`. Zonder `GROUP BY` krijg je één totaal voor de hele periode.

<div id="filtering-with-where">
  ### Filteren met WHERE
</div>

`WHERE` beperkt de gegevens voordat ze worden gemeten. Combineer voorwaarden met `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` en `rpv` **kunnen niet** worden gefilterd of gegroepeerd op device, funnel, placement of product; hun bron-rollup heeft geen dergelijke kolom. Het toevoegen van `WHERE device = "mobile"` aan een query die een van deze selecteert, wordt geweigerd met `metric "impressions" cannot be filtered by "device"`.
</Warning>

Ondersteunde vergelijkingen zijn `=`, `!=`, `IN`, `NOT IN`, `>`, `<`, `>=` en `<=`. Gebruik een lijst met `IN` om meerdere waarden te matchen:

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

`experiment` is **geen** filterbaar veld; het heeft geen rollup-bron, dus `WHERE experiment IN [...]` wordt geweigerd met `filters on "experiment" are not supported.`

Het **funnel**-filter ondersteunt meervoudige selectie: **is one of** (`IN`) neemt alleen de geselecteerde funnels op, **is not one of** (`NOT IN`) sluit ze uit. Wanneer je groepeert op **Funnel** en een **is one of**-filter toepast, toont de grafiek één lijn per geselecteerde funnel, zonder samenvoeging tot "Other".

<div id="time-ranges-and-comparisons">
  ### Tijdsbereiken en vergelijkingen
</div>

Elke query heeft een tijdsbereik nodig, ingesteld met `SINCE`:

| Vorm | Voorbeeld | Betekenis |
| - | - | - |
| Voorinstelling | `SINCE last_30d` | Een voortschrijdend venster dat **gisteren** (UTC) eindigt. De lopende huidige dag wordt bewust uitgesloten, dus `last_1d` betekent alleen gisteren, en `this_month` loopt van de 1e tot en met gisteren. |
| Aangepast venster | `SINCE 2026-07-02 UNTIL 2026-07-05` | Een vast bereik, met ISO-datums (`YYYY-MM-DD`). |

Beschikbare voorinstellingen: `last_1d`, `last_7d`, `last_30d`, `last_90d`, `this_month`, `last_month` en `this_year`.

* **`GRAIN`** stelt de intervalgrootte voor tijdreeksen in: `day`, `week` of `month`. (`hour` wordt wel geparsed, maar geen enkele rollup levert gegevens per uur, dus zo'n query wordt geweigerd met `group_by / time_grain combination is not supported.`)
* **`COMPARE`** legt een tweede periode eroverheen. Gebruik `previous_period`, het even lange venster direct ervoor. `previous_year` is verborgen in de Compare-kiezer omdat het warehouse geen gegevens van vóór februari 2026 bevat; het blijft alleen in AQL te typen zodat eerder opgeslagen queries blijven werken.

```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>
  Rapportagegegevens beginnen in **februari 2026**, dus een venster vóór die datum levert voor beide perioden een leeg resultaat op.
</Note>

<div id="choosing-a-chart">
  ### Een grafiek kiezen
</div>

* **`CHART`** bepaalt hoe het resultaat wordt weergegeven: `scorecard`, `line_chart`, `bar_chart`, `area_chart`, `funnel_chart` of `table`.
* **`TIMEZONE`** stelt de tijdzone in die wordt gebruikt om datums te groeperen, als IANA-naam tussen aanhalingstekens, bijvoorbeeld `TIMEZONE "America/New_York"`. Standaard UTC (zie [Tijdzones](#timezones)).

Het type `funnel_chart` heeft specifieke vereisten:

* **Plaatsingsmodus.** Groepeer op `placement` en selecteer één statistiek. Fasen worden geordend volgens de canonieke plaatsingsvolgorde (standaard-upsell, dan downsell, dan aanvullende upsells). Alleen de eerste statistiek wordt weergegeven; aanvullende statistieken worden in een voetnoot vermeld.
* **Statistiekmodus.** Selecteer twee of meer statistieken zonder `GROUP BY`. Elke statistiek wordt een funnelfase in de volgorde van de query (bijvoorbeeld `SELECT impressions, conversions` toont de uitval van impressies naar conversies). Alle statistieken moeten dezelfde eenheid hebben.

```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>
  De plaatsingsmodus vereist een statistiek die naar plaatsing kan worden uitgesplitst. `impressions`, `accept_rate` en `rpv` kunnen dat niet; de funnelgrafiek toont daarvoor "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">
  ### Sorteren en beperken
</div>

* **`ORDER BY`** sorteert resultaten op een statistiek of dimensie, met `ASC` of `DESC`.
* **`LIMIT`** beperkt het aantal geretourneerde rijen, handig voor "top N"-vragen.

```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">
  ### Meer voorbeelden
</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` en `rpv` kunnen niet naar apparaat worden uitgesplitst; hun rollup is shop × surface × dag, zonder apparaatkolom. Gebruik `revenue` (of een andere op conversies gebaseerde statistiek) voor vergelijkingen tussen apparaten.
</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">
  ## Tijdzones
</div>

Standaard worden queries in UTC uitgevoerd. Je kunt de tijdzone overschrijven zodat resultaten die per datum zijn gegroepeerd de lokale tijd weerspiegelen (zie [Een tijdzone instellen](/nl/aftersell/reports_explorer#setting-a-timezone) voor de stappen in de werkbalk).

<Note>
  Queries met **Impressions**, **Accept Rate** of **Revenue Per Visit** groeperen datums altijd in UTC, ongeacht de tijdzone die je selecteert, omdat ze afkomstig zijn uit een dagelijkse rollup die in UTC-dagen wordt gerapporteerd. Als een query een van deze combineert met andere statistieken, valt de hele resultatenset terug op UTC zodat de datumintervallen op elkaar aansluiten.
</Note>

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

Geef een tijdzone direct in AQL op met de `TIMEZONE`-clausule, die tussen `CHART` en `ORDER BY` staat:

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

Als de clausule aanwezig is, overschrijft deze de selectie in de werkbalk voor die query, en blijft ze behouden wanneer je opslaat en opnieuw laadt.

<div id="available-timezones">
  ### Beschikbare tijdzones
</div>

De kiezer (en de `TIMEZONE`-clausule) accepteert een vaste set van tien zones. Elke andere IANA-tijdzone wordt als niet-ondersteund geweigerd.

| Tijdzone | Voorbeeldlocatie |
| - | - |
| UTC | Gecoördineerde wereldtijd |
| America/New\_York | New York (ET) |
| America/Chicago | Chicago (CT) |
| America/Denver | Denver (MT) |
| America/Los\_Angeles | Los Angeles (PT) |
| Europe/London | Londen (GMT/BST) |
| Europe/Paris | Parijs (CET/CEST) |
| Asia/Tokyo | Tokio (JST) |
| Asia/Singapore | Singapore (SGT) |
| Australia/Sydney | Sydney (AEST/AEDT) |

<div id="account-default-and-how-timezone-affects-results">
  ### Accountstandaard en hoe de tijdzone de resultaten beïnvloedt
</div>

Als **Lock reporting timezone** is ingeschakeld in je analytics-instellingen, gebruikt de selectie **Account default** die vergrendelde tijdzone (de werkbalk toont de gekozen zone, bijvoorbeeld **Timezone: Account default (Paris (CET))**). De pagina met analytics-instellingen accepteert de volledige IANA-lijst, maar Reports respecteert alleen de tien bovenstaande zones; als je vergrendelde zone daar niet bij hoort, wordt **Account default** zonder melding omgezet naar UTC. Als **Lock reporting timezone** niet is ingeschakeld, valt **Account default** terug op UTC.

Wanneer een tijdzone is ingesteld, gebruikt het groeperen per datum de lokale tijd in plaats van UTC. Een gebeurtenis op `2026-03-29T01:30:00Z` valt bijvoorbeeld op 28 maart in New York (ET), maar op 29 maart in Parijs (CET). Queries zonder tijdzone, inclusief eerder opgeslagen queries, blijven in UTC worden uitgevoerd.
