A borehole scheme of a few hundred connections, a water SACCO, and a licensed water service provider billing several thousand all run the same job: read every connection, price it, bill it, and collect. The smaller the admin team, the more of the month the read-to-bill cycle eats - meter readers walk the lines with a notebook, tariffs get worked out by hand, bills are written per connection, and someone chases arrears house by house. It holds together until the connection count grows - then a single mis-keyed reading becomes a dispute at the kiosk, and water you never billed for quietly becomes water you never get paid for.
Where the cycle breaks
- Readings are captured on paper and re-typed later, with errors nobody catches until a customer complains
- Tiered tariffs, standing charges, and levies are calculated by hand for every account
- Billing everyone each cycle is slow, and it’s too easy to bill the same account twice
- Arrears pile up with no clear list of who to follow up or disconnect
Set it up the way the network is laid out
Organise connections into zones, and routes nested under each zone - the round a reader actually walks. Every account carries its account number, service address, category (domestic, commercial, institution, industrial), tariff, zone, and route. Meters belong to accounts, so a connection can have more than one, and a meter swap records the old closing register and the new opening register cleanly.
Capture readings in the field - even with no signal
Readers use the installable field app on their phone: point the camera at the meter, and it reads the register digits and serial for confirmation - the reader always checks the number before saving, and the photo is banked as dispute evidence either way. No network at the far end of the line? Readings queue offline on the device and sync automatically when signal returns.
Zana computes consumption from the previous reading and flags the ones worth a human look before they become wrong bills:
- A reading lower than last time is held as an anomaly for review, not billed as negative
- Consumption more than 3× the account’s recent average is flagged for a second look
- A meter that has rolled over past its digits is caught and reviewed
- Field submissions land as pending verification - never straight onto a bill - until someone with the right role approves them
Prefer paper or bulk entry? Import a route from CSV (bad rows are skipped with a reason, not the whole file), export a pre-filled capture sheet, or key a whole route into a grid.
One tariff, applied to everyone, line by line
Set your tariff once and Zana applies it to each account’s consumption as clear invoice lines: tiered bands (each block priced at its own rate, true stepped pricing), a standing charge (prorated for a connection’s first part-month), a minimum charge floor where consumption is low, and levies as a percentage or a fixed amount (a regulatory levy, a sanitation surcharge). Even a zero-consumption account still gets a statement so the standing charge is never a surprise.
Worked example. A domestic tariff: first 10 units at KES 50, next 20 at KES 65, above that KES 90, plus a KES 100 standing charge and a 5% levy. An account using 24 units bills 10×50 + 14×65 = KES 1,410 in consumption, + KES 100 standing, + KES 75 levy = KES 1,585 - itemised on the bill, identical to what the run totalled.
Run the cycle with the exceptions surfaced first
A billing run builds every account’s bill, then stops at reviewed so you see the exceptions - missing readings, unapproved readings, no meter, no tariff - before anything is posted. Fix them, then post. The run writes real invoices, and two independent guards make double-billing a period impossible: a lock while posting, plus a check against the shared ledger so a second run can’t re-bill an account already billed for that month. When the cycle finishes, the workspace owner gets a summary email - bills posted, total billed, how many reached customers by email, SMS, and WhatsApp, and a list of accounts that need attention.
Collect by M-Pesa, and stay on top of arrears
Bills collect through M-Pesa STK push like any invoice, and a customer paying against their account number clears their oldest bills first. From there you get an arrears ageing report bucketed by zone, route, and category, a collection rate, a ranked debtor list, and a disconnection candidate list (accounts overdue past your threshold - 60 days by default) you can turn into disconnect orders in one action. Reconnection and connection fees, and security deposits offset on closure, are all handled.
What you’ll need
Utility billing is on Pro (KES 2,500/month, up to 250 accounts) and Business (KES 6,000/month, up to 1,000 accounts); larger networks move to Enterprise. Utility bills don’t count against your invoice quota. Set up your tariff, import your accounts, and run your first cycle end to end.

