Pro Teams

Updated Oct 13, 2026 Open the tool

A Pro Team is one Stripe subscription that gives every member Pro access. The owner pays per seat, invites people from Discord, and manages roles and seats from the team dashboard at /app/team.

What a Pro Team is

A Pro Team is a group subscription created from /app/team. The page says "Create a team" and "Give every member Pro access under one subscription." The listed features are "Pro access for every member", "Shared Discord channel", "Team role management" and "Priority support".

Every team has one owner (the person who paid), any number of admins, and members. Each person uses one seat. The team gets its own Discord role and a private channel in the Zoov.dev server, created automatically when the subscription goes through. The owner must have a linked Discord account or creation fails with "Owner must have a linked Discord account".

A team is not a shared workspace or project store. Members share Pro access, the Discord channel and the team credit allowance described below.

Seats and price

Team seats cost $25 per seat per month. The /app/team page shows "$25/seat/mo" and "From $50/mo for 2 seats". A team has at least 2 and at most 100 seats; the form defaults to 3. Seats are billed at the Pro monthly Stripe price, so a seat costs the same as an individual Pro plan. Since 2026-10-13 team checkout always uses this team seat price; no other price can be sent with it. There is no yearly team price.

Checkout runs through Stripe and accepts promotion codes. The footer says "Billed through Stripe. Cancel or adjust seats anytime." After paying, the page shows "Team created" and polls for about 30 seconds while the webhook builds the team, then opens /team/{teamId}. If it times out: "Taking longer than expected. Try refreshing the page." An abandoned checkout shows "Checkout cancelled. Your checkout was cancelled. No charges were made."

One owner can only have one active team: "You already have an active team. Use the dashboard to manage seats." A checkout that renews an existing team works only for your own team; anyone else's returns "Not your team".

Changing seats

Only the owner can change seats, using the "Seats" button and the "Manage Seats" modal. Rules:

  • Minimum 2: "Minimum seat count is 2." Maximum 100: "Seat count must be between 2 and 100".
  • Never below the member count: "Cannot reduce to {n} seats. You currently have {m} members. Remove members first."
  • The team must be Active: "Team subscription is not active".

The modal shows "New total: ${n x 25}/mo for {n} seats" and "Prorated charges will be applied to your current billing cycle." The Stripe quantity is updated with proration, so adding seats mid-cycle charges the difference now and removing seats credits it. When no seats are free, the owner sees an "Add more seats" link.

Inviting members

Owners and admins can invite. The "Invite" button is disabled when no seats are free or the team is not Active. The "Invite member" modal says "Find a Discord user and choose their team role." Search Discord server members by name (2 characters minimum), pick the person, choose "Admin" or "Member".

Sending creates an invitation with a unique link and DMs the person: "You've been invited to join {team}! Role: {role}. Click here to accept: https://www.zoov.dev/team/invite/{token}. This invitation expires in 7 days." Success: "Invitation sent to {username} via Discord DM".

Errors: "Only owners and admins can invite members", "Team subscription is not active", "No available seats. {used}/{total} used. Upgrade your subscription to add more seats.", "An invitation is already pending for this user".

"Pending invitations" lists each invite with a "Copy" link button, "Resend" (toast "Discord DM sent") and "Cancel" (toast "Invitation cancelled"). If the DM fails: "Failed to send Discord DM. Copy the invite link and share it manually." The DM says 7 days; the expiry date shown comes from the invitation record (verify the database default matches).

Since 2026-10-05 the person invited also gets Team invitation in the workspace bell ("From "), linking to /app/team, as long as their Discord account has signed in to Zoovdev before. The DM still carries the accept link.

Accepting an invitation

The link opens /team/invite/{token}; if not logged in the person is sent to /login?redirect=/team/invite/{token}. The page "Team Invitation" shows the team, role, inviter, "Joining Benefits" including "Pro access granted!", and "This invitation expires on {date}", with "Accept Invitation" and "Decline".

On accept the person joins with the invited role, gets a DM "Welcome to {team}! You've joined as a {role} with Pro access.", sees "Welcome to the Team!" and "You've also been granted Pro access.", then lands on the team page.

Errors: "Invitation not found", "Invitation has expired", "Team subscription is not active", "You are already a member of this team", "No available seats on this team", "Discord account not linked". A Discord-linked account is required because Pro access is granted through Discord roles.

What members get

Every member, including the owner, receives:

  • The Pro Discord role and Pro access on the site.
  • The team's Discord role and private channel.
  • A one-time grant of temporary credits equal to one Pro plan allowance, read from the Pro product's award_credit metadata (fallback 1,000). If the Pro allowance is raised later, members are topped up by the difference.

The grant is once per person per team, enforced by a database unique index, so leaving and being re-invited does not repeat it. The whole team can never hold more than seats x allowance in net team credits; once that budget is used, a new member gets Pro access but no credits.

Team credits are temporary. What a member still holds is taken back when they are removed, when the team is suspended for non-payment, or when it is cancelled. Credits already spent are not charged back.

Roles and removing members

Roles are "Owner", "Admin" and "Member".

  • Owner: changes seats and roles, invites, removes anyone but themselves ("Cannot remove team owner", "Cannot change owner role").
  • Admin: invites, cancels and resends invitations, removes members but not admins ("Admins cannot remove other admins"). "Only team owners can change roles".
  • Member: no management rights.

The owner changes a role from the dropdown next to a member (toast "Role updated"). Removing uses the trash icon, asks "Remove {username} from the team?" and shows "Member removed". Removal takes away the team Discord role, the Pro role (unless the person has their own active individual subscription) and any team credits still held, and frees the seat.

There is no self-service "leave team" action in the code. A member who wants out should ask the owner or an admin to remove them (verify).

Billing owner and team status

The owner's Stripe customer pays for the whole team. Payments are non-refundable under the Terms of Service. The owner cancels or updates payment details through the Stripe customer portal (verify the exact path; the ToS says it is "located within the profile or from your subscription email").

The team page shows a status: "Active", "Past due", "Canceled" or "Inactive".

  • Past due or Inactive: Stripe is retrying payment. Membership stays, but every member loses the Pro role and team credits until payment succeeds. Then the team returns to Active, roles come back and credits are restored and topped up to the current allowance.
  • Canceled: the subscription ended. Pro access and team credits are removed from everyone. Members with their own individual subscription keep their own Pro.

Inviting, accepting and seat changes are blocked while the team is not Active.

The team in the workspace (2026-09-14)

Inside /app the team lives at /app/team (Team in the profile menu): the same team, members, roles, invitations and seats as the legacy dashboard, on two panels. Owners and admins invite from an inline search of the Zoovdev Discord server (the person gets the accept DM as before); the owner changes roles and removes members (a dialog confirms: the seat frees up and their Pro access ends at once), and changes the seat count from the "Seats on the bill" field (never under the members held; the next invoice charges the new quantity). Somebody with no team sees the create form (name, seats 2 to 100, the monthly total) and goes to Stripe Checkout. The routes are GET /api/v2/team and its invitations and members children (see the workspace doc); the accept link in the DM still opens the legacy /team/invite/<token> page.

Common questions

How much does a team cost? $25 per seat per month, minimum 2 seats ($50/mo), maximum 100. Billed monthly through Stripe.

Do team members get Pro? Yes. Every member gets the Pro role and Pro site access, plus a one-time grant of temporary credits equal to a Pro allowance (1,000 unless the Pro plan changes).

Why did my invite fail? Usually no free seats ("No available seats") or a pending invite already exists. The team must be Active, and the invitee needs a Discord-linked Zoov.dev account.

How long does an invitation last? The DM says 7 days. After that the link shows "Invitation has expired" and a new one is needed.

Can I reduce seats? Yes, the owner can, down to the current member count and never below 2. Prorated charges or credits apply to the current cycle.

What happens to my credits if I leave the team? Temporary team credits you still hold are removed; spent credits are not charged back. Your own purchased or subscription credits are untouched.

I already have Pro. Do I keep it if removed from a team? Yes. Removal only takes Pro away if you have no active individual subscription.

Languages

Since 2026-09-20 this part of the site is available in English, French, German, Spanish, Portuguese, Polish and Dutch. It follows the browser's language on a first visit, and the language menu (the icon beside the profile in /app, or in the top navigation on public pages) changes it. Nothing about how it works, what it costs or what a plan includes differs by language; only the words do. File names, format names (GLB, YDR, YTD), product and model names, code, and some error lines that come from the server stay in English. Details and known gaps: Languages and translation.

Topics teamteamsseatsinviteinvitationpro teammembersroles

Something missing? Ask on Discord