Billing & collections system · Lebanon
ISP.NET
A local internet provider now sees who has paid, who owes and what's left to collect on one screen, instead of Excel sheets and paper.



236 subscribers · 71% settled
of this month's billing, ISP.NET dashboard
The problem
The provider tracked every collection in Excel sheets, and sometimes on pen and paper. There was no single place to see the month's billing, who had paid and who still owed.
What I built
Five modules in one private, login-only app that runs on the owner's and collectors' phones.
Headline feature
Collections, with an offline field view
Collectors work from their route list (the app calls it Dabdabeh): today's houses in order, drag to reorder, Pay right on the row. It keeps working without internet and saves payments offline.

Headline feature
Arabic WhatsApp reminders, with a live preview
Debt warnings and payment confirmations are written for you in Arabic, with the customer's name, amount and date filled in automatically. Check the live preview, then send in one tap.

Subscribers, one tap from paid
Every subscriber in one list, searchable and filterable by payment, debt or expiry, with a Pay button on each row.

Finance: the month at a glance
How much of this month's billing is settled, what's overdue, and a monthly log you can filter and export to Excel.
Products and technicians
Stock, equipment and product sales, plus field jobs for technicians with the location attached.
The numbers, straight from the dashboard
- active subscribers
- 236
- paid this month
- 166
- not paid yet (25 overdue)
- 70
- billed this month
- $5,875
- collected (71% settled)
- $4,147
- left to collect ($619 overdue)
- $1,728
- payments collected in the last 5 days
- 49 · $1,228
A snapshot of one month (October 2026), not a before/after comparison.
Security and trust
It holds a business's money, so it's a private, login-only system.
- Staff and collectors each sign in with their own account; collector logins can't be turned into admin access.
- Every payment and change is recorded in a plain-English activity log, with who did it and when.
- A database-level rule stops any invoice from being paid more than it's worth, even if two people submit at the same time.
- Invoices are generated automatically each day inside the database, in Beirut time.
How it was built
Built over about ten weeks, from late July to early October 2026, and released in phases while the business kept running. Existing subscribers came in through an Excel import with duplicate checks.
For developers
React + TypeScript front end, Supabase (Postgres, auth) back end, and an offline-first PWA using IndexedDB (Dexie) that syncs when the connection returns. Billing runs as scheduled Postgres jobs (pg_cron) with integrity constraints on payments.