B Billify
Všechny články
Případová studie 6 min čtení

Jak fakturuju captchaapi.eu přes Billify a Billify chrání před boty díky captchaapi.eu

Jeden vývojář, dva produkty, kruhová závislost. Přihlašovací a registrační formuláře Billify jsou kryté PoW captchou z captchaapi.eu. Faktury pro zákazníky czptchaapi.eu vystavuje Billify.

Stavím dva produkty z jedné dílny. Billify je fakturační API pro CZ/EU SaaS — REST endpoint, který přijme doménový payload a vrátí fakturu v režimu reverse-charge, ČNB kurzem a PDF. Captchaapi.eu je GDPR captcha, která místo Google reCAPTCHA ověřuje návštěvníka přes proof-of-work bez cookies a bez US závislostí.

Žijou v jedné Hetzner serverovně v Norimberku, mají stejný EU mail provider a nemají žádný společný subprocesor v zámoří. Jsou to dva různé produkty které se ale navzájem doplňují.

1. Stripe Checkout → Billify API

Captchaapi.eu si platby od svých zákazníků odbavuje přes Stripe Checkout. Když Stripe pošle webhook invoice.paid, captchaapi.eu fakturu nevytváří sám. To by znamenalo, že bych musel:

  • udržovat per-supplier číselné řady (a nešidit thread-safety)
  • ověřovat VAT ID odběratele přes VIES a držet auditní stopu pro § 92a ZDPH
  • stahovat denní fixing ČNB ke dni DUZP pro EUR faktury
  • generovat PDF, které projde finančním úřadem
  • a navrch ručit za to, že to vše zvládne i v lednu, kdy se překlopí číselná řada

Místo toho captchaapi.eu po invoice.paid sestaví doménový payload a zavolá jeden HTTP request:

captchaapi/StripeWebhookHandler.php
// Stripe invoice.paid → vystav Billify fakturu
$response = Http::withToken(config('services.billify.token'))
    ->post('https://billify.cz/api/v1/invoices', [
        'supplier_id' => '01HX...',
        'customer'    => [
            'name'       => $invoice->customer_name,
            'vat_number' => $invoice->customer_tax_ids[0]?->value,
            'address'    => [/* z Stripe customer */],
        ],
        'items'    => [[
            'description' => 'Captchaapi.eu Pro plan',
            'quantity'    => 1,
            'unit_price'  => $invoice->amount_paid / 100,
        ]],
        'currency'          => 'EUR',
        'paid_at'           => now(),
        'locked'            => true,
        'metadata'          => ['stripe_invoice_id' => $invoice->id],
    ])
    ->throw();

// → 201 Created · číslo, PDF URL, status=paid, locked, vše hotovo

Billify je čistý invoicing primitive. Neví o Stripe, neví o žádném payment provideru, neumí parsovat cizí webhooky. Přijme payload, vrátí fakturu. Pro tenhle konkrétní setup (jsem CZ OSVČ identifikovaná osoba) VatModeResolver deterministicky odvodí VatMode::ReverseCharge pro každého zákazníka — žádné DPH, jen čistá fakturace bez šance na chybný režim z překlepu.

A protože je to mé vlastní API, neplatím 5–10 % obratu Lemon Squeezy nebo Paddle za to, aby vystavili fakturu místo mě. Kdyby měl captchaapi.eu obrat $1 200/rok, MoR služba by si vzala $96. Místo toho se faktura odbude jedním HTTP requestem, který Billify zvládne za 2–10 sekund.

VIES, ČNB, čísla — věci, které nejdou ošidit
I když fakturuju jako neplátce, Billify má matici, která pokrývá i další režimy. Kdybych se zítra registroval k DPH, výsledek by byl deterministický: identifikovaná osoba × EU B2B s VAT ID → reverse charge, VIES validace přes paralelní Http::pool race s 30s timeoutem, záznam do tabulky vies_validations včetně raw VIES JSON pro auditora finančního úřadu. To je 200+ řádků kódu, který by jinak žil v každém SaaS. Místo toho je to závislost na vlastním API.

2. Login Billify → captchaapi.eu

Billify je side projekt, ale má auth přes Fortify s 2FA, takže login formulář je něco, co se dá scanovat pro credential stuffing. Standardní řešení by bylo nasadit Google reCAPTCHA v3.

Háček: Google jako sub-procesor by mě donutil přepsat seznam zpracovatelů a doplnit US-based subjekt do GDPR DPA. Tím by se z claimu „zero tracking, 100 % EU" na home page stala lež. Pro indie SaaS, který má privacy-first positioning, je to mrtvé z hlediska brandu — a mě osobně tlačí na compliance overhead, který nechci řešit.

Místo toho login Billify načítá widget z captchaapi.eu. PoW captcha neukládá cookie, nedělá fingerprinting, neobsahuje žádný US dependency. Návštěvník vyřeší krátký výpočet v prohlížeči, server ověří proof-of-work a propustí dál. Pro útočníka skenujícího credential páry to znamená, že každý attempt stojí pár stovek milisekund CPU času — což je dost pro bota.

A protože je to moje captcha, můžu ji v případě falešných alarmů otevřít v dev konzoli a opravit edge case za hodinu. Ne za týden přes support ticket Googlu, který nikdy nepřijde.

3. Proč ta kompozice dává smysl

Dogfooding jako quality gate

Pokaždé, když přijde Stripe invoice.paid od captchaapi.eu zákazníka, projede to mým vlastním Billify API. Když by byl bug ve VIES race, v ČNB walkbacku přes svátek, v lock/unlock toggle nebo v immutable snapshotech, najdu ho v reálném provozu dřív, než ho najde někdo jiný v té nejhorší možné chvíli — typicky den před účetní uzávěrkou.

Žádný unit test ani staging fixture nenahradí reálný request od reálného Stripe webhooku, kterému jde o reálné peníze. Dogfooding je nejlevnější forma integrace testů, jaká existuje.

Single-owner stack

Když se v captchaapi.eu změní endpoint pro captcha widget, nemusím čekat, až vendor pochopí požadavek. Otevřu druhý PhpStorm v jiném repu, opravím to a nasadím během dvaceti minut. Když naopak změním Billify API kontrakt, vím přesně, který klient (já) ho taky volá, a aktualizuju captchaapi.eu integraci ve stejném sittingu.

Tahle latence mezi „chci to změnit" a „je to nasazené" je důvod, proč indie SaaS dílny dokáží konkurovat vendorům s desetkrát větším týmem. Ne proto, že bych byl rychlejší programátor — ale proto, že nemám koordinační overhead.

Privacy-first jako vedlejší produkt

Tahle architektura nebyla původně privacy-first záměrem. Vznikla z toho, že jsem nechtěl řešit obchodní vztah s providerem, který mi jednou udělá pull-the-plug nebo zvedne ceny o 300 %. Ale výsledek — žádný US sub-procesor, jeden datacenter v Norimberku, jeden mail provider v ČR — je přesně to, co dnes EU SaaS zákazníci hledají. Dali GDPR pokuty za 1,2 miliardy € Metě a 390 milionů Googlu; lidi to vnímají.

Závěr

Pokud stavíš SaaS pro EU zákazníky a Lemon Squeezy ti žere 8 % obratu, podívej se na Billify. Pokud máš na webu formulář a nechceš lepit Google iframe, kouni na captchaapi.eu.

Oba produkty sleduju v jediné Sentry organizaci a fakturuju je z jedné DPH evidence. Pro indie SaaS dílnu je to o jednu věc méně, kterou by bylo třeba řešit — a zákazník na druhé straně dostane systém, který je sám sobě nejtvrdším testerem.