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

# Referencia de AftersellQL (AQL)

> La referencia del lenguaje de consultas AftersellQL: métricas y dimensiones disponibles, sintaxis de las cláusulas AQL con ejemplos y reglas de zona horaria para el Explorer.

Cada consulta que creas en el [Explorer](/es/aftersell/reports_explorer) es una sentencia de **AftersellQL (AQL)**. La mayor parte del tiempo creas las consultas de forma visual y nunca escribes AQL a mano; esta página es la referencia de las métricas y dimensiones que puedes elegir, de la forma de texto de AQL y de las reglas de zona horaria.

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

Estas son las métricas que puedes elegir, agrupadas de la misma forma que en el selector de métricas.

<div id="revenue-profit">
  ### Ingresos y ganancias
</div>

| Métrica | Descripción |
| - | - |
| **Revenue** | Ingresos de upsell en la moneda nativa de tu tienda. |
| **Revenue (USD)** | Ingresos de upsell normalizados a USD para comparaciones entre monedas. |
| **Revenue Per Visit** | Ingresos de upsell por sesión con impresión. No se puede desglosar por producto, ubicación, embudo ni dispositivo. |
| **Avg. Conversion Value** | Ingresos por oferta aceptada. También se denomina Average Upsell Value. |
| **Upsell Revenue Per Order** | Ingresos de upsell (USD) divididos entre el total de pedidos. Solo a nivel de tienda. |
| **Product Profit** | Ingresos menos el costo de los bienes vendidos (COGS) de los productos vendidos como upsell. Depende del COGS configurado por el comerciante, así que tómalo como una estimación: los productos sin costo registrado informan los ingresos como ganancia, y la cobertura de costos varía según la tienda. Solo con granularidad de producto; no se puede desglosar por embudo, ubicación ni dispositivo. |

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

| Métrica | Descripción |
| - | - |
| **Conversions** | El número de eventos de oferta aceptada. Una oferta aceptada es una conversión, por lo que una sesión que acepta dos ofertas cuenta dos veces. |
| **Accept Rate** | Basada en sesiones: la proporción de sesiones que vieron una oferta y aceptaron al menos una. Se calcula de forma independiente de Conversions, a partir de un rollup diferente, por lo que no es Conversions ÷ Impressions. |
| **Units Sold** | Total de unidades vendidas a través de ofertas de upsell. |
| **Decline Rate** | Porcentaje de ofertas post-compra rechazadas explícitamente. Solo post-compra. |

<div id="engagement">
  ### Interacción
</div>

| Métrica | Descripción |
| - | - |
| **Impressions** | Sesiones únicas que vieron una oferta. |
| **Show Rate** | Porcentaje de decisiones que dieron lugar a una impresión. |

<div id="store-performance">
  ### Rendimiento de la tienda
</div>

| Métrica | Descripción |
| - | - |
| **Total Store Revenue** | Ingresos totales de pedidos pagados en Shopify. Solo a nivel de tienda; no se puede desglosar por superficie, embudo, ubicación ni dispositivo. |
| **Orders** | Total de pedidos pagados en Shopify. Solo a nivel de tienda. |
| **Average Total Order Value** | Ingresos de la tienda divididos entre los pedidos. Valor promedio del pedido a nivel de tienda. |

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

| Métrica | Descripción |
| - | - |
| **Rokt Revenue** | Ingresos de la red Rokt atribuidos a tu tienda. |
| **Rokt Transactions** | Número de transacciones de la red Rokt de tu tienda. |
| **Rokt Revenue / Transaction** | Ingresos de Rokt divididos entre las transacciones por intervalo de tiempo. |
| **Rokt Impressions** | Total de impresiones de la red Rokt en las ubicaciones de tu tienda. Distinto de las **Impressions** de upsell. |
| **Rokt Referrals** | Referidos de la red Rokt, interacciones positivas que enviaron al comprador a un socio de Rokt. |

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

Las dimensiones desglosan una métrica por un atributo. No todas las dimensiones son compatibles con todas las métricas; el Explorer impide automáticamente las combinaciones incompatibles (por ejemplo, **Decline rate** y **Show rate** no se pueden desglosar por **Currency**).

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

| Dimensión | Descripción |
| - | - |
| **Date** | Agrupa los resultados por día, semana o mes. |
| **Surface** | La superficie de upsell: PPU (post-compra), Checkout, Thank You Page o Cart. |
| **Funnel** | El embudo específico al que pertenece la oferta. |
| **Product** | El producto ofrecido como upsell. |
| **Placement** | La ubicación dentro de un embudo. |
| **Device** | El tipo de dispositivo: Mobile, Desktop o Unknown. No hay un valor separado para tablet. |
| **Currency** | El código de moneda ISO (por ejemplo, USD, EUR, GBP). Útil para tiendas multimoneda. |

<div id="unavailable-dimensions">
  ### Dimensiones no disponibles
</div>

Las siguientes están en desarrollo. Aparecen en el selector, pero se muestran como 'Not compatible' para todas las métricas hasta que se implementen.

| Dimensión | Descripción |
| - | - |
| **Flow type** | El tipo de flujo de upsell. |
| **Experiment** | La prueba A/B o variante del experimento. |
| **Outcome** | El resultado de la decisión (por ejemplo, elegible, sin stock). |
| **Reason code** | El motivo del resultado de una decisión. |
| **Scope** | El alcance de la decisión (Flow, Experience, Placement o ItemSlot). |
| **Response type** | La respuesta a la oferta (Accepted, Declined o Timeout). |

<div id="aql-statement-syntax">
  ## Sintaxis de las sentencias AQL
</div>

Una sentencia AQL es una única pregunta compuesta por cláusulas. Solo `SELECT` y un rango de tiempo (`SINCE`) son obligatorios; todo lo demás es opcional. Cuando incluyes cláusulas opcionales, deben aparecer en este orden:

```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 ejemplo mínimo, ingresos de upsell y tasa de aceptación diarios de los últimos 30 días:

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

<Note>
  Las palabras clave no distinguen entre mayúsculas y minúsculas (`SELECT` y `select` funcionan igual) y las sentencias no terminan en punto y coma. Los valores de texto van entre comillas dobles; los números y las listas no.
</Note>

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

* **`SELECT`** enumera las métricas que se van a medir, separadas por comas, por ejemplo `SELECT revenue, impressions, accept_rate`.
* **`GROUP BY`** desglosa esas métricas por una o más dimensiones, como `date`, `device`, `surface` o `funnel`. Sin `GROUP BY`, obtienes un único total para todo el período.

<div id="filtering-with-where">
  ### Filtrar con WHERE
</div>

`WHERE` acota los datos antes de medirlos. Combina condiciones con `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` y `rpv` **no se pueden** filtrar ni agrupar por dispositivo, embudo, ubicación ni producto; su rollup de origen no tiene esa columna. Añadir `WHERE device = "mobile"` a una consulta que seleccione cualquiera de ellas se rechaza con `metric "impressions" cannot be filtered by "device"`.
</Warning>

Las comparaciones admitidas son `=`, `!=`, `IN`, `NOT IN`, `>`, `<`, `>=` y `<=`. Usa una lista con `IN` para buscar coincidencias con varios valores:

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

`experiment` **no** es un campo filtrable; no tiene un rollup de origen, por lo que `WHERE experiment IN [...]` se rechaza con `filters on "experiment" are not supported.`

El filtro de **funnel** admite selección múltiple: **is one of** (`IN`) incluye solo los embudos seleccionados, **is not one of** (`NOT IN`) los excluye. Cuando agrupas por **Funnel** y aplicas un filtro **is one of**, el gráfico muestra una línea por cada embudo seleccionado, sin agruparlos en "Other".

<div id="time-ranges-and-comparisons">
  ### Rangos de tiempo y comparaciones
</div>

Toda consulta necesita un rango de tiempo, definido con `SINCE`:

| Forma | Ejemplo | Significado |
| - | - | - |
| Preestablecido | `SINCE last_30d` | Una ventana móvil que termina **ayer** (UTC). El día actual en curso se excluye deliberadamente, así que `last_1d` significa solo ayer y `this_month` va del día 1 hasta ayer. |
| Ventana personalizada | `SINCE 2026-07-02 UNTIL 2026-07-05` | Un rango fijo, con fechas ISO (`YYYY-MM-DD`). |

Preestablecidos disponibles: `last_1d`, `last_7d`, `last_30d`, `last_90d`, `this_month`, `last_month` y `this_year`.

* **`GRAIN`** define el tamaño del intervalo para las series temporales: `day`, `week` o `month`. (`hour` se analiza correctamente, pero ningún rollup sirve datos por hora, así que una consulta así se rechaza con `group_by / time_grain combination is not supported.`)
* **`COMPARE`** superpone un segundo período. Usa `previous_period`, la ventana de igual duración inmediatamente anterior. `previous_year` está oculto en el selector Compare porque el almacén de datos no contiene datos anteriores a febrero de 2026; sigue pudiendo escribirse en AQL solo para que las consultas guardadas anteriormente sigan analizándose.

```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>
  Los datos de informes empiezan en **febrero de 2026**, así que una ventana anterior a esa fecha devuelve resultados vacíos para ambos períodos.
</Note>

<div id="choosing-a-chart">
  ### Elegir un gráfico
</div>

* **`CHART`** define cómo se muestra el resultado: `scorecard`, `line_chart`, `bar_chart`, `area_chart`, `funnel_chart` o `table`.
* **`TIMEZONE`** define la zona horaria usada para agrupar las fechas, como un nombre IANA entre comillas, por ejemplo `TIMEZONE "America/New_York"`. El valor predeterminado es UTC (consulta [Zonas horarias](#timezones)).

El tipo `funnel_chart` tiene requisitos específicos:

* **Modo de ubicación.** Agrupa por `placement` y selecciona una métrica. Las etapas se ordenan según la secuencia canónica de ubicaciones (upsell predeterminado, luego downsell, luego upsells adicionales). Solo se representa la primera métrica; las métricas adicionales se indican en una nota al pie.
* **Modo de métricas.** Selecciona dos o más métricas sin `GROUP BY`. Cada métrica se convierte en una etapa del embudo en el orden de la consulta (por ejemplo, `SELECT impressions, conversions` muestra la caída de impresiones a conversiones). Todas las métricas deben compartir la misma unidad.

```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>
  El modo de ubicación necesita una métrica que se pueda desglosar por ubicación. `impressions`, `accept_rate` y `rpv` no se pueden; para ellas, el gráfico de embudo muestra "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">
  ### Ordenar y limitar
</div>

* **`ORDER BY`** ordena los resultados por una métrica o dimensión, con `ASC` o `DESC`.
* **`LIMIT`** limita el número de filas devueltas, útil para preguntas de tipo "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">
  ### Más ejemplos
</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` y `rpv` no se pueden desglosar por dispositivo; su rollup es tienda × superficie × día, sin columna de dispositivo. Usa `revenue` (u otra métrica basada en conversiones) para comparar dispositivos.
</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">
  ## Zonas horarias
</div>

De forma predeterminada, las consultas se ejecutan en UTC. Puedes cambiar la zona horaria para que los resultados agrupados por fecha reflejen la hora local (consulta [Configurar una zona horaria](/es/aftersell/reports_explorer#setting-a-timezone) para ver los pasos en la barra de herramientas).

<Note>
  Las consultas que incluyen **Impressions**, **Accept Rate** o **Revenue Per Visit** siempre agrupan las fechas en UTC, independientemente de la zona horaria que selecciones, porque provienen de un rollup diario que se informa en días UTC. Si una consulta mezcla una de ellas con otras métricas, todo el conjunto de resultados vuelve a UTC para que los intervalos de fecha sigan alineados.
</Note>

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

Especifica una zona horaria directamente en AQL con la cláusula `TIMEZONE`, que aparece entre `CHART` y `ORDER BY`:

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

Cuando está presente, la cláusula anula la selección de la barra de herramientas para esa consulta y se conserva al guardar y volver a cargar.

<div id="available-timezones">
  ### Zonas horarias disponibles
</div>

El selector (y la cláusula `TIMEZONE`) acepta un conjunto cerrado de diez zonas. Cualquier otra zona horaria IANA se rechaza por no ser compatible.

| Zona horaria | Ubicación de ejemplo |
| - | - |
| UTC | Tiempo universal coordinado |
| America/New\_York | Nueva York (ET) |
| America/Chicago | Chicago (CT) |
| America/Denver | Denver (MT) |
| America/Los\_Angeles | Los Ángeles (PT) |
| Europe/London | Londres (GMT/BST) |
| Europe/Paris | París (CET/CEST) |
| Asia/Tokyo | Tokio (JST) |
| Asia/Singapore | Singapur (SGT) |
| Australia/Sydney | Sídney (AEST/AEDT) |

<div id="account-default-and-how-timezone-affects-results">
  ### Account default y cómo afecta la zona horaria a los resultados
</div>

Si **Lock reporting timezone** está habilitado en tus ajustes de analíticas, seleccionar **Account default** usa esa zona horaria bloqueada (la barra de herramientas muestra la zona resuelta, por ejemplo **Timezone: Account default (Paris (CET))**). La página de ajustes de analíticas acepta la lista IANA completa, pero Reports solo respeta las diez zonas anteriores; si tu zona bloqueada no es una de ellas, **Account default** se resuelve silenciosamente a UTC. Si **Lock reporting timezone** no está habilitado, **Account default** vuelve a UTC.

Cuando se establece una zona horaria, la agrupación por fecha usa la hora local en lugar de UTC. Por ejemplo, un evento a las `2026-03-29T01:30:00Z` cae el 28 de marzo en Nueva York (ET), pero el 29 de marzo en París (CET). Las consultas sin zona horaria, incluidas las guardadas anteriormente, siguen ejecutándose en UTC.
