05
Chapter 05 of 08 · Accounting
AvailableEmailSMSWebhook

Fakturoid + Stripe + 4notify: invoice, notification and reconciliation with no glue code

Fakturoid is the most-used Czech invoicing SaaS for SMBs; Stripe owns the majority of online payments. 4notify sits between as orchestrator: Stripe sends payment_intent.succeeded webhook, 4notify validates the signature, calls Fakturoid API to issue the invoice (with CZ VAT rules), returns the PDF URL and simultaneously emails the customer and SMSes the accountant.

Problem

Teams usually write a Node.js middleman — 200 lines that break every Thursday on a new Stripe API version. Or they use Zapier (expensive) or Make.com (slow, 30s latency). 4notify holds the link natively, with signatures and retries.

Legal framework
Zákon č. 235/2004 Sb. (ZDPH) § 28

A tax document must be issued within 15 days of the taxable supply. The 4notify trigger guarantees issuance within 30 s of payment.

Zákon č. 563/1991 Sb. (o účetnictví)

Document retention minimum 5 years; 4notify keeps the document hash and metadata for audit, the PDF itself remains in Fakturoid.

EET / Veri*sdělení 112/2016 Sb.

Repealed for online payments as of 1 Jan 2023; kept as a configurable mode for firms voluntarily on it.

Architecture
01

Stripe signature validation

Stripe HMAC-SHA256 signs the webhook; 4notify validates with the current webhook secret before any action, otherwise returns 400.

02

Fakturoid invoice issuance API

POST /api/v3/accounts/{slug}/invoices.json with mapped line items, business ID, VAT ID, VAT rate and payment method „transfer“/„card“.

03

Three-way output: email, SMS, ERP webhook

Customer gets email with PDF, accountant gets SMS with invoice number, internal signed webhook hits your ERP — all in parallel with exponential-backoff retries.

04

Idempotency and deduplication

Stripe sometimes replays the same webhook; 4notify uses stripe_event_id as an idempotency key, so duplicate invoices don't happen.

Code
json
// Webhook flow Stripe → 4notify → Fakturoid:
// 1. Stripe POST /webhooks/stripe-cz
{
  "id": "evt_3OmZk2",
  "type": "payment_intent.succeeded",
  "data": { "object": {
    "id": "pi_3OmZk2", "amount": 124800, "currency": "czk",
    "metadata": { "order_id": "2026-CZ-0481", "ico": "26168685" }
  }}
}

// 2. 4notify → Fakturoid POST /api/v3/accounts/eshop/invoices.json
{
  "subject_id": "lookup:26168685",
  "lines": [{ "name": "Severin SM 4810", "quantity": 1, "unit_price": "1031.40", "vat_rate": 21 }],
  "payment_method": "card",
  "variable_symbol": "20260481"
}
Sample message
EmailInvoice 2026-CZ-0481 for 1,248 CZK — PDF attached

Hello, thank you for the payment. The invoice 2026-CZ-0481 is attached. Download also here: fakturoid.cz/i/abc123. For accounting purposes please retain for 5 years.

Before launch
  • Stripe webhook secret pasted into 4notify
  • Fakturoid API token (personal, not shared)
  • Mapping of Stripe catalog items → Fakturoid
  • Customer email template with {{invoice_pdf_url}}
  • SMS template for accountant (invoice number, amount, due date)
  • Test 1 CZK payment end-to-end before go-live
What 4notify does differently

Stripe webhook idempotency plus credit-note and reverse-charge VAT support — without your own Node.js middleman.

FAQ
Does it work with Superfaktura or iDoklad?

Yes, we have connectors for Fakturoid, Superfaktura, iDoklad and Money S3. Multiple in parallel is supported (one primary + backup).

What about credit notes (storno invoices)?

When Stripe sends charge.refunded, 4notify calls Fakturoid POST /invoices/{id}/storno.json, emails the customer the credit note and updates the ERP.

How do you handle reverse-charge VAT (RPDP)?

If the client has a valid EU VAT ID outside CZ (VIES-checked), 4notify sets vat_rate to 0 and adds the note „Customer pays VAT“ — Fakturoid prints the statutory wording.

Start free

14 days, no card. Czech-language support.

Other chapters