Skip to main content

guides/multi-tenancy.md

# Multi-Tenancy

mailglass stores `tenant_id` on deliveries, events, and suppressions from day one. This guide shows the minimum setup and one custom resolver shape.

## Prerequisites

- `Mailglass.Config` points to your repo
- You choose a tenant resolution strategy (`SingleTenant` or custom)

## Single-tenant default

```elixir
config :mailglass, tenancy: Mailglass.Tenancy.SingleTenant
```

## Custom tenant behaviour

```elixir
defmodule MyApp.Tenancy do
  @behaviour Mailglass.Tenancy

  @impl Mailglass.Tenancy
  def scope(query, %{tenant_id: tenant_id}) do
    Mailglass.Tenancy.scope(query, %{tenant_id: tenant_id})
  end

  @impl Mailglass.Tenancy
  def resolve_webhook_tenant(%{path_params: %{"tenant_id" => tenant_id}}), do: {:ok, tenant_id}
  def resolve_webhook_tenant(_ctx), do: {:error, :missing_tenant_id}
end
```

## Run tenant-scoped delivery

```elixir
Mailglass.Tenancy.with_tenant("acme", fn ->
  %{email: "ops@acme.example"}
  |> MyApp.UserMailer.welcome()
  |> Mailglass.deliver()
end)
```

## End-to-End Example

```elixir
Mailglass.Tenancy.with_tenant("acme", fn ->
  {:ok, delivery} =
    %{email: "owner@acme.example"}
    |> MyApp.UserMailer.welcome()
    |> Mailglass.deliver()

  delivery.tenant_id
end)
```