Integracija preko API-ja · 14 min čitanja
Tezga i n8n: 7 gotovih tokova za fiskalizaciju bez programera
Tezga eKasa i n8n se spajaju preko REST API-ja i odlaznih webhookova, pa fiskalni račun nastaje sam kad uplata legne, kad stigne porudžbina iz forme ili kad shop vrati robu. U tekstu je sedam gotovih tokova sa okidačem, čvorovima, JSON telom i spiskom onoga što najčešće pukne.
Tezga eKasa i n8n se povezuju preko REST API-ja i odlaznih webhookova, pa se fiskalizacija uklapa u tok koji već imaš: bankovni izvod, forma na sajtu, Google Sheets, SEF ili CRM. Za svaki tok ti trebaju API ključ, jedan čvor HTTP Request i pravilno popunjen JSON. Ispod je sedam tokova koje možeš da preslikaš bez programera.
- n8n zove Tezga API čvorom HTTP Request, a ključ ide u zaglavlje
X-Tezga-Api-Key. - Polje
externalIdje ključ idempotentnosti: ista porudžbina se fiskalizuje tačno jednom, koliko god puta tok ponovio zahtev. - Odgovor 202 znači da je Tezga primila zahtev, a V-PFR je trenutno nedostupan; Tezga sama ponavlja, ti ne šalješ novi zahtev.
- Odlazni webhook
racun.fiskalizovanvraća podatke u n8n, pa se CRM, tabela ili poruka pune bez ručnog rada. - Tokovi rade i za paušalce i za DOO; jedino SEF tok traži da je tvoja firma u sistemu e-faktura.
Šta ti treba pre prvog toka?
Tri stvari: nalog na Tezga eKasi, API ključ i n8n koji radi (cloud ili tvoja instanca, svejedno). Ključ praviš u kasi, u podešavanjima integracija. Počinje sa tzg_, ima 48 heksadecimalnih znakova posle toga i vidi se samo jednom pri pravljenju. Zato ga odmah upiši u n8n kao credential tipa „Header Auth” sa imenom zaglavlja X-Tezga-Api-Key. Po firmi možeš da imaš do 20 ključeva, pa napravi zaseban ključ za n8n i nazovi ga tako, da bi ga kasnije rotirao (rotacija je na 90 dana) bez gašenja drugih integracija.
Ako želiš da vežbaš bez posledica, uradi to na testnom nalogu. Okruženje je osobina naloga, ne ključa: testni nalog šalje račune u sandbox Poreske uprave (tamo nisu fiskalni), ili koristi tip računa „Обука” na produkciji, koji nosi napomenu „ОВО НИЈЕ ФИСКАЛНИ РАЧУН”. Kad tok proradi, samo zameniš credential ključem sa pravog naloga. Detaljan opis svih polja je na strani API za fiskalizaciju, a mašinski opis u OpenAPI dokumentu.
U svakom HTTP Request čvoru podesi: metod POST, URL https://pos.narbiz.com/api/integrations/order?provider=custom, telo kao JSON, i uključi opciju da čvor ne prekida tok na kodovima 4xx i 5xx (u n8n: „Continue on Fail” ili opcija „Never Error”), da bi sledeći IF čvor sam odlučio šta radi sa 202, 400 ili 429.
Tok 1: Uplata na izvodu pa fiskalni račun pa mejl kupcu
Ovo je tok za prodavca koji porudžbine drži u tabeli ili CRM-u, a kupci plaćaju na tekući račun po pozivu na broj. Ako predračun sa NBS IPS QR kodom izdaješ kroz Tezgu, ovo uparivanje kasa radi sama iz izvoda (opisano na strani novac, banka i naplata). n8n verzija ti treba kad porudžbine žive negde drugde.
Mokap n8n platna za tok 1: raspored pokreće čitanje transakcija, uparuje ih sa otvorenim porudžbinama i za svaku uparenu uplatu izdaje fiskalni račun.
Okidač i čvorovi
Okidač je Schedule Trigger na 30 minuta. Prvi HTTP Request čvor poziva GET /api/integrations/transactions i vraća bankovne transakcije koje je kasa učitala iz izvoda. Google Sheets čvor čita list sa otvorenim porudžbinama (kolone: poziv na broj, iznos, mejl kupca, stavke). Merge čvor u režimu spajanja po polju upari transakciju sa porudžbinom preko poziva na broj. Za svaku uparenu stavku HTTP Request čvor šalje POST na /api/integrations/order?provider=custom. Na kraju Google Sheets čvor upiše status „fiskalizovano” i broj računa iz odgovora.
JSON telo
{
"externalId": "izvod-2026-09-14-97-4410231",
"tipDokumenta": "racun",
"tok": "fiskalni",
"nacinPlacanja": "Prenos na račun",
"posaljiMejl": true,
"kupac": { "naziv": "Petar Petrović", "email": "petar@primer.rs" },
"stavke": [
{ "naziv": "Ručno rađena kožna torba", "sifra": "TB-01",
"kolicina": 1, "cenaSaPdv": 5900, "poreskaStopa": "Ђ" }
]
}
Za externalId uzmi nešto što se ne ponavlja i što potiče iz banke, na primer datum i broj transakcije. Tako je nemoguće da ista uplata dva puta proizvede račun, čak i ako tok krene dvaput u istom minutu. Poresku oznaku uzmi iz GET /api/integrations/tax-labels; firma koja nije u PDV-u koristi oznaku bez PDV-a, a ne „Ђ” iz primera.
Šta može da pukne
- Dva kupca uplate isti iznos bez poziva na broj. Merge ih ne razlikuje. Rešenje: poziv na broj obavezan na predračunu, a bez njega tok ne izdaje račun nego šalje tebi poruku za ručnu proveru.
- Kupac uplati manje od iznosa. Ne izdaje se račun na pun iznos; IF čvor poredi iznose i za razliku otvara zadatak.
- Izvod stigne sa zakašnjenjem, pa se tok „uhvati” tek sutradan. Račun se i dalje izdaje na dan kad je uplata viđena, što je tačno po Zakonu o fiskalizaciji: račun ide u trenutku prometa, a promet je isporuka ili naplata, šta pre nastupi.
Tok 2: Porudžbina iz forme pa račun pa Telegram poruka vlasniku
Za prodavca koji nema web shop, već formu na sajtu, u n8n-u (Form Trigger) ili u nekom alatu za forme koji zna da pošalje webhook. Ovaj tok prima porudžbinu, izdaje dokument i tebi šalje poruku da spakuješ paket.
Okidač i čvorovi
Okidač je Webhook čvor (ili n8n Form Trigger). Set čvor pretvara polja forme u oblik koji Tezga očekuje: ime, mejl, izabrani proizvod, količina, način plaćanja. IF čvor grana po načinu plaćanja: ako je pouzeće, izdaje se fiskalni račun sa načinom plaćanja „Prenos na račun” (novac stiže preko kurira na tvoj račun, nije gotovina); ako je uplata na račun, izdaje se predračun sa IPS QR kodom, a fiskalni račun nastaje kad uplata legne. HTTP Request čvor šalje zahtev, a Telegram čvor šalje tebi poruku sa imenom kupca, iznosom i brojem dokumenta.
JSON telo za pouzeće
{
"externalId": "forma-2026-09-15-000318",
"tipDokumenta": "racun",
"tok": "fiskalni",
"nacinPlacanja": "Prenos na račun",
"posaljiMejl": true,
"kupac": { "naziv": "Milica Jović", "email": "milica@primer.rs" },
"stavke": [
{ "naziv": "Sapun od kozjeg mleka", "sifra": "SAP-02",
"kolicina": 3, "cenaSaPdv": 650, "poreskaStopa": "Ђ" },
{ "naziv": "Dostava", "sifra": "DOST", "kolicina": 1,
"cenaSaPdv": 390, "poreskaStopa": "Ђ" }
]
}
Za predračun promeni tipDokumenta u predracun i dodaj pozivNaBroj. Bez poziva na broj API odbija predračun, i to je namerno: bez njega kasa kasnije ne bi mogla da upari uplatu sa izvoda. Kad koristiš pouzeće, razmisli da li račun izdaješ odmah ili tek kad kurir preda paket; o tome detaljno piše Trek u tekstu fiskalna kasa i pouzeće.
Šta može da pukne
- Forma dozvoli prazan mejl. Tezga račun izda, ali nema kome da ga pošalje. Rešenje: mejl obavezan na formi, a u Set čvoru validacija formata.
- Bot popuni formu 200 puta. Dobio bi 200 računa. Rešenje: zaštita forme (captcha ili honeypot polje) pre n8n-a, plus IF čvor koji odbacuje porudžbine bez validne stavke.
- Telegram čvor padne posle uspešnog računa. Račun postoji, poruka nije stigla. Zato Telegram stavi iza računa, nikad ispred, i uključi n8n ponavljanje samo za taj čvor.
Tok 3: Dnevni promet u Google Sheets
Ovaj tok ne pravi račune, on ih beleži. Za kraj dana dobijaš red sa brojem računa, iznosom po načinu plaćanja i brojem refundacija. Tezga ti to nudi i u kasi kroz izveštaje za knjigovođu sa CSV izvozom i slanjem na raspored, ali ako već vodiš tabelu za sopstvene potrebe, ovako je puniš bez kucanja.
Okidač i čvorovi
Dva okidača u dva toka. Prvi je Webhook čvor koji prima odlazni webhook racun.fiskalizovan, refundacija.izvrsena i storno.izvrsen iz Tezge, pa Google Sheets čvor za svaki događaj doda red u list „Dokumenti” (datum, tip, broj, iznos, način plaćanja, externalId). Drugi tok ima Schedule Trigger u 23:55, čita list „Dokumenti” za taj dan, Code čvor sabere po tipu i načinu plaćanja, a Google Sheets čvor upiše red u list „Dnevni promet”. Odlazni webhook uključuješ u kasi: Podešavanja, Integracije, Odlazna obaveštenja.
Primer reda koji Code čvor pravi
{
"datum": "2026-09-15",
"racuna": 41,
"refundacija": 2,
"prenosNaRacun": 118450,
"platnaKartica": 23900,
"gotovina": 0,
"ukupno": 142350
}
Šta može da pukne
- Webhook stigne dvaput (mreža, ponavljanje). Tabela dobije dupli red, a zbir bude pogrešan. Rešenje: pre dodavanja reda proveri da li već postoji red sa istim
X-Tezga-Deliveryzaglavljem, to je identifikator isporuke namenjen baš tome. - Vremenska zona. n8n instanca na UTC-u će račun izdat u 00:30 po Beogradu upisati u prethodni dan. Podesi n8n na
Europe/Belgradeu podešavanjima instance, ne u pojedinačnom toku. - Tabela ne sme da bude knjigovodstveni izvor. Zvanični izveštaj i dalje ide iz kase, jer tabela ne zna za dokumente koji su nastali dok je n8n bio ugašen.
Tok 4: Povraćaj u shopu pa refundacija
Kupac vrati robu, shop (WooCommerce, Shopify ili neki treći sa webhookom) označi porudžbinu kao vraćenu, a n8n izda refundaciju u kasi. Za WooCommerce i Shopify Tezga ima dvosmernu vezu bez n8n-a, ali tok ti treba za shopove koji nemaju gotovu vezu ili kad povraćaj odobrava neko u CRM-u, a ne u shopu.
Okidač i čvorovi
Webhook čvor prima događaj povraćaja. Set čvor izvuče externalId originalne porudžbine i stavke koje se vraćaju. HTTP Request čvor zove POST /api/integrations/refund. IF čvor proverava kod: 200 ide u Google Sheets ili mejl kupcu, 202 čeka (Tezga ponavlja), 400 ide tebi na Telegram.
JSON telo za delimičan povraćaj
{
"vrsta": "refundacija",
"externalId": "woo-10233",
"stavke": [
{ "naziv": "Majica pamučna M crna", "sifra": "MAJ-M-CRNA",
"kolicina": 1, "cenaSaPdv": 2490, "poreskaStopa": "Ђ" }
]
}
Original se traži po documentId ili po externalId porudžbine, pa ti ne treba ništa iz kase, dovoljno je ono što shop već zna. Ako je original izdat bez kupca, refundacija traži kupacIdBroj, jer refundacija po propisu nosi identifikaciju kupca kome se novac vraća. Razlika između storna i refundacije je objašnjena na strani storno i refundacija fiskalnog računa.
Šta može da pukne
- Shop pošalje webhook i za delimičan i za ceo povraćaj iste porudžbine. Tezga će drugi zahtev primeniti na preostale stavke, ali ako je zbir veći od originala, vraća 400. Rešenje: IF čvor koji proverava da li je porudžbina već refundirana u celosti.
- Kupac vraća robu, ali zadržava pravo na zamenu. Zamena veličine nije refundacija pa račun; to je refundacija stare stavke i novi račun za novu, ili zamena bez novca ako je cena ista, kako te uputi knjigovođa.
- Rok. Po Zakonu o zaštiti potrošača kupac na daljinu ima pravo na odustanak 14 dana; ako shop dozvoljava duže, kasa to ne ograničava, ali izvod mora da pokaže povraćaj novca.
Tok 5: B2B porudžbina pa e-faktura na SEF
Kupac na sajtu unese PIB. Tezga takav račun vodi kao B2B: ako ide fiskalni račun, nosi Id kupca 10:PIB; ako kupac i ti imate obavezu SEF-a, ide e-faktura u Sistem e-faktura. Tok bira polje tok: sef, fiskalni ili fiskalni_i_sef. Koji je pravi za tvoju firmu, to ti kaže knjigovođa; kasa podržava sva tri. SEF tok je deo paketa Biznis, koji je i opisan na strani fakture, SEF i otpremnice.
Okidač i čvorovi
Isti Webhook čvor kao u toku 2, ali IF čvor grana po tome da li je polje PIB popunjeno. Kad jeste, Set čvor dodaje kupac.pib i menja tok u sef. Opciono, HTTP Request čvor prvo proveri PIB na sajtu APR-a ručno (n8n nema zvanični APR čvor, pa je ovo ručna provera pre prvog računa za novog kupca).
JSON telo
{
"externalId": "b2b-2026-09-15-0007",
"tipDokumenta": "racun",
"tok": "sef",
"nacinPlacanja": "Prenos na račun",
"posaljiMejl": true,
"kupac": { "naziv": "Primer DOO", "pib": "123456789",
"email": "racuni@primer-doo.rs" },
"stavke": [
{ "naziv": "Kancelarijski papir A4, kutija", "sifra": "PAP-A4",
"kolicina": 10, "cenaSaPdv": 3600, "poreskaStopa": "Ђ" }
]
}
Šta može da pukne
- PIB sa slovnom greškom prođe na sajtu, a SEF odbije fakturu. Rešenje: u Set čvoru proveri da PIB ima tačno 9 cifara, a nove kupce prvi put proveri ručno.
- Kupac unese PIB, ali plaća karticom kao fizičko lice. Onda nije e-faktura nego fiskalni račun sa Id kupca 10:PIB. Ostavi mogućnost da tok pošalje
fiskalnikad je plaćanje karticom. - Paušalac van PDV-a koji nema obavezu SEF-a. Njemu ovaj tok najčešće ne treba, osim za javni sektor; pročitaj e-fakture za IT paušalce.
Tok 6: Rezervacija sa kaparom pa avansni račun
Salon, apartman, škola jezika ili fotograf: kupac rezerviše termin i plati kaparu unapred. Po Pravilniku o vrstama fiskalnih računa, avansni račun se izdaje kad se novac primi pre prometa, a pri isporuci konačni račun sa pozivom na avansni. Tezga zna oba koraka, a n8n ih pokreće iz sistema za rezervacije.
Okidač i čvorovi
Okidač je webhook iz sistema za rezervacije (većina alata za zakazivanje šalje webhook na novu rezervaciju i na promenu statusa). Set čvor pravi stavku „Kapara za termin” sa iznosom kapare. HTTP Request čvor zove POST /api/integrations/advance. Kad se termin obavi, drugi webhook (status „obavljeno”) pokreće zatvaranje avansa istim endpointom, sa pozivom na avansni dokument; tačan oblik zatvaranja pogledaj u OpenAPI opisu, jer zavisi od toga da li konačan iznos prelazi kaparu.
JSON telo za avans
{
"externalId": "rez-2026-10-03-1400-ana",
"nacinPlacanja": "Prenos na račun",
"posaljiMejl": true,
"kupac": { "naziv": "Ana Marković", "email": "ana@primer.rs" },
"stavke": [
{ "naziv": "Kapara za termin 03.10.2026 u 14:00", "sifra": "KAP",
"kolicina": 1, "cenaSaPdv": 3000, "poreskaStopa": "Ђ" }
]
}
Šta može da pukne
- Kupac otkaže, a kapara se zadržava. Avansni račun ostaje, a šta se izdaje za zadržanu kaparu zavisi od tvog ugovora sa kupcem; proveri sa knjigovođom pre nego što tok automatizuje otkazivanja.
- Kupac otkaže i kapara se vraća. Onda ide refundacija avansnog računa, tok 4, sa
externalIdrezervacije. - Dve rezervacije istog kupca u istom danu dobiju isti
externalId. Ubaci vreme termina u ključ, kao u primeru.
Sve o avansu u kasi, sa primerima za kaparu, ima na strani avansni račun.
Tok 7: Odlazni webhook racun.fiskalizovan pa CRM
Do sada je n8n zvao Tezgu. Ovde Tezga zove n8n. Svaki fiskalizovani račun, greška, refundacija ili storno može da pokrene tok koji upisuje kupca u CRM, otvara zadatak ili šalje poruku.
Mokap n8n platna za tok 7: Tezga šalje događaj, n8n proverava HMAC potpis, a tek onda upisuje kupca u CRM i vraća 200.
Okidač i čvorovi
Okidač je Webhook čvor u režimu „Respond when last node finishes”, sa opcijom da prima sirovo telo (Raw Body), jer se potpis računa nad sirovim telom, ne nad parsiranim JSON-om. Crypto čvor računa HMAC sha256 nad telom sa tajnom koju si upisao u kasi pri podešavanju odlaznog obaveštenja. IF čvor poredi rezultat sa zaglavljem X-Tezga-Signature (oblik sha256=...). Ako je potpis tačan, CRM čvor (HubSpot, Pipedrive, ili običan HTTP Request ka tvom CRM-u) upiše kupca, iznos i broj računa. Ako nije, Respond to Webhook čvor vraća 401 i ništa se ne upisuje.
Primer onoga što n8n šalje u CRM
{
"dogadjaj": "racun.fiskalizovan",
"isporukaId": "vrednost iz X-Tezga-Delivery",
"kupacEmail": "petar@primer.rs",
"iznos": 5900,
"napomena": "Fiskalni račun izdat, PDF poslat kupcu"
}
Ako u događaju nemaš sve što ti treba, pozovi GET /api/integrations/documents/{id}: vraća stanje dokumenta, PFR broj i javniPdfUrl, adresu javnog PDF-a koju možeš da upišeš u CRM ili da pošalješ kupcu Viberom.
Šta može da pukne
- Isporuka stigne dvaput. Pre upisa u CRM proveri da li
X-Tezga-Deliveryveć postoji u tvojoj evidenciji (n8n Data Table ili Google Sheets list). Ako postoji, vrati 200 i ne radi ništa. - n8n instanca je bila ugašena. Tezga ponavlja isporuku, ali za dugačke prekide pokreni jednokratni tok koji čita dokumente po
externalIdi dopuni CRM. - Potpis „ne štima” jer je n8n parsirao telo pa ga ponovo serijalizovao. Uključi Raw Body i računaj potpis nad njim.
Kako Tezga obrađuje zahtev iz n8n-a?
Bez obzira na to koji tok koristiš, put zahteva je isti. n8n pošalje JSON, Tezga proveri ključ i telo, potraži postojeći dokument sa istim externalId, i ako ga nema, pošalje račun na V-PFR (virtuelni procesor fiskalnih računa Poreske uprave). PFR vrati broj računa, Tezga upiše dokument, pošalje mejl kupcu ako je posaljiMejl uključen, i pokrene odlazni webhook. Sve to je opisano i na strani web shop, sajt i API.
Put jednog zahteva: n8n šalje JSON, Tezga proverava ključ i idempotentnost, V-PFR vraća broj računa, kupac dobija mejl, a n8n dobija odlazni webhook.
| HTTP kod | Šta znači | Šta n8n radi |
|---|---|---|
| 200 | Dokument izdat, u odgovoru su broj i identifikator | Nastavlja tok, upisuje broj računa |
| 202 | Primljeno, V-PFR trenutno nedostupan, Tezga ponavlja sama | Ne šalje novi zahtev; čeka webhook racun.fiskalizovan |
| 400 | Loš zahtev (polje, stopa, poziv na broj, više od 500 stavki) | Šalje poruku vlasniku sa tekstom greške |
| 401 | Ključ neispravan, istekao ili vezan za drugi IP | Zaustavlja tok, obaveštava vlasnika |
| 402 | Kredit u paketu „Po računu” potrošen | Obaveštava vlasnika da dopuni kredit |
| 429 | Prekoračen broj zahteva | Čeka i ponavlja sa istim externalId |
Šta najčešće pukne i kako se ispravlja?
| Greška | Posledica | Rešenje |
|---|---|---|
Nasumičan externalId pri svakom pokušaju | Ponovljen zahtev pravi drugi račun | Ključ izvedi iz izvora (broj porudžbine, transakcije, rezervacije) |
| Ponavljanje zahteva posle 202 | Nepotreban saobraćaj, isti dokument | Na 202 čekaj webhook, ne šalji novi POST |
| Poziv API-ja sa sajta iz pregledača | Ključ vidljiv svakom posetiocu | Ključ živi samo u n8n-u ili na serveru |
| Pouzeće kao „Gotovina” | Pogrešan način plaćanja na računu | Pouzeće je „Prenos na račun”, novac stiže preko kurira na račun |
| Dostava bez stavke | Iznos računa manji od naplaćenog | Dostava kao zasebna stavka sa svojom stopom |
| UTC na n8n instanci | Noćni računi u pogrešnom danu u tabeli | Vremenska zona instance Europe/Belgrade |
| Jedan ključ za sve | Rotacija gasi sve integracije odjednom | Po jedan ključ za n8n, shop i ostalo, do 20 po firmi |
Ako ti je jasnije kad tokove vidiš iz ugla firme koja ih koristi, autor kase je opisao svoj sopstveni tok banka, kasa, mejl u tekstu kako sam sa n8n spojio banku, kasu i mejl, a agencija Go Simple ima pregled 12 n8n automatizacija za male firme od kojih tri koriste Tezgu. Širi pregled API-ja, sa primerima za aplikacije koje nisu n8n, ima u vodiču Tezga eKasa API, integracije i automatizacije na Treku i na strani fiskalni API.
Izvori: Zakon o fiskalizaciji (Sl. glasnik RS 153/2020, 96/2021, 138/2022); Pravilnik o vrstama fiskalnih računa, tipovima transakcija, načinima plaćanja; Tehničko uputstvo za ESIR Poreske uprave (purs.gov.rs); Zakon o zaštiti potrošača (Sl. glasnik RS 35/2026); dokumentacija SEF-a (efaktura.mfin.gov.rs); NBS IPS QR (ips.nbs.rs); uputstvo za integratore i OpenAPI opis Tezga eKase. Tekst nije pravni savet; za svoju situaciju proveri sa knjigovođom.
