# 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; Starter–Business | --- ## 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.