Logo

Just Plug and Play
Next Generation Piso Wifi Business

v4.0 · Online

{{ loginError }}

Powered by ICTbizwifi+

{{ assistAdmin.full_name }}
ICTbizwifi+ V4

Command Center

{{ greeting }}, {{ user.fullName }}

Live

Admins

{{ stats.admins?.active||0 }}/{{ stats.admins?.total||0 }}

APs Online

{{ monHealth.onlineRouters??stats.routers?.online??0 }}/{{ monHealth.totalRouters??stats.routers?.total??0 }}

Sessions

{{ monHealth.activeSessions??stats.sessions?.active??0 }}

DB Ping

{{ monHealth.dbPingMs??'--' }}ms

Admins

{{ stats.admins?.total||0 }}

{{ stats.admins?.active||0 }} active

APs Online

{{ monHealth.onlineRouters??0 }}/{{ monHealth.totalRouters??0 }}

Omada live

Sessions

{{ monHealth.activeSessions??0 }}

active now

CPU

{{ monSystem.cpu?.usagePercent??'--' }}%

{{ monSystem.cpu?.count||'-' }} core

RAM

{{ monSystem.memory?.usedPercent??'--' }}%

{{ monSystem.memory?monSystem.memory.usedMB+'/'+monSystem.memory.totalMB+' MB':'-' }}

Disk

{{ monSystem.disk?.usedPercent??'--' }}%

{{ monSystem.disk?monSystem.disk.usedGB+'/'+monSystem.disk.totalGB+' GB':'-' }}

Licenses
Total Keys{{ licenseKeys?.length||0 }}
Unused{{ licenseKeys?.filter(k=>k.status==='unused').length||0 }}
Used{{ licenseKeys?.filter(k=>k.status==='used').length||0 }}
API Health
DB Ping{{ monHealth.dbPingMs??'--' }}ms
Uptime{{ monHealth.processUptime?formatUptime(monHealth.processUptime):'--' }}
Errors{{ monErrorTotal }}
System Vouchers

{{ stats.vouchers?.total||0 }}

Total

{{ stats.vouchers?.unused||0 }}

Unused

{{ stats.vouchers?.active||0 }}

Active

{{ (stats.vouchers?.total||0)-(stats.vouchers?.unused||0)-(stats.vouchers?.active||0) }}

Used

Voucher Cleanup

Delete old used/expired vouchers and their sessions to free up database space.

{{ cleanupPreview.vouchers }}

Vouchers to delete

{{ cleanupPreview.sessions }}

Sessions to clean

Oldest: {{ cleanupPreview.oldestDate }}

Nothing to clean up

Recent Activity

{{ recentActivity.length }} events

{{ a.description }}

{{ a.admin_name }}

{{ formatAgo(a.created_at) }}

No activity yet

{{ greeting }}

{{ assistAdmin ? assistAdmin.full_name : user.fullName }}

Live Assist

Total Revenue

₱{{ salesTotalRevenue }}

₱{{ Number(todayRevenue).toLocaleString(undefined,{maximumFractionDigits:0}) }} latest {{ salesTotalVouchers }} vouchers sold · {{ salesData.length }} {{ salesPeriod==='daily'?'days':salesPeriod==='weekly'?'weeks':'months' }}

APs Online

{{ stats.routers?.online||0 }}/{{ stats.routers?.total||0 }}

Active

{{ stats.sessions?.active||0 }}

Vouchers

{{ stats.vouchers?.unused||0 }}

No sales yet

Generate vouchers and start selling!

Live Network Status

Real-time

{{ stats.sessions?.active||0 }}

APs {{ stats.routers?.online||0 }}/{{ stats.routers?.total||0 }}
Active Sessions {{ stats.sessions?.active||0 }}
Vouchers Ready {{ stats.vouchers?.unused||0 }}
Admins {{ stats.admins?.total||0 }}

APs Online

{{ stats.routers?.online||0 }}

Active

{{ stats.sessions?.active||0 }}

Vouchers

{{ stats.vouchers?.unused||0 }}

Admins

{{ stats.admins?.total||0 }}

APs Total

{{ stats.routers?.total||0 }}

Vouchers

{{ stats.vouchers?.total||0 }}

Sessions

{{ stats.sessions?.active||0 }}

Recent Activity

{{ recentActivity.length }} events

{{ a.description }}

{{ a.admin_name }}

{{ formatAgo(a.created_at) }}

{{ formatDateTime(a.created_at) }}

No activity yet

Actions will appear here in real-time

Pending APs {{ pendingRouters.length }}

{{ r.model || 'Unknown Model' }}

{{ r.mac_address || r.serial_number }}

Announced {{ formatAgo(r.last_heartbeat || r.created_at) }}

Admin Users

{{ (a.full_name||'?')[0] }}

{{ a.full_name }}

{{ a.email }}

{{ a.omada_site_id }}

No site

{{ a.is_active?'Active':'Off' }}

WiFi Network (SSID)

{{ wifiSSIDName || 'Loading...' }}

Your customers see this name when connecting. All APs on your site broadcast this SSID.

Changing the SSID disconnects all current clients

Access Points ({{ omadaSiteName }})

No Access Points Found

APs will appear here once adopted on your Omada site

{{ ap.name || ap.mac }}

ONLINE PROVISIONING PENDING OFFLINE

{{ ap.mac }}

{{ ap.showModel || ap.model || 'Unknown' }} · IP: {{ ap.ip || '—' }}

Clients

{{ ap.clientNum || 0 }}

Uptime

{{ ap.uptime || '—' }}

CPU

{{ ap.cpuUtil || 0 }}%

Memory

{{ ap.memUtil || 0 }}%

Ship Mode Expired

Omada Controller

Sites Management

All sites configured on the Omada SDN Controller

{{ omadaSitesList.length }}

Total Sites

{{ omadaSitesList.filter(s=>s.wlanDeviceConnectedNum>0).length }}

With APs

{{ omadaSitesList.reduce((a,s)=>a+(s.wlanGuestNum||0),0) }}

Total Clients

{{ site.name }}

{{ site.scenario || 'Default' }} · {{ site.region || '—' }}

{{ site.wlanDeviceConnectedNum>0?'Active':'No APs' }}

APs Online

{{ site.wlanDeviceConnectedNum || 0 }}

APs Offline

{{ site.wlanDeviceDisconnectedNum || 0 }}

Clients

{{ site.wlanUserNum || 0 }}

Guests

{{ site.wlanGuestNum || 0 }}

{{ site.id }} · {{ site.timeZone }} Primary

Site AP Management

{{ selectedSite.name }}

{{ selectedSite.scenario || 'Default' }} · {{ selectedSite.region || '—' }}

{{ ap.name || ap.mac }}

{{ ap.showModel || ap.model || 'Unknown' }} · {{ ap.ip || '—' }}

{{ ap.mac }}

{{ ap.statusCategory===1?'Online':'Offline' }}
{{ (ap.assignedAdmin.full_name||'?')[0] }}

{{ ap.assignedAdmin.full_name }}

{{ ap.assignedAdmin.email }}

Not assigned

No APs found on this site

Vouchers

Manage Codes

Generate, print, and track voucher batches

Total

{{ batchSummary.total }}

Unused

{{ batchSummary.unused }}

Used

{{ batchSummary.used }}

Sales Monitoring

Total Amount

₱{{ batchSummary.totalAmount.toLocaleString('en',{minimumFractionDigits:0,maximumFractionDigits:0}) }}

Unused

₱{{ (batchSummary.totalAmount - batchSummary.usedAmount).toLocaleString('en',{minimumFractionDigits:0,maximumFractionDigits:0}) }}

Used

₱{{ batchSummary.usedAmount.toLocaleString('en',{minimumFractionDigits:0,maximumFractionDigits:0}) }}

Matching Batches ({{ filteredBatches.length }})

{{ b.count }} pcs

{{ b.batch_name || formatDuration(b.duration_minutes)+' Plan' }}

{{ formatBatchDate(b.created_at) }} · ₱{{ Number(b.price||0).toFixed(2) }}

Matching Codes ({{ vouchers.length }})

No vouchers found

Connected Devices

{{ omadaClients.length }} total

Live view of clients on your WiFi network

Active

{{ omadaClients.filter(c=>c.active).length }}

Guest

{{ omadaClients.filter(c=>c.guest).length }}

Total

{{ omadaClients.length }}

{{ client.name || client.hostName || (client.session && client.session.deviceName) || 'Unknown Device' }}

{{ client.vendor || client.osName || (client.session && client.session.deviceType) || client.mac }} · {{ client.ip }}

{{ client.connectionStatus==='authorized'?'Online':client.connectionStatus==='pending'?'Pending':client.connectionStatus==='disconnected'?'Disconnected':client.connectionStatus==='expired'?'Expired':'Offline' }}

Coin Wallet

{{ Number(client.walletBalance || 0).toFixed(2) }}

Device ID

{{ client.walletUid }}

Total loaded ₱{{ Number(client.walletTotalLoaded).toFixed(0) }}

{{ client.session.sessionStatus==='paused'?'Disconnected — Time Paused':'Session Active' }}
{{ client.session.voucherType==='continuous'?'CONTINUOUS':'PAUSE' }} {{ client.session.sessionStatus==='paused'?'disconnected':client.session.sessionStatus }}

{{ formatTimeCompact(client.session.remainingSeconds) }}

Remaining

{{ client.session.voucherCode || '---' }}

Voucher

{{ client.session.speedDown || '?' }}Mbps

Speed

Session Expired

Last Seen

{{ client.lastSeen ? formatAgo(client.lastSeen) : '---' }}

Down

{{ client.connectionStatus==='pending'||client.connectionStatus==='offline' ? '0 B' : formatBytes(client.download||client.trafficDown||0) }}

Up

{{ client.connectionStatus==='pending'||client.connectionStatus==='offline' ? '0 B' : formatBytes(client.upload||client.trafficUp||0) }}

SSID

{{ client.ssid || (client.session && client.session.ssidName) || '---' }}

{{ client.apName || client.apMac || (client.session && client.session.apMac) || '---' }} · {{ getAPModel(client) }}

No connected devices

Devices will appear here once they join your WiFi

{{ deviceHistoryMac }}

Usage history — newest first

{{ h.is_wallet?h.description:((h.source_type==='coin'||h.source_type==='coin_wallet')?(h.plan_name||'₱'+h.coin_amount):(h.source_type==='credit'?(h.plan_name||'Credit'):h.voucher_code||'—')) }}

{{ formatDate(h.started_at) }}

Plan: {{ h.plan_name }}
Duration: {{ formatDuration(h.duration_minutes) }}
Type: {{ h.voucher_type==='continuous'?'Continuous':'Pause' }}
Speed: {{ h.speed_down }}/{{ h.speed_up }} Mbps
WiFi: {{ h.wifi_name||'—' }}
Remaining: {{ formatRemaining(h.remaining_seconds) }}
Ended: {{ formatDate(h.ended_at) }}
Plan: {{ h.plan_name }}

No usage history found

Rate Plans

Pricing Tiers

Configure WiFi access plans and speed limits

{{ ratePlans.length }} / 8

{{ rp.name }}

{{ rp.is_active?'Active':'Off' }}

Price

₱{{ Number(rp.price).toFixed(0) }}

{{ formatDuration(rp.duration_minutes) }} {{ rp.speed_down }} Mbps {{ rp.speed_up }} Mbps {{ rp.max_devices }} {{ rp.max_devices===1?'Device':'Devices' }} {{ formatValidity(rp.validity_hours, rp.duration_minutes, rp.voucher_type) }}

Omada SDN

Controllers

Manage multiple Omada SDN controllers

No controllers registered

Add an Omada SDN controller to get started

{{ c.name }}

{{ c.url }}

{{ c.connected ? 'Online' : 'Offline' }}
{{ c.region }} {{ c.omadac_id }} {{ new Date(c.last_connected_at).toLocaleDateString() }}

Session Management

Pause Detector

Live monitoring {{ pdSocketConnected ? 'Connected' : 'Offline' }}

Status

{{ pdStats.isRunning ? 'Running' : 'Idle' }}

interval {{ Math.round((pdStats.pollIntervalMs||0)/1000) }}s · conc {{ pdStats.concurrency||0 }}

Last Run

{{ pdStats.lastRunAt ? formatLastSeen(pdStats.lastRunAt) : 'never' }}

{{ pdStats.lastRunDurationMs||0 }}ms · {{ pdStats.lastRunSitesChecked||0 }} sites · {{ pdStats.lastRunSessionsChecked||0 }} sess

Currently Paused

{{ pdStats.currentlyPausedCount != null ? pdStats.currentlyPausedCount : pdPausedSessions.length }}

+{{ pdStats.totalPaused || 0 }} since restart

Currently Resumed

{{ pdStats.currentlyResumedCount || 0 }}

+{{ pdStats.totalResumed || 0 }} since restart

Expired

{{ pdStats.totalExpired || 0 }}

since restart · Total runs: {{ pdStats.totalRuns || 0 }}

Currently Paused

{{ pdPausedSessions.length }}

No paused sessions

{{ s.client_mac }}

{{ formatTimeCompact(s.remaining_seconds) }} left
{{ s.voucher_code }} · {{ s.admin_name || 'unassigned' }} · {{ s.ssid_name || s.router_name || '—' }}

paused {{ formatLastSeen(s.paused_at) }}

Recent Events

No events yet
{{ ev.action }} {{ ev.mac }} {{ formatTimeCompact(ev.remaining) }} {{ formatLastSeen(ev.at) }}

System Monitor

VPS & API Health

CPU

{{ monSystem.cpu ? monSystem.cpu.usagePercent + '%' : '--' }}

{{ monSystem.cpu?.count || '-' }} core

RAM

{{ monSystem.memory ? monSystem.memory.usedPercent + '%' : '--' }}

{{ monSystem.memory ? monSystem.memory.usedMB + '/' + monSystem.memory.totalMB + ' MB' : '-' }}

Disk

{{ monSystem.disk ? monSystem.disk.usedPercent + '%' : '--' }}

{{ monSystem.disk ? monSystem.disk.usedGB + '/' + monSystem.disk.totalGB + ' GB' : '-' }}

Uptime

{{ monSystem.uptime ? formatUptime(monSystem.uptime) : '--' }}

VPS

Sessions

{{ monHealth.activeSessions ?? '--' }}

active now

APs

{{ monHealth.onlineRouters ?? '--' }}/{{ monHealth.totalRouters ?? '-' }}

online

API Traffic

Session Timeline

API Error Log ({{ monErrorTotal }})

No API errors recorded

Rate Limit Hits

No rate limit hits this period

Health

DB Ping{{ monHealth.dbPingMs ?? '--' }} ms
Active Admins{{ monHealth.activeAdmins ?? '--' }}
Active Vouchers{{ monHealth.activeVouchers ?? '--' }}
API Version{{ monHealth.apiVersion || '--' }}
Node.js{{ monHealth.nodeVersion || '--' }}
API Uptime{{ monHealth.processUptime ? formatUptime(monHealth.processUptime) : '--' }}

Documentation

User Guide

Step-by-step guide on how to use the system

1

Dashboard (Home)

Your dashboard shows a real-time overview of your business:

Total Revenue — Your total earnings from voucher sales. Use the Daily / Weekly / Monthly toggle to view different periods.

Sales Chart — Visual chart showing your revenue trend over time.

Live Status — Shows APs online, active sessions (connected devices), and available vouchers.

Recent Activity — Live feed of voucher usage, sessions, and system events.

2

APs / Routers

This page shows your WiFi access points (APs) managed through the Omada controller.

Online / Offline — Green dot means AP is powered on and connected. Gray means offline.

License — Each AP needs an active license. Tap an AP to view license status and expiry date.

SSID — The WiFi network name that customers see. You can update it from this page.

If your AP shows offline, check if it's powered on and connected to the internet. Contact support if the issue persists.

3

Vouchers

Vouchers are codes that customers enter to connect to your WiFi. Each voucher has a set duration and speed.

How to Generate Vouchers

Step 1: Go to the Vouchers page and tap "Generate"

Step 2: Set the quantity (how many codes to create)

Step 3: Set download/upload speed limits

Step 4: Set the usage duration (e.g. 1 hour, 3 hours, 1 day)

Step 5: Choose validity type:

Continuous — Timer runs even when device disconnects. Best for time-limited access.

With Pause — Timer only runs when connected. Customers can disconnect and reconnect later within the validity period.

Step 6: Tap "Generate" to create the voucher codes

Voucher Statuses

Unused — Ready to be sold. Code hasn't been entered yet.

Active — Customer is currently using this voucher.

Used — Time has expired. Voucher is fully consumed.

Revoked — Manually disabled by admin.

Batch Management

View Batch — See all voucher codes in a batch with their status

Print Batch — Print all unused vouchers in the batch (works with thermal printers)

Delete Batch — Remove entire batch (disconnects active sessions first)

4

Devices

Shows all devices currently connected to your WiFi network.

Connected Devices — Shows device name, MAC address, IP, which AP they're connected to, and remaining time.

Kick Device — Disconnect a device immediately. Their session will be paused (if pause type) or continue counting (if continuous).

Device History — Tap a device to see all its past sessions, vouchers used, and connection history.

5

Rate Plans

Rate plans define your pricing tiers — the packages displayed on your captive portal and used when generating vouchers.

Step 1: Tap "Add Rate Plan"

Step 2: Set a name (e.g. "1 Hour Surf", "All Day Pass")

Step 3: Set the price in PHP

Step 4: Set duration, speed limits, and validity type

Step 5: Tap "Save"

Rate plans appear on the customer portal when "Show Rate Plans" is enabled in Portal settings. Customers can see pricing before purchasing.

6

Portal Design

Customize the captive portal — the page customers see when they connect to your WiFi.

Template — Choose from Business, Cafe, Resort, Gaming, or Minimal themes. Each has different colors and styling.

Customize — Change portal name, welcome message, terms of service, and toggle rate plan display.

Live Preview — See how your portal looks in real-time as you make changes.

Don't forget to tap "Save & Publish" after making changes. Changes won't appear on the live portal until published.

7

License Activation

Each AP requires an active license to accept voucher connections.

Step 1: Get a license key from your provider (format: ICTBIZ-XXXXXX)

Step 2: Go to the Licenses page

Step 3: Tap "Activate License"

Step 4: Enter the license code and your AP's MAC address

Step 5: Tap "Activate"

License duration is typically 12 or 24 months. The system will show a warning when your license is about to expire.

8

Printer Station

The Printer Station is a separate app for quick voucher printing, ideal for POS (point of sale) use with a thermal printer.

Access: Visit printer.ictcloud.network or tap the printer icon in your admin panel

Step 1: Log in with your admin credentials

Step 2: Tap a rate plan card on the Home page

Step 3: Set quantity (1-30 vouchers per batch)

Step 4: Tap "Generate & Print"

Step 5: The voucher cards will appear — tap "Print Now" to send to your thermal printer (57mm)

For best results, use a 57mm thermal receipt printer. The voucher cards are optimized for this paper width.

Frequently Asked Questions

What happens when a voucher expires?

The customer is automatically disconnected. For continuous vouchers, the timer runs out. For pause vouchers, the validity period expires even if unused time remains.

Can a customer use the same voucher on multiple devices?

By default, each voucher allows 1 device. You can increase this when creating rate plans (Max Devices setting).

Can I use a voucher from another admin's network?

No. Each voucher is tied to the admin who created it. It only works on that admin's AP/router.

My AP shows offline. What should I do?

Check if the AP is powered on and has internet connection. Ensure the AP is adopted in the Omada controller. Contact your provider if the issue persists.

How do I reset my password?

Tap your profile avatar (top-right corner), then tap "Update Password". Enter your current password and the new one.

Need Help?

Contact your system provider for technical support.

Portal Design

Choose Template

Select a base then customize colors, text, and images

{{ t.name }}

{{ t.desc }}

Customize

Show Rate Plans

Display available packages on the portal page

Live Preview

{{ portalForm.portal_name || 'WiFi Hotspot' }}

{{ portalForm.welcome_text || 'Enter your voucher code to connect' }}

{{ portalForm.terms_text.substring(0,80) }}...

Hardware

Coinslots

{{ coinslots.length }} device{{ coinslots.length !== 1 ? 's' : '' }} bound to your account

{{ coinslots.length }}

How to add a coinslot

  1. Power on the ICTBIZwifi+ Smart Coinslot device
  2. Connect to WiFi BizWifi-Coinslot-XXXX
  3. Open http://192.168.4.1
  4. Configure your home WiFi, then login with your admin credentials

No coinslots bound

Follow the steps above to add your first coinslot

Coins

{{ cs.coins_total || 0 }}

{{ cs.rssi }}dBm {{ formatUptime(cs.uptime_seconds) }} No router linked {{ formatRelative(cs.last_seen) }} Bound {{ formatBoundDate(cs.bound_at) }} All APs {{ (cs.assigned_router_ids||[]).length }} AP{{ (cs.assigned_router_ids||[]).length === 1 ? '' : 's' }}

Assign Coinslot to APs

{{ assignAPsModal.coinslot && assignAPsModal.coinslot.name || '' }}

Choose which APs can use this coinslot. Customers will only see this slot in the portal when they're connected to an allowed AP.

Loading APs...

You have no APs added yet

Your APs ({{ assignAPsModal.routers.length }})

No APs selected — coinslot will be unavailable until you pick at least one.

{{ confirmDialog.title }}

{{ confirmDialog.message }}

Session Expired

Your session has expired due to inactivity or token expiration. Please sign in again to continue.

Processing...

{{ (user.fullName||'U')[0] }}

{{ user.fullName }}

{{ user.email }}

{{ user.role==='super_admin'?'Super Admin':'Admin' }}

Security

Change Password

Transfer AP

{{ transferAP?.name || transferAP?.mac }}

{{ transferAP?.mac }} · {{ transferAP?.model }}

License Details

{{ apLicenseAP?.name || apLicenseAP?.mac }}

{{ apLicenseAP?.mac }}

{{ apLicenseAP?.showModel || apLicenseAP?.model || 'Unknown' }} · IP: {{ apLicenseAP?.ip || '—' }}

ONLINE OFFLINE

{{ !apLicenseData.router.license_expires_at ? 'Ship Mode' : new Date(apLicenseData.router.license_expires_at)>new Date() ? 'Active' : 'Expired' }}

Expires: {{ new Date(apLicenseData.router.license_expires_at).toLocaleDateString() }}

No license activated yet

{{ formatLicenseRemaining(apLicenseData.router.license_expires_at) }}

remaining

License History ({{ apLicenseData.history.length }} keys used)

No licenses activated yet
{{ lk.code }} +{{ lk.duration_months }}mo
Activated: {{ lk.activated_at ? new Date(lk.activated_at).toLocaleDateString() : '—' }} Until: {{ lk.expires_at ? new Date(lk.expires_at).toLocaleDateString() : '—' }}

Transfer AP to Admin

{{ transferAPAdminAP?.name || transferAPAdminAP?.mac }}

{{ transferAPAdminAP?.mac }}

{{ a.full_name }}

{{ a.email }}

No other admins found

New Admin User

System admin only — no Omada controller account created

Auto Site Setup

A new Omada site will be created using the admin's name, with the same WiFi SSID and portal settings as the default site.

Accept Router

Router is online and waiting to be activated

Model{{ acceptingRouter?.model||'Unknown' }}
MAC{{ acceptingRouter?.mac_address }}
Firmware{{ acceptingRouter?.firmware_version||'—' }}
Announced{{ formatAgo(acceptingRouter?.last_heartbeat||acceptingRouter?.created_at) }}

License clock will NOT start until Ship Mode is activated and the customer powers on the router

Transfer AP to Admin

{{ assigningAP ? (assigningAP.name || assigningAP.mac) : '' }}

{{ assigningAP ? assigningAP.mac : '' }}

The AP will be transferred to the selected admin's Omada site. It may go offline briefly during the transfer.

{{ (a.full_name||'?')[0] }}

{{ a.full_name }}

{{ a.email }}

No admins found

Change WiFi Name

This will update the SSID on all your access points

{{ wifiSSIDName || '—' }}

Max 32 characters. Avoid special characters.

Warning

All connected devices will be disconnected and need to reconnect with the new WiFi name.

New Batch

Generate Vouchers

Maximum 500 vouchers per batch

Usage time runs only when connected to WiFi. Remaining time expires after validity is reached.

Usage time runs even when device is not connected

Pricing

{{ editingRate ? 'Edit Rate Plan' : 'New Rate Plan' }}

Usage time runs only when connected to WiFi. Remaining time expires after validity is reached.

Usage time runs even when device is not connected

Edit Credentials

{{ editingController ? 'Edit Controller' : 'Add Controller' }}

Advanced (MongoDB)

{{ controllerTestResult.connected ? 'Connection Successful' : 'Connection Failed' }}

{{ controllerTestResult.error }}

Found {{ controllerTestResult.sites.length }} site(s)

Add Access Point

The AP must already be adopted and moved to this customer's Omada site before adding it here. This only registers it in the system — it does not move the AP.

Generate License Keys

{{ generatedKeys.length }} key(s) generated!

{{ k }}

Activate License Key

Applying to:

{{ omadaAPs[0].name || omadaAPs[0].mac }}

All Activity Log

{{ a.description }}

{{ a.admin_name }}

{{ formatAgo(a.created_at) }}

{{ formatDateTime(a.created_at) }}

No activity

Adjust Credits

Current Balance

₱{{ Number(adjustForm.currentBalance||0).toFixed(2) }}

{{ adjustForm.mac }}

{{ toast.message }}