Subscribers
The Subscribers page is the central list of every PPPoE / hotspot / static user in your system. From here you create, edit, renew, disconnect, ping, change-service, reset-FUP, rename, refill, top-up, and delete — individually or in batches of up to a few thousand at a time.
The page is paginated server-side (default 25 rows) and counts are pre-aggregated server-side, so it stays fast at 60,000+ subscribers. Stats refresh on every page load; the row data refreshes when you change a filter or click pagination.
How to get here
Section titled “How to get here”Sidebar → Subscribers (people icon). Direct URL: /subscribers.
Visible to every authenticated user. Resellers see only their own subscribers and sub-resellers’ subscribers unless they have the subscribers.view_all permission, in which case they see everyone.
Layout
Section titled “Layout”| Section | What it shows |
|---|---|
| Stat bar (top) | Total, Online, Offline, Active, Inactive, Expired, FUP 0–6, Monthly FUP counters — each clickable as a filter |
| Filter row | Search box, Status dropdown, Service dropdown, NAS dropdown, Reseller dropdown |
| Action toolbar (sticky) | Select All, Renew, Reset FUP, Activate, Deactivate, Disconnect, Rename, Add Days, Change Service, Refill, Ping, Delete |
| Table | Configurable columns (see below); selected rows highlight red |
| Pagination | Page size 25 / 50 / 100 (max 100 per request) |
Stat bar — clickable status counters
Section titled “Stat bar — clickable status counters”Each tile in the stat bar is a filter shortcut. Click once to filter the list to that subset; click again to clear.
| Counter | Filter applied |
|---|---|
| Total | No filter |
| Online | is_online = true |
| Offline | is_online = false |
| Active | status = active |
| Inactive | status = inactive |
| Expired | expiry_date < now (tenant-local time) |
| Expiring | expiry_date BETWEEN now AND now + 7 days |
| FUP 0–6 | fup_level = N (daily FUP tier) |
| Monthly FUP | monthly_fup_level >= 1 (any monthly tier active) |
The active filter shows a coloured ring around the counter so you always know what you’re looking at.
Search
Section titled “Search”The search box does a case-insensitive ILIKE %query% across these fields, ordered by hit rate to keep the OR chain short-circuiting cheap:
username, full_name, phone, email, address, mac_address, ip_address, building, region, country, note, static_ip.
Searching by partial username or phone number is the most common pattern.
Columns
Section titled “Columns”Click the Columns button (gear icon) to toggle column visibility. Your selection is saved to localStorage per browser.
| Column | What it shows | Default visible |
|---|---|---|
| Username | PPPoE username (with optional realm @domain). Cyan in dark mode for readability. | Yes |
| Full Name | Customer’s legal/business name | Yes |
| Phone | Primary phone | Yes |
| MAC Address | Bound MAC, if MAC binding enforced | Yes |
| IP Address | Current PPPoE-assigned IP (or static, or last-known) | Yes |
| Service | Service plan name + speed | Yes |
| Reseller | Owner reseller. Sub-resellers show ”↳ Sub of: parent” | Yes |
| Status | Badge: Active / Inactive / Expired (with colours) | Yes |
| Expiry Date | Next renewal date | Yes |
| Last Seen | ”Online Now” if currently up; otherwise relative (“5m ago”, “3h ago”, “2d ago”); “Never” if no record | Yes |
| Daily Quota | Daily used / daily cap as X / Y GB | Yes |
| Monthly Quota | Monthly used / monthly cap | Yes |
| Balance | Subscriber prepaid balance (separate from reseller balance) | No |
| Address / Region / Country | Geographic detail | No |
| Notes | Operator notes | No |
| Created At | When the subscriber row was created | No |
The Online indicator is the green dot next to the username. It is subscribers.is_online, updated by QuotaSync every 30 seconds. A subscriber may briefly show online for up to 30 minutes after losing their PPPoE session if MikroTik missed the Accounting-Stop packet; the Stale Session Cleanup service closes that within five minutes.
Per-row actions
Section titled “Per-row actions”Each row has an action column with quick buttons (icons only on mobile, full text on desktop):
- Edit — Opens the Subscriber Detail page.
- Renew — Adds one service period to
expiry_date, charges the reseller’s balance, resets FUP counters, sends new Mikrotik-Rate-Limit, removes anyAuth-Type := Reject. - Disconnect — RADIUS CoA Disconnect first; falls back to MikroTik API
/ppp active removeif CoA times out. - Ping — Executes ping through the MikroTik router (not from the API container, which can’t reach the PPPoE subnet). Result shown in a dismissible toast.
- Torch — Signal icon on online rows. Shows live per-connection traffic from MikroTik
/tool/torch— see the detail page for the modal. - Delete — Soft delete (
deleted_at = now). The username remains unique-blocked by a partial unique index that excludes deleted rows.
Bulk actions
Section titled “Bulk actions”Select rows with the checkboxes and the action toolbar at the top of the table activates. The toolbar is sticky — it stays visible as you scroll. Selected rows turn red with a strong left border so you always know what’s selected.
| Action | What it does | Permission |
|---|---|---|
| Renew | Per-row renewal logic, in a loop. Skips subscribers whose reseller can’t cover the cost. | subscribers.renew |
| Reset FUP | Resets fup_level to 0, zeros daily_*_used, sets last_daily_reset = now. Restores Mikrotik-Rate-Limit. Monthly counters unchanged (only Renew resets monthly). | subscribers.reset_fup |
| Activate | status = active, removes Auth-Type := Reject from radcheck. | subscribers.inactivate |
| Deactivate | status = inactive, adds Auth-Type := Reject, disconnects active session. | subscribers.inactivate |
| Disconnect | CoA disconnect → MikroTik API fallback. Does not change status. | subscribers.disconnect |
| Delete | Soft-delete. Custom confirmation modal lists subscriber names in bold red text (up to 20 names shown). | subscribers.delete |
| Change Bulk | Opens Bulk Operations with the selected IDs pre-populated for set-expiry, set-service, set-price, set-reseller, set-static-ip, set-monthly-quota, set-daily-quota. | subscribers.change_bulk |
Click any header to sort. Allowed sort fields: username, full_name, created_at, expiry_date, is_online. Two derived sorts use SQL expressions:
- Daily usage —
(daily_download_used + daily_upload_used) DESC - Monthly usage —
(monthly_download_used + monthly_upload_used) DESC
Default sort is created_at DESC (newest first). Sort persists in the URL so refreshing keeps your view.
Pagination
Section titled “Pagination”Server-side. Page size is capped at 100 to keep PostgreSQL LIMIT queries cheap on large tables. Use the search box and filters to narrow down before paging — scrolling through 60,000 subscribers 100 at a time is not a workflow we optimised for.
Common workflows
Section titled “Common workflows”Renew a batch of expiring subscribers
Section titled “Renew a batch of expiring subscribers”- Click the Expiring stat counter (filters to users expiring in the next 7 days).
- Optionally narrow further by reseller or service.
- Click the Select All checkbox in the table header.
- Click Renew in the action toolbar.
- Confirm. Review the success/failed count in the toast.
Disconnect everyone on a misbehaving NAS
Section titled “Disconnect everyone on a misbehaving NAS”- Filter by NAS dropdown → select the offending router.
- Filter by Status → Online.
- Select All → Disconnect.
- The system sends CoA Disconnect per subscriber; falls back to MikroTik API where CoA fails. Users reconnect within a few seconds with fresh IPs.
Find a specific customer by phone number
Section titled “Find a specific customer by phone number”- Type the phone number (or partial) into the search box.
- The list filters live. Click the row to open the Subscriber Detail page.
Move 50 subscribers to a new service plan
Section titled “Move 50 subscribers to a new service plan”- Filter by current service plan.
- Select the 50 rows you want to move.
- Click Change Service in the toolbar — opens the Bulk Operations page with selection pre-loaded.
- Pick the target service, optionally tick “disconnect after change” so users reconnect to the new pool immediately.
Permissions
Section titled “Permissions”| Permission | Effect |
|---|---|
subscribers.view | Required just to load this page. Resellers without it see “Access Denied”. |
subscribers.view_all | Reseller sees the global list instead of just their own + sub-resellers’ subscribers. Also widens stat counts. |
subscribers.create | Shows the Add Subscriber button. |
subscribers.edit | Allows opening the detail page in edit mode. |
subscribers.delete | Enables per-row and bulk Delete. |
subscribers.renew | Enables per-row and bulk Renew. |
subscribers.disconnect | Enables per-row and bulk Disconnect. |
subscribers.reset_fup | Enables Reset FUP. |
subscribers.inactivate | Enables Activate / Deactivate. |
subscribers.ping | Shows the Ping button. |
subscribers.view_graph | Shows the live torch icon on online rows. |
subscribers.change_bulk | Enables the Change Bulk button. |
Admins bypass all checks and see every action. Resellers with no permission group assigned also see every action (back-compat).
Related pages
Section titled “Related pages”- Subscriber Detail Page — open any row to see the all-in-one editor.
- Bulk Operations — the dedicated page for large-scale changes with advanced filters.
- Sessions — live
radacctview; complementary to the “Online” filter here. - FUP Counters — distribution of subscribers across FUP tiers.
- Services & Plans — defines the plans you assign to subscribers.
- Users & Permissions — controls who can see which buttons.