# User Access — Test Accounts

Logins and links for testing ModuleDesk as each plan sees it.
Last verified: 2026-08-17.

> Local test credentials for a self-hosted instance. Do not reuse these
> passwords anywhere real, and do not create accounts like these on a
> production tenant.

## Accounts

| Plan | Login | Password | Org | Schema |
|------|-------|----------|-----|--------|
| **internal** (owner / superadmin) | `admin@local.test` | `Admin123!ChangeMe` | ModuleDesk Internal (id 1) | `tenant_internal` |
| **free** | `free@local.test` | `Test123!Free` | Free Sandbox (id 21) | `tenant_free_sandbox` |
| **premium** ("Pro") | `premium@local.test` | `Test123!Premium` | Pro Sandbox (id 22) | `tenant_pro_sandbox` |

`admin@local.test` is `role = platform_admin` — the top role, and the only one
that can reach `/admin/*`. Its org is on the `internal` plan: unlimited
everything, no billing. **There is no separate "superadmin" to create — this is
it.**

The two sandboxes are `role = admin` (org-level admin, no platform console).

## Links

| What | URL |
|------|-----|
| Login | https://support.claude-baby.dev/login |
| Inbox (landing page after login) | https://support.claude-baby.dev/inbox |
| Dashboard | https://support.claude-baby.dev/dashboard |
| Products / modules | https://support.claude-baby.dev/products |
| Settings | https://support.claude-baby.dev/settings |
| Guides (beta) | https://support.claude-baby.dev/guides |
| **Platform console** (internal only) | https://support.claude-baby.dev/admin |
| Public landing page while logged in | https://support.claude-baby.dev/?preview=1 |
| Onboarding — module selection | https://support.claude-baby.dev/onboard/modules |

## Sandbox state — and why

Both sandboxes are deliberately parked in the "just connected Addons, nothing
tracked yet" state:

- **Addons API key stored** (encrypted) — the platform `ADDONS_API_KEY`, so the
  sandbox can talk to Addons without re-pasting a key. Verified: it authenticates
  and sees 25 modules.
- **0 modules selected** — `addons_products` is empty. This is the state to test
  module selection and the plan module limits from scratch.
- **`trial_ends_at = NULL`** — no trial. A real signup gets a 30-day trial, which
  would make the *free* sandbox behave like the trial profile and defeat the
  point. Set a future date here to test the trial itself:

  ```sql
  UPDATE public.organizations
     SET trial_ends_at = now() + interval '30 days' WHERE slug = 'free-sandbox';
  ```

  That resolves the org to the **`max_trial`** plan — MAX features except `byok`,
  `historical_sync`, `ratings` and `ratings_export`, with a 60-credit pool. See
  `plan_service.PLAN_FEATURES["max_trial"]`.
- **`onboarding_complete = False`** — the Celery sync only picks orgs where this
  is `true`. Left false on purpose so a background sync doesn't silently import
  all 25 modules and destroy the no-modules-selected state. Flip it to `true`
  once modules have been deliberately selected.

## Recreating them

```bash
# from /home/agent/projects/support-hub
venv/bin/python -m scripts.create_test_orgs --reset --dry-run   # preview
venv/bin/python -m scripts.create_test_orgs --reset             # do it
```

`--reset` deletes **every** organization except the ones in `KEEP_ORG_IDS`
(currently `{1}`) and drops their tenant schemas. It is destructive — always run
`--dry-run` first. Without `--reset` the script is purely additive and skips orgs
that already exist.

## Plan names

The code has four plans: `free`, `premium`, `max`, `internal`. "Pro" in
conversation means **`premium`**. Prices in `plan_service.PLAN_PRICE_CENTS`:
premium €59, max €99.
