Platform Billing
Platform Billing is where Ascent operators manage the subscriptions of every MSP organization (tenant) on the platform. It tracks plans, seats, trials, licenses, and the underlying Stripe subscriptions. This is an operator-only surface — it manages how MSPs pay Ascent, not how MSPs bill their own clients.
Overview
Platform Billing lets you:
- Review platform-wide revenue and subscription metrics (MRR, active, trial, past-due, churn, and more)
- Search and filter every organization's subscription
- Inspect a single organization's plan, seats, usage, and billing history
- Change an organization's license tier and seat count
- Start, extend, end, or remove trials
- Grant or revoke perpetual and internal licenses
- Link an organization to a Stripe customer/subscription, and cancel or resume its Stripe subscription
Access
This page is part of the Platform Admin area and is only available to platform operators — not to MSP org admins. Opening the page requires the PLATFORM_ADMIN or PLATFORM_BILLING role; operators without one of those roles see an Access Denied message. All subscription management actions (changing tiers and seats, managing trials, granting or revoking licenses, and Stripe cancel/resume) likewise require PLATFORM_ADMIN or PLATFORM_BILLING, and linking or unlinking Stripe requires PLATFORM_ADMIN.
Navigate to Platform Billing
Open the Platform Admin area and select Billing (breadcrumb: Platform Admin → Billing).
Summary statistics
The top of the page shows summary stat cards calculated across all organizations:
| Stat | What it shows |
|---|---|
| Monthly Recurring Revenue | Although the card is labelled "From active subscriptions," the displayed total blends actual MRR (from active and past-due subscriptions) with a forecast contribution from trials — each trial adds 50% of its estimated monthly amount. Perpetual and internal licenses are excluded. |
| Active Subscriptions | Count of paying customers |
| Trial Accounts | Organizations currently in trial |
| Past Due | Subscriptions that need attention |
| Cancelled | Lost subscriptions |
| Churn This Month | Subscriptions cancelled since the start of the month |
| New This Month | Organizations created since the start of the month |
| Total Organizations | All registered organizations |
| Perpetual Licenses | Organizations on permanent access (no MRR) — shown only when present |
| Internal Licenses | BST internal-use organizations — shown only when present |
Perpetual and internal licenses are excluded from MRR.
The subscriptions table
Below the stats, a Subscriptions table lists organizations with these columns:
| Column | Description |
|---|---|
| Organization | Organization name and slug |
| Plan | License tier badge (Starter, Teams, Professional, Enterprise) |
| Status | Subscription status badge, plus a Perpetual or Internal badge when applicable |
| Members | Current number of org members |
| Monthly | Monthly amount, or Free for non-revenue licenses |
| Period End | Current period end date, or the trial end date if on trial |
| Actions | Row menu with View Details and (when a Stripe subscription exists) Manage Subscription |
Filtering and search
- Search organizations… filters by organization name or slug.
- Status filter: All Statuses, Active, Trial, Past Due, Cancelled, Pending, No Subscription.
- Plan filter: All Plans, Starter, Teams, Professional, Enterprise.
- The refresh button reloads both the stats and the table.
Results are paginated (20 per page).
Subscription statuses
| Status | Meaning |
|---|---|
| Active | Subscription (or perpetual/internal license) is in good standing |
| Trial | Organization is in a trial period |
| Past Due | Stripe reports the subscription as past due |
| Cancelled | Subscription has been cancelled |
| Pending | Stripe subscription exists but is incomplete/paused, or could not be loaded |
| No Subscription | No active Stripe subscription and no current trial |
| Expired | A trial ended with no active license |
Status is derived from live Stripe data when an organization is linked to Stripe; otherwise it is derived from the organization's license record.
Managing a subscription
Open the row's Actions menu and choose View Details (or Manage Subscription when a Stripe subscription exists) to open the Manage Subscription dialog — both menu items open the same dialog. A status summary at the top shows the current Status, Tier, Amount (or Free for non-revenue licenses), Seats (members vs. seat count, or members / ∞ when seats are unlimited), and a date whose label is Period End, Trial Ends when on trial, or Expired when the trial has expired. If the subscription is set to cancel, a banner notes that it will be cancelled at the end of the current billing period.
The dialog is organized into three tabs.
Plan & License tab
License Tier — choose the tier and click Update Tier. Tiers and their per-technician monthly pricing:
| Tier | Price |
|---|---|
| Starter | $35 / tech / mo |
| Teams | $45 / tech / mo |
| Professional | $75 / tech / mo |
| Enterprise | $135 / tech / mo |
Changing the tier updates feature access for the organization.
Seat Count — use the - / + controls or type a value, then click Update Seats. The field shows Unlimited as a placeholder when no seat count is set, but you must enter a value of at least 1 to save (a blank or zero value is rejected, and Update Seats stays disabled until you change the current count). Seat changes affect the billing quantity; for organizations linked to Stripe, the change is prorated in Stripe.
License type — the panel shows the organization's license type (SUBSCRIPTION, TRIAL, PERPETUAL, or INTERNAL) and, when granted, who granted it and when. From here you can:
- Grant Perpetual — give the organization permanent access with no recurring billing. You are prompted for a reason.
- Grant Internal — mark the organization as BST internal use (also permanent, no MRR). You are prompted for a reason.
- Revoke Perpetual / Revoke Internal — revert a perpetual or internal organization back to subscription-based billing.
Trial tab
Pick an Action, then run it:
| Action | Effect |
|---|---|
| Extend Trial | Push the trial end date out |
| Start New Trial | Begin (or restart) a trial period |
| End Trial (Convert to Active) | End the trial and activate the organization |
| Remove Trial (Suspend Access) | Remove the trial and suspend access |
For Extend Trial and Start New Trial, set Trial Days (days to add from today) or Or Set End Date (a specific date, which overrides the day count). You can record an optional Admin Notes entry explaining the change.
Stripe tab
Connection shows whether the organization is linked to Stripe:
- When connected, the dialog displays the Stripe Customer and Subscription IDs, an Open in Stripe button (opens the customer in the Stripe dashboard), and an Unlink button.
- When not connected, a Link to Stripe button opens the linking dialog.
Subscription Actions (shown when a Stripe subscription exists):
- Cancel at Period End — stops billing after the current period (the subscription stays active until then).
- Cancel Immediately — ends the subscription and access now.
- Resume Subscription — reverses a pending cancellation so billing continues. (Shown when the subscription is already scheduled to cancel.)
If an organization has no Stripe customer or subscription, the tab prompts you to use Link to Stripe.
Additional detail data (API)
The endpoint that loads an organization's subscription returns more information than the Manage Subscription dialog currently displays. Beyond the status summary and the three tabs, the response also includes usage counts (tickets, clients, assets, and real storage consumption), per-tier plan limits, the upcoming invoice (when one exists in Stripe), and recent Stripe billing history (up to the last 12 invoices with amount, status, and a link to the hosted invoice). These extra fields are not shown in the dialog today, so they are primarily useful via the API. The per-tier plan limits are reference figures the source marks as placeholder values, so treat them as indicative rather than as hard, enforced caps.
How seat counts stay in sync
Seat quantity is kept in sync automatically. When members are added or removed from an organization that has an active or trialing Stripe subscription, Ascent updates the Stripe subscription quantity to match the active member count (with proration) and notifies the organization's OWNER and ADMIN members. Organizations without a Stripe subscription, or whose subscription is not active or trialing, can still add and remove members freely — the seat sync is simply skipped. Note that a manual seat count you set in the Plan & License tab is not permanent: the next time a member is added or removed, the automatic sync recomputes the quantity from the active member count.
Audit logging
Every subscription change made here is recorded in the platform audit log, capturing the operator, the organization, and the change that was made.
Tips
- Use the Status filter to surface Past Due organizations that need follow-up.
- Prefer Cancel at Period End over Cancel Immediately when you want to honor the remaining paid period.
- Grant Perpetual or Internal licenses for partners and internal accounts so they do not appear in MRR.
- Always add a note or reason when extending trials or granting special licenses so the audit trail stays clear.