Developer Docs

Owner Destinations โ€” The Deck, Register & Pricing

This document covers the three dedicated Malet Owner routes that replace generic /profile placeholders in the platform footer, establishing a clear onboarding โ†’ workspace โ†’ upgrade funnel for Malet Owners.

Workspace Taxonomy

Mallnline organizes admin-level interfaces into three workspace tiers, each mapped to a future subdomain:

Workspace Current Route Future Subdomain Persona Scope
The Deck /dashboard deck.mallnline.com Malet Owners Your Malets, Murchases, revenue, team
The Studio /dev studio.mallnline.com Developers SDKs, webhooks, API docs
The Tower /admin tower.mallnline.com Platform Admins All users, platform-wide analytics, moderation

NOTE

For full Tower architecture details, see Workspaces & The Tower. For the Deck โ†” Tower separation audit, see deck-tower-audit.md.

The Deck vs The Tower

The existing /admin route is The Tower โ€” platform-wide oversight tools (User Listing, Revenue Analytics, Search Config, Alert Templates, Deprecation Tracking).

The Deck is the Malet Owner's daily-driver hub. It aggregates owner-scoped data and links to existing management pages:

/dashboard
โ”œโ”€โ”€ Stats Row: owned malets, products, services, blog posts
โ”œโ”€โ”€ My Malets Grid: cards with Manage / Blog / View links
โ”œโ”€โ”€ Quick Actions: launchers linking to /create-malet, /admin, /orgs, /settings, /owner/pricing, /support
โ””โ”€โ”€ Org Context Banner: shows org name when OrgSwitcher is active

Routes

`/owner/register` โ€” Onboarding Funnel

Type: Public, SSR-enabled, SEO-optimized

Auth-aware landing page with three hero states:

State CTA Destination
Unauthenticated "Sign In to Get Started" /auth?redirect=/create-malet
Authenticated, no Malets "Create Your Malet โ€” It's Free" /create-malet
Existing owner Welcome card โ†’ "Go to The Deck" deck.mallnline.com/dashboard

Sections:

  1. Dual-path chooser: Solo Creator (Starter/Free โ†’ /create-malet) vs Business & Team (Pro/$29/mo โ†’ /orgs/create?then=checkout&plan=pro)
  2. 3-step guide: Create โ†’ Add Products โ†’ Start Selling
  3. 6 benefits cards: Analytics, Payments, Team Management, Blog Engine, uChat, Theme Designer
  4. "What is The Deck?" preview: Workspace overview with feature highlights
  5. Final CTA: Links to /create-malet and /owner/pricing

Data: Dynamically imports $lib/queries/malet โ†’ GET_MY_OWNED_MALETS to determine malet count for hero state branching.

`/dashboard` โ€” The Deck Command Center

Type: Auth-gated (ssr: false), redirects to STOREFRONT_URL/auth?redirect=/dashboard via the getAuthUrl helper in ngwenya-deck.

Org-context-aware: Dynamically imports stores/orgs โ†’ reads $currentOrg. The client.ts auto-injects x-org-id headers, so GET_MY_OWNED_MALETS returns org-scoped Malets when an org is selected.

Data source: GET_MY_OWNED_MALETS from $lib/queries/malet (same query used by /profile).

Components:

Component Description
Stats row 4 KPI cards: Total Malets, Total Products, Total Services, Blog Posts
Malets grid Owned Malet cards with icon, <MallHandle>, Manage/Blog/View action buttons
Add card Dashed "Create New Malet" card linking to /create-malet
Quick actions 6 launcher cards (Create Malet, Analytics, Organization, Settings, Pricing, Support)
Org banner Contextual banner showing org name when $currentOrg is set
Empty state CTA with "Launch Your First Malet" messaging + link to /owner/register

Quick Actions reactivity: The quickActions array uses $derived() so the Organization card dynamically updates its href and desc based on currentOrg state changes.

`/owner/pricing` โ€” Plan Comparison

Type: Public, SSR-enabled, SEO-optimized

Single source of truth: All plan data imported from $lib/config/plans.ts โ€” ALL_PLANS, formatPlanPrice(), requiresOrganization(), and PlanLimits types.

Sections:

Section Details
Billing toggle Monthly/Annual switch with "Save 20%" badge
Plan cards 3-column grid: Starter (Free), Pro ($29/mo, "Most Popular"), Enterprise (Contact Sales)
Commission rates Per-card display: Starter 8%, Pro 5%, Enterprise 3%
Feature matrix 9 rows: maxMalets, maxTeamMembers, customDomain, customRbac, samlScim, siem, prioritySupport, dedicatedManager, commission
Org callout "Pro & Enterprise include an Organization" section
FAQ accordion 6 questions with animated chevron toggle
Final CTA "Start Building for Free" + "Learn More" links

CTA routing logic:

function ctaHref(plan: PlanConfig): string {
  if (plan.contactSales) return '/contact?subject=enterprise';
  if (plan.tier === 'starter')
    return authed ? '/create-malet' : '/auth?redirect=/create-malet';
  return authed
    ? `/orgs/create?then=checkout&plan=${plan.tier}&annual=${isAnnual}`
    : '/auth?redirect=/orgs/create';
}

Updated SoleContent.svelte "For Business" column:

Auth State Visible Links
Authenticated The Deck, Admin Dashboard, Manage Malets, New Organization, Manage Passkeys, Pricing, How It Works
Unauthenticated Become a Malet Owner, Open a Malet, Sign In, Pricing, How It Works

Key changes:

  • Pricing link โ†’ /owner/pricing (was /for-business#pricing)
  • Removed dead {:else if $isAuthenticated} branch
  • Added data-testid attributes for E2E testing

File Reference

File Description
src/routes/owner/register/+page.svelte Onboarding landing page
src/routes/owner/register/+page.ts SSR config
ngwenya-deck/src/routes/dashboard/+page.svelte The Deck command center
ngwenya-deck/src/routes/dashboard/+page.ts SSR disabled (auth-gated)
src/routes/owner/pricing/+page.svelte Full pricing comparison
src/routes/owner/pricing/+page.ts SSR config
src/routes/lobby/SoleContent.svelte Footer links (modified)
src/lib/config/plans.ts Plan data source of truth
docs/architecture/deck-tower-audit.md Deck vs Tower tab classification
tests/owner-routes.test.ts 23 unit tests
tests/owner-routes.e2e.ts 9 E2E test cases