FyberPay
ISP billing and network automation, built solo.
A multi-tenant SaaS that runs an internet provider end to end: subscribers and plans, M-Pesa and Paystack billing with dunning and invoicing, and live network automation that provisions and controls customer routers.
In plain EnglishFyberPay runs the business side of internet providers: it takes the customer's mobile-money payment, issues the invoice, and then actually switches their connection on or off at the router. If the customer stops paying, the system walls their connection; when they pay, it lets them back on, automatically.
Lead engineer and operator.

The exhibits
Drag to spin. Click any screenshot to inspect it full size. Every one is the live product.
The problem on file
An ISP's billing system is only honest if it ends at the network. A subscriber pays through M-Pesa on their phone; that webhook has to survive retries, land exactly once in the ledger, extend the right subscription in the right tenant, and then reach their router as a RADIUS change-of-authorization packet that actually restores their bandwidth. Miss any link and either a paying customer sits offline or a non-paying one rides free. The hard part is not any single integration. It is that money, state, and hardware all fail independently, and the system has to reconcile all three without a human watching.
What it is, in numbers
The marquee piece
Every idempotency tutorial says: cache the response under the client's Idempotency-Key header. That textbook version has a flaw nobody mentions: the header is fully attacker-chosen, and the cached value is a raw response body. A key collision, or a leaked key, hands one caller another caller's response.
FyberPay's interceptor namespaces every entry by who is asking, for which tenant, for which operation, before the client's key even matters. A cache hit is only possible for the same principal replaying the same request, so cross-tenant leakage is structurally impossible even on key reuse.
That is layer one of three. Layer two is the database: mobile-money receipt numbers carry unique constraints, so a replayed webhook cannot double-credit. Layer three is a transactional outbox: side effects publish as typed events claimed with FOR UPDATE SKIP LOCKED, so a crash between recording a payment and extending a subscription cannot lose either half.
Architecture
The hidden ninety percent
In production
- 01Runs the full loop for live ISP tenants: payment rails in, invoices and dunning in the middle, RADIUS and MikroTik control out.
- 02263 idempotent migrations, an engineer-facing changelog keyed to every promotion, and three written incident post-mortems.
- 03Test discipline unusual for a one-engineer codebase: roughly 8,200 cases; API test code is 81 percent the size of API production code.
A billing system is only honest if it ends at the network, so this one does.
The stack
Skills it proves
Want this for your product?
Send a short brief. I read every one and reply myself.