Doprava není úplně náklad ani úplně tržba. Zákazník něco zaplatí, dopravce si něco vezme, a rozdíl je buď malý zisk, nebo tichá ztráta. Ve výsledovce z toho zbydou dvě velká čísla a rozdíl, který vypadá přijatelně.

Jenže ten rozdíl je průměr. A míchají se v něm dvě úplně jiné věci: stokoruna vydělaná na lehké zásilce do výdejny a dvoustovka prodělaná na deseti kilech domů. Dohromady „skoro nula“ — a vy máte pocit, že je to v pořádku.

Vybráno od zákazníků vs. náklad na dopravu Měsíc · CZ · bez DPH
Vybráno na dopravě
184 300 Kč
948 zásilek
Náklad na dopravu
201 750 Kč
Ø 213 Kč / zásilka
Rozdíl
−17 450 Kč
doprava se nezaplatí
Krytí nákladů
91,4 %
cíl 100 %
Rozdíl −17 450 Kč za měsíc vypadá jako zaokrouhlovací chyba. Rozpad podle váhy ukáže, že se skládá z tisíců vydělaných na lehkých zásilkách a desetitisíců prodělaných na těžkých.

Dokud nevidíte jednotlivé zásilky, neřídíte dopravu — jen ji platíte.

Tak jsem si postavil report, který obě strany spáruje po objednávkách. Nikdo v něm nic nestahuje ani nepřepisuje — data si bere sám a přepočítá se každý den.

Dva dopravci, dvě úplně jiné cesty k datům

Žádní dva dopravci nedávají data stejně. Proto to není jedna integrace, ale dvě různé — a proto si takový report jen tak někdo neudělá.

  • Zásilkovna má API. Nejlepší případ. Skript si stáhne faktury a ke každé rozpis zásilek: číslo zásilky, číslo objednávky, váhu, základní sazbu, palivový příplatek, mýtné, dobírku. Přesně to, co potřebuju.
  • DPD API nemá — má e-mail. Faktury chodí jako XLS příloha do schránky. Hodilo se, že už mám napojený SupportBox z projektu na vytěžování faktur: skript projde zprávy, najde ty od DPD, stáhne přílohy a rozebere je. Do mailu se kvůli tomu nikdo nedívá.

Když data v hezké podobě neexistují, dají se vytáhnout z toho, co přijde — i když je to příloha v mailu. Podstatné je, že obě cesty běží automaticky a končí ve stejné tabulce.

Náklad podle dopravce a typu doručení Podíl na celkovém nákladu
Zásilkovna výdejní
31 % · 412 zás.
Zásilkovna adresa
19 % · 168 zás.
DPD Pickup
14 % · 143 zás.
DPD Private
12 % · 96 zás.
Balíkovna výdejní
7 % · 89 zás.
Balíkovna adresa
3 % · 40 zás.
Objem sám o sobě nic neříká. Zásilkovna na adresu je pětina nákladu při šestině zásilek — teprve po přepočtu na jednu zásilku je vidět, kde se peníze ztrácejí.

Jedna tabulka pro všechny

Obě cesty končí ve stejné tabulce — jeden řádek na zásilku. Číslo zásilky, číslo objednávky, dopravce, datum podání, váha, náklad bez DPH a rozpad na složky.

Celý koloběh je bez člověka: v noci se stáhnou faktury z API i z mailu, spárují se s objednávkami a report se přepočítá. Ráno stačí otevřít odkaz. Žádné stahování XLS, žádné kopírování do Excelu, žádné „až na to budu mít čas“.

Sloupce jsou společné pro oba dopravce, i když je každý plní jinak. Report pak nemusí řešit, odkud data přišla.

Párování s objednávkami

Druhá polovina rovnice je to, co zaplatil zákazník. Bere se z objednávkového feedu e-shopu: v každé objednávce je vedle zboží položka dopravy a položka platby. Sečtou se zvlášť a je z toho „vybráno“.

Páruje se přes číslo objednávky, které dopravce nese jako „vaše číslo“. Tam problémy nebyly. Pozornost si vyžádalo něco jiného:

  • Nespárované objednávky se nesmí schovat. Když se k nákladu objednávka nenajde, ukázalo by se „vybráno 0 Kč“ a zásilka by vypadala jako ztrátová. Report proto počítá, kolik takových je, a napíše to nad tabulku. Radši nepohodlné číslo než nepravdivý graf.
  • Vícekusové zásilky. Když jde objednávka ve třech balících, DPD naúčtuje cenu jen u prvního, ale celkovou váhu zopakuje u každého. Prostý součet udělá z osmi kilo dvacet čtyři. Váha se proto sčítá jen z kusů s nenulovou cenou.
  • Poplatek za dopravu ≠ poplatek za platbu. Dobírka je služba dopravce, ale s dopravou nemá co dělat. Kdyby zůstala v nákladu, každá dobírková objednávka by vypadala dráž, než je. Dobírky mají proto vlastní sekci.

Co z toho vypadne

Nahoře jsou čtyři čísla: kolik jsme vybrali, kolik nás to stálo, rozdíl a krytí nákladů v procentech. To poslední sleduju nejvíc — říká, jakou část ceny dopravy zaplatí zákazník. Sto procent znamená, že si doprava vydělá na sebe.

Pod tím jsou čtyři pohledy: podle dopravce, podle typu doručení, podle váhových pásem a konkrétní ztrátové zásilky. Pásma se počítají zvlášť pro výdejní místa a zvlášť pro doručení na adresu — liší se u nich sazby i váhy. Sloučené by nedávala platná čísla ani pro jedno.

Váhová pásma — doručení na adresu Ø na zásilku · bez DPH
Pásmo Zásilek Ø vybráno Ø náklad Ø rozdíl Krytí
0–1 kg 142 89 Kč 112 Kč −23 Kč 79 %
1–2 kg 96 89 Kč 131 Kč −42 Kč 68 %
2–5 kg 74 94 Kč 168 Kč −74 Kč 56 %
5–10 kg 31 61 Kč 229 Kč −168 Kč 27 %
10+ kg 11 18 Kč 284 Kč −266 Kč 6 %
Celkem 354 86 Kč 148 Kč −62 Kč 58 %
Poslední dvě pásma jsou 12 % zásilek a přes polovinu celé ztráty. Průměrně vybráno tam klesá, protože většina těch objednávek překročila hranici dopravy zdarma.
Váhová pásma — výdejní místo Ø na zásilku · bez DPH
Pásmo Zásilek Ø vybráno Ø náklad Ø rozdíl Krytí
0–1 kg 270 69 Kč 58 Kč +11 Kč 119 %
1–2 kg 172 69 Kč 64 Kč +5 Kč 108 %
2–5 kg 119 71 Kč 79 Kč −8 Kč 90 %
5–10 kg 30 52 Kč 98 Kč −46 Kč 53 %
10+ kg 3 0 Kč 124 Kč −124 Kč 0 %
Celkem 594 68 Kč 67 Kč +1 Kč 101 %
Stejný e-shop, stejný měsíc. Výdejní místa si na sebe vydělají, doručení na adresu je ztrátové. V jednom průměru se to slije do „skoro nuly“ a nikdo neví, kterou stranu dotuje.
Nejztrátovější zásilky Náklad > vybráno · seřazeno podle rozdílu
Objednávka Dopravce Váha Vybráno Náklad Rozdíl
2026101488 DPD Private 11,80 kg 89 Kč 271 Kč −182 Kč
2026101302 Zásilkovna adresa 8,40 kg 99 Kč 214 Kč −115 Kč
2026101245 Zásilkovna výdejní 6,10 kg 0 Kč 108 Kč −108 Kč
2026101177 Balíkovna adresa 9,30 kg 79 Kč 186 Kč −107 Kč
2026101094 DPD Private 7,20 kg 89 Kč 192 Kč −103 Kč
Tři z pěti nejztrátovějších zásilek mají vybráno 0 nebo 79 Kč a váhu přes šest kilo. Není to náhoda — je to nastavená hranice dopravy zdarma.

Co jsem se dozvěděl

Naše konkrétní čísla tu uvádět nebudu, ale závěry platí pro většinu e-shopů, které prodávají něco těžšího než kosmetiku:

  • Ztráta je koncentrovaná. Není to všude trochu, je to malá skupina hodně. Těžké objednávky na adresu, kde zákazník platí stejně jako za balíček do výdejny.
  • Hranice dopravy zdarma je nejdražší číslo v e-shopu. Nastavuje se jednou, obvykle odhadem, a pak se roky nesahá. Přitom rozhoduje o tom, kolik zásilek spadne do pásma, kde na každé proděláte.
  • Ceníky se pohnou, aniž si toho všimnete. Palivový příplatek se mění tiše. Bez měsíčního srovnání zjistíte až po půl roce, že krytí odteklo o pár procent. Report to hlídá sám.
  • Výdejní místa a doručení domů jsou dva různé byznysy. Míchat je do jednoho průměru znamená dotovat jedno druhým a nevědět o tom.

Nic z toho není objev. Jsou to jen věci, které se dají spočítat a rozhodnout — místo aby se odhadovaly.

Kde do toho vstupuje AI

Tenhle report by šel udělat i před pěti lety. Dvě integrace, jedna tabulka, pár agregací. Technicky na tom není nic nového.

Změnila se cena. Rozebrat cizí API, poprat se s XLS přílohou a odladit párování bývala práce na týdny. Kvůli zjištění, kolik proděláváte na zásilkách nad pět kilo, se do toho nikdo nepustil — vyplatilo se to jen firmám s vlastním vývojářem.

Ta hranice, od které se vlastní řešení vyplatí, se posunula hodně dolů. To je celá zpráva.

Moje práce nebyla psát kód. Byla v tom vědět, že náklad na dopravu není totéž co poplatek za dobírku, že vícekusová zásilka opakuje váhu a že pásma se počítají zvlášť pro výdejny. To je znalost e-shopu, a tu za vás zatím nikdo neudělá.

Kdy to dává smysl

Když posíláte dost zásilek na to, aby pár procent z ceny dopravy dělalo reálné peníze, prodáváte zboží s rozdílnou váhou a nabízíte víc dopravců. Nedává to smysl, když posíláte obálky do dvou set gramů za jednu cenu jedním dopravcem. Tam je průměr v pořádku.

A jestli si z toho chcete odnést jednu věc: otevřete si poslední fakturu od dopravce a rozdělte si ji podle váhy. I ručně, i za jeden měsíc, i v Excelu. Většinou se ukáže dost na to, abyste věděli, jestli má cenu stavět zbytek — a ten už poběží sám.