# Što ćete izraditi#
Dobar n8n workflow za odobravanje radi više od pukog čekanja da netko klikne “approve”. U produkciji trebate timeoute, podsjetnike, eskalaciju i revizijski trag koji preživljava ponovne pokušaje, duple klikove i prebacivanje kanala.
U ovom vodiču implementirat ćete:
- Odobravanja u Slacku ili Microsoft Teamsu, uz e-mail kao fallback
- Jedan kanonski zapis odobravanja sa statusom i vremenskim oznakama
- Čekanje uz ljudsku intervenciju s timeoutima, podsjetnicima i eskalacijskim putevima
- Revizijski trag koji možete izvesti za compliance ili post-mortem analize
- Sprječavanje duplikata pomoću idempotentnosti i optimističkog zaključavanja
Ako već imate workflowe u pogonu, ovaj vodič se dobro nadovezuje na naše operativne obrasce za n8n u članku n8n error handling, retries, and alerting te na pristup s bibliotekom u vodiču n8n workflow templates guide. Ako želite pomoć pri implementaciji ovoga kroz cijeli svoj stack, pogledajte naše automation services.
# Preduvjeti i arhitektura#
Što vam treba#
| Zahtjev | Preporuka | Napomene |
|---|---|---|
| n8n | 1.30+ | Podržava moderne nodeove i stabilno ponašanje izvršavanja |
| Slack ili Teams app | Konfiguriran | Slack interaktivne poruke ili Teams adaptive cards |
| E-mail provider | SMTP ili API | Za fallback i eskalaciju |
| Baza podataka | Preporučen Postgres | Za revizijski trag i deduplikaciju. SQLite radi za manja okruženja |
| Javni webhook URL | Da | Potreban za Slack ili Teams callbackove |
Dizajn na visokoj razini#
Umjesto pauziranja jednog dugotrajnog izvršavanja danima, tretirajte odobravanja kao stroj stanja (state machine) perzistiran u bazu podataka:
- 1Kreirajte zapis odobravanja sa statusom
PENDINGiapprovalId - 2Obavijestite odobravatelje u jednom ili više kanala
- 3Pričekajte callback događaj koji nosi
approvalIdi odluku - 4Validirajte i spremite prvu konačnu odluku
- 5Nastavite poslovni proces ovisno o
APPROVEDiliREJECTED
Ovaj dizajn izbjegava “zombi izvršavanja”, čini retryjeve sigurnima i stvara konzistentan revizijski trag.
Model podataka za odobravanja i revizijske logove#
Koristite dvije tablice: jednu za trenutno stanje i jednu za append-only revizijske događaje.
| Tablica | Svrha | Ključna polja |
|---|---|---|
approval_requests | Kanonsko stanje odobravanja | approval_id, status, requested_by, requested_at, expires_at, decided_by, decided_at, decision_reason, version |
approval_events | Append-only revizijski trag | event_id, approval_id, event_type, actor, channel, payload, created_at |
Cijeli broj version pomaže kod optimističkog zaključavanja ako očekujete visoku konkurentnost.
ℹ️ Napomena: U okruženjima s naglašenim compliance zahtjevima, držite
approval_events.payloadkao JSON s raw Slack ili Teams callbackom, plus kontekst zahtjeva. To ubrzava istrage i smanjuje nagađanje.
# Korak 1: Kreirajte kanonski zapis odobravanja#
Krenite od bilo kojeg triggera: HTTP Webhook, raspored (schedule), CRM update ili event “new invoice”. Odmah kreirajte approvalId i spremite pending zahtjev.
Generirajte stabilan approvalId#
Ako je odobravanje vezano uz poslovni objekt poput računa, generirajte deterministički ključ idempotentnosti:
approvalId = invoiceId + ":" + stepName + ":" + version- Ili koristite UUID za jedinstvenost i dodatno spremite
dedupeKey
Cilj je: replayi i retryjevi ne smiju stvarati više odobravanja za istu akciju.
Primjer SQL sheme (Postgres)#
CREATE TABLE IF NOT EXISTS approval_requests (
approval_id TEXT PRIMARY KEY,
status TEXT NOT NULL,
requested_by TEXT,
requested_at TIMESTAMPTZ NOT NULL DEFAULT now(),
expires_at TIMESTAMPTZ NOT NULL,
decided_by TEXT,
decided_at TIMESTAMPTZ,
decision_reason TEXT,
version INT NOT NULL DEFAULT 0
);
CREATE TABLE IF NOT EXISTS approval_events (
event_id BIGSERIAL PRIMARY KEY,
approval_id TEXT NOT NULL,
event_type TEXT NOT NULL,
actor TEXT,
channel TEXT,
payload JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_approval_events_approval_id
ON approval_events (approval_id);Umetnite zahtjev i prvi revizijski događaj u n8n#
U n8n možete koristiti Postgres node ili HTTP node prema vašem internom API-ju. Obrazac je isti:
- 1Provjerite postoji li već odobravanje za isti dedupe key
- 2Ako ne postoji, umetnite novi
PENDINGzahtjev - 3Umetnite event
REQUESTED
Ako ovo radite direktno u SQL-u, držite operaciju atomarnom. Idealno je sve u jednoj transakciji.
💡 Savjet: Ako odobravanja pokreću skupe downstream radnje, nemojte ih započinjati dok odobravanje nije konačno. Spremite input payload u bazu ili object storage i nastavite tek nakon odobrenja.
# Korak 2: Pošaljite zahtjeve za odobravanje u Slack ili Teams#
Odobravateljima treba jasan kontekst i siguran način odlučivanja. Poruka treba uključivati:
- Što se odobrava i zašto je važno
- Utjecaj odobravanja
- Link na izvorni zapis u vašem sustavu
- Kratki TTL, plus što se događa na timeout
- Jedinstveni
approvalIdugrađen u action buttone ili callback URL
Obrazac Slack poruke#
Slack podržava interaktivne komponente. U praksi možete implementirati odobravanja slanjem poruke s dva gumba i usmjeravanjem klikova na webhook.
| Element | Vrijednost |
|---|---|
| Kanal | #ops-approvals ili privatna grupa |
| Gumbi | Approve, Reject |
| Callback uključuje | approvalId, action, actorSlackId |
| Sigurnost | Provjerite Slack signature na svom webhooku |
Obrazac Teams adaptive card#
Teams koristi adaptive cards s action submit. Callback također mora sadržavati approvalId i akciju.
E-mail kao fallback#
E-mail bi trebao biti univerzalni fallback, posebno za rukovoditelje koji ne žive u Slacku ili Teamsu.
Praktičan pristup je uključiti dva potpisana linka:
- Approve link: vodi na vaš webhook endpoint s
approvalIdi kratko-živućim tokenom - Reject link: isto, ali
action=reject
Neka linkovi budu vremenski ograničeni kako biste smanjili rizik.
# Korak 3: Implementirajte pattern čekanja bez krhkih dugih pauza#
Postoje dva česta načina da “čekate odobrenje” u n8n:
- 1Wait node s resume webhookom
- 2Decoupled callback gdje se originalni workflow završi, a zaseban workflow nastavi
Za većinu timova, decoupling je pouzdaniji u mjerilu jer izbjegavate dugotrajna izvršavanja i možete neovisno retryati callback putanju.
Preporuka: decoupled callback s workflowom za nastavak#
Gradite dva workflowa:
- Workflow A: kreira zahtjev za odobravanje, šalje obavijesti, zakazuje podsjetnike i završava
- Workflow B: prima callbackove, validira, upisuje odluku i pokreće sljedeći korak
Taj sljedeći korak može biti:
- Pozivanje trećeg workflowa preko Execute Workflow
- Objavljivanje u queue
- Ažuriranje zapisa koji triggera drugu automatizaciju
Zašto je ovo važno#
Duga čekanja povećavaju operativnu složenost. Ako se vaš n8n instance restarta, nadogradi ili udari u execution limite, odobravanje može nestati ako nije spremljeno izvan n8n-a.
# Korak 4: Dodajte timeoute, podsjetnike i eskalacijske puteve#
Odobravanja u stvarnom životu propadaju iz dosadnih razloga: ljudi su na sastancima, notifikacije se zakopaju, a kanali su mutani. Treba vam predvidljiv ritam.
Definirajte SLA za odobravanja#
Odaberite ga prema poslovnom utjecaju:
| Tip odobravanja | Kadenca podsjetnika | Eskalacija | Konačni timeout |
|---|---|---|---|
| Operativna promjena | 10 min, 30 min | Voditelj tima nakon 45 min | 60 do 120 min |
| Financijsko plaćanje | 2 sata, 8 sati | CFO delegate nakon 12 sati | 24 do 48 sati |
| Compliance iznimka | Dnevno | Compliance lead drugi dan | 3 do 7 dana |
Implementacijski obrazac u n8n#
Koristite reminder workflow pogonjen schedulerom:
- 1Cron se izvršava svakih 5 minuta
- 2Querya
approval_requestsgdje jestatus = PENDINGiexpires_atnije prošao - 3Provjerava proteklo vrijeme i šalje podsjetnike kad se prijeđu pragovi
- 4Eskalira prema široj grupi ili menadžeru kad se prijeđu pragovi eskalacije
- 5Označava zahtjeve kao
TIMED_OUTkada jenow()nakonexpires_at
Svaki podsjetnik i eskalaciju spremite kao event.
Primjer queryja za podsjetnike#
SELECT approval_id, requested_at, expires_at
FROM approval_requests
WHERE status = 'PENDING'
AND expires_at > now();Od tamo izračunajte proteklo vrijeme u n8n Function nodeu ili to odradite u SQL-u s now() - requested_at.
⚠️ Upozorenje: Nemojte slati podsjetnike samo na temelju “last reminder time” koji je spremljen isključivo u n8n execution data. Perzistirajte timestampove podsjetnika u bazi, ili ćete nakon restarta ili redeploya slati podsjetnike ponovno.
Eskalacijske strategije koje funkcioniraju#
- Eskalirajte u drugi kanal, ne samo više pingova u istom kanalu
- Eskalirajte sa sažetkom i jednim action linkom
- Eskalirajte samo jednom po razini da smanjite šum
Praktičan put:
- 1Podsjetnik originalnom odobravatelju
- 2Eskalacija na
#on-callili voditelja tima - 3Konačna eskalacija na e-mail uz obavijest “timeout će automatski odbiti”
Ako je auto-approve prihvatljiv, dokumentirajte to eksplicitno u poruci i u revizijskom tragu.
# Korak 5: Izgradite endpoint za odluku i sigurno spremite konačne odluke#
Svi kanali trebaju konvergirati u jedan handler za odluku. Handler mora biti:
- Autentificiran i otporan na manipulaciju
- Idempotentan
- Siguran za konkurentnost
- Prijateljski za audit
Pravila odlučivanja#
| Pravilo | Ponašanje |
|---|---|
| Prva konačna odluka pobjeđuje | APPROVED ili REJECTED zaključava zahtjev |
| Kasnije odluke se ignoriraju | Vratite odgovor s trenutnim statusom |
| Timeouts stvaraju konačni status | TIMED_OUT je konačan |
| Opcionalno “revise and resubmit” | Kreira novi approvalId i povezuje s prethodnim |
Implementirajte idempotentnost i sprječavanje duplikata#
Dupla odobravanja se događaju jer:
- Slack retrya callbackove na non-200 odgovorima
- Korisnici više puta kliknu gumbe
- Dva odobravatelja reagiraju u isto vrijeme
- Vaš workflow retrya nakon prolaznih grešaka
Zaštita je jedan atomarni update:
- Ažurirajte zahtjev samo ako je
status = PENDING - Ako update zahvati 0 redaka, već je odlučeno
Primjer Postgres updatea:
UPDATE approval_requests
SET status = $1,
decided_by = $2,
decided_at = now(),
decision_reason = $3,
version = version + 1
WHERE approval_id = $4
AND status = 'PENDING';Zatim provjerite broj redaka:
- 1 redak ažuriran znači da je odluka prihvaćena
- 0 redaka ažurirano znači ignorirati i vratiti postojeći status
Zabilježite audit evente za svaku interakciju#
Minimalno spremite:
| Tip eventa | Kada se događa | Zašto je važno |
|---|---|---|
REQUESTED | Odobravanje kreirano | Dokazuje da je proces započeo |
NOTIFIED | Slack ili Teams ili e-mail poslan | Dokazuje da je stiglo odobravateljima |
REMINDER_SENT | Podsjetnik poslan | Pokazuje provedbu SLA-a |
ESCALATED | Eskalacija poslana | Pokazuje governance |
DECISION_RECEIVED | Callback primljen | Pokazuje tko je odgovorio i kojim kanalom |
DECISION_ACCEPTED | Prva konačna odluka spremljena | Konačni zapis autoriteta |
DECISION_IGNORED | Dupla odluka | Pokazuje rukovanje duplikatima |
TIMED_OUT | Odobravanje isteklo | Objašnjava downstream ponašanje |
# Korak 6: Implementirajte Slack i e-mail callbackove u n8n#
Workflow za Slack interactive callback#
Workflow B počinje s Webhook trigger endpointom. Trebao bi:
- 1Provjeriti signature zahtjeva (najbolje kroz API gateway ili vaš backend)
- 2Parsirati
approvalIdiaction - 3Upisati
DECISION_RECEIVEDuapproval_events - 4Izvesti uvjetni update kako bi se spremila konačna odluka
- 5Odgovoriti Slacku s ishodom
Odgovor držite brzim. Slack očekuje brzi 200.
Ako je provjera signaturea preteška unutar n8n-a, stavite tanki verification sloj ispred i proslijedite verificirane payloade.
Workflow za e-mail approval link#
Za e-mail linkove, nemojte se oslanjati na “skrivenost”. Koristite potpisani token.
Strategija tokena:
- Generirajte kratko-živući token po akciji: approve token i reject token
- Spremite hash tokena u bazu s istekom
- Na klik validirajte token, pa primijenite odluku
Čak i ako se link proslijedi, istek smanjuje rizik.
Minimalni primjer validacije tokena u Node stilu#
Ovu logiku koristite u svom servisu ili po potrebi u n8n Code nodeu.
const crypto = require('crypto');
function hashToken(token) {
return crypto.createHash('sha256').update(token).digest('hex');
}Spremite hash, ne raw token.
💡 Savjet: Kada su odobravanja osjetljiva, zahtijevajte ponovnu autentifikaciju. E-mail linkovi mogu odvesti korisnika na jednostavnu approval stranicu zaštićenu SSO-om, koja zatim poziva vaš decision webhook.
# Korak 7: Nastavite poslovni proces nakon odobrenja#
Kad zahtjev dođe do konačnog stanja, triggerajte downstream akciju:
- Ako je odobreno: izvedite promjenu, pošaljite dokument, deployajte, platite račun
- Ako je odbijeno: obavijestite podnositelja i zaustavite
- Ako je isteklo: primijenite politiku, obično odbijte i obavijestite
Robustan mehanizam nastavka je emitirati poruku:
| Metoda | Kada koristiti | Prednosti | Nedostaci |
|---|---|---|---|
| Execute Workflow | Svi-in-n8n setup | Jednostavno | Čvršće povezivanje |
| Webhook prema internom API-ju | Kada je poslovna logika u vašoj aplikaciji | Jaka validacija | Zahtijeva backend |
| Queue publish | Veliki volumen | Otporno | Više infrastrukture |
Za operativnu otpornost kombinirajte ovo s obrascima iz n8n error handling, retries, and alerting. Vaš workflow odobravanja treba “glasno” pasti kada ne može logirati evente ili spremiti odluke.
# Korak 8: Izvještavanje i export revizijskog traga#
Revizijski tragovi su korisni samo ako ih možete brzo queryati tijekom incidenta ili audita.
Praktični queryji koje biste trebali podržati#
| Pitanje | Ideja za query |
|---|---|
| Tko je odobrio određenu akciju | Lookup po approval_id i join s eventima |
| Koliko traju odobravanja | decided_at - requested_at za APPROVED i REJECTED |
| Koja odobravanja najčešće istječu | Count po tipu workflowa i TIMED_OUT |
| Učinkovitost podsjetnika | Usporedite odluke nakon reminder eventova |
Ako spremite polje workflow_name ili approval_type na approval_requests, reporting postaje puno lakši.
Primjer: query za vrijeme ciklusa odobravanja#
SELECT
status,
percentile_cont(0.5) WITHIN GROUP (ORDER BY decided_at - requested_at) AS p50,
percentile_cont(0.9) WITHIN GROUP (ORDER BY decided_at - requested_at) AS p90
FROM approval_requests
WHERE decided_at IS NOT NULL
GROUP BY status;Ovo vam daje median i p90 vremena odobravanja, što su korisne SLA metrike.
🎯 Ključna poruka: Odobravanja tretirajte kao mjerljiv proces. Kad pratite p50 i p90 cycle time, možete podesiti pragove podsjetnika i eskalacije na temelju podataka, umjesto nagađanja.
# Česte zamke i kako ih izbjeći#
- 1
Oslanjanje na jednu Slack poruku kao system of record
Slack je kanal, ne baza podataka. Uvijek spremite stanje i odluke izvan Slacka. - 2
Bez idempotentnosti, što vodi do duplih odobravanja
Neka finalni update odluke bude uvjetovan sstatus = PENDING. - 3
Timeout logika živi samo u jednom izvršavanju
Koristite cron-based enforceer za podsjetnike i timeoute koji čita iz baze. - 4
Bez logiranja “decision ignored”
Ako ne logirate duplikate, trošit ćete vrijeme na debugiranje prijava tipa “zašto je odobrilo dvaput”. - 5
Bez eskalacijskog puta, samo podsjetnici
Eskalacija treba promijeniti primatelja, ne samo povećati učestalost poruka.
# Praktični nacrt: produkcijski approval flow koji možete kopirati#
Evo konkretnog nacrta koji se mapira na n8n workflowe.
| Workflow | Trigger | Odgovornosti |
|---|---|---|
| A: Kreiraj odobravanje | Poslovni event | Kreiraj zahtjev, spremi referencu na payload, notificiraj, upiši REQUESTED i NOTIFIED |
| B: Zaprimanje odluke | Webhook | Validiraj, upiši DECISION_RECEIVED, atomarno spremi odluku, obavijesti podnositelja |
| C: Podsjetnici i timeouts | Cron | Šalji podsjetnike, eskaliraj, označi TIMED_OUT, upisuj evente |
| D: Nastavi proces | Execute Workflow ili webhook | Izvedi odobrenu akciju, upiši ACTION_EXECUTED event |
Ako interno gradite templating, standardizirajte ova četiri workflowa. To smanjuje održavanje i čini odobravanja konzistentnima među timovima. Naš n8n workflow templates guide pokazuje kako ih držati ponovo upotrebljivima bez pretvaranja u neodrživ nered.
# Ključne poruke#
- Spremite stanje odobravanja u bazu podataka i tretirajte Slack, Teams i e-mail kao kanale dostave, ne kao izvor istine.
- Spriječite dupla odobravanja atomarnim updateom koji uspijeva samo kada je status
PENDING, i eksplicitno logirajte ignorirane duplikate. - Implementirajte podsjetnike, eskalaciju i timeoute s cron-driven enforceer workflowom koji querya pending odobravanja iz baze.
- Održavajte append-only tablicu
approval_eventsza stvarni revizijski trag, uključujući notifikacije, podsjetnike, odluke i timeoute. - Mjerite performanse odobravanja pomoću p50 i p90 vremena ciklusa te podešavajte pragove podsjetnika na temelju podataka, a ne intuicije.
# Zaključak#
Produkcijski n8n workflow za odobravanje je stroj stanja s trajnom pohranom, višestrukim kanalima odgovora i strogim pravilima odlučivanja. Kad dodate timeoute, podsjetnike, eskalacije i audit logove, dobivate odobravanja koja su pouzdana pod retryjevima i transparentna pod povećalom.
Ako želite da Samioda implementira workflowe za odobravanje end-to-end, uključujući Slack ili Teams aplikacije, e-mail fallback, revizijske tragove u bazi i operativno alertanje, kontaktirajte nas putem Samioda Automation.
FAQ
Više iz kategorije Poslovna automatizacija
Sve →Lead-to-Cash automatizacija s n8n: od slanja obrasca do računa (end-to-end workflow)
Praktičan blueprint za lead-to-cash automatizaciju u n8n: prikupljanje leadova, obogaćivanje podataka, usmjeravanje prodaji, kreiranje dealova, generiranje ugovora i pokretanje fakturiranja.
Kako samostalno hostati n8n s Dockerom u 2026.: sigurnost, backupi i postavljanje okruženja
Praktičan vodič korak-po-korak za self host n8n s Docker Composeom, uključujući trajnu pohranu, upravljanje tajnama, SSL, izolaciju mreže te postupke backupa i vraćanja.
n8n rukovanje pogreškama u produkciji: ponovni pokušaji, dead-letter tokovi i alertiranje
Praktičan vodič za rukovanje pogreškama u n8n-u u produkciji — uključujući strategije ponovnih pokušaja, idempotentnost, obrasce djelomičnih neuspjeha, dead-letter tokove te Slack ili email alertiranje koje možete ponovno koristiti.
Trebate pomoć s projektom?
Gradimo prilagođena rješenja koristeći tehnologije iz ovog članka. Senior tim, fiksne cijene.
Povezani članci
Kako samostalno hostati n8n s Dockerom u 2026.: sigurnost, backupi i postavljanje okruženja
Praktičan vodič korak-po-korak za self host n8n s Docker Composeom, uključujući trajnu pohranu, upravljanje tajnama, SSL, izolaciju mreže te postupke backupa i vraćanja.
n8n rukovanje pogreškama u produkciji: ponovni pokušaji, dead-letter tokovi i alertiranje
Praktičan vodič za rukovanje pogreškama u n8n-u u produkciji — uključujući strategije ponovnih pokušaja, idempotentnost, obrasce djelomičnih neuspjeha, dead-letter tokove te Slack ili email alertiranje koje možete ponovno koristiti.
n8n webhook vodič: Automatizirajte bilo što uz webhooks (2026 korak-po-korak)
Praktičan n8n webhook vodič koji pokazuje kako hvatati webhook događaje, transformirati podatke, obrađivati pogreške i isporučiti pouzdane automatizacije uz stvarne primjere.