Jak mierzyć wpływ wyprzedaży na marżę — analiza przed/po
Spis treści
Organizujesz wyprzedaż, ruch rośnie, zamówienia lecą — a potem patrzysz na marżę i coś się nie zgadza. Przychód wyższy, ale zysk niekoniecznie. Jak sprawdzić, czy wyprzedaż naprawdę się opłaciła i które kategorie produktów ją "zjadły"?
Dlaczego sama sprzedaż to za mało
Większość e-commerce'ów mierzy wyprzedaże przez pryzmat GMV (Gross Merchandise Value) albo liczby zamówień. To błąd. Wzrost konwersji o 40% przy rabacie 30% może oznaczać, że sprzedałeś więcej, ale zarobiłeś mniej na każdej sztuce. Bez analizy marży przed/po nie wiesz, czy promotion był inwestycją czy kosztem.
Kluczowe pytania, na które powinieneś odpowiedzieć po każdej akcji wyprzedażowej:
- Jak zmieniła się marża brutto na poziomie kategorii i SKU?
- Czy wzrost wolumenu skompensował spadek marży jednostkowej?
- Które produkty były "lokomotywami" sprzedaży, a które tylko "kosztami wejścia"?
Struktura danych, której potrzebujesz
Zanim napiszesz pierwsze zapytanie SQL, upewnij się, że masz połączone trzy źródła danych w Keboola lub innym ETL:
- Tabela zamówień —
order_id,created_at,product_id,quantity,revenue,discount_amount - Tabela produktów z kosztami —
product_id,cogs(koszt własny sprzedaży),category - Tabela okresów promocyjnych —
promo_id,start_date,end_date,promo_name
Bez kolumny cogs na poziomie SKU analiza marży jest niemożliwa. Jeśli jej nie masz, zacznij od zbudowania tej tabeli we współpracy z działem finansów lub operacji — to fundament każdej rzetelnej analizy e-commerce.
Zapytanie SQL: marża przed/po w Snowflake
Poniżej przykład analizy dla wyprzedaży, która trwała 7 dni. Przyjmujemy 14 dni "przed" jako baseline.
WITH promo_period AS (
SELECT
DATE '2024-11-29' AS promo_start,
DATE '2024-12-05' AS promo_end
),
orders_enriched AS (
SELECT
o.order_id,
o.created_at::DATE AS order_date,
o.product_id,
p.category,
o.quantity,
o.revenue,
o.discount_amount,
p.cogs * o.quantity AS total_cogs,
o.revenue - (p.cogs * o.quantity) AS gross_profit,
CASE
WHEN o.created_at::DATE BETWEEN
DATEADD(day, -14, pp.promo_start) AND DATEADD(day, -1, pp.promo_start)
THEN 'before'
WHEN o.created_at::DATE BETWEEN pp.promo_start AND pp.promo_end
THEN 'during'
END AS period_label
FROM orders o
JOIN products p ON o.product_id = p.product_id
CROSS JOIN promo_period pp
WHERE o.created_at::DATE BETWEEN
DATEADD(day, -14, pp.promo_start) AND pp.promo_end
)
SELECT
category,
period_label,
COUNT(DISTINCT order_id) AS orders,
SUM(revenue) AS total_revenue,
SUM(discount_amount) AS total_discount,
SUM(gross_profit) AS total_gross_profit,
ROUND(SUM(gross_profit) / NULLIF(SUM(revenue), 0) * 100, 2) AS margin_pct,
ROUND(SUM(gross_profit) / NULLIF(COUNT(DISTINCT order_id), 0), 2) AS profit_per_order
FROM orders_enriched
WHERE period_label IS NOT NULL
GROUP BY 1, 2
ORDER BY category, period_label;To zapytanie daje Ci per-kategorię porównanie marży procentowej i zysku na zamówienie w obu okresach. Jeśli margin_pct spada z 38% na 22% przy wzroście orders o 60%, to dopiero teraz widzisz prawdziwy obraz.
Jak interpretować wyniki — pułapki analizy przed/po
Efekt kanibalizacji kategorii. Często podczas wyprzedaży jedna kategoria "kradnie" ruch innym. Klient, który kupił elektronikę na promocji, nie kupił AGD po pełnej cenie. Porównuj kategorie nie tylko osobno, ale też patrz na koszyk mieszany.
Znormalizuj po liczbie dni. Okres "przed" ma 14 dni, promocja — 7. Zawsze przeliczaj wyniki na dzienny średni zysk (total_gross_profit / period_days), inaczej porównujesz gruszki z jabłkami.
Uwzględnij zwroty. Wyprzedaże generują wyższy współczynnik zwrotów, czasem z opóźnieniem 14-30 dni. Jeśli analizujesz marżę tuż po promocji, twoje liczby są jeszcze optymistyczne. Dodaj do modelu tabelę zwrotów i odejmij zwrócony gross_profit.
Koszt pozyskania vs. marża. Jeśli na wyprzedaż zwiększyłeś budżet Google Ads lub Meta, koszt ten musi wejść do modelu. Marża brutto bez odjęcia kosztów marketingowych daje fałszywy obraz rentowności.
Jak prezentować wyniki w Tableau
Dla raportu before/after w Tableau polecam dwa widoki:
- Bullet chart — dla każdej kategorii pokazuje marżę "przed" jako target i marżę "podczas" jako actual. Natychmiast widać, gdzie promocja zadziałała, a gdzie spaliła marżę.
- Scatter plot: wolumen vs. zmiana marży — oś X to procentowa zmiana liczby zamówień, oś Y to zmiana marży w punktach procentowych. Każdy punkt to kategoria lub SKU. Produkty w ćwiartce "wysoki wzrost wolumenu, mała utrata marży" to Twoje gwiazdy wyprzedażowe. Produkty w ćwiartce "niski wzrost, duża utrata marży" — to te, których następnym razem nie warto przeceniać.
Dodaj do dashboardu filtr promo_name, żeby analitycy mogli porównywać różne akcje wyprzedażowe na przestrzeni czasu — Black Friday vs. letnia wyprzedaż vs. urodziny sklepu.
Od analizy do decyzji
Dane mają sens tylko wtedy, gdy prowadzą do konkretnych działań. Po każdej wyprzedaży powinieneś być w stanie odpowiedzieć:
- Które SKU wyłączyć z przyszłych promocji — bo ich marża jest już na tyle niska, że rabat generuje straty
- Które kategorie promować agresywniej — bo mają zdrową marżę i duży potencjał wolumenowy
- Jaki jest optymalny poziom rabatu — analiza progowa (ile % rabatu jeszcze daje dodatni gross profit)
Zbudowanie tej analizy raz, jako szablon SQL + dashboard Tableau, pozwala Ci ocenić każdą kolejną wyprzedaż w ciągu godziny, nie tygodnia.
---
TL;DR
- Mierz wyprzedaże przez marżę brutto i zysk na zamówienie — nie tylko przez GMV i konwersję
- Połącz dane zamówień z kosztami (COGS) na poziomie SKU — bez tego analiza jest ślepa
- Normalizuj wyniki na dzienny zysk i uwzględnij zwroty po fakcie
- Używaj scatter plot wolumen/marża, żeby szybko identyfikować gwiazdy i pożeracze marży
- Szablonowy SQL + stały dashboard = ocena każdej kolejnej akcji w godzinę, nie w tydzień
Chcesz wiedzieć, gdzie tracisz klientów?
Przeanalizuję Twój lejek i wskażę, co poprawić najpierw. Pierwsza rozmowa jest bezpłatna.
Umów konsultacjęWięcej artykułów o data analytics:
Wróć do bloga