caslu

caslu

Hello everyone, I’m building a collaborative editor where users can belong to multiple teams. I’ve decided to set up multi-tenancy on my user resource using the context strategy. So far, so good. However, Ash’s default behavior seems to require a team to be created before a user can be created and associated with it. This makes sense in general, but I need a different approach.

If you look at Notion, Figma, Vercel, Supabase, and many other applications with a “team” (organization, group, etc.) architecture, you’ll notice that they often register the user first. Then, the application creates a default organization, often using the user’s username, name, or other information.

Is there a way to adapt Ash’s expected flow to achieve this pattern? Something like:

User registration → Onboarding → Create user organization → Redirect to app home

I realize this is likely more of a design consideration than an Ash issue. If anyone has already tackled and solved this, I’d greatly appreciate any help. Thanks again, everyone! :smile:

Showing Posts 1 to 10

zachdaniel

zachdaniel

Creator of Ash

My suggestion would be to create the users organization immediately on register, and then allow them to update/customize it after the fact. You can attach before/after action hooks to the register action for example.

caslu

caslu OP

Zach, i’ve also noticed that i’m not being able to register user with the default setup for magic link, do i have to make some tweak ? I am using ash with Inertia, therefore i am dispatching action by myself, here’s a snippet from my auth_controller

  def magic_link_request(conn, user_params) do
    strategy = Info.strategy!(User, :magic_link)

    case Strategy.action(strategy, :request, user_params) do
      :ok ->
        redirect(conn, to: ~p"/login")

      {:error, _} ->
        conn
        |> put_flash(:error, "Failed to send magic link")
        |> redirect(to: ~p"/login")
    end
  end

After doing a multi-tenancy setup the emails aren’t being send anymore, can you help with this ?

zachdaniel

zachdaniel

Creator of Ash

You’ll need to make sure that you’re passing the tenant option. Additionally, we are releasing some fixes for multi tenancy + Ash Authentication shortly.

caslu

caslu OP

Yeah i got it but in that case i am just requesting the magic link, the user was not created yet so i cannot create an organization for this user yet, so there’s no tenant option to use (following your suggestion in above answer). So can it be adapted ?

zachdaniel

zachdaniel

Creator of Ash

Ah, sorry was a bit distracted and didn’t realize this was the same thread.

You can create an organization right there in that handler if one doesn’t exist yet for that user, and then you can set the tenant on the action. If you want to do it transactionally in the case that something goes wrong.

action :send_magic_link_request do
  transaction? true
  argument :user_params, :map, allow_nil?: false

  run fn input, _ ->
    # get org for users email
    # if it doesn't exist, make it
    org = get_or_create_org(...)
    strategy = Info.strategy!(User, :magic_link)

    Strategy.action(strategy, :request, input.arguments.user_params, tenant: org)
  end
end

Then you can call that generic action from your controller.

caslu

caslu OP

Does Token resource also needs to have a multitenancy block declaration in order to work with authentication ?

zachdaniel

zachdaniel

Creator of Ash

If your users resource is multitenant, your token resource likely should be as well.

caslu

caslu OP

Apologies for the delayed response. I didn’t see your reply earlier. My question is: Doesn’t it make more sense to set global? true on the users and token resources and then handle authentication separately from team creation?

zachdaniel

zachdaniel

Creator of Ash

It could. I’m not sure if I’d say it makes “more” sense necessarily though. I like having fewer invariants in my system. i.e if “all users always have an org” that is simpler than “users have an org except for a few minutes after they sign up and before they create their org”. You’d end up dealing with the fact that not all users have an org in a bunch of places.

caslu

caslu OP

This worked pretty well, thanks again zach

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews