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

# Dokumentacja AftersellQL (AQL)

> Dokumentacja języka zapytań AftersellQL: dostępne metryki i wymiary, składnia klauzul AQL z przykładami oraz zasady dotyczące stref czasowych w Explorerze.

Każde zapytanie, które budujesz w [Explorerze](/pl/aftersell/reports_explorer), jest instrukcją **AftersellQL (AQL)**. Najczęściej budujesz zapytania wizualnie i nigdy nie piszesz AQL ręcznie; ta strona to dokumentacja metryk i wymiarów, które możesz wybrać, tekstowej formy AQL oraz zasad dotyczących stref czasowych.

<div id="available-metrics">
  ## Dostępne metryki
</div>

Oto metryki, które możesz wybrać, pogrupowane tak samo, jak grupuje je selektor metryk.

<div id="revenue-profit">
  ### Przychód i zysk
</div>

| Metryka | Opis |
| - | - |
| **Revenue** | Przychód z upsellów w natywnej walucie Twojego sklepu. |
| **Revenue (USD)** | Przychód z upsellów znormalizowany do USD na potrzeby porównań między walutami. |
| **Revenue Per Visit** | Przychód z upsellów na sesję z wyświetleniem. Nie można go rozbić według produktu, miejsca docelowego, lejka ani urządzenia. |
| **Avg. Conversion Value** | Przychód na zaakceptowaną ofertę. Nazywany także średnią wartością upsellu (Average Upsell Value). |
| **Upsell Revenue Per Order** | Przychód z upsellów (USD) podzielony przez łączną liczbę zamówień. Tylko na poziomie sklepu. |
| **Product Profit** | Przychód pomniejszony o koszt sprzedanych towarów (COGS) dla produktów sprzedanych w ramach upsellu. Opiera się na COGS skonfigurowanym przez sprzedawcę, więc traktuj go jako szacunek: produkty bez śledzonego kosztu raportują przychód jako zysk, a pokrycie kosztów różni się w zależności od sklepu. Tylko na poziomie produktu; nie można go rozbić według lejka, miejsca docelowego ani urządzenia. |

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

| Metryka | Opis |
| - | - |
| **Conversions** | Liczba zdarzeń zaakceptowania oferty. Jedna zaakceptowana oferta to jedna konwersja, więc sesja, w której zaakceptowano dwie oferty, liczy się podwójnie. |
| **Accept Rate** | Oparty na sesjach: odsetek sesji, które zobaczyły ofertę i zaakceptowały co najmniej jedną. Jest obliczany niezależnie od Conversions, z innego rollupu, więc nie jest to Conversions ÷ Impressions. |
| **Units Sold** | Łączna liczba sztuk sprzedanych poprzez oferty upsell. |
| **Decline Rate** | Odsetek ofert post-purchase jawnie odrzuconych. Tylko post-purchase. |

<div id="engagement">
  ### Zaangażowanie
</div>

| Metryka | Opis |
| - | - |
| **Impressions** | Unikalne sesje, które zobaczyły ofertę. |
| **Show Rate** | Odsetek decyzji, które zakończyły się wyświetleniem. |

<div id="store-performance">
  ### Wyniki sklepu
</div>

| Metryka | Opis |
| - | - |
| **Total Store Revenue** | Łączny przychód z opłaconych zamówień Shopify. Tylko na poziomie sklepu; nie można go rozbić według powierzchni, lejka, miejsca docelowego ani urządzenia. |
| **Orders** | Łączna liczba opłaconych zamówień Shopify. Tylko na poziomie sklepu. |
| **Average Total Order Value** | Przychód sklepu podzielony przez liczbę zamówień. Średnia wartość zamówienia na poziomie sklepu. |

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

| Metryka | Opis |
| - | - |
| **Rokt Revenue** | Przychód z sieci Rokt przypisany do Twojego sklepu. |
| **Rokt Transactions** | Liczba transakcji sieci Rokt dla Twojego sklepu. |
| **Rokt Revenue / Transaction** | Przychód Rokt podzielony przez liczbę transakcji w danym przedziale czasu. |
| **Rokt Impressions** | Łączna liczba wyświetleń sieci Rokt we wszystkich miejscach docelowych Twojego sklepu. Różni się od upsellowych **Impressions**. |
| **Rokt Referrals** | Polecenia sieci Rokt, czyli pozytywne interakcje, które skierowały kupującego do partnera Rokt. |

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

Wymiary pozwalają rozbić metrykę według określonego atrybutu. Nie wszystkie wymiary są zgodne z każdą metryką; Explorer automatycznie zapobiega niezgodnym kombinacjom (na przykład **Decline rate** i **Show rate** nie można rozbić według **Currency**).

<div id="available-dimensions">
  ### Dostępne wymiary
</div>

| Wymiar | Opis |
| - | - |
| **Date** | Grupuje wyniki według dnia, tygodnia lub miesiąca. |
| **Surface** | Powierzchnia upsellu: PPU (post-purchase), Checkout, Thank You Page lub Cart. |
| **Funnel** | Konkretny lejek, do którego należy oferta. |
| **Product** | Produkt oferowany w upsellu. |
| **Placement** | Miejsce docelowe w ramach lejka. |
| **Device** | Typ urządzenia: Mobile, Desktop lub Unknown. Nie ma osobnej wartości dla tabletów. |
| **Currency** | Kod waluty ISO (na przykład USD, EUR, GBP). Przydatny dla sklepów wielowalutowych. |

<div id="unavailable-dimensions">
  ### Niedostępne wymiary
</div>

Poniższe wymiary są w trakcie opracowywania. Pojawiają się w selektorze, ale do czasu wdrożenia wyświetlają się jako „Not compatible” dla każdej metryki.

| Wymiar | Opis |
| - | - |
| **Flow type** | Typ przepływu upsellowego. |
| **Experiment** | Wariant testu A/B lub eksperymentu. |
| **Outcome** | Wynik decyzji (na przykład kwalifikuje się, brak w magazynie). |
| **Reason code** | Powód wyniku decyzji. |
| **Scope** | Zakres decyzji (Flow, Experience, Placement lub ItemSlot). |
| **Response type** | Odpowiedź na ofertę (Accepted, Declined lub Timeout). |

<div id="aql-statement-syntax">
  ## Składnia instrukcji AQL
</div>

Instrukcja AQL to pojedyncze pytanie złożone z klauzul. Wymagane są tylko `SELECT` i zakres czasu (`SINCE`); wszystko inne jest opcjonalne. Jeśli dodajesz klauzule opcjonalne, muszą one występować w tej kolejności:

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

Minimalny przykład — dzienny przychód z upsellów i wskaźnik akceptacji z ostatnich 30 dni:

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

<Note>
  W słowach kluczowych nie jest rozróżniana wielkość liter (`SELECT` i `select` działają tak samo), a instrukcje nie kończą się średnikiem. Wartości tekstowe umieszcza się w podwójnych cudzysłowach; liczb i list nie.
</Note>

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

* **`SELECT`** wymienia metryki do zmierzenia, oddzielone przecinkami, na przykład `SELECT revenue, impressions, accept_rate`.
* **`GROUP BY`** rozbija te metryki według jednego lub więcej wymiarów, takich jak `date`, `device`, `surface` lub `funnel`. Bez `GROUP BY` otrzymujesz pojedynczą sumę dla całego okresu.

<div id="filtering-with-where">
  ### Filtrowanie za pomocą WHERE
</div>

`WHERE` zawęża dane przed ich zmierzeniem. Warunki łączy się za pomocą `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` i `rpv` **nie mogą** być filtrowane ani grupowane według urządzenia, lejka, miejsca docelowego czy produktu; ich źródłowy rollup nie ma takiej kolumny. Dodanie `WHERE device = "mobile"` do zapytania wybierającego którąkolwiek z nich jest odrzucane z komunikatem `metric "impressions" cannot be filtered by "device"`.
</Warning>

Obsługiwane porównania to `=`, `!=`, `IN`, `NOT IN`, `>`, `<`, `>=` i `<=`. Użyj listy z `IN`, aby dopasować kilka wartości:

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

`experiment` **nie** jest polem filtrowalnym; nie ma źródła rollupu, więc `WHERE experiment IN [...]` jest odrzucane z komunikatem `filters on "experiment" are not supported.`

Filtr **funnel** obsługuje wielokrotny wybór: **is one of** (`IN`) uwzględnia tylko wybrane lejki, a **is not one of** (`NOT IN`) je wyklucza. Gdy grupujesz według **Funnel** i stosujesz filtr **is one of**, wykres pokazuje po jednej linii dla każdego wybranego lejka, bez scalania do kategorii „Other”.

<div id="time-ranges-and-comparisons">
  ### Zakresy czasu i porównania
</div>

Każde zapytanie potrzebuje zakresu czasu, ustawianego za pomocą `SINCE`:

| Forma | Przykład | Znaczenie |
| - | - | - |
| Predefiniowana | `SINCE last_30d` | Kroczące okno kończące się **wczoraj** (UTC). Bieżący, trwający dzień jest celowo wykluczony, więc `last_1d` oznacza tylko wczoraj, a `this_month` obejmuje okres od 1. dnia miesiąca do wczoraj. |
| Okno niestandardowe | `SINCE 2026-07-02 UNTIL 2026-07-05` | Stały zakres z datami ISO (`YYYY-MM-DD`). |

Dostępne wartości predefiniowane: `last_1d`, `last_7d`, `last_30d`, `last_90d`, `this_month`, `last_month` i `this_year`.

* **`GRAIN`** ustawia rozmiar przedziału dla serii czasowych: `day`, `week` lub `month`. (`hour` jest parsowane, ale żaden rollup nie dostarcza danych godzinowych, więc takie zapytanie jest odrzucane z komunikatem `group_by / time_grain combination is not supported.`)
* **`COMPARE`** nakłada drugi okres. Użyj `previous_period`, czyli okna o tej samej długości bezpośrednio poprzedzającego. `previous_year` jest ukryte w selektorze Compare, ponieważ hurtownia nie zawiera danych sprzed lutego 2026; pozostaje możliwe do wpisania w AQL wyłącznie po to, aby wcześniej zapisane zapytania nadal się parsowały.

```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>
  Dane raportowe zaczynają się w **lutym 2026**, więc okno wcześniejsze niż ta data zwraca puste wyniki dla obu okresów.
</Note>

<div id="choosing-a-chart">
  ### Wybór wykresu
</div>

* **`CHART`** określa sposób wyświetlania wyniku: `scorecard`, `line_chart`, `bar_chart`, `area_chart`, `funnel_chart` lub `table`.
* **`TIMEZONE`** ustawia strefę czasową używaną do grupowania dat, jako nazwę IANA w cudzysłowach, na przykład `TIMEZONE "America/New_York"`. Domyślnie UTC (zobacz [Strefy czasowe](#timezones)).

Typ `funnel_chart` ma szczególne wymagania:

* **Tryb miejsc docelowych.** Grupuj według `placement` i wybierz jedną metrykę. Etapy są uporządkowane według kanonicznej sekwencji miejsc docelowych (domyślny upsell, potem downsell, potem dodatkowe upselle). Rysowana jest tylko pierwsza metryka; dodatkowe metryki są odnotowane w przypisie.
* **Tryb metryk.** Wybierz dwie lub więcej metryk bez `GROUP BY`. Każda metryka staje się etapem lejka w kolejności zapytania (na przykład `SELECT impressions, conversions` pokazuje spadek od wyświetleń do konwersji). Wszystkie metryki muszą mieć tę samą jednostkę.

```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>
  Tryb miejsc docelowych wymaga metryki, którą da się rozbić według miejsca docelowego. `impressions`, `accept_rate` i `rpv` się nie da; dla nich wykres lejkowy pokazuje komunikat „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">
  ### Sortowanie i ograniczanie
</div>

* **`ORDER BY`** sortuje wyniki według metryki lub wymiaru, z `ASC` lub `DESC`.
* **`LIMIT`** ogranicza liczbę zwracanych wierszy, co przydaje się przy pytaniach typu „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">
  ### Więcej przykładów
</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` i `rpv` nie można rozbić według urządzenia; ich rollup to sklep × powierzchnia × dzień, bez kolumny urządzenia. Do porównań urządzeń używaj `revenue` (lub innej metryki pochodzącej z konwersji).
</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">
  ## Strefy czasowe
</div>

Domyślnie zapytania działają w UTC. Możesz zastąpić strefę czasową, aby wyniki grupowane po datach odzwierciedlały czas lokalny (kroki na pasku narzędzi znajdziesz w sekcji [Ustawianie strefy czasowej](/pl/aftersell/reports_explorer#setting-a-timezone)).

<Note>
  Zapytania zawierające **Impressions**, **Accept Rate** lub **Revenue Per Visit** zawsze grupują daty w UTC, niezależnie od wybranej strefy czasowej, ponieważ metryki te pochodzą z dziennego rollupu raportowanego w dniach UTC. Jeśli zapytanie łączy jedną z tych metryk z innymi, cały zbiór wyników wraca do UTC, aby przedziały dat pozostały wyrównane.
</Note>

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

Strefę czasową możesz określić bezpośrednio w AQL za pomocą klauzuli `TIMEZONE`, która występuje między `CHART` a `ORDER BY`:

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

Gdy klauzula jest obecna, zastępuje wybór z paska narzędzi dla tego zapytania i jest zachowywana przy zapisywaniu i ponownym wczytywaniu.

<div id="available-timezones">
  ### Dostępne strefy czasowe
</div>

Selektor (oraz klauzula `TIMEZONE`) akceptuje zamknięty zestaw dziesięciu stref. Każda inna strefa czasowa IANA jest odrzucana jako nieobsługiwana.

| Strefa czasowa | Przykładowa lokalizacja |
| - | - |
| UTC | uniwersalny czas koordynowany |
| America/New\_York | Nowy Jork (ET) |
| America/Chicago | Chicago (CT) |
| America/Denver | Denver (MT) |
| America/Los\_Angeles | Los Angeles (PT) |
| Europe/London | Londyn (GMT/BST) |
| Europe/Paris | Paryż (CET/CEST) |
| Asia/Tokyo | Tokio (JST) |
| Asia/Singapore | Singapur (SGT) |
| Australia/Sydney | Sydney (AEST/AEDT) |

<div id="account-default-and-how-timezone-affects-results">
  ### Domyślna strefa konta i wpływ strefy czasowej na wyniki
</div>

Jeśli w ustawieniach analityki włączona jest opcja **Lock reporting timezone**, wybranie **Account default** używa tej zablokowanej strefy czasowej (pasek narzędzi pokazuje rozwiązaną strefę, na przykład **Timezone: Account default (Paris (CET))**). Strona ustawień analityki akceptuje pełną listę IANA, ale Reports honoruje tylko dziesięć powyższych stref; jeśli Twoja zablokowana strefa nie jest jedną z nich, **Account default** po cichu rozwiązuje się do UTC. Jeśli opcja **Lock reporting timezone** nie jest włączona, **Account default** wraca do UTC.

Gdy ustawiona jest strefa czasowa, grupowanie po datach używa czasu lokalnego zamiast UTC. Na przykład zdarzenie o `2026-03-29T01:30:00Z` przypada na 28 marca w Nowym Jorku (ET), ale na 29 marca w Paryżu (CET). Zapytania bez strefy czasowej, w tym wcześniej zapisane, nadal działają w UTC.
