{"slug": "organizations-vs-projects-in-supabase-move-a-project-between-orgs-audit-dormant", "title": "Organizations vs Projects in Supabase: Move a Project Between Orgs, Audit Dormant Ones, and Build a Small Inventory Board", "summary": "A developer built a small static inventory board that groups Supabase projects by organization and estimates monthly cost from pasted CLI output, while documenting how to transfer a project between organizations and audit dormant ones. Testing on a throwaway setup, the developer found that a transferred project keeps its project reference and that paused projects appear as \"INACTIVE\" in `supabase projects list --output json`. The board runs entirely in the browser, requiring no server, access token, or stored data.", "body_md": "When your Supabase projects start to pile up, three questions come fast: what belongs to the organization and what to the project, how do I move a project, and which ones are dead? I tried all three on a throwaway setup and built a small board that shows the answer on one screen. Everything here is from my run on 2026-10-27, and prices and rules change.\n\n**How this was made:** I wrote this with Claude's help: it drafted, and I ran every step, edited the text, and checked the results. The mistakes are mine. This is a personal learning project, not an official guide, and I don't work for Supabase.\n\nThe non-technical version of the idea (company and offices): [https://medium.com/p/f19c78f2ba25](https://medium.com/p/f19c78f2ba25)\n\nThe code: [https://github.com/tomozilla/project-inventory-en-demo](https://github.com/tomozilla/project-inventory-en-demo)\n\nThe Billing FAQ says it plainly: an organization holds many projects; each project is a dedicated instance with its own Storage, Auth, Functions and Realtime; **each organization has one subscription plan**; and project add-ons (compute, PITR, custom domains) are set **per project** but billed through the organization.\n\nMy own cheat sheet:\n\n|  | Organization | Project | \n|---|---|---|\n| Plan and billing | here | (uses the organization's) | \n| Members and roles | here | covered by the organization's | \n| SSO, audit logs | here |  | \n| Database, Auth, Storage, Functions |  | here | \n| Compute size, backups, PITR |  | here | \n| API keys, URL |  | here | \n\nTwo consequences from the docs: a paid plan applies to **every project** in that organization, and you **cannot mix** free and paid projects inside one organization.\n\nMy free organization has two projects. One is paused. The pricing page says free projects pause after a week of inactivity, so I assume that is why. I did not confirm the reason on screen.\n\nSettings like SSO and audit logs live on the organization side, not in a project.\n\nI decide by asking what must never be mixed.\n\nOne docs detail surprised me: the limit of two active free projects is counted **across every Owner and Admin** of the organization. If another admin already used their allowance, you can't launch another free project there. The docs suggest creating another free organization or changing that member's role. I am the only member of my organization, so I did not reproduce this.\n\nCreate the target organization at `/dashboard/new`. Check that the plan says **Free - $0/month**.\n\nThen open the project's **Project Settings -> General** and scroll to **Transfer project**.\n\nThe dialog warns about three things: possible downtime when moving from paid to free, permission changes depending on your role in the target, and lost features (for example image transformations) on a smaller plan.\n\nI picked the new organization and confirmed. It took a few seconds, and the **project reference stayed the same**.\n\nThen I moved it back the same way and deleted the temporary organization (Organization Settings -> General -> Delete organization). Deleting asks you to type the organization's slug. I checked the page title first, because it is permanent.\n\nWhat the docs say, which I did not test:\n\nYou don't have to open every project. The CLI lists them (read-only):\n\n```\nsupabase projects list --output json\n```\n\nEach project comes back with `ref`, `name`, `organization_id`, `region`, `created_at` and `status`. In my run a paused project showed `\"status\": \"INACTIVE\"`.\n\nTwo limits matter:\n\nBefore deleting anything, ask the owner. Paused projects are not charged for compute according to the docs, so there is no rush.\n\nI turned that into a page: paste the CLI output, and see projects grouped by organization.\n\nIt is a static page. No server, no project, no access token, and what you paste stays in the browser.\n\nBecause the output has no plan, you pick it per organization. The estimate counts **running** projects only:\n\n```\nmonthly = Math.max(0, active * 10 - 10);   // Micro $10 per running project, minus the $10 included\nmonthly += plan === \"pro\" ? 25 : 599;       // plan fee\n```\n\nRun it from the repository root, because the sample button reads `../sample/`:\n\n```\npython3 -m http.server 8000     # then open http://localhost:8000/app/\nnode app/test.js                # 13 checks\nsupabase projects list --output json | pbcopy   # your own data (macOS)\n```\n\nWith the sample, I set organization 1 to free and organization 2 to pro:\n\nI also checked that the parser reads my real CLI output (3 projects in 2 organizations). I looked at the counts only and kept the names out of this article and the repo.\n\nI decided the page should never go blank silently. A broken paste shows the reason in red, and rows missing `ref`, `name`, `organization_id`, `status` or `created_at` are **skipped with a count**, not dropped quietly.\n\nThe page said \"1 projects\", and the per-organization tables had different column widths. Both fixed.\n\nIdeas I haven't tried: a separate file that maps organization ids to names and owners, a diff against the last inventory so only new or newly paused projects show up, and never letting the tool decide that something is safe to delete.\n\nNext in this series: how to read your bill.", "url": "https://wpnews.pro/news/organizations-vs-projects-in-supabase-move-a-project-between-orgs-audit-dormant", "canonical_source": "https://dev.to/tomozilla/organizations-vs-projects-in-supabase-move-a-project-between-orgs-audit-dormant-ones-and-build-a-bgf", "published_at": "2026-10-28 02:31:16+00:00", "updated_at": "2026-10-28 02:41:19.504731+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools"], "entities": ["Supabase", "Claude", "GitHub"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/organizations-vs-projects-in-supabase-move-a-project-between-orgs-audit-dormant", "markdown": "https://wpnews.pro/news/organizations-vs-projects-in-supabase-move-a-project-between-orgs-audit-dormant.md", "text": "https://wpnews.pro/news/organizations-vs-projects-in-supabase-move-a-project-between-orgs-audit-dormant.txt", "jsonld": "https://wpnews.pro/news/organizations-vs-projects-in-supabase-move-a-project-between-orgs-audit-dormant.jsonld"}}