Skip to content
se.hadi/

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.

ISP.NET subscriber list: 236 subscribers, each row with a green Pay button (names hidden)
ISP.NET dashboard: 5,875 billed this month, 71% settled, 166 paid and 70 not paid yet
ISP.NET WhatsApp message editor: an Arabic debt warning with a live preview

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.

WhatsApp message editor with an Arabic debt warning, the placeholders for name and amount, and a live preview

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.

Subscriber list showing a total of 236, with a green Pay button on each row (names hidden)

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.

Monthly log for October 2026 with $4,147 collected, filters by company, service, owner and collector, and an Export to Excel button

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

The dashboard these numbers come from. Amounts are in US dollars.
ISP.NET dashboard: 5,875 billed this month, 71% settled, 4,147 paid, 1,728 left to collect, 236 active subscribers
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.

See it working

Chat on WhatsApp

I reply within 24 hours