Skip to content

FUP Counters

The FUP Counters page is the operational view of your Fair Usage Policy. It shows, in real time, which subscribers have been throttled by QuotaSync, which are about to be, and how the population is distributed across the six daily and six monthly FUP tiers defined on each Service.

QuotaSync runs every 30 seconds. Every time a subscriber’s daily_download_used + daily_upload_used crosses a threshold, the row’s fup_level is incremented and RADIUS pushes the new throttled rate via CoA. This page reads fup_level and monthly_fup_level columns directly, so it’s effectively the live picture.

Sidebar → FUP Counters. Direct URL: /fup.

Requires fup.view. The reset operations require fup.reset.

SectionWhat it shows
Stat rowTotal subscribers, Active FUP (fup_level > 0), Daily quota exceeded, Monthly quota exceeded, Unlimited (services with quota = 0)
FUP distributionBar chart: how many subscribers in each tier (0, 1, 2, 3, 4, 5, 6)
Quota tablePer-subscriber row with daily and monthly bars
Filter barSearch, FUP status filter, Quota status filter
Action columnReset FUP, Open subscriber
CardDefinition
Total SubscribersCOUNT(*) from subscribers in scope
Active FUPWHERE fup_level > 0 — currently throttled by daily FUP
Daily Quota ExceededJOIN services WHERE daily_quota > 0 AND daily_quota_used >= daily_quota
Monthly Quota ExceededSame for monthly
UnlimitedWHERE services.daily_quota = 0 AND services.monthly_quota = 0

Each card is clickable as a filter shortcut.

A horizontal bar chart, one bar per FUP level 0–6, showing the subscriber count in each. A healthy ISP has the vast majority in tier 0 (full speed). Sustained populations in tiers 4–6 mean either:

  • Your daily quota is too small for what customers are paying.
  • A handful of heavy users (peer-to-peer, IP cameras, surveillance backhauls) are recurring offenders.

One row per subscriber, sortable by fup_level DESC, monthly_quota_used DESC by default — heaviest offenders first.

ColumnNotes
UsernameClick to open subscriber detail.
Full NameFrom subscribers.full_name.
ServiceFrom services.name.
ResellerFrom resellers.name.
Daily Used / Quotadaily_quota_used / services.daily_quota. Bar shows percentage.
Monthly Used / QuotaSame for monthly.
FUP LevelCurrent daily tier (0–6). Badge coloured by severity.
OnlineGreen dot if is_online = true.
Last Quota Resetlast_quota_reset timestamp.

Bar colours follow standard ISP convention:

  • 0–60% — green
  • 60–80% — yellow (approaching tier)
  • 80–100% — orange (about to throttle)
  • ≥ 100% — red (throttled)
ValueFilter
Activefup_level > 0
Normalfup_level = 0
ValueFilter
Daily exceededdaily_quota_used >= daily_quota
Monthly exceededmonthly_quota_used >= monthly_quota
Warning (80%+)Daily OR monthly used ≥ 80% of quota
UnlimitedService has no quota

Username or full_name ILIKE match.

Each row has a Reset FUP button. The handler:

  1. Sets fup_level = 0.
  2. Zeros daily_quota_used, daily_download_used, daily_upload_used.
  3. Updates last_daily_reset = now().
  4. Restores Mikrotik-Rate-Limit in radreply to the service’s full speed.
  5. Sends CoA Update with the new rate (or falls back to MikroTik API).

The subscriber feels the speed-up within 30 seconds. Monthly counters are not touched — only Renew resets monthly.

From Subscribers → filter by FUP tier → Select All → Reset FUP.

The DailyQuotaResetService runs once a day at the configured Daily Quota Reset Time (Settings → RADIUS, default 00:05 in the system timezone). It runs:

UPDATE subscribers SET
daily_quota_used = 0,
daily_download_used = 0,
daily_upload_used = 0,
fup_level = 0,
last_daily_reset = NOW()
WHERE deleted_at IS NULL;

If the API container restarts at exactly that minute the reset can be missed — the service window is 2 minutes wide. If you find subscribers stuck in tier 6 the next morning, check docker logs proxpanel-api | grep DailyQuotaResetService.

Monthly counters reset only on subscriber Renew. The fields zeroed:

monthly_fup_level, monthly_download_used, monthly_upload_used,
monthly_quota_used, cdn_monthly_download_used, cdn_monthly_upload_used,
cdn_monthly_fup_level

last_monthly_reset = now() is set so reports can attribute usage to the right billing period.

QuotaSync cycle (every 30 s):

  1. Read every online subscriber + their service.
  2. For each, query the NAS via /ppp active for =bytes-in= and =bytes-out= (per-session counters that reset on reconnect).
  3. Compute delta = current_bytes - last_session_*.
  4. Sanity cap (v1.0.388) — if delta > 1 GB per 30 s cycle, log SUSPICIOUS DELTA, re-baseline, skip this cycle. Prevents the v1.0.387 inflated-counter bug from reoccurring.
  5. Apply Free Hours discount if in the time window.
  6. Add to daily_*_used, monthly_*_used.
  7. Evaluate tier crossings. If a new tier is reached, write the new Mikrotik-Rate-Limit to radreply and CoA-push it to the NAS.

Soft-FUP services keep burst configuration alive even at the throttled rate so brief clicks still feel snappy.

Reset everyone in tier 6 (end of “rough day”)

Section titled “Reset everyone in tier 6 (end of “rough day”)”
  1. From Subscribers, click the FUP 6 stat counter.
  2. Select All → Reset FUP.
  3. All filtered subscribers return to tier 0 with full Mikrotik-Rate-Limit. Speeds update via CoA in 30 seconds.
  1. Open this page.
  2. Click the Monthly Used column header to sort descending.
  3. The top of the list is your bandwidth hogs. Cross-reference with the Sharing Detection page to see if any of them are sharing accounts.

Diagnose a subscriber who says “I’m always throttled”

Section titled “Diagnose a subscriber who says “I’m always throttled””
  1. Search their username.
  2. Look at the daily and monthly bars.
  3. Open the subscriber → Usage tab → daily breakdown chart. Identify the day they hit the threshold.
  4. If the chart shows unexpectedly high usage (10× normal), they may have inherited counters from another user — check last_session_* columns and force a re-baseline by changing their service and back.
PermissionEffect
fup.viewPage loads.
fup.resetReset FUP button on each row + bulk reset enabled.
subscribers.view_allReseller sees system-wide quota stats, not just their own.