Webhooks
Webhooks trimit fiecare schimbare pe care o observă agenții la o adresă a ta, pe loc, ca uneltele tale să poată face ceva cu ea: un mesaj în chatul echipei când un produs se epuizează, un rând într-un tabel când scad vânzările, un tichet când trimiterea emailurilor este oprită. Se află la Setări → Webhooks.
Cum adaug o adresă?
https publică.Un spațiu de lucru poate avea cel mult cinci adrese. O adresă cu Toate tipurile de evenimente primește și tipurile adăugate mai târziu; una cu o listă primește doar ce e pe ea.
Cum schimb sau pun pe pauză o adresă?
- Editează (creionul) schimbă adresa sau tipurile ei de evenimente. Secretul rămâne același.
- Comutatorul de lângă adresă o pune pe pauză. Cât timp e pe pauză nu i se trimite nimic nou; ce aștepta pleacă atunci când o pornești din nou. Un test se trimite totuși, pentru că l-ai cerut tu.
- Elimină (coșul) oprește definitiv trimiterea. Ce a fost deja trimis rămâne în lista de evenimente.
Ce se trimite?
Fiecare eveniment este un POST cu un corp JSON:
{
"id": "<event id>",
"type": "signal",
"createdAt": "2026-10-14T09:12:00.000Z",
"workspace": "magazinul-meu",
"data": {
"kind": "stock.out",
"agent": "maestro",
"subject": { "type": "shop_product", "id": "<product id>" },
"facts": { "productId": "<product id>", "title": "Cană ceramică", "units": 14 },
"text": { "en": "\"Cană ceramică\" sold out", "ro": "„Cană ceramică” s-a epuizat" },
"link": "https://kooga.io/o/magazinul-meu/store/products"
}
}ideste id-ul evenimentului. Același eveniment trimis de două ori (o reîncercare după ce adresa ta a răspuns prea târziu) are acelașiid, așa că îl poți sări.typeestesignal, sautestpentru evenimentul trimis de butonul Trimite un test.data.kindspune ce s-a schimbat (vezi tabelul de mai jos), iardata.factsconține cifrele din spatele schimbării. Ce cifre sunt acolo depinde de tip.data.texteste rândul pe care l-ai citi în Kooga, în engleză și română.data.linkdeschide locul din Kooga unde să te uiți.
| Tip | Ce s-a schimbat |
|---|---|
rank.dropped | Un cuvânt cheie urmărit a coborât în Google. |
rank.top_three | Un cuvânt cheie urmărit a ajuns în primele trei rezultate Google. |
article.declining | Un articol publicat pierde clicuri. |
visibility.dropped | Asistenții AI menționează magazinul tău mai rar. |
visibility.first_check | Prima verificare a vizibilității în AI s-a încheiat. |
shelf.lost | Un produs a ieșit din cardurile de cumpărături ChatGPT. |
email.paused | Trimiterea emailurilor a fost oprită din cauza plângerilor de spam. |
email.bounces | Revin nelivrate mai multe emailuri decât de obicei. |
sales.dropped | Comenzile au scăzut mult sub o săptămână obișnuită. |
stock.out | Un produs care se vinde s-a epuizat. |
stock.low | Un produs care se vinde e pe terminate. |
stock.back | Un produs epuizat a revenit în stoc. |
Pot apărea tipuri noi. Le ignori pe cele pe care nu le folosești.
Cum verific că un eveniment vine de la Kooga?
Fiecare eveniment are aceste antete:
| Antet | Valoare |
|---|---|
Kooga-Event | signal sau test |
Kooga-Delivery | Id-ul acestei livrări, același la fiecare reîncercare |
Kooga-Signature | t=<secunde unix>,v1=<semnătură> |
Semnătura este HMAC-SHA256, în hex, al momentului, un punct și corpul brut exact cum a fost primit, calculat cu secretul tău. Ca să o verifici:
t și v1 din antetul Kooga-Signature.t + "." + corp cu secretul tău, înainte să interpretezi corpul.v1 în timp constant și respinge evenimentul dacă diferă.t e mai vechi de cinci minute, ca unul vechi să nu poată fi retrimis.În Node.js:
import crypto from 'node:crypto';
function fromKooga(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(',').map(part => part.split('=')));
const expected = crypto.createHmac('sha256', secret).update(`${parts.t}.${rawBody}`).digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
return fresh && expected.length === parts.v1?.length &&
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1));
}Dacă un secret ajunge unde nu trebuie, alege Secret nou lângă adresă. Cel vechi nu mai funcționează din acel moment.
Ce se întâmplă când adresa mea nu răspunde?
Răspunde cu orice cod 2xx în cel mult zece secunde și evenimentul e
considerat livrat. Orice altceva, inclusiv o redirecționare, se reîncearcă:
după un minut, cinci minute, treizeci de minute, două ore și douăsprezece ore.
După a șasea încercare evenimentul e abandonat. O adresă căzută o după-amiază
tot primește totul.
Cât timp trimiterile la o adresă eșuează, ea apare ca Eșuează. Următorul eveniment care trece șterge starea.
Unde văd ce s-a trimis?
Lista Evenimente de sub adrese cuprinde fiecare eveniment din ultimele 30 de zile, cele mai noi primele. O poți filtra după stare, tip de eveniment sau adresă, iar Reîncarcă o citește din nou. Alege un eveniment ca să vezi:
id-ul lui și adresa la care a plecat,- corpul exact cum a fost trimis,
- fiecare încercare: codul cu care a răspuns adresa ta (sau Niciun răspuns), când și cât a durat, cele mai noi primele; iar cât timp așteaptă, când e următoarea încercare.
Trimite din nou trimite încă o dată un eveniment, cu o nouă serie de șase
încercări: unul abandonat sau unul pe care receptorul tău l-a pierdut. Își
păstrează id-ul, așa că un receptor care sare peste id-urile văzute sare și
peste el. Evenimentele se păstrează 30 de zile.
Ce urmează
Aceleași schimbări ajung la tine în Kooga ca carduri pe Acasă, iar ce fac agenții cu fiecare tip alegi în Reguli.