Skip to content

Customer Features (Mobile)

When a subscriber logs in to the ProxRad mobile app, they land in customer mode — a focused self-service surface scoped to their account. Every screen in this mode is a thin wrapper over the same API the web-based customer portal uses; nothing is computed on the device.

The customer mode replaces the SMS / email “what’s my usage today?” flow most ISPs still field by phone. It also lets subscribers do safe operations themselves — top-up, plan change, WiFi password reset — without occupying a CSR.

  1. Install ProxRad from the App Store or Google Play.
  2. Enter your ISP’s ProxPanel URL (e.g. https://panel.example.com).
  3. Log in with the subscriber username and password your ISP provided. The username is usually in the form name@domain.
  4. The app detects user_type = "customer" and routes you to the customer tab bar.

Screen file: mobile/src/screens/customer/CustomerDashboard.js API endpoints:

  • GET /api/customer/dashboard — plan, expiry date, balance, online status
  • GET /api/customer/live-traffic — current download / upload in Mbps + session uptime (polled every 3 s while focused)

The dashboard answers four questions:

  1. Am I online right now? Online indicator, current uptime.
  2. What’s my plan? Service name, contract speed.
  3. When does my plan expire? Days remaining, expiry date.
  4. What’s my balance? For prepaid models — credit remaining, last top-up.

The live traffic widget is a small two-line chart of Mbps down / Mbps up over the last 60 seconds. It’s powered by the same MikroTik torch query the admin Sessions page uses (or the radacct delta on generic-RADIUS NAS). On servers where torch isn’t reachable, the widget falls back to a polling estimate from radacct interim updates — added in v1.0.5.

Screen file: mobile/src/screens/customer/CustomerUsageScreen.js API endpoints:

  • GET /api/customer/usage — circular progress for daily + monthly with the matching numeric counters
  • GET /api/customer/usage-history?days=30 — per-day breakdown for the last 30 days

The Usage screen has two stacked sections:

SectionWhat it shows
QuotasTwo circular progress rings — daily and monthly. Each shows GB-used / GB-cap and current FUP tier.
HistoryVertical list of the last 30 days. Tap a day to expand and see every PPPoE session that day (start, stop, duration, GB).

The session-list view is the same data the Sessions page shows, but scoped to the logged-in subscriber and read-only.

Screen file: mobile/src/screens/customer/CustomerWiFiScreen.js API endpoints:

  • GET /api/customer/cpe — current SSID and password per band, online status
  • POST /api/customer/cpe/wifi — change SSID / password
  • POST /api/customer/cpe/reboot — reboot router

Visible only if the subscriber has a CPE device linked. This screen lets a customer:

  • See their current WiFi SSID and password (2.4 GHz and 5 GHz separately if dual-band).
  • Change the SSID, the password, or both. Pressing Save queues a TR-069 SetParameterValues task and waits for the device to ACK (typically 5 – 30 s).
  • Reboot the router. The device must phone home to the TR-069 ACS to accept the command — if the customer’s router is in a tunneling loop, the reboot will not arrive until they physically power-cycle.

Screen file: mobile/src/screens/customer/CustomerTopUpScreen.js API endpoints:

  • GET /api/customer/topup-options — packages the customer can buy (price, GB, extra days)
  • POST /api/customer/topup — execute the top-up

Two flavors of top-up are shown side-by-side:

  1. Data top-up — buy extra GB to extend the monthly FUP quota. Cost and GB are configured per service plan (services.topup_packages).
  2. Prepaid card — enter the code from a prepaid card. Credit hits the wallet, then auto-renews if the plan is due.

A successful top-up:

  • Records a transaction of type data_topup or prepaid_card.
  • Updates subscribers.daily_quota_used / monthly_quota_used if the package adds GB.
  • Pushes a WhatsApp confirmation if Communication Rules are configured.

Screen file: mobile/src/screens/customer/CustomerTicketsScreen.js

  • CustomerTicketDetailScreen.js + CreateTicketScreen.js API endpoints:
  • GET /api/customer/tickets — list
  • GET /api/customer/tickets/:id — detail
  • POST /api/customer/tickets — create
  • POST /api/customer/tickets/:id/reply — reply

The customer can:

  • Open a new ticket. Optional photo attachment (expo-image-picker); since v1.0.4, the device’s GPS coordinates are attached if location permission was granted (used by field-service ISPs to dispatch a technician).
  • Reply to existing tickets.
  • See the support agent’s replies threaded inline.

Tickets surface on the admin side under Tickets — same data, full read/write for staff.

Screen file: mobile/src/screens/customer/CustomerAccountScreen.js API endpoints:

  • GET /api/customer/account — name, phone, email, address fields
  • PUT /api/customer/account — update contact details
  • POST /api/customer/change-password — change PPPoE / portal password

Customers can update their own name, phone, email, and address. They can also change their PPPoE password, which:

  1. Updates the plaintext + encrypted password on the subscribers row.
  2. Updates the radcheck Cleartext-Password attribute.
  3. Disconnects the active session (CoA Disconnect) so the next reconnect uses the new password.

If a customer keeps disconnecting and reconnecting after changing the password, double-check that the router stores the password in its PPPoE profile, not just in a router-side credential vault.

Screen file: mobile/src/screens/customer/CustomerPublicIPScreen.js API endpoints:

  • GET /api/customer/public-ip — current rented IP if any + price
  • POST /api/customer/public-ip/rent — rent a fresh IP from the pool
  • POST /api/customer/public-ip/release — release the IP and stop billing

If your installation has the Public IP feature enabled, customers can rent a routable IPv4 from the pool. The flow:

  1. Customer taps Rent a Public IP.
  2. A confirmation modal shows the monthly fee.
  3. On confirm, an IP is reserved from the pool (public_ips.status = rented), a transaction is recorded, and a Framed-IP-Address row is created in radreply for the subscriber.
  4. The session must reconnect for the IP to take effect — the app prompts the customer and disconnects them.

Screen file: mobile/src/screens/customer/CustomerChangeServiceScreen.js API endpoints:

  • GET /api/customer/services — services the customer is allowed to switch to
  • POST /api/customer/change-service — execute the change

Visible only if the parent reseller has can_change_service = true. The customer:

  1. Picks a different plan from the list of allowed targets.
  2. Sees a prorated charge / credit preview (server-side math, not done on device).
  3. Confirms.

The service change disconnects the active session so the router fetches a new IP from the new pool (see IP Pool Management).

Screen file: mobile/src/screens/customer/CustomerParentalScreen.js API endpoints:

  • GET /api/customer/parental/devices — connected devices grouped by host
  • POST /api/customer/parental/block — block a device
  • POST /api/customer/parental/schedule — set a schedule

Visible if the subscriber has parental controls enabled on their plan. Each device behind the home router (discovered via TR-069 hosts or DHCP leases — see Parental device sync) shows up with:

  • A friendly name (editable).
  • A “blocked / allowed” toggle.
  • An optional weekly schedule (e.g. block Xbox between 22:00 and 06:00).

Enforcement happens via firewall rules on the MikroTik (mangle + drop) — the mobile app only edits the schedule, the BNG enforces it.

Customer mode has no permission system in the panel sense — there is exactly one role, “the subscriber themselves.” What’s gated is:

CapabilityGated by
Change serviceParent reseller’s can_change_service flag.
Public IP rentpublic_ips feature enabled + pool has free IPs.
Parental controlsCustomer’s plan has parental flag set.
Top-upService plan has at least one top-up package configured.
WiFi screenA CPE device is linked to the subscriber.

If none of those apply, the screen simply isn’t shown in the tab bar.