> ## Documentation Index
> Fetch the complete documentation index at: https://docs.neoagent.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Change License Seats

> Add or remove license seats via your marketplace provider

Each call changes the seat count of one marketplace subscription, the one the agent picked with [List License Subscriptions](/agents/tools/m365/list-license-subscriptions), in one direction: it adds seats or it removes them.

<Info>
  This tool changes the subscription seat count only. Assigning a license to a user, or unassigning it, is done by the [Microsoft 365 tools](/agents/tools/m365/overview) (Microsoft Graph API), gated by your M365 licensing permissions. Unassign users **before** the agent removes seats.
</Info>

<Warning>
  **Removing seats never terminates a subscription.** If the agent removes the last seat, the
  subscription record stays on your marketplace and can keep billing until its term ends. The agent
  says so and hands the job to a technician. Cancelling the subscription itself is done by hand in
  the marketplace portal. Neo has no API call that ends a subscription on any of the five supported
  marketplaces.
</Warning>

## What It Does

When enabled, the agent can:

* Add or remove seats for any license SKU
* Target a **specific subscription** when your provider has multiple subscriptions for the same license (e.g., separate Monthly and Annual subscriptions)
* Auto-detect which marketplace provider to use based on the company's configuration

## Settings

| Setting                         | Description                                                                                                        |
| ------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| **Require technician approval** | The agent sends a Teams approval request before it changes seats. Enabled by default.                              |
| **Allow adding seats**          | The agent may buy seats. Turn it off on an agent that should only remove seats, such as an offboarding agent.      |
| **Allow removing seats**        | The agent may lower a seat count. Turn it off on an agent that should only buy seats, such as an onboarding agent. |

At least one of the two directions must be on. When the agent asks for a change its settings do not
allow, the tool changes nothing and the agent tells the technician.

## Subscription Targeting

Many MSPs keep multiple subscriptions for the same license (e.g., an 80/20 yearly/monthly split, or separate month-to-month and annual-commitment subscriptions). The agent identifies the exact subscription by calling [List License Subscriptions](/agents/tools/m365/list-license-subscriptions) first, which returns the subscription ID, status, billing term, commitment term and seat count for each subscription.

## Marketplace Provider Auto-Detection

The marketplace provider is determined from the company's configuration. Neo checks in this order:

1. **Pax8** — if a Pax8 marketplace company ID is configured
2. **D\&H** — if a D\&H marketplace company ID is configured
3. **Microsoft Partner Center** — if a Partner Center marketplace ID is configured, or as a fallback when Partner Center credentials are available

<a id="timing-the-purchase" />

<a id="timing-the-cancellation" />

## Timing the Change

The agent applies a change either **immediately** or **at the next renewal date**. Use custom instructions to direct it:

* **Immediately** (default) — an addition applies now and bills for the prorated remainder of the current period. Microsoft NCE allows an immediate removal only within the first 7 days of a term, so an immediate removal can fail on an older subscription. If the marketplace rejects it on NCE policy grounds, the agent is told to retry at the next renewal.
* **Next renewal** — the change is queued for the subscription's renewal date. It suits additions you want aligned with billing anniversaries, and removals after the 7-day window.

Scheduled-at-renewal is supported via API on **Ingram Micro** and **Microsoft Partner Center**. For **Pax8**, **D\&H**, and **Sherweb**, the API doesn't expose it, so the agent suggests scheduling the workflow itself to run on the renewal day.

The agent can also align the renewal date to the **end of the calendar month** or to the **subscription's existing anniversary** when the change applies (Ingram Micro only).

<a id="waiting-for-the-new-seat-to-appear" />

## Adding Seats: Waiting for the New Seat

Marketplaces accept the order asynchronously. Microsoft Graph usually shows the new seat within \~60–90 seconds, but rare cases take longer. For an **immediate** order the tool waits for the new seat to become visible in Microsoft before it returns, so the agent can usually assign the license straight away. The wait is up to **5 minutes** in an automation and **20 seconds** in a chat conversation, where someone is waiting for the agent's reply.

If the seat is still not visible when that wait ends, the tool returns successfully and tells the agent to wait a few more minutes and check again before assigning, or to hand off to a technician if the seat still doesn't appear. A **next-renewal** order returns immediately, and the seat appears on the renewal date.

<a id="confirming-the-marketplace-applied-the-order" />

<a id="confirming-the-change-applied" />

## Confirming the Marketplace Applied the Change

Whether Microsoft can assign a seat is a separate question from whether the marketplace record
changed. One customer had the Microsoft side fulfil correctly while the Pax8 subscription
disappeared from their portal.

On **Pax8**, the agent reads the subscription back after the change and reports the seat count Pax8
holds. The read-back window is 90 seconds, and 30 seconds in a chat conversation. The read-back ends
in one of two states:

* **Confirmed** — Pax8 reports the seat count the agent asked for.
* **Unconfirmed** — the read-back did not show that seat count in the time available. The agent is
  told not to claim the change applied, and to ask a technician to check the portal rather than
  send the change again, because a repeat that does apply would change the seats twice.

For a removal, the state decides whether the tool reports success. A reduction **to zero seats**
that stays unconfirmed reports failure, because Pax8 ends a subscription through cancellation and
not through a seat change of zero; an offboarding agent then does not write a completed licence
removal for seats that are still on the subscription. Every other unconfirmed reduction reports
success with the unconfirmed wording, since Pax8 settles a quantity change over several minutes.

D\&H, Ingram Micro, Sherweb and Microsoft Partner Center are not read back yet. There the agent
reports the change as unconfirmed, never as failed, because nothing was checked either way.

## When the Marketplace Refuses a Removal

* **Pax8 committed minimum** — Pax8 will not lower a subscription below the seat count committed for
  the current term. The agent is told how many seats, if any, can come off before the term ends, and
  not to retry. Often the answer is none until the renewal date.
* **Sherweb at zero seats** — when Sherweb refuses to take a subscription to zero seats, the agent
  relays Sherweb's error and tells the technician to cancel the subscription in the Sherweb portal.

<a id="pax8-provisioning-lock" />

## Busy Subscriptions

When Pax8 is still provisioning a prior change, it returns `HTTP 500 — Subscription being modified has executing provisioning actions`. In an automation, Neo retries this error with backoff (60 / 90 / 120 seconds, up to \~4.5 minutes) before it gives up. Concurrent calls against the same Pax8 subscription are serialized at the Neo layer, so parallel onboarding workflows do not race.

A chat conversation does not wait any of that out. The two ways of giving up early read differently to the agent, because they leave the marketplace in different states:

* **Another Neo run holds the subscription.** Nothing was sent, so the agent is told the subscription is unchanged and that it can run the change again later. An automation waits up to 6 minutes for the other run; a chat conversation waits 10 seconds.
* **Pax8 reports the subscription as still provisioning.** The change did reach Pax8, and a provisioning rejection is not proof that Pax8 ignored it. The agent is told to read the seat count with [List License Subscriptions](/agents/tools/m365/list-license-subscriptions) before sending the change again.

In the rare case where the whole marketplace call passes 50 seconds in a chat, the agent is told that
Neo does not know whether the change was submitted, and to read the seat count before sending it
again.

## Tool Dependencies

When you enable this tool, the following are automatically enabled:

* **List License Subscriptions** — so the agent can find the subscription ID before it changes seats
* **Request Technician Approval** — when approval is enabled in settings

## How to Use

Guide subscription selection with custom instructions:

```
When buying Microsoft 365 Business Basic seats:
- Add 80% of seats on the Annual subscription
- Add 20% of seats on the Monthly subscription
```

```
After unassigning all licenses from the departing user,
remove the freed Monthly seats to stop billing immediately.
If this would take the subscription to zero seats, leave an internal
note for the licensing team to cancel the subscription in the portal.
```
