For ISPs, RT/RW nets, schools and homelabs. Manage PPPoE subscribers and hotspot vouchers without a local server. One-line setup on MikroTik; works with Ubiquiti, Cisco, Huawei and any standard RADIUS NAS.
Your MikroTik keeps doing what it is good at: moving traffic. Every login, limit and disconnect is decided in the cloud and travels over one encrypted tunnel. Pick a scenario or step through it yourself.
Step 1 of 7
Encrypted tunnel
Login page
Customer
Phone or laptop
Your MikroTik
NAS · hAP ax³
Mikrodius
Cloud RADIUS
Your app
Billing, webhooks
Packet inspectorCustomer → Your MikroTik
Login page
hotspot login
username = "K7Q2"
password = "••••••"
Access-Request
Code = Access-Request
User-Name = "K7Q2"
Calling-Station-Id = "D4:CA:6D:11:22:33"
# from 10.8.0.14, the NAS tunnel IP
Checks
✓ NAS Kopi Senja (10.8.0.14)
✓ voucher K7Q2 · plan "1 Day 10M"
✓ expiry not used yet
✓ devices 0 of 1 online
Access-Accept
Code = Access-Accept
Mikrotik-Rate-Limit = "5000k/10000k"
Session-Timeout = 86400
Acct-Interim-Interval = 300
Online
status = logged in
address = 10.5.50.42
rate = 10M down / 5M up
Accounting-Start
Acct-Status-Type = Start
Acct-Session-Id = "81a00012"
Framed-IP-Address = 10.5.50.42
session.started
{
"type": "session.started",
"data": { "session": {
"username": "K7Q2", ... } }
}
PPPoE dial
service = pppoe
user = "pppoe-cust-104"
password = "••••••"
Access-Request
Code = Access-Request
User-Name = "pppoe-cust-104"
Service-Type = Framed-User
Checks
✓ NAS RT 05 Tower (10.8.0.9)
✓ subscriber pppoe-cust-104
✗ password does not match
Access-Reject
Code = Access-Reject
Login failed
pppoe: authentication failed
subscriber.login_rejected
{
"type": "subscriber.login_rejected",
"data": {
"username": "pppoe-cust-104",
"reason": "wrong_password" }
}
Time's up
subscriber K7Q2
expires_at 2026-10-01T19:42:00+07:00
→ disconnect its live sessions
Disconnect-Request
Code = Disconnect-Request
User-Name = "K7Q2"
Acct-Session-Id = "81a00012"
Session dropped
hotspot: logged out
Disconnect-ACK
Code = Disconnect-ACK
Accounting-Stop
Acct-Status-Type = Stop
Acct-Session-Time = 86400
Acct-Output-Octets = 1840236544
subscriber.expired
{
"type": "subscriber.expired",
"data": { "subscriber": {
"username": "K7Q2", ... } }
}
Interim-Update
Acct-Status-Type = Interim-Update
User-Name = "budi.santoso"
Acct-Output-Gigawords = 23
Acct-Output-Octets = 1288490188
Checks
✓ usage 100.1 GB this month
→ fup step 1: after 100 GB, 5 Mbps
→ no data limit: stays online
CoA-Request
Code = CoA-Request
Acct-Session-Id = "81b0002f"
Mikrotik-Rate-Limit = "2500k/5000k"
Queue updated
rate = 5M down / 2.5M up
CoA-ACK
Code = CoA-ACK
subscriber.fup_reached
{
"type": "subscriber.fup_reached",
"data": { "step": {
"number": 1,
"after_bytes": 100000000000,
"bandwidth": { ... } } }
}
POST /suspend
POST …/subscribers/
external_id:CUST-104/suspend
{ "reason": "Invoice INV-0042 overdue" }
Disconnect-Request
Code = Disconnect-Request
User-Name = "pppoe-cust-104"
Acct-Session-Id = "81b0002f"
Session dropped
pppoe: disconnected
# the modem redials by itself
Access-Request
Code = Access-Request
User-Name = "pppoe-cust-104"
Service-Type = Framed-User
Checks
✓ password matches
✗ status suspended
→ isolation plan "Isolir"
Access-Accept
Code = Access-Accept
Mikrotik-Rate-Limit = "512k/512k"
Mikrotik-Address-List = "isolir"
Payment page
address-list = isolir
→ web traffic goes to your payment page
PATCH /plans
PATCH /api/v1/workspaces/ws_…/plans/plan_…
{ "bandwidth": {
"download_kbps": 20000,
"upload_kbps": 10000 } }
Live sessions
plan "Home 20"
→ 38 sessions online on 4 NAS
→ only the speed changed: send CoA
CoA-Request
Code = CoA-Request
Acct-Session-Id = "81a00012"
Mikrotik-Rate-Limit = "10000k/20000k"
Queue updated
rate = 20M down / 10M up
CoA-ACK
Code = CoA-ACK
Midnight
plan "Home 10" · speed_windows
00:00–06:00 every day 20 Mbps
→ 212 sessions online on 6 NAS
CoA-Request
Code = CoA-Request
Acct-Session-Id = "81a00012"
Mikrotik-Rate-Limit = "10000k/20000k"
Queue updated
rate = 20M down / 10M up
CoA-ACK
Code = CoA-ACK
CoA-Request
# 06:00, the window ends
Code = CoA-Request
Mikrotik-Rate-Limit = "5000k/10000k"
Queue updated
rate = 10M down / 5M up
Login page
hotspot login
username = "K7Q2"
password = "••••••"
Product
Everything to run hotspot and PPPoE networks.
Batch vouchers in one click
Generate 10–500 hotspot vouchers in one click with your own prefixes, time limits and speed tiers. Export the batch as CSV for distribution.
Kopi Senja WiFi
KS-7Q2M
1 Day · 10M
Kopi Senja WiFi
KS-H83X
3 Hours · 5M
Kopi Senja WiFi
KS-P4DN
7 Days · 20M
Instant disconnect
No scheduled scripts. When time or quota runs out, the router drops the session immediately.
Voucher K7Q200:03
Voucher expires
Disconnect sent over tunnel
Session dropped
Speed profiles
Standard MikroTik-Rate-Limit attributes create simple queues on login.
Home 105M/10M
Home 3015M/30M
Business50M/50M
PPPoE subscribers
Monthly customers with static IPs, MAC lock against password sharing and automatic expiry.
Static IPMAC lockAuto-expiryData quotaSimultaneous use
Every site, one place
Group towers, branches and cafés into workspaces and share subscriber pools across access points.
4 of 5 routers online · tap one to switch it
Live traffic and session history
See who is online right now, with IP, MAC, uptime and bytes. Export accounting records for billing and compliance.
User
IP
Uptime
Down / Up
pppoe-cust-104
10.10.1.45
3h 12m 00s
4.20 GB / 610 MB
vch-k92a
10.5.50.42
42m 00s
380 MB / 41 MB
pppoe-cust-221
10.10.1.88
1d 4h 7m
18.90 GB / 2.10 GB
Setup
Online in two minutes.
Three steps, one command. No public IP, no firewall rules, no RADIUS dictionaries.
1
Step 1
Create a workspace
One per network you run, with its own NAS, plans, subscribers and sessions.
2
Step 2
Add the NAS
Name the MikroTik. Mikrodius generates its tunnel keys and RADIUS secret.
3
~1 min
Step 3
Paste one command
Run it in the RouterOS terminal. The router dials out and comes online.
RouterOS v7 terminal
# WireGuard (RouterOS v7) — paste in the RouterOS terminal
[admin@MikroTik] >
Your dashboard
Waiting for the router
Kopi Senja
WireGuard · 10.8.0.14
Last seen
Never
Active sessions
—
What the command sets up
The RADIUS client for hotspot and PPPoE
A WireGuard tunnel to Mikrodius
Instant disconnects and speed changes
Left untouched
FirewallDHCPHotspot pagesQueues
Pricing
Pay for the access you sell.
No monthly fee and no tiers. Each subscriber access is charged once, after a free trial of 2 minutes or 5 MB, and priced by how long it lasts. Top up with QRIS.
Access rates
One flat price per access, paid in platform credits. Every Rp 1 you top up adds 1 credit.
Under 2 minutes and 5 MB Free trial0 credits
Up to 1 hour5 credits
Up to 3 hours10 credits
Up to 6 hours15 credits
Up to 12 hours20 credits
Up to 1 day25 credits
Up to 3 days60 credits
Up to 7 days120 credits
Up to 30 days300 credits
Every access starts with a free trial: nothing is charged until the user has been online 2 minutes or used 5 MB. Access length is the plan's validity, its time limit or the user's expiry, whichever ends first. Access with no end is charged once for every 30 days it is used.
For new accounts
Rp 1.000.000
worth of welcome credit, free to use in your first 30 days. No card needed.
Print as many vouchers as you like. Unsold vouchers and users who never log in cost nothing; you are charged only when a user goes online for the first time.
K7Q2
0
M4XP
25
T9RB
0
A2LC
0
What would my network cost?
List the vouchers and subscriptions you sell, at any length and volume, and see your cost per day, month or year.
Unlimited subscribers and vouchers
25 NAS included per workspace
Unlimited session history
Webhooks, full API and MCP
Top up with QRIS
Top-ups become Platform Credits that pay for subscriber access and other platform services. See the User Agreement and Privacy Policy.
Developers
Plug into your own billing.
A documented REST API, signed webhooks and an MCP server for AI agents. OpenAPI and llms.txt included — no login needed to read the docs.