Automatska fiskalizacija web shop-a: račun kupcu bez ijednog klika
9 min čitanja
Kad kupac plati u web shop-u, fiskalni račun mora da izađe. Ako to za tebe radi neko na klik, prodaja staje kad ta osoba nije za računarom. Automatska fiskalizacija je jedno pravilo: naplata potvrđena znači račun kod kupca u mejlu, bez ikakvog čoveka između.
Web shop koji radi u Srbiji ima obavezu da za svaki račun izdat građaninu pošalje fiskalni račun. Ako to znači da vlasnik svake večeri sedne i klika 40 puta „fiskalizuj", posao ne trpi samo vlasnika, nego i kupca koji čeka. Automatska fiskalizacija je drugačija: procesor kartica ili banka potvrdi uplatu, sistem sam pozove V-PFR, kupac za par sekundi u pošti nađe fiskalizovan račun sa QR kodom. Nula klikova.
- „Automatski" znači: kupac plati → račun stigne, bez ikakvog čoveka između; nije „admin klikne na fiskalizuj" nego „nema dugmeta".
- Okidač nije klik na „Naruči", nego potvrda naplate od procesora ili banke; inače se izda račun a novca nema.
- WooCommerce, Shopify i PrestaShop dobijaju gotov plugin ili aplikaciju; ostale platforme idu preko webhook-a ili n8n toka.
- Sirov
externalIdpo porudžbini spreči da retry (ponovljeni webhook) izda drugi račun za istu porudžbinu. - Refundacija i storno ne rade preko obrisane porudžbine, već preko novog fiskalnog dokumenta koji anulira original.
Kad je fiskalizacija stvarno automatska?
Rečenica „automatska fiskalizacija" kruži tržištem, ali u praksi znači tri različite stvari. Prvi nivo je „poluautomatski": aplikacija je otvorena u pretraživaču, admin vidi novu porudžbinu i klikne „fiskalizuj". Radi, ali ako admin ne radi u petak uveče, kupac u petak uveče ne dobija račun. Drugi nivo je „automatski sa prisustvom": aplikacija sama okine fiskalizaciju kad je porudžbina u statusu „plaćeno", ali samo ako je aplikacija u tom trenutku pokrenuta (otvoren tab, uključen računar). Ako računar spava, red se pravi. Treći, pravi nivo, je „server-to-server automatski": web shop server pošalje poziv ka Tezga API-ju čim procesor potvrdi naplatu; ni admin ni njegov računar nisu deo lanca.
Cilj je uvek treći nivo. On radi po noći, vikendom i za vreme godišnjeg odmora, jer nema ljudske komponente. Sve ostale varijante rade dok neko gleda.
Šta se dešava od trenutka „Plati" do fiskalnog računa u mejlu?
Pet učesnika, jedan tok, nula ljudi između kupca i računa u pošti.
Ceo tok traje 2 do 8 sekundi. Kupac ostaje na strani „Hvala na kupovini" dok procesor javi ishod, shop server istog sekunda pošalje podatke ka Tezga API-ju, V-PFR odgovori sa potpisanim fiskalnim brojem i QR kodom, a Tezga sam pošalje mejl sa računom, PDF-om i linkom. Kupac otvori pošu dok pije kafu; ništa nije čekao.
WooCommerce (WordPress + Woo)
Za WooCommerce postoji Tezga plugin. Instaliraš ga iz WP admin panela (Plugins → Add New → „Tezga eKasa fiskalizacija") i uneseš API ključ iz Tezga kontrolne table. Plugin se sam okači na Woo hook woocommerce_order_status_completed i woocommerce_payment_complete, pa čim porudžbina uđe u status „completed" ili čim procesor javi „paid", ide poziv ka Tezgi. Za paket koji imaš u Woo-u, plugin sam mapira artikle iz WooCommerce baze u Tezga oblik. Manuelno mapiranje treba samo za neuobičajene poreske oznake.
Neuobičajene stavke (poklon vaučer, dostava kao PDV oporeziva ili oslobođena, popust preko kupona) plugin nudi kroz posebna podešavanja pre puštanja. Preporuka: uključi plugin u režim „samo test" prve tri porudžbine, potvrdi da fiskalni broj stiže, pa prebaci na „produkcija".
Shopify
Shopify nema nativni fiskalni plugin za Srbiju, ali ima Admin API i webhook orders/paid. Tezga integracija ide preko dodatka „Shopify → Tezga" koji je zapravo servis koji sluša taj webhook i preslikava porudžbinu u Tezga API poziv. Instalacija je otvaranje trial-a servisa, unos API ključeva sa obe strane i klik „Poveži". Servis se preporučuje zbog složenosti PDV pravila (Shopify računa PDV po lokaciji, mi po srpskom zakonu). Alternativa je sopstveni Node ili Ruby server koji radi isti posao, sa punom kontrolom.
PrestaShop, Magento, OpenCart
PrestaShop 8+ ima modul (Tezga Fiskalizacija) koji se instalira sa marketplace-a ili iz zip fajla. Radi na Presta hook hookActionOrderStatusPostUpdate: čim admin ili sistem promeni status u „isporučeno" ili „naplaćeno", zove Tezga API. Za Magento 2 postoji ekstenzija sa istom logikom, ali kroz Magento observer. OpenCart 3 i 4 imaju plugin sa event catalog/model/checkout/order/addOrderHistory. Svi rade po istom obrascu: hook na promenu statusa, poziv ka Tezga API-ju.
Wix, Squarespace, Webflow (bez servera)
Wix, Squarespace i Webflow ne daju ti pravi server, pa direktan poziv ka Tezga API-ju iz njihovog admin panela nije bezbedan (ključ bi izašao u pregledač). Rešenje je posrednik: n8n instanca ili Zapier tok. Ti u panelu platforme okineš webhook „nova porudžbina" ka n8n; n8n proveri da li je porudžbina plaćena, čita stavke i pozove Tezga API sa serverskog niza. Odgovor Tezge ide nazad u Wix/Squarespace kao note na porudžbini. Za Webflow logika je ista, ali se najčešće veže sa Stripe ili LemonSqueezy naplatnim tokom.
Refundacija, storno i otkazivanje
Automatika ne prestaje sa izdavanjem računa. Ako kupac vrati robu, fiskalizovan račun se ne briše (zakon to zabranjuje). Umesto brisanja, izdaje se novi fiskalni dokument refundacije koji se poziva na broj originala i anulira ga u knjigama Poreske uprave. U svakom pluginu za web shop, to je odvojena akcija „Refundiraj u Tezgi" koja se okine kad se u shop-u promeni status u „refunded" ili „canceled" (posle uspešne naplate).
| Situacija | Šta se dešava na kasi | Kupac dobija |
|---|---|---|
| Porudžbina plaćena i isporučena | Fiskalni račun (avans ili promet) | Račun i QR mejlom, PDF u prilogu |
| Uplata potvrđena, roba još nije isporučena | Fiskalni avansni račun | Avansni račun, konačni ide kasnije |
| Porudžbina otkazana pre naplate | Ništa (nije bilo prometa) | Ništa, kupac vidi status u shop-u |
| Naplata izvršena, roba vraćena | Refundacija (novi fiskalni dokument) | Fiskalni dokument refundacije mejlom |
| Naplata jednim delom, ostatak pouzećem | Dva odvojena fiskalna dokumenta | Dva mejla sa dva QR koda |
Šta pravi duple ili nedovršene račune?
Najčešća greška je poziv ka Tezga API-ju odmah kad kupac klikne „Naruči", pre nego što procesor potvrdi naplatu. Ako procesor odbije karticu, izdat je fiskalni račun a novca nema; obračun se ne poklapa i knjigovođa gubi vreme. Rešenje je čekanje potvrde naplate, koje procesori signaliziraju webhook-om (Stripe, NestPay, Monri, IPS) ili status promenom (Woo payment_complete).
Druga greška je odsustvo externalId. Kad shop server ne dobije odgovor od Tezge za 5 sekundi (mreža je pukla, Tezga trenutno prima veliki broj poziva), pokušava ponovo. Bez externalId, drugi pokušaj napravi drugi račun za istu porudžbinu; kupac dobija dva mejla, dve nedelje kasnije se ispravlja ručno. Ako svakoj porudžbini daš isti externalId pri svakom pokušaju (broj porudžbine iz shop baze), Tezga vidi da je posao već obavljen i vrati isti račun iz prvog pokušaja. Duplog izdavanja nema.
Treća greška je pogrešan izbor poreske oznake. Ako plugin uvek šalje 20% PDV a stvarno prodaješ hranu koja ide na 10%, poreska uprava vidi neuredan obračun. Zato je preporuka da poresku oznaku ne postavljaš iz podešavanja plugina već iz definicije proizvoda u shop-u (Woo product meta, Shopify variant tax code).
- Zakon o fiskalizaciji, Sl. glasnik RS, 153/2020 i 96/2021, članovi 3 i 5.
- Tehničko uputstvo za korisnika ESIR-a i PFR-a, važeća verzija, Poreska uprava RS.
- Tezga API dokumentacija, endpoint
/api/integrations/order, uslovi za idempotentnost. - WooCommerce, Shopify, PrestaShop, Magento javni webhook opisi (2026).
Česta pitanja
Da li automatska fiskalizacija radi bez interneta?
Ne. Za automatski poziv ka V-PFR-u treba internet i sa strane shop servera i sa strane V-PFR-a. Za web shop koji radi online, ovo je uvek ispunjeno; ako sajt padne, i porudžbina i račun čekaju istovremeno. Pravo pitanje je šta se dešava sa pojedinačnim porudžbinama koje se zaglave, i tu Tezga radi automatski retry sa istim externalId-om.
Šta ako kupac plati pouzećem?
Pouzeće znači da je kupac primio robu i platio kuriru; naplata je potvrđena kad kurirska služba (Post Ekspres, DHL, City Express) vrati informaciju o isporuci i uplati. Shop plugin tada okida fiskalizaciju sa spiskom stavki. Neki shop-ovi izdaju fiskalni račun u trenutku pakovanja robe (avansni), pa konačni kad novac stigne; pravnički oba pristupa su ispravna.
Kako ide fiskalizacija za IPS QR uplatu?
Kad kupac plati na IPS QR na sajtu, banka javlja Tezgi (ili shop-u koji zove Tezgu) da je uplata legla, po pravilu unutar 2 do 10 sekundi. Fiskalni račun se izdaje čim potvrda stigne. Detalje IPS toka pokriva pojam IPS QR u rečniku.
Da li kupac mora da mi ostavi mejl?
Za onlain prodaju gotovo uvek da, jer mora da dobije fiskalni račun negde. Ako kupac ne ostavi mejl, obaveza je da mu prezentuješ fiskalni račun (npr. link na stranu potvrde ili SMS sa QR-om). Papirni račun nije obavezan; QR kod na ekranu koji kupac skenira jeste zakonski dovoljan.
Da li automatika radi i za usluge, ne samo za robu?
Radi. Za usluge (konsalting, kurs, pretplata) fiskalni račun se izdaje kao „usluga" sa 20% PDV-om (ili 10% za neke), a stavka nosi opis usluge umesto SKU-a. Detaljno kako se fiskalizuju digitalne usluge, časovi i pretplate imaš u tekstu online prodaja usluga.
Šta ako Tezga API ne odgovori na vreme?
Shop server dobija HTTP 202 „Prihvaćeno" ako je V-PFR trenutno nedostupan, uz garanciju da će Tezga sama pokušati ponovo. Do 3 sata su prihvatljivi zastoji sa zakonske strane; posle toga kupac mora dobiti račun ili se transakcija stornira. Za shop admin ovo je nevidljivo: račun stigne kasnije.
Kako da vidim koje porudžbine nemaju račun?
U Tezga kontrolnoj tabli postoji filter „Fiskalizacija u toku" i „Nije fiskalizovano". Prvi pokazuje porudžbine koje čekaju V-PFR odgovor, drugi one gde je poziv sa shop-a stigao ali sa greškom. Za oba postoji dugme „Ponovi", ali automatski retry pokrije skoro sve slučajeve pre nego što ih vidiš.
Da li isti Tezga nalog radi za više shop-ova?
Da. Jedan Tezga nalog može da opslužuje više web shop-ova, do 20 aktivnih API ključeva, jer se svaki shop kod nas identifikuje ključem. Za grupe firmi (jedan vlasnik, više PIB-ova), preporuka je odvojen nalog po PIB-u, jer fiskalizacija ide na tvoju firmu, a jedan nalog nosi jedan PIB.
Kako radi automatika za avansne uplate?
Ako kupac plati unapred (rezervacija hotela, pretplata na časopis, zakup lokala), izdaje se fiskalni avansni račun. Kad se usluga stvarno pruži ili roba isporuči, izdaje se konačni fiskalni račun koji anulira avansni. Web shop plugin razlikuje ova dva slučaja preko statusa porudžbine ili preko datuma isporuke.
Šta se dešava sa računom kad admin obriše porudžbinu?
Brisanje porudžbine u shop bazi ne briše fiskalizovan račun u Poreskoj upravi; on i dalje postoji. Zato plugin uvek okine refundaciju umesto tihog brisanja: novi fiskalni dokument refundacije anulira original i knjigovodstvo ostaje čisto. Ako je porudžbina obrisana pre fiskalizacije, ne dešava se ništa.
Ako imaš web shop na nekoj od gornjih platformi, Tezga ti nudi 30 dana besplatno bez ugovora. Otvori demo firmu, poveži shop u par klikova i vidi kako izgleda kad između tebe i računa nema nijednog dugmeta.
