# Descrybe v2 easy expansions High-value, low-complexity catalog→sell expansions shipped without new DB tables. ## Navigation groupings Dashboard sidebar (primary + More): | Area | Links | |------|--------| | **Primary** | Dashboard, Products, **Stores** (`/stores`), Export, Billing | | **More → Marketing** | Campaigns, Calendar, SEO, Brand, Reviews | | **More → Catalog** | Categories, Attributes, Standard Fields | | **More → Ops** | Processing, Settings, AI provider, Email sending, Admin | Stores hub cards: WooCommerce, Shopify (sibling), Feed URL, CSV upload, Export/REST. Connector contract: [store-connectors.md](store-connectors.md). ## Collision note Email campaigns own `/campaigns` and `/api/campaigns`. Content calendar uses: - UI: `/marketing/calendar` - API: `GET/POST /api/marketing/calendar` (+ `/api/v1/marketing/calendar` for API keys) Do **not** mount content calendar under `/api/v1/campaigns` or `/campaigns`. ## 1. Content calendar stub - **UI:** `/marketing/calendar` - **Presets:** Black Friday (week around BF), Christmas (Dec 1–26), computed per year - **Persistence:** Campaign meta is stored on the export feed `template._campaign` JSON (no migration) - **API:** - `GET /api/marketing/calendar?year=2026` — presets + prepared campaigns for the company - `POST /api/marketing/calendar/prepare` — body `{ "preset_id": "black_friday" | "christmas", "year"?, "format"?: "csv"|"xml", "force_new"?: boolean }` ## 2. Product quality score - **UI:** Quality column on the products list (0–100 badge + tooltip of missing SEO/completeness checks) - **Weights:** title 20, description 20, meta title 15, meta description 15, category 10, attributes 10, image 10 - **Lib:** `apps/api/internal/marketing/quality.go` - **API:** - `GET /api/products/quality` (and `/api/v1/products/quality`) — paginated products with `quality_score` / `quality_grade` / `quality_checks` - Optional `?min_score=60` - Also exposed on `GET /api/products` (processed) via `quality_score` / `quality_grade` / `quality_checks` ## 3. One-click Prepare Black Friday - **Dashboard:** “Prepare Black Friday” button creates (or reuses) a CSV export feed named `Black Friday {year}` with Google Shopping-style default mappings and calendar dates in `template._campaign` - **Also:** Content Calendar cards call the same prepare endpoint - **Idempotent:** Re-prepare returns the existing feed unless `force_new` is set ## Verification ```bash cd apps/api && go test ./internal/marketing/ && go build ./... cd apps/web && npm run check ```