Poslovna automatizacija
n8nAutomatizacijaOdobravanjaSlackMicrosoft TeamsE-mailRevizijski tragDizajn workflowa

Izrada n8n workflowa za odobravanje u 2026.: Slack ili Teams, e-mail i revizijski tragovi

AO
Adrijan Omićević
·14 min čitanja

# Š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#

ZahtjevPreporukaNapomene
n8n1.30+Podržava moderne nodeove i stabilno ponašanje izvršavanja
Slack ili Teams appKonfiguriranSlack interaktivne poruke ili Teams adaptive cards
E-mail providerSMTP ili APIZa fallback i eskalaciju
Baza podatakaPreporučen PostgresZa revizijski trag i deduplikaciju. SQLite radi za manja okruženja
Javni webhook URLDaPotreban 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:

  1. 1
    Kreirajte zapis odobravanja sa statusom PENDING i approvalId
  2. 2
    Obavijestite odobravatelje u jednom ili više kanala
  3. 3
    Pričekajte callback događaj koji nosi approvalId i odluku
  4. 4
    Validirajte i spremite prvu konačnu odluku
  5. 5
    Nastavite poslovni proces ovisno o APPROVED ili REJECTED

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.

TablicaSvrhaKljučna polja
approval_requestsKanonsko stanje odobravanjaapproval_id, status, requested_by, requested_at, expires_at, decided_by, decided_at, decision_reason, version
approval_eventsAppend-only revizijski tragevent_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.payload kao 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)#

SQL
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:

  1. 1
    Provjerite postoji li već odobravanje za isti dedupe key
  2. 2
    Ako ne postoji, umetnite novi PENDING zahtjev
  3. 3
    Umetnite 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 approvalId ugrađ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.

ElementVrijednost
Kanal#ops-approvals ili privatna grupa
GumbiApprove, Reject
Callback uključujeapprovalId, action, actorSlackId
SigurnostProvjerite 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 approvalId i 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:

  1. 1
    Wait node s resume webhookom
  2. 2
    Decoupled 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 odobravanjaKadenca podsjetnikaEskalacijaKonačni timeout
Operativna promjena10 min, 30 minVoditelj tima nakon 45 min60 do 120 min
Financijsko plaćanje2 sata, 8 satiCFO delegate nakon 12 sati24 do 48 sati
Compliance iznimkaDnevnoCompliance lead drugi dan3 do 7 dana

Implementacijski obrazac u n8n#

Koristite reminder workflow pogonjen schedulerom:

  1. 1
    Cron se izvršava svakih 5 minuta
  2. 2
    Querya approval_requests gdje je status = PENDING i expires_at nije prošao
  3. 3
    Provjerava proteklo vrijeme i šalje podsjetnike kad se prijeđu pragovi
  4. 4
    Eskalira prema široj grupi ili menadžeru kad se prijeđu pragovi eskalacije
  5. 5
    Označava zahtjeve kao TIMED_OUT kada je now() nakon expires_at

Svaki podsjetnik i eskalaciju spremite kao event.

Primjer queryja za podsjetnike#

SQL
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:

  1. 1
    Podsjetnik originalnom odobravatelju
  2. 2
    Eskalacija na #on-call ili voditelja tima
  3. 3
    Konač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#

PraviloPonašanje
Prva konačna odluka pobjeđujeAPPROVED ili REJECTED zaključava zahtjev
Kasnije odluke se ignorirajuVratite odgovor s trenutnim statusom
Timeouts stvaraju konačni statusTIMED_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:

SQL
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 eventaKada se događaZašto je važno
REQUESTEDOdobravanje kreiranoDokazuje da je proces započeo
NOTIFIEDSlack ili Teams ili e-mail poslanDokazuje da je stiglo odobravateljima
REMINDER_SENTPodsjetnik poslanPokazuje provedbu SLA-a
ESCALATEDEskalacija poslanaPokazuje governance
DECISION_RECEIVEDCallback primljenPokazuje tko je odgovorio i kojim kanalom
DECISION_ACCEPTEDPrva konačna odluka spremljenaKonačni zapis autoriteta
DECISION_IGNOREDDupla odlukaPokazuje rukovanje duplikatima
TIMED_OUTOdobravanje istekloObjaš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:

  1. 1
    Provjeriti signature zahtjeva (najbolje kroz API gateway ili vaš backend)
  2. 2
    Parsirati approvalId i action
  3. 3
    Upisati DECISION_RECEIVED u approval_events
  4. 4
    Izvesti uvjetni update kako bi se spremila konačna odluka
  5. 5
    Odgovoriti 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.

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.

JavaScript
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:

MetodaKada koristitiPrednostiNedostaci
Execute WorkflowSvi-in-n8n setupJednostavnoČvršće povezivanje
Webhook prema internom API-juKada je poslovna logika u vašoj aplikacijiJaka validacijaZahtijeva backend
Queue publishVeliki volumenOtpornoViš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#

PitanjeIdeja za query
Tko je odobrio određenu akcijuLookup po approval_id i join s eventima
Koliko traju odobravanjadecided_at - requested_at za APPROVED i REJECTED
Koja odobravanja najčešće istječuCount po tipu workflowa i TIMED_OUT
Učinkovitost podsjetnikaUsporedite 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#

SQL
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. 1

    Oslanjanje na jednu Slack poruku kao system of record
    Slack je kanal, ne baza podataka. Uvijek spremite stanje i odluke izvan Slacka.

  2. 2

    Bez idempotentnosti, što vodi do duplih odobravanja
    Neka finalni update odluke bude uvjetovan s status = PENDING.

  3. 3

    Timeout logika živi samo u jednom izvršavanju
    Koristite cron-based enforceer za podsjetnike i timeoute koji čita iz baze.

  4. 4

    Bez logiranja “decision ignored”
    Ako ne logirate duplikate, trošit ćete vrijeme na debugiranje prijava tipa “zašto je odobrilo dvaput”.

  5. 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.

WorkflowTriggerOdgovornosti
A: Kreiraj odobravanjePoslovni eventKreiraj zahtjev, spremi referencu na payload, notificiraj, upiši REQUESTED i NOTIFIED
B: Zaprimanje odlukeWebhookValidiraj, upiši DECISION_RECEIVED, atomarno spremi odluku, obavijesti podnositelja
C: Podsjetnici i timeoutsCronŠalji podsjetnike, eskaliraj, označi TIMED_OUT, upisuj evente
D: Nastavi procesExecute Workflow ili webhookIzvedi 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_events za 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

Share
A
Adrijan OmićevićSamioda Team
All articles →

Trebate pomoć s projektom?

Gradimo prilagođena rješenja koristeći tehnologije iz ovog članka. Senior tim, fiksne cijene.