2026-05-21 · 3 min read

Two roles. Six seats. Same shared library.

Teams shipped quietly. Here's the full role matrix, the invite flow, and why we landed on three roles instead of the usual five.

Three pixel avatars on a leaf-green background

Most SaaS team features have five roles: Owner, Admin, Member, Guest, Billing. We have three: Owner, Editor, Viewer. Three is enough for the size of team a $6/month link shortener serves, and every role we don't ship is a permission matrix we don't have to keep correct.

What each role can do

  • Owner: everything. Add members, change roles, delete the team, manage billing, transfer ownership. There's exactly one per team.
  • Editor: create, edit, and delete links / QR codes / campaigns inside the team's library. See team-wide analytics. Can't change roles, can't invite new members, can't touch billing.
  • Viewer: read-only. See every link, every chart, every CSV export. Can't create, edit, or delete anything. Great for a stakeholder who just needs to see the numbers.

Inviting a teammate

Settings → Team → Invite. Type their email, pick their role, hit send. We email them an accept link signed with a 7-day token. They click it, sign in (or sign up; if they don't have a BlinkLink account yet we create one on accept), and they're in.

If they're already part of another team, they can be in both. A user's links, the team's links, and any other team they're in are separate workspaces in the dashboard's left sidebar.

Six seats and not more

Pro includes six seats. That covers a typical small marketing team, agency pod, or indie team. If you need more, email us and we'll do something reasonable. We've kept the cap low on purpose: the moment we let it grow unbounded, we'd need a permissions matrix that does justice to a 200-person org, which would change what the product is.

Under the hood

Teams are a Postgres table with RLS policies that gate every team-scoped resource. The RPC that accepts an invite runs SECURITY DEFINER and is the only path that writes to team_members. The transactional invite email comes from Resend via a tiny edge function. The whole feature is about 400 lines of SQL and 600 lines of React.