Skip to content
AM

Billing: seats and overages

Seat usage controls how many active members and outstanding invitations an organization can have. Open Portal > Team for the operational seat view or Portal > Billing for the subscription summary.

Seat limits

TierIncluded seatsConfigured additional-seat price
Core1$15/month
Growth3$12/month
Scale5$10/month
Enterprise10Contract-managed
Practice2No self-service price configured

The backend calculates total seats as included seats plus seatsPurchased on the subscription. The current InBlack UI displays that total but does not provide a dedicated control for changing seatsPurchased. Manage payment method and View invoices open Stripe Customer Portal, but the application does not guarantee that a customer can change seat quantity there. Contact the account owner or InBlack support when more seats are required.

What consumes a seat

The seat gate counts:

  • Active memberships.
  • Pending invitations, because each invitation reserves capacity before acceptance.

Suspending or removing a non-owner member releases an active seat. Revoking a pending invitation releases its reservation. Reactivating a suspended member consumes a seat again and is blocked when none is available.

The Team page reports used, pending, total, and available from the teamSeats GraphQL query.

When the organization is full

Inviting or reactivating returns a GraphQL error with extension code SEAT_LIMIT_REACHED:

{
"message": "Seat limit reached. Upgrade your plan or remove a member to invite more people.",
"extensions": {
"code": "SEAT_LIMIT_REACHED"
}
}

The action text differs for reactivation. The single-invite and bulk-invite paths perform the same gate; bulk invite rows report the seat_limit outcome after capacity is exhausted.

Practice connections

Practice subscriptions separately meter active client-organization links:

ConnectionsConfigured monthly rate
First 10Included
11 through 50$7 each
Above 50$5 each

The current link-client resolver checks the practice entitlement and operator access but does not enforce a maximum connection count. The billing summary and practiceConnectionSummary GraphQL query expose total, included, and billable connection counts. This is separate from the two seats included for the practice’s own team.

API surfaces

  • GET /api/billing/summary returns subscription and usage summaries.
  • POST /api/billing/portal-session creates a Stripe Customer Portal URL for a human user.
  • teamSeats(organizationId) returns current seat allocation.
  • practiceConnectionSummary(practiceOrganizationId) returns practice connection usage.

The current MCP catalog does not expose seat-purchase or seat-usage tools.