Pages to write
Mirror Cursor’scursor.com/docs/account/teams/* structure 1:1 where our
functionality is congruent. Six pages:
teams/setupteams/pricingteams/membersteams/ssoteams/dashboardteams/analytics
Global deliberate deltas from Cursor (apply on every page)
- Usage is denominated in rows, not tokens or model requests. There is no Cursor “Token Rate” analog. The on-demand rate is a flat $0.004/row for every tier and seat type. Never invent per-model pricing.
- No client-version or AI-code-tracking analytics. Our analytics are feature-level row consumption (Search / Monitors / Transcripts), API requests, and monitor pings. There is no “tab acceptance” or editor metric.
- No marketplace, Bedrock, or MDM sections. Cursor’s device/model governance suite (MDM, model access control, repo blocklist, auto-run policy) has no Arcmira analog and is skipped entirely, not “coming soon.”
- Analytics are available on Teams with no client-version gating.
- The audit log is positioned as Enterprise. Events are recorded for all teams from day one (backfill-safe), but the viewer is Enterprise-only.
- Em dashes are forbidden in user-facing copy (site rule). Use periods, commas, or colons.
Teams vs Enterprise gating table (docs must never promise Enterprise features on Teams)
Page 1: teams/setup
Mirror Cursor’s setup page: creating a team, upgrading from an individual
plan, and domain-based joining.
- Creation flow:
/team/new-teamcollects team name, Standard and Premium seat counts (minimum 2 seats total), and monthly/yearly interval, then goes through Stripe Checkout. The team is created by the Stripe webhook after payment. - Entry points: the always-visible Members tab in the dashboard shows an “Upgrade to Teams” state for users without a team (feature grid: Team Management, Usage Analytics, Admin Controls, Shared API Keys) plus a “Need enterprise features?” contact-sales banner.
- Individual-plan holders who join a team keep their personal subscription until they cancel it themselves (document this explicitly).
- Domain join opt-in: when a team has verified a domain and enabled Domain matching, users with a matching email see a “Join your team” banner on the Members tab and can self-serve join (Standard seat, Member role).
Page 2: teams/pricing
- Standard seat: $40/user/month with 5,000 rows/month included.
- Premium seat: $120/user/month with 25,000 rows/month included (5x).
- Unpaid Admin seats are free, unlimited, and have no product access.
- Yearly billing: 20% off (96 per seat per month, billed annually). Monthly-to-yearly switching is immediate and prorated; yearly-to-monthly is not available mid-plan.
- Billing is per active seat and centralized on the team. Mid-cycle seat adds and Standard-to-Premium upgrades are prorated immediately. Premium-to-Standard downgrades apply at the next renewal.
- Removal rule: removing a member who consumed included rows this cycle keeps the seat billed until the end of the cycle; otherwise the seat is released immediately with a prorated credit.
- On-demand usage: $0.004/row after included seat rows, controlled by the team on-demand toggle and the team-wide monthly spending limit.
- Minimums/invariants: 2 seats at purchase; every team keeps at least one admin and at least one paid member.
Page 3: teams/members
- Roles and the capability matrix (Cursor parity):
- All roles (including Members) can invite new members (Members can invite Standard-seat Members only).
- Only Admins and Unpaid Admins can remove members, change roles or seat types, access team settings sections, configure SSO/domains, manage billing, and view team analytics (full spend columns).
- Unpaid Admins are free, non-billable, and have no product access.
- Seat type is independent of role (except Unpaid Admin, which is always the free seat).
- Joining paths: email invites (7-day expiry, delivered by email with an
accept page at
/team/invite/{token}), revocable long-expiry invite links (/team/join/{token}, admin-managed, rotate/revoke), SSO auto-join (JIT), and domain matching. “Restrict invites to verified domains” blocks invites to outside addresses; both domain controls require at least one verified domain. - Removal semantics: seat-hold-until-cycle-end when credits were used, the member’s team-scoped API keys are revoked, their access tier reverts unless they carry a personal subscription, and admins can revoke the removed member’s active sessions.
Page 4: teams/sso
- SAML 2.0 and OIDC at no extra cost on Teams.
- Prerequisite: verify domain ownership in Settings -> Domains (DNS TXT
record
_arcmira-verify.{domain}with valuearcmira-verify={token}). - Configuration lives in the dashboard Settings tab (Single Sign-On section): provider ID, issuer/entity ID, domain, and either IdP metadata XML (SAML) or client ID/secret + discovery endpoint (OIDC).
- Document the SP endpoints (Better Auth SSO plugin paths under
https://api.arcmira.com/api/auth/): SP metadata atsso/saml2/sp/metadata?providerId={id}, ACS atsso/saml2/sp/acs/{providerId}. - JIT provisioning: first SSO sign-in auto-creates the account and enrolls it into the team (Standard seat, Member role); seats auto-expand and are prorated.
- Enforcement: the “Enforce SSO” toggle blocks password and Google sign-in for all verified-domain emails. Sign-in via the “Use single sign-on (SSO) instead” link on the sign-in page.
Page 5: teams/dashboard
Document OUR actual layout, not Cursor’s separate admin console:
- Members tab (always visible, above API Keys in the sidebar): member list with role and seat badges, invite modal (email + invite link), pending invite management, and the Upgrade-to-Teams state for individual users.
- Settings tab: personal settings first, then team sections for admins: Usage-Based Pricing (on-demand toggle, admin-only toggle, team spending limit, default per-member limit), Domains (add/verify + domain matching + invite restriction), Single Sign-On (connection wizard + enforcement), Team Profile (rename + delete team danger zone). Invite link management lives in the invite modal on the Members tab.
- Billing tab: team seat counts by type with prorated adjustments, the yearly-switch banner, and the existing invoice portal.
- Team API keys: created from the API Keys tab with a team scope (admin-only) for the Teams Admin API.
- Audit log: recorded for all teams; the viewer is Enterprise-only (the
endpoint returns
enterprise_requiredon Teams).
Page 6: teams/analytics
- Analytics are integrated into the main dashboard Overview tab (not a separate analytics page): admins see team spend vs limit tiles, a summary stat row (active members, rows consumed, API requests), a team-wide rows-per-day chart, and a searchable, sortable, paginated per-member table.
- Visibility rules: all members can see the member table (leaderboard semantics via default rows-used sort); spend columns are admin-only.
- Time ranges: 7/30/90 days (bounded at 90).
- CSV export for both the chart and the member table.
- Teams Admin API (read-only, team-scoped API keys):
GET /v1/team/membersGET /v1/team/spendGET /v1/team/usage-events(cursor-paginated, bounded to 90 days)- The analytics chart data itself is NOT exposed via API on Teams (Enterprise gating, matching Cursor).
Implementation references (for fact-checking, do not link publicly)
- Backend:
apps/backend/src/handlers/teams.ts(consolidated surface),team-analytics.ts,team-checkout.ts,src/v1/team.ts,src/services/team.ts,team-billing.ts,team-sso.ts,team-email.ts. - Schema:
apps/backend/migrations/jobs/0067_teams_v2.sql,0068_sso_provider.sql. - Web:
apps/web/components/dashboard/members-tab.tsx,team-settings.tsx,team-overview.tsx,team-billing.tsx,apps/web/app/team/*.