I’m not going to bash Supabase again. I love it. The DX is great, the auth just works, but it really only works for a single user.

But as soon as your app needs teams, things get complicated fast.


When “auth” becomes “identity spaghetti”

Here’s what I wanted:

  • Users can create and join organizations
  • An org can invite members
  • Users can belong to multiple orgs
  • Data is scoped per-org
  • Some users are admins, others aren’t

Seems simple, right? But Supabase (like Firebase, like Auth.js) doesn’t have a concept of organizations. Just users.

So the moment you add orgs, you’re building:

  • Database schema to track orgs and memberships
  • Logic to switch active orgs per session
  • Permission rules tied to user/org roles
  • Custom invites, email flows, domain-based auto-join
  • Frontend UI to manage all of the above

It’s not auth anymore. It’s identity + access + tenancy + billing + “why did I think this was a weekend project?”


Why we built Update

I didn’t want to reinvent auth—I just wanted this:

“Only allow access to this resource if the user belongs to the org and has the right plan.”

That’s what Update handles.

  • Organizations out of the box
  • Role-based permissions per org
  • Billing attached to teams or users
  • Auto-join by email domain
  • Everything scoped automatically

Example: Adding org-aware auth to Supabase (currently in beta!)

Update wraps your Supabase client, so you get everything you’re used to—plus orgs, billing, and permissions.

import { createClient } from "@updatedev/js/supabase";

const client = createClient(
  process.env.NEXT_PUBLIC_UPDATE_PUBLIC_KEY!,
  process.env.NEXT_PUBLIC_SUPABASE_URL!,
  process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
);

Users can now create and switch orgs:

await client.orgs.create("Acme Inc");
await client.orgs.switch(orgId);

You can invite users to orgs, or set up auto-join by domain:

await client.orgs.invite(orgId, "[email protected]");

await client.orgs.setAutoJoinDomain(orgId, "acme.com");

Entitlements and permissions are baked in:

const { data } = await client.entitlements.check("can_view_dashboard");

if (!data.hasAccess) {
  redirect("/upgrade");
}

TL;DR

Supabase is awesome—until you need teams.

That’s where Update fits in.

It adds orgs, billing, and permissions on top of your existing stack.

No need to DIY roles + invites + permissions + billing glue logic.

You ship faster. Your users get teams. Everyone wins.

If you’re building anything with users and teams, check it out:

👉 https://www.update.dev