3CX License Management Across a Fleet: Every Renewal in One Place

A lapsed 3CX license takes a customer's phones offline. Across dozens of PBXs, the renewal that gets you is the one that slipped off the calendar. Here's how to see every expiry and capacity risk on one screen — with reminders that chase you before it bites.

The problem with tracking license renewals across many PBXs

A 3CX license isn't a soft limit you can quietly run past. When it lapses, the PBX stops behaving like a healthy phone system — simultaneous calls get capped, and an outright expiry can take service down. For a customer, that reads as "the phones broke," and it lands as an emergency ticket on a day nobody scheduled.

For a single PBX this is easy to stay on top of: there's one date, and it's probably in your calendar. The failure mode is specific to scale. When you manage twenty, fifty, or a hundred customer instances — each with its own edition, its own expiry, its own seat count, possibly bought through different resellers at different times — there is no single date to remember. There's a long tail of them, and the one that gets you is precisely the one that fell off the spreadsheet: the client you onboarded eight months ago, the instance whose key you can't immediately place, the renewal that was "next quarter's problem" until next quarter arrived.

The usual coping mechanisms don't hold up. A shared spreadsheet of expiry dates is stale the moment a license is renewed or a customer adds seats, and nobody trusts it enough to act on it. Logging into each customer's 3CX console to check license status is exactly the kind of recurring chore that gets skipped under load. And native 3CX gives each PBX a view of its own license — there's no built-in pane that shows you all of them at once, ranked by who's about to lapse. So the work that protects you most (knowing your fleet's renewal posture before a customer does) is the work that's easiest to let slide.

The fix has the same shape every fleet problem does: consolidate the data into one place, sort it so the urgent thing is on top, and get told before a deadline instead of after. That's license management as an operations function, not a memory game.

The fleet License Status view: every license on one screen

The center of license management in Sikurd is a single License Status page that reads each connected instance's license off the PBX and lays the whole fleet out in one table. Every row carries the facts you actually need to make a renewal or capacity decision:

  • License edition — the human-readable 3CX edition for that instance (retail, hosted/SPLA, and unknown variants all resolved to a consistent label), with the license key and version shown alongside.
  • Expiry date — when that license lapses, rendered in your tenant timezone so the date matches the one your customer is on.
  • Days left — the countdown, with overdue licenses shown explicitly as "Nd overdue" rather than a quiet negative number.
  • Simultaneous-call limit — the licensed concurrent-call ceiling for that PBX, so capacity is visible next to the seat count.
  • Seat / extension usage — a usage bar of extensions used vs. licensed, with the percentage and a human-vs-AI-user breakdown, so you can see who's running near their ceiling.

Two design choices make this a triage tool rather than a list. First, the table is sorted soonest-expiry-first: most-overdue at the very top, then whatever expires next, with instances that have no expiry data falling to the bottom. You never scroll to find the fire — it's already at the top of the page. Second, five status counters sit across the top and roll the fleet up at a glance:

  • Expired
    The license has already lapsed (or the PBX reports it expired). These are live incidents — phones may already be degraded.
  • Critical
    14 days or fewer until expiry. Renew now; this is the band that turns into an Expired row if ignored.
  • Warning
    60 days or fewer. On the horizon — get the renewal queued with the customer before it's urgent.
  • Active
    Comfortably in date. Nothing to do but keep an eye on seat usage.
  • Unknown
    No expiry data on record for that instance — worth investigating, because a missing date is its own risk.

The same bands drive the row coloring, so the table reads like a heat map: green is fine, yellow is "this quarter," red is "now," and an expired row is unmistakable. One screen answers the two questions that matter — what's about to lapse, and who's about to outgrow their license? — without logging into a single 3CX console.

The License Expiry Calendar: renewals grouped by month

Beneath the status table sits a License Expiry Calendar that takes the same data and reframes it for planning instead of triage. Instead of a flat list, it groups upcoming expiries by month — "June 2026," "July 2026," and so on, in chronological order — so a renewal workload becomes legible the way a calendar is. Each entry shows the instance, the customer, the FQDN, the license key, the exact expiry date, and a days-left badge.

This is the view you open when you're doing forward planning rather than firefighting: you can see that you have three renewals clustered in August and one straggler in November, decide whose you'll batch together, and reach out to those customers ahead of time. Where the status table answers "what's on fire right now," the calendar answers "what's coming, and how should I spread the work" — and clicking any entry jumps you straight to that instance.

One-click renew: deep-links into the 3CX partner shop

Spotting an expiry is only useful if acting on it is fast. So every row that has a known license key carries a "Renew / buy" button that deep-links directly into the 3CX partner shop for that exact license key — the standard partner renewal URL, pre-filled with the key, opened in a new tab so you keep your place in the fleet view.

To be clear about the boundary: Sikurd doesn't process the purchase. The renewal itself still happens in the 3CX portal, where your reseller account and partner pricing live — that's by design, because that's where the commercial relationship belongs. What the one-click link removes is the annoying middle step: figuring out which key belongs to which customer and navigating to the right place to renew it. You go from "this customer is about to lapse" to "the right renewal page is open" in a single click. And once you've renewed there, the "Refresh license" button on the instance pulls the new expiry back into Sikurd so the dashboard and the reminders reflect reality without waiting for the next poll.

License-expiry reminders: 10, 3, and 1 day out

The dashboard tells you the state when you look at it. Reminders are what make sure you don't have to remember to look. Sikurd fires license-expiry reminder alerts at three milestones ahead of each expiry date:

  • 10 days out — INFO
    The heads-up. "This license expires soon — plan the renewal." Enough runway to reach the customer and schedule it calmly.
  • 3 days out — WARNING
    Act this week. The window is closing and the renewal needs to actually happen now, not be planned.
  • 1 day out — CRITICAL
    You have hours. This is the last call before the license lapses and the phones are affected.

A few details make these reminders trustworthy rather than noisy — and they're worth spelling out, because the difference between a useful alert and an ignored one is in exactly these mechanics:

  • Calendar-day math in the tenant's timezone. "Days left" is computed as the difference between calendar dates in your timezone, not a UTC clock diff. A license that expires tomorrow at 9 p.m. Eastern reads as "1 day," the way you'd actually say it — not "2 days" because of a UTC overflow. The alert thresholds line up with the human mental model of "what day does this die."
  • De-duplicated, one clean series per expiry. Each milestone fires once for a given expiry date. You get a tidy 10 → 3 → 1 progression, not the same warning repeated every poll. And because each reminder is keyed to a specific expiry date, the series is tied to this renewal cycle.
  • Auto-resolving on renewal. Because the reminders are keyed to the expiry date, the moment Sikurd reads a new, later date, the old series no longer applies — a renewed license simply stops alerting. Hit "Refresh license" after renewing and any open license-expiry alert clears immediately once the new date clears the 10-day window, instead of lingering until the next poll.
  • Routed like any other alert. License-expiry reminders flow through the same alert pipeline as the rest of your monitoring, so they can land wherever your other alerts do — your PSA, Slack or Teams, or an escalation policy — rather than living in a corner of the UI nobody checks.

A note on what these reminders are not, because over-claiming here would be misleading. The reminder series covers the license expiry date. It is not a seat-overage pager — Sikurd shows seat and call-capacity headroom on the dashboard so you can read it during a review, but it does not page you when an instance crosses a utilization threshold. And it's a license-date series, not a 3CX maintenance/support-contract countdown; maintenance status shows up as a flag that gates updates, not as its own dated alarm. The expiry reminders are the part that actively chases you; capacity and maintenance are things you check.

Why this beats a spreadsheet (or remembering)

The build-it-yourself alternative is a shared sheet of expiry dates that somebody updates by hand, cross-referenced against logging into each console when you remember to. That works for a handful of PBXs. Across a real fleet it produces the exact failure the whole industry keeps relearning: the sheet drifts out of date, nobody trusts it, the check that would have caught the lapse is the one that got skipped — and you find out a license expired because a customer's phones went down.

Consolidating license management closes that gap by default. Every instance's edition, expiry, simultaneous-call limit, and seat usage live on one screen, sorted so the next thing to lapse is on top. The calendar lets you plan renewals by month instead of reacting to them. One click takes you to the right renewal page for the right key. And a 10/3/1-day reminder series — computed on your calendar, de-duplicated, auto-resolving on renewal — makes sure the deadline finds you first. The work that "didn't get done consistently" becomes a glance at one page and an alert you can't miss.

Adjacent reading

Frequently asked questions

When do the license-expiry reminders actually fire?
At three milestones before the expiry date: 10 days out is an INFO heads-up (plan the renewal), 3 days out is a WARNING (act this week), and 1 day out is CRITICAL (you have hours). The math is done on calendar days in the tenant's timezone, not a UTC clock diff — so a license that dies tomorrow at 9 p.m. Eastern reads as "1 day," the way an operator thinks about it, instead of "2 days" because of a UTC overflow. Each milestone fires once per expiry date and is de-duplicated, so you get a clean three-step series rather than repeated noise — and the alert routes through the same alert pipeline as the rest of your monitoring (so it can hit your PSA, Slack/Teams, or escalation policy).
What happens to the reminders after I renew?
They clear themselves. Reminders are keyed to a specific expiry date, so the moment Sikurd reads a new, later expiry off the PBX, the old milestone series no longer applies and a renewed license simply stops alerting. If you've just renewed upstream at the 3CX portal and don't want to wait for the next poll cycle, hit the per-instance "Refresh license" button — it forces the PBX to re-query 3CX's license server, pulls the new expiry into Sikurd immediately, and auto-resolves any open license-expiry alert when the new date is comfortably past the 10-day window. You see the before/after expiry inline so you know the refresh actually moved the needle.
Does Sikurd warn me before I run out of extension seats or call capacity?
It shows you the headroom, plainly, but it does not page you on seat overage. Every row on the License Status page carries a seat/extension usage bar (used vs. licensed, with a percentage and a human/AI breakdown) and the simultaneous-call limit, so you can see at a glance which customers are running close to their ceiling and need a bigger license before they hit a wall. Sikurd records an internal event when an instance crosses ~90% utilization, but — to be precise — that event does not currently send a notification. Capacity is something you read off the dashboard during a review, not an alert that wakes you up. The expiry reminders are the part that actively chases you.
What does the one-click "Renew / buy" link do?
Each row with a known license key shows a "Renew / buy" button that deep-links straight into the 3CX partner shop for that exact key (the standard partner renewal URL, pre-filled with the key). It opens in a new tab so you don't lose your place in the fleet view. There's no purchasing inside Sikurd — the actual renewal still happens in the 3CX portal, where partner pricing and your reseller account live — but the link removes the step of hunting down which key belongs to which customer. Once you've renewed there, the "Refresh license" button pulls the new expiry back so the dashboard and reminders update.
Does Sikurd track 3CX maintenance / support-contract expiry too?
Not as a dated reminder — and it's worth being honest about the boundary. What Sikurd surfaces is the license expiry (edition, expiry date, days left, simultaneous-call limit, seat usage). 3CX maintenance status appears as a boolean "maintenance expired" flag that gates updates — if an instance's maintenance has lapsed, Sikurd holds it out of an update push rather than failing mid-install — but there is no 10/3/1-day countdown on the maintenance date the way there is on the license. If your renewals and maintenance run on the same date, the license reminders effectively cover both; if they're decoupled, treat the license-expiry series as your alarm and the maintenance flag as a pre-update safety check.
How is the fleet view sorted, and what are the status colors?
Soonest problem first. The License Status table sorts by days-remaining ascending, so anything already overdue floats to the very top, then whatever expires next, and instances with no expiry data fall to the bottom — you never have to scroll to find the fire. Each instance gets one of five statuses that also drive five counter tiles across the top: Expired, Critical (≤ 14 days), Warning (≤ 60 days), Active, and Unknown (no expiry data on record). The 10/3/1-day figures are the reminder thresholds — the alerts that fire — while the 14/60-day bands are the at-a-glance color coding on the table so a quarterly horizon is visible without doing date math in your head.
Do I have to log into every customer's 3CX console to see this?
No — that's the entire point. Sikurd reads each connected instance's license edition, expiry, simultaneous-call limit, and seat usage and consolidates them onto one page, with a per-month expiry calendar beside the table. You see every customer's renewal posture and capacity in a single screen instead of remote-ing into N admin consoles or keeping a spreadsheet of expiry dates that's stale the moment you save it.

See every 3CX license, expiry, and seat count in one view.

Sort the whole fleet soonest-expiry-first, group renewals by month, renew any key in one click, and get 10/3/1-day reminders before a license lapses. Your first three instances are free, forever.