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

> Справочник по языку запросов AftersellQL: доступные метрики и измерения, синтаксис предложений AQL с примерами и правила часовых поясов для Explorer.

Каждый запрос, который вы создаете в [Explorer](/ru/aftersell/reports_explorer), — это инструкция **AftersellQL (AQL)**. Чаще всего вы создаете запросы визуально и никогда не пишете AQL вручную; эта страница — справочник по метрикам и измерениям, которые можно выбрать, по текстовой форме AQL и по правилам часовых поясов.

<div id="available-metrics">
  ## Доступные метрики
</div>

Ниже перечислены метрики, которые можно выбрать, сгруппированные так же, как в списке выбора метрик.

<div id="revenue-profit">
  ### Доход и прибыль
</div>

| Метрика | Описание |
| - | - |
| **Revenue** | Доход от апселлов в родной валюте вашего магазина. |
| **Revenue (USD)** | Доход от апселлов, нормализованный в USD для сравнений между валютами. |
| **Revenue Per Visit** | Доход от апселлов на сессию с показом. Не может разбиваться по товару, размещению, воронке или устройству. |
| **Avg. Conversion Value** | Доход на принятое предложение. Также называется Average Upsell Value. |
| **Upsell Revenue Per Order** | Доход от апселлов (USD), деленный на общее количество заказов. Только на уровне магазина. |
| **Product Profit** | Доход минус себестоимость проданных товаров (COGS) для апселл-товаров. Опирается на настроенную мерчантом себестоимость, поэтому относитесь к нему как к оценке: товары без указанной себестоимости отражают доход как прибыль, а покрытие себестоимости варьируется по магазинам. Только на уровне товара; не может разбиваться по воронке, размещению или устройству. |

<div id="conversions">
  ### Конверсии
</div>

| Метрика | Описание |
| - | - |
| **Conversions** | Количество событий принятия предложений. Одно принятое предложение — одна конверсия, поэтому сессия, в которой принято два предложения, учитывается дважды. |
| **Accept Rate** | На основе сессий: доля сессий, в которых было показано предложение и принято хотя бы одно. Рассчитывается независимо от Conversions, на основе другой агрегации, поэтому это не Conversions ÷ Impressions. |
| **Units Sold** | Общее количество единиц, проданных через апселл-предложения. |
| **Decline Rate** | Процент post-purchase предложений, явно отклоненных покупателем. Только для post-purchase. |

<div id="engagement">
  ### Вовлеченность
</div>

| Метрика | Описание |
| - | - |
| **Impressions** | Уникальные сессии, в которых было показано предложение. |
| **Show Rate** | Процент решений, завершившихся показом. |

<div id="store-performance">
  ### Показатели магазина
</div>

| Метрика | Описание |
| - | - |
| **Total Store Revenue** | Общий доход от оплаченных заказов Shopify. Только на уровне магазина; не может разбиваться по поверхности, воронке, размещению или устройству. |
| **Orders** | Общее количество оплаченных заказов Shopify. Только на уровне магазина. |
| **Average Total Order Value** | Доход магазина, деленный на количество заказов. Средний чек на уровне магазина. |

<div id="rokt-network">
  ### Сеть Rokt
</div>

| Метрика | Описание |
| - | - |
| **Rokt Revenue** | Доход сети Rokt, атрибутированный вашему магазину. |
| **Rokt Transactions** | Количество транзакций сети Rokt для вашего магазина. |
| **Rokt Revenue / Transaction** | Доход Rokt, деленный на количество транзакций за временной интервал. |
| **Rokt Impressions** | Общее количество показов сети Rokt по всем размещениям вашего магазина. Отличается от **Impressions** апселлов. |
| **Rokt Referrals** | Рефералы сети Rokt — положительные взаимодействия, которые направили покупателя к партнеру Rokt. |

<div id="dimensions">
  ## Измерения
</div>

Измерения разбивают метрику по атрибуту. Не все измерения совместимы с каждой метрикой; Explorer автоматически предотвращает несовместимые комбинации (например, **Decline rate** и **Show rate** нельзя разбить по **Currency**).

<div id="available-dimensions">
  ### Доступные измерения
</div>

| Измерение | Описание |
| - | - |
| **Date** | Группирует результаты по дню, неделе или месяцу. |
| **Surface** | Поверхность апселла: PPU (post-purchase), Checkout, Thank You Page или Cart. |
| **Funnel** | Конкретная воронка, к которой относится предложение. |
| **Product** | Товар апселла. |
| **Placement** | Размещение внутри воронки. |
| **Device** | Тип устройства: Mobile, Desktop или Unknown. Отдельного значения для планшетов нет. |
| **Currency** | Код валюты ISO (например, USD, EUR, GBP). Полезно для мультивалютных магазинов. |

<div id="unavailable-dimensions">
  ### Недоступные измерения
</div>

Следующие измерения находятся в разработке. Они отображаются в списке выбора, но показываются как «Not compatible» для каждой метрики, пока не будут реализованы.

| Измерение | Описание |
| - | - |
| **Flow type** | Тип апселл-потока. |
| **Experiment** | Вариант A/B-теста или эксперимента. |
| **Outcome** | Результат решения (например, подходит, нет в наличии). |
| **Reason code** | Причина результата решения. |
| **Scope** | Область решения (Flow, Experience, Placement или ItemSlot). |
| **Response type** | Ответ на предложение (Accepted, Declined или Timeout). |

<div id="aql-statement-syntax">
  ## Синтаксис инструкций AQL
</div>

Инструкция AQL — это один вопрос, состоящий из предложений. Обязательны только `SELECT` и временной диапазон (`SINCE`); все остальное необязательно. Если вы добавляете необязательные предложения, они должны идти в следующем порядке:

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

Минимальный пример — ежедневный доход от апселлов и accept rate за последние 30 дней:

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

<Note>
  Ключевые слова не чувствительны к регистру (работают и `SELECT`, и `select`), а инструкции не заканчиваются точкой с запятой. Строковые значения заключаются в двойные кавычки; числа и списки — нет.
</Note>

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

* **`SELECT`** перечисляет измеряемые метрики через запятую, например `SELECT revenue, impressions, accept_rate`.
* **`GROUP BY`** разбивает эти метрики по одному или нескольким измерениям, таким как `date`, `device`, `surface` или `funnel`. Без `GROUP BY` вы получаете одно итоговое значение за весь период.

<div id="filtering-with-where">
  ### Фильтрация с помощью WHERE
</div>

`WHERE` сужает данные до их измерения. Объединяйте условия с помощью `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` и `rpv` **нельзя** фильтровать или группировать по устройству, воронке, размещению или товару; в их исходной агрегации нет такого столбца. Добавление `WHERE device = "mobile"` к запросу, выбирающему любую из них, отклоняется с ошибкой `metric "impressions" cannot be filtered by "device"`.
</Warning>

Поддерживаемые операторы сравнения: `=`, `!=`, `IN`, `NOT IN`, `>`, `<`, `>=` и `<=`. Используйте список с `IN`, чтобы сопоставить несколько значений:

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

`experiment` **не** является полем для фильтрации; у него нет источника агрегации, поэтому `WHERE experiment IN [...]` отклоняется с ошибкой `filters on "experiment" are not supported.`

Фильтр **funnel** поддерживает множественный выбор: **is one of** (`IN`) включает только выбранные воронки, **is not one of** (`NOT IN`) исключает их. Если вы группируете по **Funnel** и применяете фильтр **is one of**, график показывает по одной линии на каждую выбранную воронку, без объединения в «Other».

<div id="time-ranges-and-comparisons">
  ### Временные диапазоны и сравнения
</div>

Каждому запросу нужен временной диапазон, задаваемый с помощью `SINCE`:

| Форма | Пример | Значение |
| - | - | - |
| Пресет | `SINCE last_30d` | Скользящее окно, заканчивающееся **вчера** (UTC). Текущий незавершенный день намеренно исключается, поэтому `last_1d` означает только вчерашний день, а `this_month` охватывает период с 1-го числа по вчерашний день. |
| Пользовательское окно | `SINCE 2026-07-02 UNTIL 2026-07-05` | Фиксированный диапазон с датами в формате ISO (`YYYY-MM-DD`). |

Доступные пресеты: `last_1d`, `last_7d`, `last_30d`, `last_90d`, `this_month`, `last_month` и `this_year`.

* **`GRAIN`** задает размер интервала для временных рядов: `day`, `week` или `month`. (`hour` распознается, но ни одна агрегация не предоставляет почасовые данные, поэтому такой запрос отклоняется с ошибкой `group_by / time_grain combination is not supported.`)
* **`COMPARE`** накладывает второй период. Используйте `previous_period` — окно той же длины непосредственно перед выбранным. `previous_year` скрыт в списке выбора Compare, поскольку в хранилище нет данных до февраля 2026 года; его можно ввести в AQL только для того, чтобы ранее сохраненные запросы продолжали распознаваться.

```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>
  Данные отчетности начинаются с **февраля 2026 года**, поэтому окно ранее этой даты возвращает пустой результат для обоих периодов.
</Note>

<div id="choosing-a-chart">
  ### Выбор графика
</div>

* **`CHART`** задает способ отображения результата: `scorecard`, `line_chart`, `bar_chart`, `area_chart`, `funnel_chart` или `table`.
* **`TIMEZONE`** задает часовой пояс для группировки дат в виде имени IANA в кавычках, например `TIMEZONE "America/New_York"`. По умолчанию используется UTC (см. [Часовые пояса](#timezones)).

У типа `funnel_chart` есть особые требования:

* **Режим размещений.** Группируйте по `placement` и выберите одну метрику. Этапы упорядочены по каноничной последовательности размещений (сначала апселл по умолчанию, затем даунселл, затем дополнительные апселлы). Отображается только первая метрика; дополнительные метрики отмечаются в сноске.
* **Режим метрик.** Выберите две или более метрики без `GROUP BY`. Каждая метрика становится этапом воронки в порядке запроса (например, `SELECT impressions, conversions` показывает отсев от показов к конверсиям). Все метрики должны иметь одинаковую единицу измерения.

```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>
  Для режима размещений нужна метрика, которую можно разбить по размещению. `impressions`, `accept_rate` и `rpv` этого не позволяют; для них график воронки показывает сообщение «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">
  ### Сортировка и ограничение
</div>

* **`ORDER BY`** сортирует результаты по метрике или измерению с `ASC` или `DESC`.
* **`LIMIT`** ограничивает количество возвращаемых строк, что полезно для вопросов вида «топ 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">
  ### Другие примеры
</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` и `rpv` нельзя разбить по устройству; их агрегация имеет вид магазин × поверхность × день, без столбца устройства. Для сравнения устройств используйте `revenue` (или другую метрику на основе конверсий).
</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">
  ## Часовые пояса
</div>

По умолчанию запросы выполняются в UTC. Вы можете переопределить часовой пояс, чтобы результаты с группировкой по датам отражали местное время (шаги на панели инструментов см. в разделе [Настройка часового пояса](/ru/aftersell/reports_explorer#setting-a-timezone)).

<Note>
  Запросы, включающие **Impressions**, **Accept Rate** или **Revenue Per Visit**, всегда группируют даты в UTC независимо от выбранного часового пояса, поскольку эти данные берутся из ежедневной агрегации, формируемой по дням UTC. Если запрос сочетает одну из этих метрик с другими, весь набор результатов переключается на UTC, чтобы интервалы дат оставались согласованными.
</Note>

<div id="the-timezone-clause">
  ### Предложение TIMEZONE
</div>

Укажите часовой пояс непосредственно в AQL с помощью предложения `TIMEZONE`, которое располагается между `CHART` и `ORDER BY`:

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

Если это предложение присутствует, оно переопределяет выбор на панели инструментов для данного запроса и сохраняется при сохранении и повторной загрузке.

<div id="available-timezones">
  ### Доступные часовые пояса
</div>

Список выбора (и предложение `TIMEZONE`) принимает закрытый набор из десяти поясов. Любой другой часовой пояс IANA отклоняется как неподдерживаемый.

| Часовой пояс | Пример местоположения |
| - | - |
| UTC | Всемирное координированное время |
| America/New\_York | Нью-Йорк (ET) |
| America/Chicago | Чикаго (CT) |
| America/Denver | Денвер (MT) |
| America/Los\_Angeles | Лос-Анджелес (PT) |
| Europe/London | Лондон (GMT/BST) |
| Europe/Paris | Париж (CET/CEST) |
| Asia/Tokyo | Токио (JST) |
| Asia/Singapore | Сингапур (SGT) |
| Australia/Sydney | Сидней (AEST/AEDT) |

<div id="account-default-and-how-timezone-affects-results">
  ### Значение по умолчанию для аккаунта и влияние часового пояса на результаты
</div>

Если в настройках аналитики включен параметр **Lock reporting timezone**, выбор **Account default** использует этот зафиксированный часовой пояс (панель инструментов показывает итоговый пояс, например **Timezone: Account default (Paris (CET))**). Страница настроек аналитики принимает полный список IANA, но Reports учитывает только десять перечисленных выше поясов; если ваш зафиксированный пояс не входит в их число, **Account default** без предупреждения использует UTC. Если параметр **Lock reporting timezone** не включен, **Account default** использует UTC.

Когда часовой пояс задан, группировка по датам использует местное время вместо UTC. Например, событие в `2026-03-29T01:30:00Z` приходится на 28 марта в Нью-Йорке (ET), но на 29 марта в Париже (CET). Запросы без часового пояса, включая ранее сохраненные, по-прежнему выполняются в UTC.
