Skip to main content

Documentation Index

Fetch the complete documentation index at: https://danestvesllc-2b77d201.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

Team seats let a single subscription cover multiple members of an organization. Instead of each user buying their own plan, one billing owner holds a subscription with a fixed number of seats and assigns those seats to teammates by email or customer ID. Laravel Polar exposes seat management directly on the Subscription model. For admin or cross-subscription operations, use the LaravelPolar facade.
How seat assignment works: Assigning by email sends a Polar invitation link. Assigning by customer ID grants access directly without an email invite. Both approaches use the same underlying Polar endpoint.

Listing seats

Call seats() on a subscription to fetch a SeatsList object containing all seats and the available and total counts:
$seatsList = $user->subscription()->seats();

$seatsList->seats;           // array<Polar\Models\Components\CustomerSeat>
$seatsList->availableSeats;  // int — unfilled seats remaining
$seatsList->totalSeats;      // int — total seats on the subscription
Use availableSeats to decide whether you can add more members before prompting the owner to upgrade.

Assigning a seat

Call assignSeat() to add a member to a subscription. You can identify the recipient by email, by an existing Polar customer ID, or by an external customer ID.

Assign by email (sends invitation)

Passing an email address sends the recipient an invitation link to claim the seat:
$user->subscription()->assignSeat(email: 'alice@example.com');

Assign by customer ID

If the recipient already has a Polar customer record, assign the seat directly without sending an invitation:
$user->subscription()->assignSeat(customerId: 'cust_xxx');

Assign with metadata

Pass a metadata array to attach structured data to the seat — for example, a role or department:
$user->subscription()->assignSeat(
    email: 'alice@example.com',
    metadata: ['role' => 'admin'],
);
assignSeat() returns a Polar\Models\Components\CustomerSeat instance representing the new seat. Store the seatId if you need to revoke or resend the invitation later.

Revoking a seat

Remove a member from a subscription by passing their seat ID to revokeSeat():
$user->subscription()->revokeSeat('seat_xxx');
Revoking a seat frees it up so it can be reassigned to another member. The revoked member loses access to any subscription benefits.

Resending a seat invitation

If a pending invitation has expired or the recipient missed it, resend it with resendSeatInvitation():
$user->subscription()->resendSeatInvitation('seat_xxx');
This only applies to seats in a pending (not yet claimed) state. Seats that have already been claimed cannot receive a new invitation.
Show a “Resend invitation” button in your team management UI for seats where the CustomerSeat status indicates the invitation is still pending.

Facade variants for admin use

For operations that span multiple subscriptions or that run outside the context of a specific billable model, use the LaravelPolar facade directly:
use Danestves\LaravelPolar\LaravelPolar;
use Polar\Models\Components;

// List seats for any subscription by ID
LaravelPolar::listSeats(subscriptionId: 'sub_xxx');

// Assign a seat with a full SeatAssign object
LaravelPolar::assignSeat(new Components\SeatAssign(
    subscriptionId: 'sub_xxx',
    email: 'alice@example.com',
));

// Revoke by seat ID
LaravelPolar::revokeSeat('seat_xxx');

// Resend invitation by seat ID
LaravelPolar::resendSeatInvitation('seat_xxx');
Facade methods require a valid POLAR_ACCESS_TOKEN with sufficient permissions. They bypass the billable model entirely, so there is no automatic association with a local user record.