Customers
| Code | Name | Phone | Brand | Group | Status | ||
|---|---|---|---|---|---|---|---|
| Loading... | |||||||
Leads
Loading...
| Name | Contact | Source | Status | Assigned To |
|---|---|---|---|---|
| Loading... | ||||
Loading...
Service Plans
| Name | Speed | Price | Billing Cycle | Data Cap | Users | |
|---|---|---|---|---|---|---|
| Loading... | ||||||
A standalone, purchasable product for prepaid customers — bundles one of the plans above with a duration and a price, e.g. "1 Month 10Mbps" or a discounted "3 Month Bundle" on the same plan.
Add a prepaid package
| Name | Plan | Duration | Price | Status | |
|---|---|---|---|---|---|
| Loading... | |||||
Billing
| Number | Customer | Status | Total | Balance | Due Date |
|---|---|---|---|---|---|
| Loading... | |||||
Outstanding balances by how overdue they are — customers with nothing owing aren't listed.
| Customer | Current | 1-30 days | 31-60 days | 61-90 days | 90+ days | Total |
|---|---|---|---|---|---|---|
| Loading... | ||||||
Every customer with a suspended service, an overdue balance, or both — click a row to open that customer, or select several to suspend/resume all their active services at once.
| Customer | Account Code | Billing Group | Service Status | Overdue Amount | Days Overdue | |
|---|---|---|---|---|---|---|
| Loading... | ||||||
PayFast
Used for one-off card/EFT payments customers make themselves through the customer portal.
Netcash
Used for recurring debit order batch collections (the "Netcash Run" billing groups).
Generate under Account Profile → NetConnector → Account Service on the Netcash website.
Generate under Account Profile → NetConnector → Debit Orders on the Netcash website.
Sage Accounting (SageOne)
Used to sync customers, invoices, and payments to Sage. If your Sage account is already connected to DataTill, its own "Accounting Integration" settings screen has the username, company id, and API key to reuse here.
Your standard-rate Tax Type id in Sage — Settings > Tax Types.
The bank account id payments should post against in Sage.
Tickets
| Subject | Customer | Priority | Status | Assigned To |
|---|---|---|---|---|
| Loading... | ||||
Scheduling
| Title | Project | Customer | Priority | Status | Assigned To | Due |
|---|---|---|---|---|---|---|
| Loading... | ||||||
| Name | Description | Status |
|---|---|---|
| Loading... | ||
Loading...
Inventory
| SKU | Name | Category | Tracking | On Hand | Unit Cost |
|---|---|---|---|---|---|
| Loading... | |||||
Hotspot
| Name | Address | Splash Title |
|---|---|---|
| Loading... | ||
| Name | Location | Duration | Speed | Data Cap | Price |
|---|---|---|---|---|---|
| Loading... | |||||
| Code | Template | Status | Created | |
|---|---|---|---|---|
| Loading... | ||||
Settings for this location
Captured leads (people who've used a free trial)
| When | Location | Name | Phone | |
|---|---|---|---|---|
| Loading... | ||||
RADIUS
Every router/NAS device that authenticates against this platform's FreeRADIUS server needs to be registered here first with a shared secret — this covers any customer router, not just hotspot access points. FreeRADIUS only loads clients at startup, not live — click "Restart RADIUS" below after adding or editing one, or it won't actually take effect.
Add a RADIUS client
| Source IP / hostname | Short name | Type | |
|---|---|---|---|
| Loading... | |||
Categorizes the underlying connection technology a service is delivered over (Fibre, Wireless, LTE, Hotspot, etc.) — purely descriptive, doesn't affect authentication itself. Available as a choice when creating or editing a customer's service.
Add a connection type
| Name | Sort order | Status | |
|---|---|---|---|
| Loading... | |||
Applied to every service plan's RADIUS group, and re-applied to all of them automatically whenever you save a change here — so this reaches existing customers too, not just newly created services.
Suspended account blocking
Stale session cleanup
Runs every 15 minutes. Both off by default — enabling either sends real disconnect requests to routers for sessions matching the pattern below, ending live customer connections. A router isn't disconnectable unless it's already registered under RADIUS → Clients, since that's where its shared secret comes from.
Subnets to issue fixed customer IPs from. Assign one to a customer from their Internet Services panel — either auto-pick the next free address here, or type in an IP you've already issued manually (checked for conflicts either way).
Add an IP pool
| Name | CIDR | Gateway | |
|---|---|---|---|
| Loading... | |||
Everyone currently authenticated on RADIUS, across every registered router — this is a live snapshot, not a log of past sessions.
| Customer | Username | NAS | IP Address | Started | Data used |
|---|---|---|---|---|---|
| Loading... | |||||
Locations
The registry of towers/sites that Network Devices (and reporting) can be assigned to — separate from Hotspot → Locations, which is a splash-page config for the Wi-Fi hotspot feature, not a physical site. Also populated automatically by the DataTill import.
Add a location (tower/site)
| Name | Address | GPS | Devices | |
|---|---|---|---|---|
| Loading... | ||||
Network Devices
Infrastructure this ISP owns and operates — routers at tower/PoP sites. Adding one only needs its IP address and a RouterOS API login (read-only access is enough) — model, identity, and CPU load are all read directly from the device itself, both right away and on every automatic poll (every 5 minutes). Separate from RADIUS → Clients, which is specifically about customer-facing authentication, not general device health. Sites devices can be assigned to are managed under Locations.
Add a device
| Model | Description | Location | IP Address | CPU | Status | Last Polled | |
|---|---|---|---|---|---|---|---|
| Loading... | |||||||
A registry of templates already approved in Meta's own WhatsApp Business Manager — this doesn't create or submit templates itself (that only happens on Meta's side); it just lets staff pick a known template by name when messaging a customer, from their detail page. Sending a message to a specific customer happens from that customer's own detail view, not here.
Add a template
At most one active template can be assigned to a given event — if another template already has this event, saving will fail until you unassign it there first.
| Name | Language | Description | Parameters | Trigger | Status | |
|---|---|---|---|---|---|---|
| Loading... | ||||||
Resellers
| Name | Phone | Wallet | Credit Limit | Status |
|---|---|---|---|---|
| Loading... | ||||
Voucher sales per reseller
| Reseller | Vouchers bought | Spent | Redeemed | Unused | Disabled |
|---|---|---|---|---|---|
| Loading... | |||||
Audit Log
A record of who did what, platform-wide. Only visible to admins.
| When | Who | Action | On | Details |
|---|---|---|---|---|
| Loading... | ||||
Branding
Each brand has its own name, logo, colour and support details. Customers, resellers and hotspot users see the brand that matches the website address they used; the default brand is shown on any other address. Resellers can also be assigned a brand (and given their own logo) from the Resellers page.
| Logo | Name | Website addresses | Customers | Resellers | |
|---|---|---|---|---|---|
| Loading... | |||||
Staff
| Name | Role | Status | |
|---|---|---|---|
| Loading... | |||
Roles & Permissions
The 4 built-in roles (marked "Built-in") can't be renamed or deleted, but their permissions can still be edited here — same as any custom role you create.
| Name | Type | Staff assigned | Permissions granted | |
|---|---|---|---|---|
| Loading... | ||||
Permission Matrix
What every role can actually do, at a glance — reflects live data including any custom roles, rather than the 4 built-in ones only. Click a role above to change what it can do.
| Loading... |
|---|
Voice / VoIP
Call records imported from your Asterisk + A2Billing system, folded automatically into each customer's next invoice. Link a customer's A2Billing phone number from their detail page first.
Import from A2Billing
Pulls new call records directly from your A2Billing database (also runs automatically every 2 hours
if A2BILLING_DB_HOST is set in .env).
Import from CSV
Columns required: externalCallId, voipAccountId, callDate, sourceNumber, destinationNumber, durationSeconds, cost.
The first row is treated as a header and skipped.
Recent Calls (all customers)
| Customer | When | From → To | Duration | Cost | Billed |
|---|---|---|---|---|---|
| Loading... | |||||