Skoro každá firma jede na hromadě nástrojů, které spolu nemluví. Objednávka padne do e-shopu, ale do účetnictví ji přepíšeš ručně. Formulář vyplní zákazník, ale do CRM ho přidáš ručně. Tohle ruční přepisování je přesně to, co webhooky umí zabít. Ukážu ti, co webhooky jsou, jak se liší od běžného API a jak s nimi propojit nástroje, aby si data předávaly samy.
Co je webhook
Webhook je zpráva, kterou jeden systém automaticky pošle druhému ve chvíli, kdy se něco stane. Představ si ho jako upozornění: "Hej, právě přišla nová objednávka, tady jsou její data." Místo abys se musel pořád ptát "je tam něco nového?", systém ti dá vědět sám, hned jak se to stane.
Technicky je to obyčejný HTTP požadavek (nejčastěji POST) na adresu, kterou předem nastavíš. V těle požadavku přijdou data o události ve formátu JSON.
Webhook versus API: klíčový rozdíl
Lidé tyhle dva pojmy pletou, ale liší se v jednom zásadním bodě: kdo začíná konverzaci.
| API (dotaz) | Webhook (oznámení) | |
|---|---|---|
| Kdo iniciuje | Ty se ptáš serveru | Server sám pošle tobě |
| Kdy | Když si řekneš | Když nastane událost |
| Analogie | Voláš na poštu, jestli přišel balík | Pošta ti zavolá, že balík dorazil |
U API se musíš ptát opakovaně a doufat, že trefíš správný okamžik. Webhook ti dá vědět přesně v ten moment, kdy se něco stane. Je tedy rychlejší a šetří zbytečné dotazování. Pokud si nejsi jistý základy API, mrkni na článek jak napojit aplikaci na databázi přes API.
Jak webhook přijmout
Aby tě jiný systém mohl upozornit, musíš mít připravenou adresu (endpoint), která zprávu přijme a zpracuje. Takhle vypadá jednoduchý příjem webhooku, třeba nové objednávky:
// app/api/webhook/objednavka/route.ts
export async function POST(req) {
const data = await req.json();
// zpracuj data: ulož, přepošli, pošli e-mail...
await ulozObjednavku({
cislo: data.order_number,
castka: data.total,
email: data.customer_email
});
// potvrď přijetí, jinak to odesílatel zkusí znovu
return new Response("OK", { status: 200 });
}Důležitý detail: vždy vrať odpověď se stavem 200, jakmile zprávu přijmeš. Pokud nevrátíš, většina systémů to vyhodnotí jako chybu a webhook pošle znovu, klidně několikrát.
Bezpečnost: ověř, že zpráva je pravá
Tvoje adresa pro webhook je veřejná, takže na ni teoreticky může poslat zprávu kdokoliv. Útočník by mohl předstírat falešnou objednávku. Proto seriózní služby zprávy podepisují tajným klíčem a ty musíš podpis ověřit, než data zpracuješ:
const podpis = req.headers.get("x-signature");
const ocekavany = vypocitejPodpis(rawBody, process.env.WEBHOOK_SECRET);
if (podpis !== ocekavany) {
return new Response("Neplatný podpis", { status: 401 });
}Tohle nikdy nevynechávej. Ověření podpisu je rozdíl mezi spolehlivou integrací a otevřenými dveřmi do tvého systému.
Co všechno se dá takhle propojit
Webhooky jsou lepidlo moderních automatizací. Pár scénářů z praxe:
- E-shop do účetnictví: nová objednávka automaticky vytvoří fakturu.
- Formulář do CRM: vyplněný kontaktní formulář rovnou založí kartu zákazníka a úkol obchodníkovi.
- Platba do aplikace: potvrzená platba ze Stripe odemkne uživateli placenou funkci.
- Notifikace do týmu: nová poptávka se objeví v týmovém chatu během sekundy.
O propojení formulářů a e-mailů detailněji píšu v článku automatizace e-mailů a formulářů.
Webhooky i opačně: když upozorňuješ ty
Zatím jsme mluvili o příjmu, ale webhook umíš taky odeslat. Když ve tvojí aplikaci nastane událost, třeba se zaregistruje nový uživatel, můžeš sám poslat oznámení do jiného systému. Stačí udělat obyčejný POST požadavek na adresu, kterou ti druhá strana dala:
// odešli oznámení o nové registraci
await fetch(process.env.CRM_WEBHOOK_URL, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
udalost: "novy_uzivatel",
email: uzivatel.email,
cas: new Date().toISOString()
})
});Díky tomu se z tvojí aplikace stane plnohodnotný článek řetězce automatizací. Můžeš upozorňovat tým v chatu, zakládat úkoly nebo spouštět navazující procesy v jiných nástrojích, aniž by tě to stálo víc než pár řádků kódu.
Když nechceš programovat: Make a Zapier
Pokud nechceš psát kód, nemusíš. Nástroje jako Make nebo Zapier umí webhooky přijmout i odeslat a propojit stovky služeb přes klikací rozhraní. Pro jednoduché scénáře jsou skvělé. Jakmile ale potřebuješ vlastní logiku, ošetření chyb nebo výkon při velkém objemu, vlastní řešení v kódu se vyplatí. Bývá rychlejší, levnější při škálování a máš nad ním plnou kontrolu.
Hranice je obvykle jasná podle ceny a objemu. Klikací nástroje účtují za počet operací, takže při tisících událostí denně se účet rychle nasčítá. Vlastní endpoint na vlastním hostingu zvládne stejný objem za zlomek a navíc do něj zapíšeš přesně tu logiku, kterou klikání neumí. Dobrá strategie je začít v Make nebo Zapieru, ověřit, že nápad dává smysl, a teprve osvědčené toky přepsat do kódu.
Idempotence: pojistka proti duplicitám
Vrátím se k jednomu pojmu, protože je v praxi klíčový. Idempotentní endpoint je takový, který stejnou zprávu zpracuje vícekrát bez škody. Proč na tom záleží: odesílatelé webhook při nejistotě posílají znovu, takže ti tatáž objednávka může dorazit dvakrát. Když si u každé zprávy uložíš její jednoznačné id a před zpracováním zkontroluješ, jestli už ho znáš, duplicitní fakturu ani dvojitý e-mail nikdy nevytvoříš.
Časté dotazy
Co se stane, když je můj systém zrovna nedostupný?
Většina služeb webhook nezahodí, ale opakuje odeslání po určité době, někdy i hodiny. Tvůj endpoint by měl být ideálně idempotentní, tedy zvládnout stejnou zprávu přijmout dvakrát bez toho, aby vytvořil duplicitní záznam.
Jak otestuju webhook během vývoje?
Lokální aplikace není z internetu dostupná, takže potřebuješ tunel. Nástroje jako ngrok vytvoří veřejnou adresu, která vede na tvůj počítač, a webhook tak dorazí i během vývoje.
Je webhook bezpečný pro citlivá data?
Ano, pokud běží přes HTTPS a ověřuješ podpis. Citlivé údaje navíc do těla webhooku raději nedávej, pošli jen id a detail si dotáhni přes zabezpečené API.
Pojďme propojit, co u tebe mlčí
Ruční přepisování dat mezi nástroji je tichý žrout času, který se dá skoro vždy zautomatizovat. Stavím integrace a automatizace na míru, od jednoduchého propojení formuláře s CRM po složité toky dat mezi více systémy. Pokud tě napadá pár míst, kde pořád něco překlikáváš ručně, napiš mi přes kontakt a najdeme, co u tebe automatizovat jako první.