Automatizacijan8nIzdavanje računaFinancijske operacijeMalo poduzeće

Kako automatizirati proces izdavanja računa: vodič kroz n8n korak po korak (2026.)

Adrijan Omičević··16 min čitanja
Share

# Što ćete izgraditi (i kome je ovo namijenjeno)#

Ovaj vodič pokazuje kako automatizirati proces izdavanja računa od početka do kraja uz n8n: generirati račune, poslati ih, zakazati podsjetnike i uskladiti uplate kako biste prestali juriti tablice i propuštene e-mailove.

Namijenjeno je uslužnim tvrtkama, agencijama i B2B timovima koji naplaćuju mjesečno/tjedno — posebno ako imate klijente s ponavljajućim angažmanima i predvidljive cikluse naplate.

Ako još niste sigurni isplati li se automatizacija, pročitajte 5 znakova da vašem poslovanju treba automatizacija.

# Ishod: automatizirani “pipeline” za izdavanje računa#

Do kraja ćete imati workflow koji:

  • Povlači naplative stavke (time entries, pretplate, retaineri, potrošnja) iz vašeg izvora.
  • Pouzdano kreira broj računa, iznose i datum dospijeća.
  • Generira PDF račun iz predloška.
  • Šalje e-mail s računom i uputama za plaćanje ili linkom za plaćanje.
  • Šalje podsjetnike po rasporedu dok se ne plati.
  • Usklađuje uplate (Stripe/PayPal/bank export) i odmah zaustavlja podsjetnike.
  • Upisuje audit trail (log računa + timeline događaja) za računovodstvo.

# Preduvjeti (držite jednostavno)#

Alate možete zamijeniti ovisno o vašem stacku; struktura workflowa ostaje ista.

  • n8n (cloud ili self-hosted)
  • Izvor podataka za naplative stavke:
    • Airtable / Google Sheets / Notion / HubSpot / Pipedrive / PostgreSQL
  • Slanje e-mailova:
    • SMTP, Gmail, Microsoft 365, SendGrid, Postmark itd.
  • Način generiranja PDF-a:
    • PDFMonkey / DocRaptor / APITemplate.io, ili vlastiti HTML→PDF endpoint
  • Izvor podataka o plaćanjima za usklađivanje (odaberite jedno):
    • Stripe / PayPal
    • Bankovni CSV export
    • API računovodstvenog sustava (Xero/QuickBooks) ako ga već koristite

Ako želite da se ovo izgradi i održava kao automatizacija produkcijske razine, pogledajte naše usluge automatizacije: Samioda Automation.

# Arhitektura: preporučeni podatkovni model (minimalan, ali robustan)#

Da biste spriječili duplikate i usklađivanje učinili pouzdanim, držite dvije tablice/kolekcije:

  1. 1

    Customers

    • customerId
    • name, email
    • billingAddress, vatId (opcionalno)
    • paymentTermsDays (npr. 14)
    • currency
    • active flag
  2. 2

    Invoices

    • invoiceId (internal UUID)
    • invoiceNumber (čitljiv ljudima, sekvencijalni ili po periodu)
    • customerId
    • periodStart, periodEnd
    • issueDate, dueDate
    • lineItems (array)
    • subtotal, tax, total
    • status (draft, sent, paid, void, overdue)
    • pdfUrl / pdfFileId
    • sentAt, paidAt
    • externalPaymentRef (Stripe charge ID, bank ref itd.)
    • Idempotency ključ (kritično): key = customerId + period + total + version
  3. 3

    Invoice Events (opcionalno, ali preporučeno)

    • invoiceId
    • type (generated, sent, reminder_1, reminder_2, paid_detected, reconciled)
    • timestamp
    • payload (email message ID, payment ID itd.)

Ova struktura čini automatizaciju sigurnom: uvijek provjerite prije nego što kreirate/pošaljete.

⚠️ Upozorenje: Idempotency je kritičan u automatizaciji izdavanja računa. Jedan retry workflowa zbog mrežnog problema ili srušenog koraka može generirati duplikate računa, preplatiti kupce i stvoriti noćne more za usklađivanje. Uvijek generirajte idempotency ključ (customerId + period + total), provjerite ga prije stvaranja računa i koristite database-level unique ograničenja za sprječavanje duplikata. U billing sustavima nema "undo" — sprječite duplikate kod izvora.

# Dijagram workflowa (tekstualni opis)#

Izgradit ćete dva n8n workflowa:

Workflow A — Generiranje + slanje računa (po rasporedu)#

Opis dijagrama:

  1. 1
    Cron (mjesečno/tjedno)
  2. 2
    Dohvati naplative stavke (DB/Sheets/CRM)
  3. 3
    Za svakog kupca (Split in Batches)
  4. 4
    Izračunaj račun + idempotency ključ (Function)
  5. 5
    Provjeri postoji li račun (DB lookup)
    • Ako postoji → Preskoči
    • Ako ne → nastavi
  6. 6
    Renderiraj HTML računa (Template u Function)
  7. 7
    Generiraj PDF (HTTP Request prema PDF servisu)
  8. 8
    Spremi račun (DB insert/update)
  9. 9
    Pošalji e-mail s računom (Email node)
  10. 10
    Zapiši događaj (DB insert)

Workflow B — Podsjetnici + usklađivanje (dnevno)#

Opis dijagrama:

  1. 1
    Cron (dnevno)
  2. 2
    Dohvati otvorene račune (status = sent/overdue)
  3. 3
    Dohvati uplate (Stripe/PayPal/bank export)
  4. 4
    Upari uplate s računima (Function)
    • Ako je upareno → označi plaćeno + zapiši log
  5. 5
    Pronađi račune kojima trebaju podsjetnici (logika dospijeća)
  6. 6
    Pošalji podsjetnike (Email node)
  7. 7
    Zapiši događaj (DB insert)

Odvajanje workflowa sprječava da pokretanje podsjetnika slučajno generira račune i olakšava debugging.

💡 Savjet: Odvojeni workflowi za generiranje računa i podsjetnike nisu samo best practice — to je sigurnosna barijera. Ako Workflow A (generiraj + pošalji) padne polovično, Workflow B (uskladi + podsjeti) neće slučajno spamirati podsjetnike kupcima koji nikad nisu dobili račune. Također možete neovisno uključiti/isključiti svaki workflow za održavanje ili testiranje bez ometanja drugog.

# Korak 1: Definirajte numeraciju računa i pravila perioda#

Odaberite jedan predvidljiv obrazac broja računa i nikad ga ne mijenjajte usred godine.

Uobičajeni obrasci:

ObrazacPrimjerNajbolje zaNapomena
Sekvencijalno000142Stabilan volumenTraži pažljivo “locking” da se izbjegnu kolizije
Godina + sekvenca2026-0012Računovodstvena jasnoćaSekvenca se resetira godišnje
Kupac + periodACME-2026-02Ponavljajući klijentiLako uparivanje, ali nije svugdje uvijek usklađeno s propisima

Praktična preporuka: YYYY-#### (npr. 2026-0012) s DB sekvencom ili zapisom “zadnjeg broja računa”.

Definirajte i pravila billing perioda:

  • Mjesečni računi: periodStart = prvi dan prošlog mjeseca, periodEnd = zadnji dan prošlog mjeseca
  • Retaineri: izdavanje 1. u mjesecu za isti mjesec, dospijeće za 7/14 dana
  • Naplata po potrošnji: naplatite potrošnju prethodnog mjeseca

# Korak 2: Izradite predložak računa (HTML)#

Većina PDF generatora prihvaća HTML. Neka bude jednostavan i konzistentan.

Primjer (minimalni) HTML predloška (spremite ga u n8n Function node kao string ili učitajte iz repozitorija preko HTTP):

HTML
<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <style>
      body { font-family: Arial, sans-serif; font-size: 12px; color: #111; }
      .header { display:flex; justify-content:space-between; margin-bottom: 24px; }
      .title { font-size: 20px; font-weight: 700; }
      table { width: 100%; border-collapse: collapse; margin-top: 16px; }
      th, td { border-bottom: 1px solid #eee; padding: 8px; text-align: left; }
      .right { text-align:right; }
      .totals { margin-top: 12px; width: 40%; margin-left: auto; }
    </style>
  </head>
  <body>
    <div class="header">
      <div>
        <div class="title">Invoice {{invoiceNumber}}</div>
        <div>Issue date: {{issueDate}}</div>
        <div>Due date: {{dueDate}}</div>
      </div>
      <div>
        <strong>{{companyName}}</strong><br/>
        {{companyAddress}}<br/>
        VAT: {{companyVat}}
      </div>
    </div>

    <div>
      <strong>Billed to</strong><br/>
      {{customerName}}<br/>
      {{customerAddress}}<br/>
      VAT: {{customerVat}}
    </div>

    <table>
      <thead>
        <tr>
          <th>Description</th>
          <th class="right">Qty</th>
          <th class="right">Unit</th>
          <th class="right">Total</th>
        </tr>
      </thead>
      <tbody>
        {{lineItems}}
      </tbody>
    </table>

    <table class="totals">
      <tr><td>Subtotal</td><td class="right">{{subtotal}}</td></tr>
      <tr><td>Tax</td><td class="right">{{tax}}</td></tr>
      <tr><td><strong>Total</strong></td><td class="right"><strong>{{total}}</strong></td></tr>
    </table>

    <p style="margin-top:16px;">
      Payment: {{paymentInstructions}}
    </p>
  </body>
</html>

Zamijenit ćete {{...}} stvarnim vrijednostima unutar n8n-a.

# Korak 3: Workflow A u n8n — generiranje i slanje računa#

3.1 Kreirajte okidač (Cron)#

Koristite Cron da se pokreće prema vašem rasporedu naplate:

  • Mjesečno: 1. dan u mjesecu u 08:00
  • Tjedno: ponedjeljak u 08:00

Savjet: pokrećite ujutro u primarnoj vremenskoj zoni i vremensku zonu spremite eksplicitno.

3.2 Dohvat naplativih stavki#

Koristite jedan node ovisno o sustavu:

  • Postgres node: upit za time entries
  • Google Sheets node: čitanje redaka
  • HTTP Request node: poziv vašeg CRM/billing API-ja

Želite podatke grupirane po kupcu i periodu.

Primjer SQL-a (Postgres) za agregaciju prošlog mjeseca:

SQL
SELECT
  customer_id,
  date_trunc('month', now() - interval '1 month') AS period_start,
  (date_trunc('month', now()) - interval '1 day')::date AS period_end,
  json_agg(json_build_object(
    'description', description,
    'qty', hours,
    'unitPrice', hourly_rate
  )) AS line_items
FROM time_entries
WHERE started_at >= date_trunc('month', now() - interval '1 month')
  AND started_at < date_trunc('month', now())
GROUP BY customer_id;

3.3 Razdijeli po kupcu (Split in Batches)#

Dodajte Split In Batches kako bi se svaki račun obrađivao neovisno. Time su greške izolirane i lakše se ponavlja (retry).

3.4 Izračun iznosa + idempotency ključ (Function)#

Koristite Function node za izračun ukupnih iznosa i izradu idempotency ključa.

JavaScript
function money(n) {
  return Math.round((n + Number.EPSILON) * 100) / 100;
}

const customerId = $json.customer_id;
const periodStart = $json.period_start;
const periodEnd = $json.period_end;
const items = $json.line_items;

let subtotal = 0;
const normalizedItems = items.map((it) => {
  const qty = Number(it.qty || 0);
  const unitPrice = Number(it.unitPrice || 0);
  const total = money(qty * unitPrice);
  subtotal += total;
  return { ...it, qty, unitPrice, total };
});

subtotal = money(subtotal);
const taxRate = 0; // set your VAT logic here
const tax = money(subtotal * taxRate);
const total = money(subtotal + tax);

const issueDate = new Date().toISOString().slice(0, 10);
const paymentTermsDays = 14;
const dueDateObj = new Date();
dueDateObj.setDate(dueDateObj.getDate() + paymentTermsDays);
const dueDate = dueDateObj.toISOString().slice(0, 10);

// Idempotency: same customer + same period + same total => same invoice
const key = `${customerId}:${periodStart}:${periodEnd}:${total}`;

return [{
  customerId,
  periodStart,
  periodEnd,
  issueDate,
  dueDate,
  lineItems: normalizedItems,
  subtotal,
  tax,
  total,
  key
}];

3.5 Provjera postojećeg računa (DB Lookup)#

Prije nego što išta generirate, provjerite tablicu Invoices po key (ili po customerId + period).

  • Ako je pronađen: zaustavite granu (NoOp) i zapišite “already exists”.
  • Ako nije pronađen: nastavite.

Ovo je razlika između sigurnog sustava i sustava koji nakon retryja zasipa duplikatima.

3.6 Generiranje broja računa (sigurno)#

Ako koristite DB sekvencu, generirajte broj u jednoj atomskoj naredbi.

Primjer (Postgres):

SQL
SELECT nextval('invoice_number_seq') AS seq;

Zatim formatirajte u n8n-u:

  • invoiceNumber = 2026- + leftPad(seq, 4)

Ako nemate DB, koristite “settings” redak s optimistic lockingom — ali DB sekvenca je čišće rješenje.

3.7 Renderiranje HTML-a i pretvorba u PDF#

Opcija A: PDF servis (najbrže)

Koristite HTTP Request prema PDF API-ju s:

  • HTML sadržajem
  • Header/footer (opcionalno)
  • Povratom URL-a ili binarnog PDF-a

Primjer oblika payload-a (ovisi o provideru):

JSON
{
  "document": {
    "type": "html",
    "content": "<html>...</html>"
  },
  "output": {
    "format": "pdf"
  }
}

Opcija B: vlastiti HTML→PDF endpoint (više kontrole)

Hostajte mali Next.js/Node servis s Puppeteerom. n8n ga poziva preko HTTP-a i prima PDF.

Idealno ako želite potpunu kontrolu nad fontovima, layoutom ili offline generiranjem.

3.8 Spremanje računa + reference na PDF#

Upišite zapis u spremište računa:

  • status = sent (ili draft ako želite korak ručne provjere)
  • pdfUrl ili pdfFileId (ako spremate u S3/Drive)
  • sentAt nakon uspješnog slanja e-maila

Važno: spremite prije slanja, ali sentAt označite tek nakon slanja.

3.9 Slanje e-maila s računom#

Koristite Email node (SMTP ili integraciju providera). Uključite:

  • Predmet: Invoice {invoiceNumber} — Due {dueDate}
  • Tijelo: kratki sažetak + način plaćanja + link
  • Prilog: PDF računa

Primjer sadržaja e-maila:

  • Ukupan iznos i datum dospijeća
  • Link za plaćanje (Stripe Payment Link ili bankovne upute)
  • Kontakt za pitanja
  • Opcionalno: dodajte “reply-to” na vaš finance inbox

3.10 Logiranje događaja#

Upišite događaj “invoice_sent” s:

  • timestamp
  • message ID od providera
  • e-mail primatelja

Ovaj log će vam trebati kad klijent kaže “nismo ga dobili”.

# Korak 4: Workflow B u n8n — podsjetnici za plaćanje + usklađivanje#

Ovaj workflow se pokreće dnevno i radi dva posla:

  1. 1
    detektira uplate (uskladivanje)
  2. 2
    šalje podsjetnike samo dok je račun neplaćen

4.1 Okidač (Daily Cron)#

Pokrenite jednom dnevno (npr. 07:30). Ako vaš payment provider šalje webhooks, možete usklađivati i na webhook evente za gotovo real-time ažuriranja.

4.2 Dohvat otvorenih računa#

Upit za račune gdje:

  • status IN ('sent', 'overdue')
  • paidAt IS NULL

Ako imate puno računa, filtrirajte na “due date unutar zadnjih 60 dana” kako ne biste skenirali godine povijesti.

4.3 Dohvat uplata#

Odaberite izvor:

  • Stripe: lista uspješnih charges/payment intents od jučer
  • PayPal: lista transakcija
  • Bank CSV: ako još nemate API pristup, uploadajte CSV u Drive i neka ga n8n parsira dnevno

Za Stripe (konceptualno):

  • Dohvatite payment intents gdje je status = succeeded
  • Uključite metadata ako možete dodati broj računa u metadata

Best practice: Pri slanju računa uključite broj računa u payment reference (ili Stripe metadata). Usklađivanje postaje determinističko umjesto “fuzzy”.

4.4 Uparivanje uplata s računima (Function)#

Uparujte po ovom redoslijedu prioriteta:

  1. 1
    Točno uparivanje po invoiceNumber u payment metadata/opisu
  2. 2
    Točno uparivanje po total + customer
  3. 3
    Fallback uparivanje po total + vremenski prozor (najmanje pouzdano)

Primjer logike uparivanja (pojednostavljeno):

JavaScript
const invoices = $items("Open Invoices").map(i => i.json);
const payments = $items("Payments").map(p => p.json);

const byInvoiceNumber = new Map(invoices.map(inv => [inv.invoiceNumber, inv]));

const reconciled = [];
const unmatchedPayments = [];

for (const pay of payments) {
  const ref = pay.invoiceNumber || pay.reference || "";
  const inv = byInvoiceNumber.get(ref);

  if (inv && Number(pay.amount) === Number(inv.total)) {
    reconciled.push({ invoiceId: inv.invoiceId, paymentId: pay.id, paidAt: pay.paidAt });
  } else {
    unmatchedPayments.push(pay);
  }
}

return reconciled.map(r => ({ ...r }));

Zatim ažurirajte račune:

  • postavite status = 'paid'
  • postavite paidAt
  • postavite externalPaymentRef
  • zapišite događaj paid_detected

ℹ️ Napomena: Usklađivanje je jedan od najtežih dijelova pipeline-a. Hijerarhija prioriteta je bitna: točno uparivanje po broju računa, zatim točan iznos + kupac, zatim iznos + vremenske okvire (najgori slučaj). Uključite broj računa u payment metadata kada je moguće (dodajte ga u Stripe metadata, bankovnu referencu za transfer ili PayPal custom field). To čini uparivanje determinističkim umjesto probabilističkim. Temeljito testirajte logiku uparivanja s edge casesima: više računa istog iznosa, djelomične uplate, preplapate, i kašnjene transakcije.

4.5 Logika podsjetnika (kada slati)#

Definirajte faze koje su čvrste, ali razumne:

FazaKadaPrijedlog predmetaNapomena
Podsjetnik 13 dana prije dospijeća“Uskoro dospijeće: Invoice …”Prijateljski, proaktivno
Podsjetnik 23 dana nakon dospijeća“Overdue: Invoice …”Direktno, uključite link za plaćanje
Podsjetnik 310 dana nakon dospijeća“Second notice: Invoice …”Blaga eskalacija tona

Koraci implementacije:

  • Za svaki otvoreni račun izračunajte daysToDue = dueDate - today.
  • Provjerite jeste li već poslali tu fazu podsjetnika u Invoice Events.
  • Ako niste, pošaljite i zapišite događaj.

4.6 Slanje podsjetnika (Email Node)#

Uključite:

  • broj računa
  • iznos i datum dospijeća
  • upute/link za plaćanje
  • PDF prilog (ponovno koristite spremljeni PDF URL/binarno)

Uvjet zaustavljanja: Ako usklađivanje označi račun plaćenim, grana za podsjetnike ga mora odmah preskočiti.

# Korak 5: Izlaz usklađivanja (spremno za računovodstvo)#

Usklađivanje treba proizvesti prikaz koji se može izvesti:

  • Plaćeni računi (broj računa, kupac, iznos, datum plaćanja, payment reference)
  • Neplaćeni računi (dani kašnjenja, zadnji poslani podsjetnik)

Ako trebate slati u računovodstveni softver, dodajte završni korak:

  • HTTP Request prema Xero/QuickBooks
  • Kreirajte invoice zapis + allocation uplate
  • Spremite external accounting ID natrag u zapis računa

# Korak 6: Učinite sustav sigurnim za produkciju (idempotency, greške, alertovi)#

Idempotency checklist#

  • Generirajte key i provjerite ga prije kreiranja računa.
  • sentAt spremite tek nakon uspješnog slanja.
  • Koristite unique constraint nad key (na razini DB-a) za sprječavanje duplikata.

Obrada grešaka#

Dodajte ove n8n nodeove/pattern-e:

  • Error Trigger workflow: hvata greške i šalje obavijest na Slack/e-mail.
  • Retries: za prolazne HTTP greške (PDF API, e-mail provider).
  • Dead-letter queue: spremite neuspjele invoice ID-je za ručni retry.

Alertovi koji stvarno znače nešto#

Obavijestite samo kada:

  • Generiranje računa padne za kupca
  • Slanje e-maila padne (bounce/reject)
  • Usklađivanje detektira dvosmislena uparivanja (isti iznos za više računa)
  • Overdue > X dana bez odgovora

# Česte greške (i kako ih izbjeći)#

  1. 1

    Duplikati računa zbog ponovnih pokretanja (rerun)
    Rješenje: idempotency ključ + DB unique constraint + provjera “exists?”.

  2. 2

    Nekonzistentnosti u generiranju PDF-a
    Rješenje: fiksirajte font, izbjegavajte remote assete, testirajte u istom rendereru kao produkcija.

  3. 3

    Podsjetnici poslani nakon uplate
    Rješenje: prvo usklađivanje, zatim podsjetnici; logirajte događaje po fazama.

  4. 4

    Loše uparivanje tijekom usklađivanja
    Rješenje: dodajte broj računa u payment reference/metadata; izbjegavajte uparivanje samo po iznosu.

  5. 5

    Problemi s vremenskom zonom (dospijeće pomaknuto za jedan dan)
    Rješenje: datume računa spremite kao YYYY-MM-DD; vremensku zonu u n8n postavkama tretirajte eksplicitno.

# Primjer: minimalna lista n8n nodeova (da gradite brzo)#

Workflow A (Generiraj + pošalji)#

  1. 1
    Cron
  2. 2
    Fetch billables (DB/Sheets/HTTP)
  3. 3
    Split In Batches
  4. 4
    Function (totals + key)
  5. 5
    DB Query (provjeri račun po key)
  6. 6
    IF (exists?)
  7. 7
    DB Query (next invoice seq)
  8. 8
    Function (build invoiceNumber, render HTML)
  9. 9
    HTTP Request (PDF)
  10. 10
    DB Insert/Update (invoice + pdfUrl)
  11. 11
    Email Send (attach PDF)
  12. 12
    DB Insert (event: sent)

Workflow B (Uskladi + podsjeti)#

  1. 1
    Cron (daily)
  2. 2
    DB Query (open invoices)
  3. 3
    Fetch payments (Stripe/PayPal/bank)
  4. 4
    Function (match)
  5. 5
    DB Update (mark paid)
  6. 6
    DB Query (invoices needing reminders)
  7. 7
    IF (reminder stage already sent?)
  8. 8
    Email Send (reminder)
  9. 9
    DB Insert (event: reminder_x)

# Kada prilagoditi, a kada ostaviti standardno#

Pravilo: standardizirajte workflow, prilagodite rubne dijelove.

KomponentaStandardiziratiPrilagoditi kada
Numeracija računaDaPravila (legal/accounting) se razlikuju po državama
Raspored podsjetnikaUglavnomRazličiti segmenti kupaca trebaju drugačiji tempo
PDF predložakOsnovni predložakTrebate brendirani layout ili višejezične račune
UsklađivanjeDaViše metoda plaćanja i djelomična plaćanja
Izvor podatakaNeOvisi o vašem CRM/time-tracking/billing stacku

# Sljedeći koraci#

# Ključni zaključci#

  • Idempotency je kritičan: uvijek generirajte jedinstveni ključ po kupcu+periodu+iznosu, provjerite ga prije stvaranja računa i prisilite ga na razini baze podataka da biste spriječili katastrofe duplikata.
  • Odvojeni workflowi za sigurnost: odvojite generiranje računa (Workflow A) od podsjetnika i usklađivanja (Workflow B) kako greške u jednom ne bi kaskadno utjecale na drugi.
  • Podsjetnici u fazama s auto-stop: koristite 3-fazni raspored podsjetnika (-3 dana, +3 dana, +10 dana), ali zaustavite slanje odmah čim usklađivanje detektira plaćanje. Logirajte svaku fazu kako biste izbjegli ponovno slanje.
  • Usklađivanje zatvara petlju: uparite uplate po broju računa (metadata), zatim po iznosu+kupac, s fallbackom na iznos+vremenski okvir. Uvijek uključite broj računa u payment referencu kod izvora.
  • Logiranje je vaša sigurnosna mreža: svaki generirani račun, svaka poslana e-pošta, svaka usporedjena uplata i svaki zakazani podsjetnik trebao bi biti logiran. Ti logovi su ono na što ćete se oslanjati kada kupac ospori naplaću ili trebate auditirati sustav.
  • Počnite malo, zatim automatizirajte: započnite s ručnom odobravanjem računa, zatim dodajte podsjetnike, pa onda usklađivanje. Naučit ćete edge casese i izbjegnuti over-engineering.

# Zaključak#

Za pouzdanu automatizaciju procesa izdavanja računa treba vam više od zakazanog e-maila: trebaju vam dosljedna pravila računa, idempotency za sprječavanje duplikata, put za generiranje PDF-a, podsjetnici u fazama i usklađivanje koje zaustavlja podsjetnike u trenutku kad se uplata detektira.

n8n je odličan izbor jer se povezuje s postojećim alatima, logika je eksplicitna, a sustav se može “očvrsnuti” logiranjem i DB ograničenjima. Trebate li detaljnije vodiče za n8n, istražite n8n workflow automation. Izgradite Workflow A (generiraj + pošalji), zatim Workflow B (uskladi + podsjeti) i dobit ćete pipeline za izdavanje računa koji se skalira bez dodatnog administrativnog posla.

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.