Skip to main content
squid·ware

Schema · postgresql

SaaS

Organisaties, memberships, plannen en abonnementen voor multi-tenant SaaS.

saas

ERD

Mini Map

Samenvatting

5 modellen 27 velden 4 relaties

Een multi-tenant SaaS-basis: organisaties hebben members, kiezen een plan en houden een abonnement bij.

  • Organization groepeert Memberships en Subscriptions.
  • User kan lid zijn van meerdere organisaties via Membership (met MemberRole).
  • Plan beschrijft prijs en interval; Subscription koppelt org aan plan met status.

Broncode

datasource db {
  provider = "postgresql"
}

generator client {
  provider = "prisma-client-js"
}

model Organization {
  id             String         @id @default(cuid())
  name           String
  slug           String         @unique
  memberships    Membership[]
  subscriptions  Subscription[]
  createdAt      DateTime       @default(now())
  updatedAt      DateTime       @updatedAt
}

model User {
  id          String       @id @default(cuid())
  email       String       @unique
  name        String?
  memberships Membership[]
  createdAt   DateTime     @default(now())
  updatedAt   DateTime     @updatedAt
}

model Membership {
  id             String       @id @default(cuid())
  organizationId String
  organization   Organization @relation(fields: [organizationId], references: [id])
  userId         String
  user           User         @relation(fields: [userId], references: [id])
  role           MemberRole   @default(MEMBER)
  createdAt      DateTime     @default(now())

  @@unique([organizationId, userId])
}

model Plan {
  id            String         @id @default(cuid())
  name          String
  slug          String         @unique
  priceCents    Int
  interval      BillingInterval
  subscriptions Subscription[]
}

model Subscription {
  id             String             @id @default(cuid())
  organizationId String
  organization   Organization       @relation(fields: [organizationId], references: [id])
  planId         String
  plan           Plan               @relation(fields: [planId], references: [id])
  status         SubscriptionStatus @default(TRIALING)
  currentPeriodEnd DateTime?
  createdAt      DateTime           @default(now())
  updatedAt      DateTime           @updatedAt
}

enum MemberRole {
  OWNER
  ADMIN
  MEMBER
}

enum BillingInterval {
  MONTHLY
  YEARLY
}

enum SubscriptionStatus {
  TRIALING
  ACTIVE
  PAST_DUE
  CANCELLED
}