Skip to content
Stone & Water
Doc · 05 Category management

Category management · tree, SEO, images & AI — all in one modal

Maintain the entire category tree without leaving the Shopware standard: create, move, translate, set SEO URLs, assign images, assign products, generate AI texts and back up the whole tree as CSV or JSON — per sales channel and language.

Opening & structure

The "Categories" button (left of the Feed Generator in the product list) opens the modal. The sales channel/language selector uses the master-data-style channel bar (with icons and field borders). Per channel the tree is built from the navigation root, with the entry category at the top. Loaded directly via the category repository — no separate API endpoint, no separate page. Secured via the dedicated "Manage categories" permission.

Self-healing: on opening, broken categories (e.g. invalid sort references) are repaired automatically so the listing doesn't crash.

Create, edit, move

  • New category via the button in the bar — quickly a root category in the selected channel, or as a subcategory. New categories are created in the system language.
  • Rename, activate/deactivate, delete directly in the tree or detail area. The delete confirmation is a PIM-CI-style dialog (no browser confirm).
  • Drag & drop: move categories under another parent.
  • Duplicate in the detail header — duplicates the category including all subcategories (subtree) as siblings with a "(copy)" name addition.

Fields per language, type & layout

Name, description and SEO fields are maintained per language; a language switch reloads tree and detail so translated fields appear. The description is a WYSIWYG editor (sw-text-editor) with visible HTML formatting. Plus:

  • Set type & parent category, external link for link categories
  • Assign layout (CMS experience), incl. "Create new experience" button (opens the CMS editor in a new tab)
  • "Show in main navigation" toggle, custom fields section
  • Default sorting (Shopware product_sorting) — stored via the category slot config; "Default (inherited)" removes the override again

Category image & alt text

In the master data (directly above "Show in navigation") sits the category image (cover) with preview: choose from the media library or upload directly, remove. Stored as category.mediaId, uploads land in the category media folder. An alt text field (language-dependent, stored on the media record) improves accessibility and SEO.

SEO URL (slug) per channel & language

In the "Description & SEO" area you can set a SEO URL slug per sales channel and language. On opening, the current canonical URL is loaded; on saving it's written via a backend endpoint:

  • The old URL remains as a 301 redirect (old entry becomes non-canonical), the new one becomes canonical and is marked as manual — Shopware won't overwrite it on reindex.
  • The slug is additionally stored reliably in the category custom field staw_pim_seo_url (via the normal save).
  • Empty field = remove override, Shopware generates automatically again.
Note: headless sales channels have no storefront URLs. If writing the actual storefront URL fails, a visible warning with the cause appears.

Product assignment — stream or preset

The "Products" section controls which products are in the category — in two clearly separated options:

  • Dynamic product group (stream): select a Shopware product group (product_stream); productAssignmentType=product_stream and the productStreamId are stored.
  • Preset (StawPim filter): a StawPim filter (staw_pim_filter) with live hit count. When saving in preset mode, the resolved products are firmly assigned to the category so they appear in the frontend. Safeguard: 0 hits won't empty the category.

The preset display shows parent products and variants separately (like the listing). "No preset" removes the assignment again.

Completeness score

Each category in the tree shows a percentage score (green/yellow/red) based on filled description, meta title, meta description and category image. In the detail area the score is shown live next to the title and updates while editing. A completeness filter next to the search shows incomplete categories specifically.

AI texts & translation

An "AI texts" button generates description, meta title, meta description and keywords — across all four AI providers, with tone selection, output in the active language and a free "Additional instructions to the AI" field. Toggles "Include subcategories" (entire subtree) and "Overwrite existing texts".

  • "Translate" is also available separately next to "AI texts" — translating the fields from source to target language via DeepL or an AI provider.
  • Bulk: with "Select all" + bulk button, AI texts or translations are generated for all selected categories at once. AI errors show the real cause (curl error + upstream status) instead of just "Proxy HTTP 502".

Bulk actions in the tree

Categories can be multi-selected in the tree via checkbox. A bulk bar shows the count and offers "Set active/inactive" and "Show/hide in nav". Before each action a named snapshot of the previous state is created; a "History" button lists snapshots (restorable) along with the audit log.

Import / export

Via the "Import/export" button the entire category tree of the selected sales channel can be managed:

  • CSV export including custom fields as their own cf. columns. Multilingual: one column per shop language for each translatable field in the format field.locale (e.g. name.de-DE, description.en-GB).
  • CSV import resolves the parent category via the parentPath column (path with " > "), creates missing categories and updates existing ones (same path + name). With preview and validation (name/type/parent).
  • Save tree as JSON — full backup incl. all languages, custom fields and IDs, ideal before larger restructurings. Restore = import again.
Safety on import: before importing you can download a CSV backup. The identity (parentPath + name) stays unchanged on multilingual import — per-language columns only write the respective translation.