Owner, admin, member: put Stripe on one person
The first team prompt is usually "add a role column." That is not a billing model. If the Stripe customer is not tied to one person who can open the Customer Portal, every later prompt fights the schema.
NextBento ships three roles and keeps the subscription on the owner. Admins invite. Members use the app. That is enough to share a dashboard. It is not seat billing, not organizations, and not a marketplace of teams.
Why billing is a person
Stripe Checkout creates a customer and a subscription. Someone has to be the subscriptions.user_id. If that someone is "the team," you still need a human who can update the card, cancel, or open the portal. You will pick a user anyway. Name that user owner on day one.
Put the subscription on whoever paid. Gate /api/billing/portal so only that user can manage it. Do the price and plan math on the server. The browser can show "Pro." It must not decide who paid.
Admins need to add people without becoming the cardholder. Members need /dashboard without an invite UI. Those are access rules, not invoices.
What each role is for
Owner. Holds the Stripe customer. Can invite, remove, change roles, and delete the team. Billing screens are owner-only.
Admin. Invites admin or member, removes non-owners, does not open the portal. Useful when a cofounder should run the team list and you still want one person on the card.
Member. Uses the product. No invite form, no billing.
Invites are email plus a token. The invitee signs in, accepts, and lands in team_members with the invited role. The owner is not a row in that table; the owner is the subscription user. Implementation lives in Teams docs. This post is the argument, not the click path.
What goes wrong if you skip it
You charge in Stripe and never store user_id. Now nobody can open the portal without a support ticket.
You store the customer on every member. Now a removed teammate still "owns" billing, or two people cancel each other.
You add seats because a competitor screenshot had a slider. Seat math is a product. It needs proration, a source of truth, and a support load. A member cap (MAX_TEAM_MEMBERS, plan limits in the kit) is a ceiling so a bot cannot invite the internet. It is not per-seat pricing.
Do not ask the agent for "true orgs" on a weekend. NextBento does not ship seat billing or platform super-admin. If you need that on day one, look at compare instead of stretching this model.
When a single-user app is enough
If you will never invite anyone, you still want an owner. You are that owner. The admin and member paths sit idle until you send an invite. That is cheaper than reinventing billing when the first teammate shows up.
The longer version of "do not prompt this from an empty repo" is why blank-repo auth and Stripe burn evenings. Indie-hacker framing is on NextBento for indie hackers.