# Team members

Each teammate signs in with their own account. A membership grants access to one
organization and its projects according to role. It does not grant access to
another organization in the same billing account or to Extrovert platform administration.

## Invite a teammate

1. In the console, choose the organization, then **Settings > Team**.
2. Choose **Invite teammate**, enter their email, and choose a role. Member is the default.
3. Create the invitation. Extrovert queues an email; you can also copy the invitation link.

Owner and Admin can manage the team. The recipient signs in or creates a login
using the invited email, verifies it, reviews the organization and role, and
chooses **Accept invitation**. Invited teammates can create a login while new
workspace signup is paused. Joining an existing organization does not create a
second workspace or subscription.

The link is a locator, not a bearer credential: another verified email cannot use
it to join. Invitations expire after 14 days. Resend preserves the original role,
inviter and expiry. Revoke a pending invitation to cancel it; create a fresh
invitation when an earlier one has expired or needs a different role.

## Choose a role

| Role | Access |
| --- | --- |
| Owner | Organization administration and ownership management. |
| Admin | Team, organization resources, and billing administration. |
| Member | Email operations and review, with access across the organization's projects. |
| Viewer | Read access without mutations. |
| Billing (advanced) | Billing and commerce, plus Member permissions. |

Use the separate ownership workflow to change ownership. A team administrator
cannot change a higher-ranked member, and the last Owner cannot be removed or demoted.
The API rechecks the inviter's current authority when a teammate accepts.

## Understand seats

Owners count as members. Each joined person counts once across active organizations
sharing a billing account, even if they belong to several of those organizations.
Membership and billing are separate: shared billing never creates shared access.

Pending invitations do not reserve seats, and you can invite people when the account
is full. Acceptance checks capacity atomically. Free and Developer include two
team members; Startup includes ten. Developer does not add seats over Free.

When someone cannot join because the account is full, their invitation stays pending.
Current billing-account Owners, Admins and Billing members receive a grouped email
notification. Free a seat or review a plan with more seats in **Settings > Billing**,
then ask the teammate to accept again. Neither the email nor an upgrade automatically
accepts the invitation or authorizes a charge.

Downgrades are blocked if the account has more joined members than the target plan allows.
Removing someone from only one organization may not free a seat if they still belong
to another active organization on the same billing account.

## Delivery and troubleshooting

- **Email queued** means delivery is waiting or retrying.
- **Email submitted** means the transport accepted the email; it does not confirm receipt.
- **Email failed** means retries ended. Check the address, then resend or share the link.
- **No email delivery recorded** can appear for invitations created before email delivery was added.

Resend is limited to once per minute for one invitation, with up to 50 invitation
emails per organization per hour and 100 pending invitations per organization.
Identical pending invitations reuse the original link without sending a second email.

If the link is unavailable, verify the invited email or use **Switch account**.
Revoked and expired invitations require a new invitation. If the inviter no longer
has team-management authority, ask a current administrator to revoke and recreate it.

## Remove access

Use **Remove** beside a member to end their human access to the organization.
Their other organization memberships remain. Their old accepted invitation cannot
restore access, and live console feeds recheck membership.

Independently created organization credentials can keep running. Review
[connections and access](https://docs.extrovert.dev/concepts/connections-and-access/) and API keys separately
when offboarding a teammate; removing human membership does not automatically delete
mailboxes or revoke every worker credential.

## API

List members and invitations with bounded pages (`limit`, `cursor`, optional email
`search`). Use `next_cursor` until empty; invitation lists also accept a status filter.

- `GET /v1/admin/orgs/{org_id}/members` includes joined-seat usage.
- `GET /v1/admin/orgs/{org_id}/invitations` lists native invitations for administrators.
- `POST /v1/admin/orgs/{org_id}/invitations` creates an invitation and queues delivery.
- `POST /v1/admin/orgs/{org_id}/invitations/{invitation_id}/resend` queues another email.
- `POST /v1/admin/orgs/{org_id}/invitations/{invitation_id}/revoke` revokes it.
- `GET /v1/admin/invitations` lists invitations matching the verified signed-in email.
- `GET /v1/admin/invitations/{invitation_id}` reads a matching invitation.
- `POST /v1/admin/invitations/{invitation_id}/accept` explicitly accepts it.

Existing raw-token acceptance remains supported. Tokens are stored only as hashes;
list responses and email links do not contain the token. Administrative SDK/MCP
operations require the current human role and explicitly delegated account control.