Files
descrybe/docs/plan-permissions/01-dashboard-feature-catalog.md
greeneclipse 8580c996c3 Initial commit of Descrybe v2 without local scratch artifacts.
Drop one-shot tmp/axe scripts and agent i18n scratch so the Gitea tree is deployable.
2026-08-09 22:47:43 +02:00

360 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# User dashboard feature catalog (agent 1/10)
Inventory of signed-in **user dashboard** surfaces: everything rendered in the dashboard shell (`+layout.svelte` branch that is not marketing, auth, or `/admin/*`). Sources: `Nav.svelte`, route `+page.svelte` files, `plan-gates.ts`, `billing-display.ts`, `pricing-data.ts`, `entitlements.go`, `AssertCanStartProcessing`, and UI upgrade banners.
**Plan ladder (API defaults):** Free → Starter → Plus → Growth → Business → Scale → Enterprise (`apps/api/internal/billing/service.go` `defaultPublicPlans`, `apps/web/src/lib/components/pricing/pricing-data.ts`).
| Plan | SKU cap | Monthly AI credits | Paid (`is_paid_plan`) |
|------|---------|-------------------|------------------------|
| Free | 50 | 0 | No |
| Starter | 100 | 100 | Yes |
| Plus | 400 | 400 | Yes |
| Growth | 1,200 | 1,200 | Yes |
| Business | 4,000 | 4,000 | Yes |
| Scale | 12,000 | 12,000 | Yes |
| Enterprise | Unlimited (`max_products` null) | 1,000,000 wallet grant | Yes (custom) |
**Enforced today (API):** product SKU cap (`ErrProductLimitExceeded`), AI credit wallet + `can_use_ai` for AI-only processing (`ErrAIRequiresUpgrade` / `ErrInsufficientCredits`), email live-send blocked on Free (`email/service.go` dry-run), campaign AI generate (`campaigns/generate_send.go`), brand voice injection in AI prompts (`AIBrandApplyAllowed` → paid or trial). EPREL is **not** plan-gated (`CanUseEPREL` always true).
**Marketing copy only (not found enforced in API):** per-plan feed-source counts, export-feed counts, storage GB, WooCommerce “test vs full sync”, API read vs full access tiers, BYOK add-on packaging. Flag these when designing admin toggles — they need new enforcement or stay documentation-only.
---
## Admin toggle groups
Use these sections when grouping `feature_key` toggles in an admin plan editor.
| Section key | Scope |
|-------------|--------|
| `shell` | Global chrome: nav, header, command palette, tutorial, company switcher |
| `dashboard` | Home / overview |
| `catalog` | Products, categories, attributes, standard fields, structured descriptions |
| `feeds` | Import feeds, mapping, export feeds, file uploads |
| `stores` | Store hub, WooCommerce, Shopify connectors |
| `processing` | Background job monitor |
| `marketing` | Campaigns, calendar, brand, SEO, reviews |
| `integrations` | AI BYOK, email sending |
| `billing` | Billing, plans, checkout |
| `settings` | Account, company, alerts, API keys, team |
| `support` | Support center |
| `capabilities` | Cross-cutting gates (AI, SKU cap, email send, etc.) |
---
## Shell (`shell`)
| feature_key | UI location | User actions | Default by plan |
|-------------|-------------|--------------|-------------------|
| `shell.navigation` | Sidebar `Nav.svelte` — primary + More (Setup / Operate) | Navigate all dashboard routes; mobile drawer | All plans |
| `shell.command_palette` | Header area + `CommandPalette.svelte` (⌘K) | Quick-jump to Products, Feeds, Processing, Export, Settings, Billing, Support | All plans |
| `shell.company_switcher` | `DashboardHeader``CompanySwitcher.svelte` | Switch active company/workspace | All plans (multi-company users) |
| `shell.support_notifications` | `SupportNotificationBell.svelte` | Poll staff replies; open support tickets | All plans |
| `shell.tutorial` | Header tutorial buttons + `TutorialOverlay.svelte` | Start / resume / browse guided tour | All plans |
| `shell.account_menu` | Header avatar → `/settings` | Open account settings | All plans |
| `shell.billing_recovery_banner` | `BillingRecoveryBanner.svelte` (layout) | Past-due or missing-plan recovery CTAs | All plans (state-driven) |
---
## Dashboard (`dashboard`)
| feature_key | Route / component | User actions | Default by plan |
|-------------|-------------------|--------------|-------------------|
| `dashboard.overview` | `/dashboard``dashboard/+page.svelte` | Welcome, plan/credit summary | All |
| `dashboard.stats` | `DashboardStats.svelte` | View SKU count, active jobs, credits used/remaining | All |
| `dashboard.quick_links` | Dashboard shortcuts section | Jump to Products, Feeds, Processing | All |
| `dashboard.recent_jobs` | Dashboard jobs list | View recent processing jobs, open Processing | All |
| `dashboard.news_feed` | `NewsFeed.svelte` | Product news / announcements | All |
| `dashboard.activation_checklist` | `ActivationChecklist.svelte` | First-run onboarding steps | All |
| `dashboard.migrated_checklist` | `MigratedCohortChecklist.svelte` | Post-migration cutover checklist (cohort flag) | All (cohort) |
| `dashboard.etl_gaps` | `MigratedEtlGapsPanel.svelte` | Migration gap warnings | All (cohort) |
| `dashboard.store_reconnect` | `StoreReconnectBanner.svelte` | Reconnect broken store credentials | All |
| `dashboard.upgrade_banners` | `UpgradeBanner.svelte` on dashboard | Free plan, out-of-credits, SKU limit, trial, low credits | **Gated messaging** — see capabilities |
---
## Catalog (`catalog`)
### Products — `/products`
| feature_key | UI location | User actions | Default by plan |
|-------------|-------------|--------------|-------------------|
| `catalog.products` | Nav **Products**`products/+page.svelte` | Browse, filter, sort, select products | All |
| `catalog.products.tab_processed` | `ProductTabs.svelte` | View completed processed products | All |
| `catalog.products.tab_needs_review` | Product tabs | Review AI enrichment before accept | All (needs AI run) |
| `catalog.products.tab_error` | Product tabs | View failed processing rows | All |
| `catalog.products.tab_processing` | Product tabs | View in-flight rows | All |
| `catalog.products.tab_unprocessed` | Product tabs | View raw / unprocessed inventory | All |
| `catalog.products.process_categories` | `ProductProcessingActions` | Run category assignment (no AI credits) | All |
| `catalog.products.process_attributes` | Processing actions | Normalize specs / fill attributes (no AI) | All |
| `catalog.products.process_ai_titles` | Processing actions | AI title generation | **Starter+** or Free with credits |
| `catalog.products.process_ai_descriptions` | Processing actions | AI description generation | **Starter+** or Free with credits |
| `catalog.products.enrichment_review` | `ProductEditPanel.svelte` | Accept / reject / edit AI fields | All (after AI run) |
| `catalog.products.inline_rename` | Product table | Quick rename processed titles | All |
| `catalog.products.export_selection` | Processing actions export | Export selected products | All |
| `catalog.products.upgrade_prompt` | Upgrade banners on products page | Free-plan and credit-limit CTAs | **Already gated** (UI) |
### Categories — `/categories`, `/categories/[id]/title-formula`, `/categories/[id]/description-formula`
| feature_key | UI location | User actions | Default by plan |
|-------------|-------------|--------------|-------------------|
| `catalog.categories` | Nav More → Categories | List/edit category tree | All |
| `catalog.categories.title_formula` | Title formula page | Build title formulas with variables | Free: basic (1 cat marketing); Starter+: full |
| `catalog.categories.description_formula` | Description formula page | Build description formulas | Same as title formulas |
### Attributes — `/attributes`
| feature_key | UI location | User actions | Default by plan |
|-------------|-------------|--------------|-------------------|
| `catalog.attributes` | Nav More → Attributes | Define attribute definitions | All |
| `catalog.attributes.bulk_import` | Attributes **Bulk Import** tab | CSV bulk import attributes | All |
### Standard fields — `/standard-fields`
| feature_key | UI location | User actions | Default by plan |
|-------------|-------------|--------------|-------------------|
| `catalog.standard_fields` | Nav More → Standard Fields | Manage field dictionary | All |
| `catalog.standard_fields.groups` | Standard Fields **Groups** tab | Organize fields into groups | All |
### Other catalog pages (no nav link)
| feature_key | Route | User actions | Default by plan |
|-------------|-------|--------------|-------------------|
| `catalog.structured_descriptions` | `/structured-descriptions` | Structured description field config | All |
| `catalog.vector_categories` | `/vector-categories` | Dev/test vector index (Pinecone) | All if Pinecone configured |
---
## Feeds (`feeds`)
### Import feeds — `/feeds`
| feature_key | UI location | User actions | Default by plan |
|-------------|-------------|--------------|-------------------|
| `feeds.list` | Nav **Feeds** | List supplier feeds, search, stats | All (Free marketing: 1 source) |
| `feeds.add_url` | Add feed dialog **Feed URL** tab | Add HTTP(S) feed URL | All |
| `feeds.add_csv` | Add feed **CSV file** tab | Upload CSV as feed source | All |
| `feeds.sync` | Per-feed sync actions | Trigger feed sync (FTP unsupported in UI) | All |
| `feeds.delete` | Feed row actions | Delete feed | All |
### Feed mapping — `/feeds/[feedId]/mapping`
| feature_key | UI location | User actions | Default by plan |
|-------------|-------------|--------------|-------------------|
| `feeds.mapping` | From feeds list → Map | Map supplier fields to standard fields | All |
| `feeds.mapping.select_item` | Mapping tab 1 | Pick XML/CSV item element | All |
| `feeds.mapping.map_fields` | Mapping tab 2 | Column / path mapping, transforms | All |
| `feeds.mapping.queue_processing` | Post-map CTA | Queue products for processing after sync | All (AI steps follow capability gates) |
### Export feeds — `/export-feeds`
| feature_key | UI location | User actions | Default by plan |
|-------------|-------------|--------------|-------------------|
| `feeds.export_feeds` | Nav **Export feeds** | List channel export definitions | All (Free marketing: 1 export) |
| `feeds.export_feeds.create` | Create / edit dialog | Configure export format & filters | All |
| `feeds.export_feeds.generate` | Generate action | Run export generation (rate-limited API) | All |
| `feeds.export_feeds.public_url` | Public URL display | Copy signed export URL | All |
### Uploads — `/files`
| feature_key | Route | User actions | Default by plan |
|-------------|-------|--------------|-------------------|
| `feeds.uploads` | `/files` | List/delete CSV uploads; link to product import | All |
---
## Stores (`stores`)
### Hub — `/stores`
| feature_key | UI location | User actions | Default by plan |
|-------------|-------------|--------------|-------------------|
| `stores.hub` | Nav **Stores** | Overview of WooCommerce / Shopify cards | All |
| `stores.hub.api_keys_link` | Stores page | Deep-link to Settings → API keys | All |
### WooCommerce — `/woocommerce`
| feature_key | Tab / section | User actions | Default by plan |
|-------------|---------------|--------------|-------------------|
| `stores.woocommerce` | Nav More → Reviews uses `?tab=reviews` | Full WooCommerce integration page | All |
| `stores.woocommerce.connection` | Connection tab | Store URL, credentials, test connection | Free: test/limited (marketing); Starter+: full |
| `stores.woocommerce.categories` | Categories tab | Sync categories to/from Woo | Plan-dependent (marketing) |
| `stores.woocommerce.attributes` | Attributes tab | Sync attributes | Plan-dependent (marketing) |
| `stores.woocommerce.orders` | Orders tab | View recent orders | All |
| `stores.woocommerce.reviews` | Reviews tab | Manage product reviews | All |
| `stores.woocommerce.settings` | Settings tab | Sync options, overwrite guards | All |
| `stores.woocommerce.queue_sync` | Push products to Woo | Queue catalog sync jobs | Gated by processing/SKU caps |
### Shopify — `/stores/shopify` (also `/shopify` legacy)
| feature_key | Tab | User actions | Default by plan |
|-------------|-----|--------------|-------------------|
| `stores.shopify` | Stores hub → Shopify | Shopify connector | All |
| `stores.shopify.connection` | Connection tab | OAuth / API connection | All |
| `stores.shopify.orders` | Orders tab | View orders | All |
| `stores.shopify.settings` | Settings tab | Sync settings | All |
| `stores.shopify.queue_sync` | Sync actions | Push products to Shopify | Gated by processing/SKU caps |
---
## Processing (`processing`)
| feature_key | Route | User actions | Default by plan |
|-------------|-------|--------------|-------------------|
| `processing.monitor` | Nav More → **Processing** (`/processing`, alias `/tasks`) | Live job list, refresh, auto-poll | All |
| `processing.job_cancel` | Job row actions (if present) | Cancel / retry failed jobs | All |
| `processing.pipeline_steps` | Job detail / description | normalize → specs → fill → EPREL → AI | EPREL all; AI gated |
---
## Marketing (`marketing`)
### Campaigns — `/campaigns`, `/campaigns/new`, `/campaigns/[id]`
| feature_key | UI location | User actions | Default by plan |
|-------------|-------------|--------------|-------------------|
| `marketing.campaigns` | Nav More → Campaigns | List seasonal email campaigns | All |
| `marketing.campaigns.create` | `/campaigns/new``CampaignWizard.svelte` | Pick season, audience, products | All |
| `marketing.campaigns.generate_ai` | Wizard generate step | AI email draft generation | **Starter+** (`showUpgrade` on Free) |
| `marketing.campaigns.send` | Wizard / campaign detail | Send or schedule blast | Free: dry-run only (email service) |
| `marketing.campaigns.edit_content` | Campaign editor | Edit subject/body HTML | All |
### Content calendar — `/marketing/calendar`
| feature_key | Route | User actions | Default by plan |
|-------------|-------|--------------|-------------------|
| `marketing.content_calendar` | Nav More → Content calendar | Seasonal presets, link campaigns to dates, export feed prep | All |
### Brand — `/brand`
| feature_key | Route | User actions | Default by plan |
|-------------|-------|--------------|-------------------|
| `marketing.brand_kit` | Nav More → Brand | Edit voice, colors, logo, preferred terms | All (view); admin edit |
| `marketing.brand_ai_apply` | Brand + formula previews | Inject brand voice into AI enhance prompts | **Starter+** (`ai_apply_allowed` API) |
### SEO — `/seo`
| feature_key | Route | User actions | Default by plan |
|-------------|-------|--------------|-------------------|
| `marketing.seo` | Nav More → SEO | SEO checklist scores, recommendations | All |
| `marketing.seo.template_fill` | SEO actions | Rule-based meta template fill | All |
| `marketing.seo.ai_rewrite` | SEO actions | AI meta rewrite | **Starter+** or credits (`can_use_ai`) |
### Reviews — `/woocommerce?tab=reviews`
| feature_key | Route | User actions | Default by plan |
|-------------|-------|--------------|-------------------|
| `marketing.reviews` | Nav More → Reviews | WooCommerce reviews tab | All |
---
## Integrations (`integrations`)
### AI — `/integrations/ai`
| feature_key | Route | User actions | Default by plan |
|-------------|-------|--------------|-------------------|
| `integrations.ai` | Nav More → AI integrations | Configure OpenAI / platform AI modes | All |
| `integrations.ai.byok` | AI integrations page | Bring-your-own API key | Growth+ marketing (BYOK add-on); Business included |
### Email — `/integrations/email`
| feature_key | Route | User actions | Default by plan |
|-------------|-------|--------------|-------------------|
| `integrations.email` | Nav More → Email sending | Resend or SMTP credentials | All |
| `integrations.email.test` | Test send | Send test email (may dry-run) | Free: dry-run |
| `integrations.email.blast` | Blast dialog | Marketing blast to audience | Free: dry-run forced |
---
## Billing (`billing`)
| feature_key | Route | User actions | Default by plan |
|-------------|-------|--------------|-------------------|
| `billing.overview` | Nav **Billing** `/billing` | Plan name, credits, SKU usage, subscription status | All |
| `billing.customer_portal` | Billing page | Open Stripe Customer Portal (company admin) | Paid plans with Stripe |
| `billing.quick_upgrade` | Billing quick upgrade cards | Checkout Starter / Growth / Business | Company admin |
| `billing.add_credits` | Billing dialog (if shown) | Purchase extra credits | Paid |
| `billing.plans_compare` | `/plans` (linked from banners) | Compare public ladder, feature matrix | All |
| `billing.checkout` | `/plans` + Billing | Stripe Checkout self-serve upgrade | Company admin; StarterBusiness |
---
## Settings (`settings`)
| feature_key | Tab (`/settings?tab=`) | User actions | Default by plan |
|-------------|------------------------|--------------|-------------------|
| `settings.profile` | `profile` | Name, language, save profile | All |
| `settings.company` | `company` | Company name, locale, branding prefs | Company admin |
| `settings.alerts` | `alerts` | In-app alert preferences (`alert-prefs.ts`) | All |
| `settings.api_keys` | `api-keys` | Create/revoke company API keys | Free marketing: no API; Starter+: read/full per marketing |
| `settings.team` | `team` | Invite members, roles, demote/remove | Company admin |
| `settings.team_invite` | Team tab dialog | Send teammate invite | Company admin |
---
## Support (`support`)
| feature_key | Route | User actions | Default by plan |
|-------------|-------|--------------|-------------------|
| `support.center` | Nav More → Support `/support` | List own tickets | All |
| `support.ticket_create` | `/support/new` | Open new ticket | All |
| `support.ticket_thread` | `/support/[ticketId]` | Reply, read staff messages | All |
---
## Capabilities (`capabilities`) — cross-cutting gates
These map to API enforcement and/or prominent UI locks. Prefer admin toggles here for plan matrices.
| feature_key | Enforced where | Behavior | Suggested defaults |
|-------------|----------------|----------|-------------------|
| `capability.sku_cap` | `AssertCanStartProcessing`, `at_product_limit` on `/api/auth/me` | Blocks new processing when processed SKU count ≥ plan `max_products` | Free 50 · Starter 100 · Plus 400 · Growth 1.2k · Business 4k · Scale 12k · Enterprise unlimited |
| `capability.ai_credits` | Entitlements `can_use_ai`, credit wallet debit | AI jobs need credits or paid plan | Free 0/mo · Starter 100 · Plus 400 · Growth 1.2k · Business 4k · Scale 12k · Enterprise unlimited |
| `capability.ai_processing` | Processing pipeline + products UI | Title/description/enhance/seo AI types | Off on Free unless credits; on paid |
| `capability.eprel` | `CanUseEPREL` (always true) | EU energy label enrichment | **All plans** |
| `capability.normalize_specs_fill` | Pipeline steps without AI | Category, attributes, normalize | **All plans** |
| `capability.campaign_ai` | `campaigns/generate_send.go` | AI campaign copy generation | Starter+ |
| `capability.email_live_send` | `email/service.go` dry-run | Real marketing email delivery | Free dry-run; paid live (unless `EMAIL_DRY_RUN`) |
| `capability.brand_ai_apply` | `AIBrandApplyAllowed` | Brand voice in AI prompts | Paid or trial |
| `capability.seo_ai_rewrite` | SEO API `can_use_ai` | AI meta rewrite on SEO page | Same as AI credits |
| `capability.feed_source_limit` | **Marketing only** (`pricing-data`) | Max import feed sources | Free 1 · Starter 2 · Plus 3 · Growth 5 · Business 8 · Scale 12 · Enterprise unlimited |
| `capability.export_feed_limit` | **Marketing only** | Max export feed definitions | Free 1 · Starter 2 · Plus 4 · Growth 8 · Business unlimited · Scale unlimited · Enterprise unlimited |
| `capability.storage_limit` | **Marketing only** | Storage GB | Free 2 · Starter 20 · Growth 100 · Business 500 · Enterprise unlimited |
| `capability.api_access` | **Marketing only** (keys UI exists for all) | REST / v1 API | Free off · Starter read · Growth+ full |
| `capability.byok` | AI integrations UI | Customer OpenAI key | Growth add-on · Business included · Enterprise |
---
## Already gated in UI (summary)
| Surface | Gate signal | feature_key |
|---------|-------------|-------------|
| Products processing menu | `canUseAI` locks AI options | `catalog.products.process_ai_*` |
| Products / Dashboard / Billing banners | `isFreePlan`, credits, SKU limit | `dashboard.upgrade_banners`, `catalog.products.upgrade_prompt` |
| Campaign wizard | `showUpgrade` on Free | `marketing.campaigns.generate_ai` |
| SEO page | `showUpgrade`, `report.can_use_ai` | `marketing.seo.ai_rewrite` |
| Brand page | `ai_apply_allowed` alert | `marketing.brand_ai_apply` |
| Email integrations | `dry_run_forced` banner | `integrations.email.blast` |
| API processing start | HTTP 402 `plan_gate` codes | `capability.ai_processing`, `capability.sku_cap` |
---
## Routes in dashboard shell but excluded from this catalog
| Path | Reason |
|------|--------|
| `/admin/*` | Platform admin (separate shell) |
| `/login`, `/register`, `/accept-invite` | Auth shell |
| `/`, `/pricing`, `/features`, `/docs`, `/privacy`, `/terms`, `/unsubscribe` | Marketing shell (`MARKETING_PATHS`) |
| `/integrations` | Redirects to `/stores` |
---
## Navigation index (primary + More)
**Primary (`Nav.svelte` `primaryItems`):** Dashboard, Products, Feeds, Stores, Export feeds, Billing.
**More → Setup:** Categories, Attributes, Standard Fields, Brand, Settings, AI integrations, Email sending, Platform admin (platform admins only).
**More → Operate:** Processing, Campaigns, Content calendar, SEO, Reviews, Support.