Team workspaces on orkestr, and the ownership-transfer problem

Team plan has improved on orkestr: explicit team workspaces, shared project budgets across personal and team contexts, and a real ownership-transfer flow.

Stefan 6 min read

You signed up for the Team plan a year ago. Your card is on file. You hired two engineers, invited them, and they’ve shipped most of the production work since. Now you’re leaving the company.

On most SaaS we’ve used, this is the moment you open a support ticket. “Hi, can the new tech lead take over the subscription? Also all 12 projects. Also the domains. Also the audit log.” Three business days later you get an email asking for “verification” of something.

Team plan shipped on orkestr today. The whole flow is in the dashboard, and the ownership transfer takes about ninety seconds end to end. Most of this post is about why that last part was harder than it should have been.

What ships today

  • Explicit team workspaces. Create a team, invite members by email, switch workspaces from the top bar. Personal projects stay personal; team projects are visible to the team.
  • Shared plan budgets. Your Team plan’s 15-project allowance is shared across your personal workspace and the team. The team owner’s plan applies to team projects automatically.
  • Role-aware everything. Members see who created each project. Members can’t delete team projects (only the owner can). The activity feed shows team-tagged actions to all members.
  • Ownership transfer. If the owner wants out, they can hand the team (and every project and function inside it) to another member, atomically, with a 1 EUR card verification on the new owner’s side. The old owner’s subscription gets cancelled. The new owner’s billing starts the day the old one would have renewed.

Team is 29.99 EUR/month or 299 EUR/year. Same EU-hosted infrastructure as every other plan, no US data transfer.

The workspace model

I want to be specific about what “workspace” means here, because the word is overloaded.

orkestr has exactly two workspace contexts: Personal and Team. There used to be a third one in an early draft called “All workspaces” - the kind of UX where you see everything across every team you’re in, on one dashboard. We shipped it on a staging environment, used it for a week, and ripped it out. It made scoping invisible, and that’s the kind of detail you want loud, not implicit.

The active workspace is now part of every request. If you’re a member of a team and you open the projects page, you do not see the owner’s untagged personal projects. Not because the UI hides them, but because the backend never returns them in the first place.

The one place scope expands automatically is plan limits. A project’s plan is whoever owns it - so if you’re on the free tier and you’re working on a project in a Team-plan team, you get Team-plan limits on that project: rollbacks, custom domains, the bigger CPU and memory budgets, IP allowlists, the works. No “upgrade to Pro” walls inside a team you’re already paying for.

Shared plan budgets, role-aware counts

The 15-project limit on Team is a single budget split across both contexts. If you the owner have 5 personal projects and your team has 8 team projects, you’ve used 13 of 15. Your members, however, see “8 of 15” - their personal projects don’t count against the team’s budget, and they shouldn’t see how many personal projects you have. Even the count would leak something.

This is the kind of detail that nobody notices when it’s right, and everyone notices when it’s wrong. Same for the activity feed: members see team-tagged actions from everyone, plus their own personal actions, never the owner’s personal actions. Same for domains, addons, deployments.

The invite flow, and the email-mismatch problem

Invites are email-based. The owner enters an email, we create a TeamInvite row, the invitee gets a link. Standard so far.

The annoying edge case: the invitee already has an orkestr account, but the email on that account doesn’t match the one the owner typed. Maybe they signed up with firstname@gmail.com for personal and you invited their work email firstname@company.com. Most platforms either silently match (bad - emails are not identity) or hard-fail and tell the owner to try again (annoying).

orkestr does neither. The accept page shows: “This invite was sent to firstname@company.com. Your account email is firstname@gmail.com. Are these the same person?” The invitee says yes, the system logs both emails on the membership row, and they’re in. If the invitee says no, the invite stays open for whoever actually owns that email.

It’s a tiny UX detail. It removed about half the support emails I expected to get.

The ownership-transfer problem

Now the interesting part.

Until last week, a Team-plan owner who wanted to leave the team had one option: remove every member, delete every team project, cancel their subscription, and let the team data evaporate. That is not “transfer ownership.” That is “burn down the office and leave.”

Here’s how the flow works:

  1. Owner requests transfer. Picks a member, ticks a consent checkbox that says “you’ll lose ownership of every team project and function”.
  2. Target gets notified. If they’re not on Team plan yet, the prompt tells them they need to subscribe first. We can’t hand the team over to someone whose plan can’t hold the resources.
  3. Target pays 1 EUR. A Mollie card verification, not a real charge. It exists for two reasons: it proves the target’s card is valid before we hand them a subscription, and EU consumer rules effectively require an explicit, attributed action with disclosed terms before starting a recurring charge.
  4. Atomic swap. Once Mollie confirms the verification, a single database transaction reassigns the team, every project, and every function in one go. Either every write lands or none of them do.
  5. Subscription handover. The new owner’s subscription starts on the day the old one would have renewed. The old owner’s subscription is cancelled and the 1 EUR is refunded. Neither party double-pays during the handover.

The handover timing was the part I’m proudest of. The first version had the new subscription kick off immediately, which meant if the swap happened on day 5 of a 30-day cycle, the old owner had paid for 25 unused days and the new owner started paying right away. Anyone who’s ever processed a refund knows that’s a customer service trap. Aligning the start date to the old owner’s renewal date makes the swap free for both sides.

What’s not in this release

A short honest list:

  • No automatic expiry on pending transfers. Right now they sit there until someone cancels or accepts. Likely a 7-day default soon.
  • No multi-owner teams. One owner per team. Co-ownership is a different feature with different invariants and I don’t want to ship a half version of it.

If you’ve been waiting for the Team plan, it’s at orkestr.eu/pricing. If you’re already on Pro and want to bring a couple of engineers on, the upgrade is in your settings.

Why I wrote this

The transfer flow is unglamorous infrastructure. Nobody picks a hosting platform because of how its team-ownership swap works. But it’s the kind of detail that, two years from now, prevents a customer from being stuck in a support queue trying to leave or onboard a co-founder. Those moments are when “we ship the EU alternative to the big guys” stops being a tagline and starts being a thing you can actually do.

If you hit a sharp edge in the team flow, my email’s stefan at orkestr dot eu. I read everything.


Ship your next app on orkestr

EU-hosted. Push your code - live in seconds.

Start deploying for free