CASE STUDY · CUSTOM SOFTWARE SOLUTIONS · CEBU, PHILIPPINES
Custom software case study: an ISP billing & provisioning platform
The hardest way to prove you can build enterprise software is to run your own company on it. This is the platform behind Exybit Network and Data Solution, an internet service provider in Cebu that I founded, and whose management software I wrote end to end.
The business problem
An ISP is a brutal software problem wearing a telecom costume. Every subscriber is a recurring-billing contract attached to a physical radio on a roof: they sign up, get provisioned onto real network hardware, pay (or don't), get suspended, pay again, get reactivated. Every month, forever, with money and connectivity on the line at each step. Off-the-shelf ISP billing tools either didn't fit a property-centric wireless operation or demanded workflows the business didn't have.
So instead of bending the business around someone else's software, I built a custom platform for subscriber provisioning, network automation, and billing. It's the same class of system I now build for other businesses as Exybit, a custom software solutions practice in Cebu, Philippines.
System architecture
The platform is a NestJS backend with a React 19 front end, PostgreSQL via Prisma, deployed with Docker and GitHub Actions CI/CD. That's the boring-on-purpose core that enterprise software should have. What makes it an ISP platform is the shape of the domain model and the integrations around it:
- A property-centric CRM: subscriptions hang off physical service locations, not just accounts, because in a wireless ISP the antenna on the roof is the ground truth.
- Direct API integration with MikroTik RouterOS. The routers that actually move packets are first-class citizens of the backend, reached over management tunnels.
- A self-hosted UISP instance feeding live CPE (customer radio) monitoring back into the operational picture.
Network automation: software that touches real hardware
Provisioning is fully automated over the RouterOS API. When a subscription is created, the platform creates the PPPoE credentials on the right router. When an account lapses, suspension is a profile swap (the router throttles or gates the connection) followed by a session kick, so the change applies immediately instead of whenever the session happens to renew. Payment reactivates service the same way, with no human in the loop.
Automating against physical infrastructure forces a discipline that pure-web systems rarely learn: the hardware is sometimes unreachable. A router behind a flaky backhaul can't be an excuse for a paying customer staying suspended.
Fault-tolerant billing: idempotent payments, self-healing crons
The billing engine is prepaid and designed around two failure modes that kill recurring-billing systems in the real world:
- Duplicate payment events. Payment handling is idempotent with atomic gateway deduplication. The same gateway notification can arrive twice (retries, race conditions) and the subscriber is credited exactly once. No double-charging, no double-crediting.
- Unreachable hardware. Expiry and renewal run on automated crons that re-attempt router changes when a device can't be reached, so a temporarily offline router converges to the correct state instead of drifting. The database's intended state and the network's actual state reconcile themselves.
Together they make an enterprise automation backend where the whole subscriber lifecycle (invoice, payment, provisioning, suspension, reactivation) runs zero-touch.
The customer portal
Subscribers get a self-service portal on its own JWT auth domain, deliberately separated from staff authentication: receipts, account status, and support tickets without a phone call. Ticketing feeds the same operational dashboard the CRM uses, so support and network state live in one place.
Operations: shipped is not done
The platform runs Dockerized on self-managed infrastructure with a GitHub Actions deploy pipeline, alongside the self-hosted UISP monitoring stack. I maintain the code and I operate the system it runs, which is the fastest feedback loop a software developer can have: every architectural shortcut becomes my own 3 AM problem.
Results
- Real paying subscribers provisioned, billed, suspended, and reactivated by the platform daily, in production, in Cebu.
- Zero-touch billing lifecycle: idempotent payments and self-healing retry crons mean the money path needs no manual reconciliation.
- Hardware-level automation: the software provisions actual MikroTik routers, not just database rows.
- A live proof point that Exybit builds and operates enterprise-grade custom software, because a real business has depended on this platform every day since it shipped.
Need custom software built, in Cebu or anywhere?
This is what Exybit does. Custom software solutions for businesses in the Philippines and abroad: platforms, billing and automation backends, portals, and the operations to keep them running. If you have a system that needs to exist, or one that keeps falling over, let's talk it through.
Get in touch ▸ ← Back to exybit.org