PIM for Shopware 6 - Manual
This page bundles all functions of the PIM plugin for Shopware 6 at a glance. It serves as a compact reference - for detailed step-by-step guides with screenshots, please use the dedicated documentation pages for each area.
The PIM plugin is compatible with Shopware 6.6 and 6.7. Since version 1.11.48 a single package covers both lines, so separate packages per Shopware version are no longer needed.
State of this reference: plugin version 1.11.72.
System requirements
- Shopware: 6.6 or 6.7
- PHP: 8.2 or newer
- Database: MySQL 8 or MariaDB 10.11
- Memory: Shopware's standard recommendation (256 MB+)
- Permissions: Shopware admin access as administrator role
staw_pim_direct_ via migrations: configuration, filter presets, import/export profiles, change history, snapshots, approvals, edit locks, category history and snapshots, and the reference states and log of the external system guard.Installation
Installation via Shopware Store or manual upload.
Via Shopware Store
- In Shopware admin, go to Extensions → Store and search for "PIM for Shopware"
- Load the plugin - it then appears under Extensions → My extensions
- Click Install, then Activate
Activate plugin
Activation creates the plugin's own tables and configuration entries via migrations, registers the ACL permissions and the menu items, and builds the initial config matrix with defaults.
Open PIM
After activation, three entries appear in the admin under the Stone & Water menu: PIM Dashboard, PIM (the product list) and PIM Configuration Matrix. They require the "View" permission of the "StawPim (products)" permission group.
Optionally, the setting "Redirect the standard product list to PIM" (config matrix → General tab) sends the menu item "Catalogues → Products" straight to the PIM product list.
PIM Dashboard
The dashboard summarises the state of the catalogue. It is described in detail on the Dashboard page.
- KPI cards: including total products, active, inactive, variants, average completeness, new (7 days), price figures, average images and products without images, description, SEO or categories. You choose which cards appear in the Dashboard tab of the config matrix.
- Stock status: out of stock, critical stock and inactive with stock, plus the ten products with the lowest stock.
- Top issues: sorted by severity and count, for example active products without visibility, without price, images, description, categories or SEO data, short descriptions and duplicate EANs, each with a jump into the listing.
- Data quality and completeness: quality bars per field, completeness distribution, the least complete and the most recently changed products, plus top manufacturers and price distribution.
- Settings (Dashboard tab): include variants, thresholds "Critical stock from" (default 5) and "Short description below" (default 50 characters), KPI cards, data quality checks and a completeness weighting for 38 fields in five groups (ignore, normal 1×, important 2×, very important 3×).
Config matrix
The config matrix is the central control element of the plugin. You open it via the PIM Configuration Matrix menu item in the Stone & Water menu of the admin. Whether regular users see it is controlled by the superadmin switch "PIM configuration" (see Superadmin & visibility).
At the top there is a search across all settings: Ctrl+K (Mac: ⌘+K) puts the cursor into it, tabs with hits show the number of hits, and the next/previous buttons jump from hit to hit.
The 13 tabs at a glance
- General: redirect the standard product list to PIM, keep filters persistent (optionally including the search term), page size (10, 25, 50 or 100 entries), compact variant view, visible columns of the product list including custom columns, sticky channel and language bar, scroll-to-top button, cover image always first, visible filters and quick filters.
- Dashboard: include variants, thresholds, KPI cards, data quality checks and completeness weighting.
- Products: tab visibility of the detail page, visible sales channels, group custom fields by set, rounding and automatic update of linked tier prices, preview for inactive products, plus per field the visibility and the required-field marker in the detail view and the order of the sections.
- Variants: product number and name patterns with separator, option name format and maximum product number length, set main variant automatically including strategy, hide main product in listing, automated property assignment, matrix view (default view, default value, max. variants, default 500), fields and sections of the variant view, and the quickview fields for editing variants in the listing.
- SEO URLs: Shopware standard SEO URL or the two-generator system, field pattern and URL pattern (Twig), own patterns per sales channel, category path source, separator, lower case and umlaut conversion. Details: SEO URLs.
- Texts & translations: main language as placeholder, visible channel languages for bulk edit and CSV export, master prompt, length targets, and DeepL, ChatGPT, Claude, Mistral and Gemini with API key, model, connection test and default tone. ChatGPT, Claude and DeepL each have an extra switch for bulk edit.
- Import / export: products per sync batch, parallel image uploads per product, concurrent products during image import, translations per sync batch, API rate limit, disable indexing during import, re-index automatically after import, abort import at an error count, plus export defaults (default export profile, separator, max. products with default 5,000, export variants by default, file format, decimal separator).
- Bulk edit: show missing property translations, batch size, max. products via preset filter, write size per API request, snapshot before changes, confirmation before applying, revert automatically on cancel and include variants by default.
- Approval: enable the workflow, approvers, logging, retention, statistics and clean-up.
- Change history: automatic clean-up, retention period (default 90 days), maximum entries per product (default 100), logging on or off, delete the whole history.
- Snapshots: automatic clean-up, retention period (default 90 days), maximum number (default 50), snapshots for bulk edits and for CSV imports, diff view, and the lists for comparing, restoring and deleting.
- External systems: protection against external systems with protected languages, fields and integrations, trigger mode, waiting time, reference state and log. Details: External system guard.
- PIM superadmin (visible to superadmins only): superadmin users, visibility and functions for regular users, edit lock and "Reset PIM to defaults".
Changes in the config matrix are applied with "Save".
Section order via arrow buttons
You set the order of the sections in the product detail view in the Products tab and the order in the variant view in the Variants tab - each with the "Move up" and "Move down" buttons.
Sections without active fields are automatically hidden - no empty accordion headers.
Gross/net toggles for all price types
All four price types can be shown/hidden independently for gross and net in the config matrix - both for master articles and variants:
- Sales price gross / net
- Purchase price gross / net
- List price / RRP gross / net
- Lowest 30-day price (Omnibus) gross / net
This allows pure gross maintenance, pure net maintenance, or mixed display - matching the shop's default tax logic or the maintainer's preference. Existing user configurations with the old single toggles remain valid via fallback logic - no migration required.
SEO URL system - two generators with a custom field as bridge
The SEO URL system works in two clearly separated steps that interact via a canonical custom field. The advantage: the final URLs come from Shopware's own SEO template and survive every reindex - even if Shopware fully reindexes the catalogue, your URLs stay intact.
Alternative: Shopware standard SEO URL
If you don't want to use the canonical custom-field system, you can enable the "Shopware standard SEO URL" option in the config matrix (separately controllable for product detail, variant modal and Quickview). When active:
- the field shows the native Shopware SEO URL instead of the StawPim canonical field; the canonical options are hidden, the main category stays visible
- the standard SEO URL field in master data, variant modal and Quickview is directly editable - it loads the existing URL (even without sales-channel binding) and writes via PATCH to
seo_urlwithout creating duplicates - existing pattern shops stay unchanged (backwards-compatible, explicit defaults)
Step 1 - "Generate URL in custom field" (token → field)
A token pattern (e.g. {mainCategoryPath}/{name}) is resolved variant- and language-accurately and written to the per-shop custom field staw_pim_canonical_<shop>. Available in two ways:
- Bulk run: button in the SEO tab opens the modal with channel/language selection (grouped by shop, accordions, "select/deselect all" per group) and progress display
- Per product: "Generate from pattern" button directly in master data and variants - fills the input field, then save normally
Available tokens as clickable chips: {name}, {productNumber}, {manufacturer}, {category}, {categoryPath}, {mainCategory}, {mainCategoryPath}, {options}, {properties}, {tags}, {ean}, {metaTitle} plus custom field tokens. The "field pattern" is its own input, separate from the step-2 Twig URL pattern.
Optional meta title pattern
Alongside the field pattern (step 1), an optional meta title pattern can be configured. On generation the meta title is resolved as plain text - no slugification, umlauts and capitalisation are kept, breadcrumbs joined with " / " - and written to the product meta title per language in the same run. It respects "only empty", truncates at 255 characters, and the result summary shows the number of meta titles written. The variable chips are also available below the meta title field.
Step 2 - "Generate SEO URLs" (Twig → database)
A Twig pattern reads the custom fields and is set as Shopware's native SEO URL template (seo_url_template) per sales channel. Reindexing runs through Shopware's own SeoUrlGenerator - Shopware generates the URLs itself from the custom field. Typical pattern for migrations:
{% if staw_url_product_detail %}{{ staw_url_product_detail|raw }}{% else %}{{ product.customFields.staw_pim_canonical_shop|raw }}{% endif %}
Migrated products keep their existing URL, new products use the field filled by step 1. Changed paths remain as 301 redirects - no SEO loss, no 404 for existing links.
Pattern editor with textarea, pencil and Twig syntax check
The pattern input is a textarea with auto-height - for long patterns with {% if %} conditions, the entire logic is visible. Per pattern:
- Pencil icon to edit - opens a large editor with variable chips
- Context-aware variable chips: token chips for step 1, official Shopware SEO Twig variables (product detail page) for step 2. Fields are inserted with
|rawdirectly - Live Twig syntax check: invalid Twig is flagged in red, save is blocked
- Mix warning: when
{tokens}and Twig ({% %}/{{ }}) appear in the same pattern, the editor warns - it doesn't work because Shopware slugifies the Twig output and strips token braces. Recommendation: pure Twig or pure token pattern
Custom pattern per shop - for both generators
The per-sales-channel pattern editor is available for both generators: step 1 can get its own token pattern per channel, step 2 its own Twig pattern. Shop patterns are a list: each shop with its own pattern shows name + pattern - editable via pencil or removable via trash. "Add pattern for shop" opens the editor modal with channel selection. Shops without their own pattern use the default pattern.
The generation modal
Both generators open a guided modal (in PIM CI with indigo accents):
- Pick sales channel + languages - all active channels, grouped by shop as cards with language accordions below (initially collapsed, nothing preselected). Per group "select/deselect all" with counter, plus a global "select all" button. Per channel badges: product count (only products actually visible in the channel, incl. variants) and missing-URL count.
- Options:
- "Keep old URLs as 301" - changed paths remain as redirects
- "Only generate missing SEO URLs" - existing/migrated URLs stay untouched
- "Remove all product URLs (reset)" - deletes all SEO URLs of the selected channels/languages (incl. Shopware's global detail URLs of that language) and rebuilds fresh. The other options visibly switch to OFF
- Preview - picks sample products that are visible in the channel and whose pattern resolves; up to three real example URLs, long URLs wrap, box is scrollable.
- Dry-run or generation - the dry-run shows the complete run without writing. Result cards colour-coded: new = green, change = blue, skipped = grey, warning = amber, error = red.
The progress bar shows a percentage with indigo gradient. Generation runs chunked - even tens of thousands of products without timeout.
Result report and conflicts
- Written / skipped / redirects as counters
- "N without rendered path" - products whose pattern outputs nothing (e.g. migration field and canonical field both empty). Makes it immediately clear why nothing was written
- Conflicts with product numbers instead of internal IDs. Paths already taken by another route (e.g. a category with the same slug) are cleanly skipped and reported as "path already taken elsewhere" - no duplicate-key abort
{mainCategoryPath}/{name}-{options}.Slug handling: umlauts, slashes, dots
- Umlauts and special characters (also in static pattern text like a literal "für/") are converted: ä→ae, ö→oe, ü→ue, ß→ss; "&" and spaces become the separator
- Slashes and dots are preserved - category names with "/" and article numbers/names with "." (e.g.
.htmlsuffixes) pass through unchanged - Twig
|rawautomatic: Shopware's SEO environment slugifies every Twig output (incl. slashes → "-"). Bare outputs of path fields automatically get|rawinjected in all generation paths - Preview and server generation behave identically - what the preview shows is what gets written
- Safety net: empty canonical field → fallback to the product name instead of an empty path
Language fallback for multi-language shops
Generation consistently uses the channel-/language-specific values (name, manufacturer, category, variant options). Fallback chain: requested language → parent language → system; empty or inherited translations are skipped. Applies to token and Twig generation - no accidental default language in foreign-language URLs.
Variants: unique URLs
Both generators process parent and variants. Inherited fields are resolved from the parent (incl. translated customFields with inheritance). The tokens {options}, {properties} and {tags} deliver language-translated values - a pattern like {mainCategoryPath}/{name}-{options} produces a unique URL per variant and language, no duplicate paths between variants of the same parent.
Deterministic category path
{mainCategoryPath}/{categoryPath} use the main category of the respective sales channel. If none is set, the fallback prefers the deepest assigned category (longest path) - deterministic instead of arbitrary. With an empty category.path column (indexer backlog after imports), the ancestor chain is reconstructed via parent_id.
…/config/seourl reopens the SEO tab.Default tax rate for new products
When creating a new product, the first tax rate from the Shopware system is automatically preselected (sorted by position ASC). Both taxId and taxRate are set.
Validation modal with scroll-to-section
Clicking Save while required fields are empty: instead of a wall of warning banners, a modal opens listing all errors. Clicking an error jumps directly to the relevant section.
Permissions & superadmin
Access is controlled on two levels: through Shopware roles with the permission group "StawPim (products)" and through the superadmin settings in the config matrix. In detail: Permissions & superadmin.
Settings → Users & permissions → Roles → pick or create a role → group "Catalogues" → "StawPim (products)"
Four roles in the permission group
staw_pim.viewer- View: required for the menu items and all PIM pages (dashboard, product list, detail page, config matrix). Includesproduct.viewerand read access to custom fields, sales channels, languages, dynamic product groups, tags, delivery times, units and tax rates.staw_pim.editor- Edit: includesproduct.editor. The plugin does not check this role separately; whether saving is allowed is decided by the Shopware permissions on the affected data.staw_pim.creator- Create: includesproduct.creatorand protects the page for creating new products. Requires View and Edit.staw_pim.deleter- Delete: includesproduct.deleter. Requires View.
Role-based menu visibility
Without the "View" permission the menu items are not visible - dashboard, products and config matrix do not appear for users without permission. The automatic redirect from the Shopware standard product list to the PIM list respects this permission too.
Superadmin & visibility
In the PIM superadmin tab you enter the user names of the PIM superadmins (one per line or comma-separated). Superadmins see all areas and functions. As long as the list is empty, all users count as superadmin.
Under "Visibility for regular users" you decide whether users without a superadmin entry see the PIM configuration (config matrix) and the PIM dashboard. If the dashboard is hidden, the dashboard button in the header disappears as well.
Feed generator released separately
Under "Functions for regular users" there is a separate "Feed generator" switch - it turns the feed generator on or off for non-superadmins, independently of CSV import and export. Default: on.
Function switches for regular users
In the "Functions for regular users" area you switch individual functions on or off for users without a superadmin entry. They are on by default, and superadmins always see them:
- Create products and Duplicate products (duplicate entry in the context menu)
- Generate variants (bulk edit) - "Generate variants" tab in bulk edit
- Copy to variants - the buttons for copying images and properties of the main product to its variants
- Delete products - individually and via bulk edit
- Set active/inactive
- Bulk edits
- Snapshots and Change history
- CSV export and CSV import
- Feed generator
- Manage categories - "Categories" button and category management
CSV import tab
Edit lock
With "Enable edit lock" (PIM superadmin tab) a notice "Product is being edited" appears when another user currently has the same product open. You can take over editing or return to the product list. The lock is kept alive by a heartbeat (every 5 seconds per open product); after the configured timeout without heartbeat it is released automatically, for example when a browser was closed unexpectedly.
Reset PIM to defaults
"Reset all settings" resets all PIM configurations (field selection, order, general settings) to the defaults. In addition, filter presets, import/export profiles, snapshots, change history and approval entries are deleted. The action must be confirmed with your own admin password.
Languages
PIM works with all languages set up in Shopware. In the detail view you pick sales channel and language in the channel and language bar. In the config matrix (Texts & translations tab, "Visible channel languages") you decide which channel/language combinations are offered in bulk edit and in the CSV export. With "Show main language as placeholder", an empty field shows the main language value greyed out as a placeholder.
Copy from default language
When a sales channel uses its own language, no own texts exist there at first. The storefront does show the inherited content, but without an own starting text there is nothing to edit or to hand to the AI. For exactly this case the function "Copy from default language" exists in two places.
- Products: Bulk edit → section AI & texts. Name, description, meta title, meta description and keywords are copied; fields and target languages are freely selectable.
- Categories: Bulk action in the category modal. The dialog states the number, target language and fields up front, shows a progress bar while copying and refreshes the view afterwards. The button only appears when the selected language differs from the default language.
- Existing texts stay: By default only empty fields are filled. For products, overwriting can be enabled optionally; for categories own texts are always skipped and reported at the end.
- Checked properly: Whether a target language already has own texts is determined from the translation records - not from the inherited display values.
Listing structure
The central product listing is the main view of PIM with these elements:
- Filters - quick filters, category tree, sales channel and freely defined custom filters with AND or OR logic
- Column header - sorting by click; which columns appear is set in the config matrix
- Rows - one row per product, variants can be expanded below
- Actions - bulk edit, CSV import/export, feed generator and categories
- Pagination - 10, 25, 50 or 100 rows per page
Filters with AND/OR
Custom filters consist of field, operator and value. Each filter set uses one logic mode: AND (products must match all active filters) or OR (at least one). Nested groups do not exist. Individual filters can be deactivated without deleting them.
- Text fields (8 operators): contains, does not contain, is exactly, is not, starts with, ends with, is empty, is not empty
- Number fields (8 operators): =, ≠, >, <, ≥, ≤, is empty, is not empty
- Yes/no fields (2 operators): is active, is inactive
- Fields: product number, name, description, meta description, meta title, search keywords, EAN/GTIN, manufacturer number (MPN), pack unit, stock, available stock, price, weight, width, height, length, number of variants, status (active) and top seller flag
- Variant-aware - filters consider main products and variants
- "Translation missing" - with the options name missing, description missing and both missing. Matches are determined server-side for exactly the selected language and narrowed to main products; empty texts count as missing. Without an explicit language the active language applies. The filter chip names the language, e.g. "Translation: name missing (Alpendampf DE)".
- Language inheritance: if a text exists only in the parent language, it applies in the shop - filters and completeness therefore check the whole language chain. Products without any translation in the chain are still found reliably.
- Completeness follows the sales channel: translatable fields are evaluated against the language of the selected channel; without a channel against the system language.
- RRP status ("RRP missing", "RRP lower than gross") is determined server-side across the whole catalogue, so hit count, pagination and result match.
Category filter
Besides the freely combinable conditions, a dedicated tree filters by category. It renders the catalogue at any depth; five, six or more levels can be expanded and selected.
- Subcategories are included - ticking a category selects everything below it, clearing it removes them again
- Any depth - the tree calls itself and no longer stops after four levels
- The filter works together with all other conditions
Including the subcategories is the part that matters in practice: products usually sit on the lowest level, so selecting a parent category alone would have found nothing.
How the filters interact
All active filters work together and narrow the result set - sales channel, categories, completeness, custom conditions, product groups, price range, images, description, visibility, RRP, properties, delivery time and variant images.
- Variants are searched too - when a custom filter is set, the plugin also searches the variants and pulls their parent products into the list so a match is not missed
- Negating conditions such as "does not contain" or "is not" deliberately apply to the parent product only - otherwise one matching variant would be enough to pull in a contradicting article
- Empty fields count as matches for negating conditions, because an empty field precisely does not contain the searched text
window.stawPimLastCriteria. With several filters set at once, this shows which conditions really arrive.Configure columns
You set the columns of the product list centrally in the config matrix: General tab → "Visible columns in the product list". Product number and name are always visible. You change the order there with "Move up" and "Move down". The setting applies to all users. In the list you sort by clicking a column header.
Add custom columns
"Add custom column" in the same column configuration opens a dialog where you define an additional column with its own name and a source field:
- Source field: either a master data field (release date, stock, dimensions, other date fields, …) or any custom field. The selection is a searchable dropdown with group headings (master data / custom fields).
- Make sortable: a switch in the dialog allows sorting the list by this column (click on the column header). For custom fields this depends on the field type.
- Automatic formatting: values are shown appropriately - dates formatted, yes/no for boolean fields.
New columns appear in the column list, can be positioned with the arrows, removed again and are saved in the configuration.
Filter presets
You save frequently used filter combinations as a preset. Presets are stored in the shop database and are available to all users; there is no separation per user. A preset can be marked as a quick filter and then appears directly above the list. Presets also serve as the basis for bulk edit ("Preset filter"), for feeds and for the product assignment of categories.
Inline editing
Directly editable in the list row are stock, price (gross), EAN, manufacturer number and weight as well as the active switch - for variants too. The value is saved immediately when you leave the field; a success message confirms it. For the price, the net value is calculated from the product's tax rate. Inherited values of a variant are highlighted.
Quickview modal
Clicking a variant in the product list opens the quickview modal with its master data - without switching to the full detail view. Holding Ctrl or ⌘ opens the product in a new tab instead.
Contents of the modal:
- Basic data: product number, name (empty = inherit from the main product), EAN/GTIN, manufacturer number (MPN), active/inactive
- Prices: price gross and net, purchase price, pseudo price (strike-through price), lowest price 30 days (Omnibus)
- Description
- Availability & dimensions: stock, restock time, clearance sale, free shipping, delivery time, selling unit (singular/plural), purchase unit, reference unit, product unit, minimum and maximum purchase, purchase steps, weight, length, width, height, release date
- SEO: meta title, meta description, search keywords and, if enabled in the config matrix, the Shopware standard SEO URL
Header layout
The modal header shows the variant name first (large and dark), the product number as secondary information behind it (small, grey). That way it is clear at a glance which variant is being edited.
Uniform input fields
All input fields in the quickview follow the same structure: label on top, input below (42 px height) - consistent with the rest of the plugin.
Expand all / collapse all
The modal header has an Expand all / Collapse all button to open or close all accordions in one step.
Which fields appear in the quickview is set in the config matrix in the Variants tab under "Quickview fields (variant editing in the listing)". There is no separate "Quickview" tab.
Variant display
Variant products appear in the listing as a parent row. Click the plus icon to expand variants inline.
Compact variant view: in the config matrix under General → Product list you can enable the "Compact variant view" option. Variants are then displayed space-saving - without large indentation, without preview image and with noticeably flatter rows; the variant marker (└) sits centred. Contents (name + options) are fully preserved, even with very long variant names (rows grow as needed, without overlap). After changing it in the config matrix, click "Save".
Image upload via drag & drop
In master data and in the variant view, the "Images/Media" section has a drag-&-drop zone (below the images). Drop files or click to open the file dialog - both work, with progress display.
- Uploads go to the Shopware media library (product folder) and are immediately assigned to the product
- The first image automatically becomes the cover if none is set yet
- Variants: an uploaded image becomes the variant's own image and overrides the inherited one. Removing the own image restores inheritance from the main product - both stay possible at any time
File name, alt text and title
In the media view of a product, the edit icon on an image opens three fields: file name, alt text (alternative text for SEO and accessibility) and title (title attribute). Renaming the file runs server-side through a dedicated plugin endpoint (/api/_action/staw-pim-direct/media/{id}/rename).
Preview of inactive products
If "Allow preview for inactive products" (config matrix → Products tab) is on, an inactive product can also be viewed in the shop via the preview button. After a confirmation it is activated temporarily; if no visibility is set, PIM sets "Direct link only" automatically. Both are reverted automatically after the configured duration (15, 30, 60 or 120 seconds).
Approval workflow
The approval workflow is switched on in the config matrix in the Approval tab with "Enable approval workflow". In detail: Approval workflow.
- Statuses: draft, in progress, submitted for review, sent back for revision (rejected) and approved.
- Submitting sets the status "submitted" and deactivates the product. Rejecting (optionally with a reason) sets "revision" and deactivates it as well. Approving activates the product. Revoking approval sets it back to draft and deactivates it.
- "In progress" is set by editors themselves as a signal to the team; the status can be reset to draft.
- Approvers: approving and rejecting is allowed for the users whose user names are listed under "Approvers" (one per line or comma-separated) and for all superadmins. If the list is empty, all users may approve. There is no separate Shopware role for this.
- Bulk edit: approvers find the "Approval" action in the master data tab with approve, send back for revision (optionally with a reason) and reset. The statuses are written in batches with one request per 200 products.
- Visible: status badge with buttons in the detail view, status indicator and filter in the product list, statistics in the config matrix.
- Log: status changes are recorded with user and time in the product's change history. In addition, approval logging stores every approval entry in a dedicated table; it can be switched off, existing entries are kept.
- Retention and clean-up: optional automatic clean-up after 30, 60, 90, 180 days, 1 or 2 years (cleaned entries fall back to draft). Manually: delete drafts, clean up older entries or delete all approval entries (all products then return to "draft").
- Deactivating: if you switch the workflow off, products no longer need approval. Existing approval entries remain in the database until you clean them up.
Category assignment with chips
Assigned categories are listed as removable chips below the category tree (small × to remove). Instantly visible which categories are selected - without searching the tree.
Create product - guided modal
The "Create product" button opens a modal that asks for the essentials before creating - instead of writing an empty, category-less product straight into the catalogue. No more invisible orphan records.
The modal is deliberately reduced to the essentials: name, article number (reserved from the number range, editable) and sales channel visibility (preselected), stacked vertically. Price (0), default tax rate and the inactive status are set silently as defaults - these and the categories are maintained afterwards on the detail page, which opens directly after creation.
The input fields follow the PIM CI (1.5px borders, 8px radius, indigo focus ring, uniform height), including the tax rate selector.
Duplicating: when duplicating a product, the PIM assigns the next free article number from the Shopware number range (like manual creation) instead of appending a -Copy suffix; the name gets a "(copy)" addition. Variants of the copy receive their number as <new number>.<index> (Shopware variant convention). If the number range fails, the -Copy suffix applies as fallback.
Release date
The release date (Shopware's releaseDate) is named consistently throughout the PIM - on the detail page, in the config matrix, bulk edit, the feed generator, CSV and variant quick-edit. (Earlier versions used a mix of "release date", "approval date" and "publication date".)
- Detail page: the field sits in the "Availability" section (no longer under "Visibility"). The section opens even when only the release date field is enabled.
- Variants: settable per variant - both in variant quick-edit and in the variant detail modal, each in the availability section. Empty inherits from the parent (greyed out like the other inheritable fields). Toggleable in the "Variant availability" field matrix (default on).
- Display & storage: the date picker shows the date in localised format (DD.MM.YYYY) without time, but internally still stores the full datetime value (Shopware standard).
availableAt / "available from" column from earlier exports is still mapped to the release date on CSV import for compatibility - but only when the release date itself is empty. The former separate "available from" field no longer exists (it was never stored, since the product entity has no such column).Category management
A "Categories" button (left of the Feed Generator) opens a modal for full category management - no switching to the Shopware standard needed.
- Tree per sales channel: 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/root category at the top. Loaded directly via the
categoryrepository (no separate API endpoint). - Create, edit, delete: categories can be created, renamed, activated/deactivated and deleted. New categories are created in the system language. A "New category" button in the bar quickly creates a root category in the selected channel. The delete confirmation is a PIM-CI-style dialog (no browser confirm).
- Fields per language: 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.
- Type, layout & more: set parent category and type, assign a layout (CMS experience, incl. "Create new experience" button opening the CMS editor in a new tab), external link for link categories, "Show in main navigation" toggle, custom fields section. Categories can be moved under another parent via drag & drop.
- AI texts for categories: a "AI texts" button opens a panel to generate description, meta title, meta description and keywords - across all four providers, with tone selection, output in the active language and a free "Additional instructions to the AI" field. An "Include subcategories" toggle generates for the entire subtree, an "Overwrite existing texts" toggle decides whether only empty fields are filled or existing ones replaced. Next to it, "Translate" is available separately (DeepL or AI provider, source → target language).
- Category image & alt text: in the master data, choose a cover image from the media library or upload it (stored as
category.mediaId), plus a language-dependent alt text for accessibility/SEO. - SEO URL (slug): a dedicated slug per sales channel and language; the old URL remains as a 301 redirect, the new one becomes canonical and survives reindex. An empty field resets to Shopware automatic.
- Product assignment: per category a dynamic product group (stream) or a StawPim preset filter (with live hit count; on save the products are firmly assigned).
- Completeness score & bulk: each category shows a percentage score (description, meta, image); a completeness filter next to the search. Multi-select via checkbox for "active/inactive" and "show/hide in nav" with snapshot/"history" and audit log.
- Default sorting & duplicate: set a Shopware sorting per category; duplicate a category incl. subtree as "(copy)".
- Import/export: the entire tree as multilingual CSV (columns
field.locale, custom fields ascf.columns) or as JSON backup; import resolves parents viaparentPath, with preview, validation and backup.
Languages in the category tree
- Completeness per language: The percentage per category counts only the own texts of the selected language - matching the editing form next to it, which is also maintained per language. Inherited content is not included.
- Tree follows the channel language: On opening, the tree is built in the language of the first selected sales channel, so names and percentages on the left match the language shown above.
- Changes visible immediately: After bulk actions (active/inactive, show/hide in navigation, undo) and after an import, the editing view on the right is refreshed along with the tree.
Bulk edit - overview
Bulk edit changes fields of many products in one operation. In detail: Bulk edit.
Flow
- Choose the source: Selection (checked rows) or Preset filter (all hits of a saved preset). The article count with products and variants is shown.
- In the dialog pick a tab on the left and activate one or more actions (multiple selection possible), enter values.
- If "Confirmation before applying" is on (default), an overview of all planned changes appears. Deleting and clearing fields always require confirmation.
- The operation runs in two phases: first a snapshot of the previous values is saved, then the new values are written.
- Progress display with counter, phase and estimated remaining time - can be stopped any time with Cancel.
Whether variants of the selected products are included is defined by "Include variants by default" in the Bulk edit tab of the config matrix.
Actions per tab
Bulk edit is organised in tabs. In each tab several actions can be combined.
Master data
- Status (active/inactive), top seller, clearance sale, free shipping
- EAN / GTIN: set, prefix, suffix or clear
- Release date (empty = released immediately)
- Listing configuration: show main product or expand variants
- Approval (only with an active workflow and for approvers): approve, send back for revision, reset
Assignment
- Manufacturer, essential characteristics (assign or remove template), warranty (from Shopware 6.7.14)
- Add or remove categories and tags
- Assign or remove properties, create new groups and options directly
- Add or remove visibility per sales channel (search & navigation, search only, navigation only)
- Visibility to variants and properties to variants (reset to inheritance or copy from main product)
- Add the tier row from quantity 1
- Assign cross-selling: new group with name, position, type (dynamic product group or product list), sorting, limit and active status; existing groups are kept
Prices & stock
- Price: fixed price, increase %, decrease %, increase €, decrease €, purchase price + % or purchase price + € (products without a purchase price are skipped)
- Pseudo price (strike-through): fixed price, % above selling price, surcharge in € or remove. It is only set if it is higher than the selling price.
- Stock: set, increase or subtract
- Tax class: gross price stays, net price is recalculated
- Order quantity (minimum and maximum, 0 = unlimited) and purchase steps
- Copy to variants: copy price tiers and cross-selling from the main product to all variants
- Tier linking: link tiers to the base price, unlink them, or rebuild them for a price rule with "Define tiers"
Shipping
- Weight, width, height, length
- Delivery time, restock time (empty deletes the value)
- Pack unit (singular and plural, with language selection)
- Base price (purchase unit and reference unit) and product unit
SEO
- Meta title, meta description and SEO URL as templates with variables such as
{name},{manufacturer},{category}or{mainCategoryPath}; preview for the first three products - Main category per sales channel
- Canonical variant: first variant, specific variant (with exactly one selected product) or remove
Custom fields
- All product custom fields by type (yes/no, select, number, text), with language selection
Further tabs
- AI & texts - appears as soon as ChatGPT, Claude or DeepL is enabled for bulk edit (see below)
- Generate variants - create or delete variants (function switch "Generate variants")
- Clear fields - clear master data, SEO & marketing, relations and custom fields selectively
- Delete - permanently delete the selected products including variants and media assignments (function switch "Delete products")
Filter display with a preset filter
If you choose a preset as the source, PIM shows its active filters as readable chips, for example status, stock, manufacturer, categories, dynamic product group, sales channel, tag, tax, delivery time, price and weight. IDs are resolved to names. If the preset contains no filters, a red warning "No filters active" appears.
Language selection for translatable fields
Translatable fields show the "Channels & languages" selection. The value is set in the default language and additionally written to every selected language - one action, multiple languages. Without a selection only the default language is written.
Fields with language selection:
- SEO tab: meta title, meta description, SEO URL
- Custom fields: all custom fields marked as translatable in Shopware
- Shipping tab: packaging unit (singular/plural) - the only translatable field in the shipping section
Fields deliberately without language selection:
- Product unit / unit of measure: it's only a reference to a unit (piece, litre, kg) - the translation lives on the unit itself, not on the product
- Language-independent fields: price, stock, EAN, weight, manufacturer, active status, dimensions, delivery time - these exist only once per product
Data from the main product to variants
For values that should be identical across all variants there are several ways:
- Bulk edit, Prices & stock tab → "Copy to variants": copy price tiers and cross-selling (including products) from the main product to all variants. Existing variant data is overwritten.
- Bulk edit, Assignment tab: "Visibility to variants" and "Properties to variants".
- Detail view of a main product → "Copy to variants": copy selected fields to all variants - price (gross/net), pseudo price, purchase price, stock, delivery time, free shipping, weight & dimensions, EAN and active status.
- Images and properties: dedicated buttons in the detail view (see Transfer to variants).
AI & texts
This tab appears as soon as at least one of the three providers ChatGPT, Claude or DeepL is enabled in the config matrix (Texts & translations tab) and released for bulk edit. Mistral and Gemini are not available in bulk edit.
- ChatGPT and Claude: context (product name, description, manufacturer, price, EAN, categories, properties, weight), fields (product name, description, meta title, meta description, meta keywords), tone, target languages per channel and additional instructions. Optionally "Individual texts per channel & language".
- DeepL: translation into the selected target languages.
- Copy from default language: copy name, description, meta title, meta description and keywords into target languages; optionally overwrite existing texts and optionally let the AI revise them.
Generate and delete variants
- Generate: pick properties and options, preview "variants × products = total", use the product number and name patterns from the config matrix or override them for this run, main variant and listing, skip or add to existing combinations. Generated variants remain even after a snapshot revert.
- Delete: scope "Only without orders" (recommended) or "Delete ALL variants". In safe mode, variants with orders are skipped and counted as protected in the preview. Deleting is irreversible, also via snapshots.
Assignment - property translations
If property options are missing in a language, Shopware shows the name from another language through the fallback chain - the assignment tab then appears to mix languages. The assignment tab makes this visible and fixable on the spot.
- Marking: Options without a translation are highlighted and labelled "no translation"; a summary with the count appears at the top.
- Translation dialog: The pencil icon on each option lets you enter the translated name directly, without leaving the Shopware property catalogue. Several languages can be maintained at once, each with its own text field and the associated sales channels for orientation.
- Sales channels are the benchmark: The check runs against the languages of the channels the affected products are actually assigned to. A sales channel filter takes precedence.
- Also assign to the master product: The checkbox additionally writes the selected options to the parent product of the affected variants, and removes them there in removal mode. The configuration option "always write variant properties to the master product as well" can preset it permanently.
Clear fields - including custom fields
Besides master data, SEO and link fields, the custom fields of the products can be cleared selectively as well. As custom fields are translatable, the existing language selection applies here too; the values are included in the snapshot before clearing and can therefore be restored.
Snapshot & revert
Before every bulk edit and every CSV import a snapshot of the previous values is saved automatically (can be switched off). Snapshots are managed in the config matrix in the Snapshots tab, also reachable via "Manage snapshots" in the dialog:
- Separate lists for bulk edits and CSV imports
- Show diff: comparison of before (snapshot) and current (in the shop) per product and field, with search and "Only products with changes"
- Restore snapshot or delete it, individually or all
- Retention: default 90 days (7 days to 1 year), maximum 50 snapshots (10 to 200); the oldest are removed first
With "Revert automatically on cancel" (Bulk edit tab), changes already applied in a cancelled run are rolled back via the snapshot.
Confirmation and preview
There is no before/after table per product before running. Instead:
- Confirmation before applying - overview of all planned changes before running (on by default, always for deleting and clearing fields)
- SEO preview - meta title, meta description and SEO URL of the first three products
- Variant preview - number and the first combinations; when deleting, the number of variants to delete and protected
- Diff view - afterwards in the Snapshots tab of the config matrix
Bulk edit settings
In the Bulk edit tab of the config matrix:
- Show missing translations in bulk edit (assignment / properties)
- Batch size (products per API call), max. products via preset filter, write size per API request
- Create snapshot before changes, confirmation before applying, revert automatically on cancel
- Include variants by default
CSV export
The CSV export creates a file with all products or with the hits of the active filter. In detail: CSV import & export.
- Columns freely selectable - standard fields, custom fields (
cf_*), properties, cross-selling, images and translations - Built-in profiles: master data, prices & stock, SEO, images, translations, variants and full export; own profiles can be saved
- Main language for export: this language fills the main columns (
name,descriptionetc.), further channel languages appear astrans_*columns - Decimal separator: dot or comma (rounded to 2 decimals)
- Encoding: UTF-8 with BOM so that Excel shows umlauts correctly
- Filters: filters from the product list are applied; what cannot be mapped (custom filters, RRP status, approval status, search term) is named explicitly in the dialog
- Defaults in the config matrix (Import / export tab): default export profile, separator (semicolon, comma, tab), max. products (default 5,000), export variants by default, default file format, decimal separator
"Unit (name)" column
Alongside the unit ID (UUID), the product unit is exported as a readable name (e.g. "Litre", "Kilogram", "Piece").
CSV import
The import reads CSV, TSV, XML, DATANORM and Excel files (.xlsx, .xls), from a file or from a URL, and creates new products or updates existing ones.
- Match products by: product number (default), EAN / GTIN, manufacturer number or product ID
- Import mode: update + new, update only or create new only (requires a name column)
- Image mode: add or replace (delete all)
- Column mapping per CSV column via a dropdown, with "Skip"; mapping, separator and modes can be saved as an import profile
- Validation before importing: number of rows to create, update and skip, warnings (e.g. duplicate product numbers, rows without product number) and errors
- Strict mode (all or nothing): if errors occur, all changes imported so far are reverted automatically
- Also import data for the main language: translated fields are additionally written to the admin's main language
"Unit" auto-detection
The importer recognises both "Unit (name)" and "Product unit" as column names and resolves readable names like "Litre" or "Kilogram" to the correct unit ID.
Automatic lookups
Missing manufacturers, tags, tax rates, delivery times and property options are created automatically. Categories and product units must already exist; entries that are not found appear as errors. Variant parents can be resolved via the product number - UUIDs are not required.
Change log and undo
The Change log tab in the CSV window lists the imports with time, number created/updated/errors, file name and affected fields. "Undo last import" resets the most recently imported changes to the previous values; "Clear log" removes the list. A download of the original file is not provided. Import snapshots additionally appear in the Snapshots tab of the config matrix.
Performance settings
In the config matrix (Import / export tab): products per sync batch (10, 50 default, 200; on errors automatic fallback to single processing), parallel image uploads per product (default 5), concurrent products during image import (default 2), translations per sync batch, API rate limit, disable indexing during import, re-index automatically after import and abort import at an error count (never or after 5, 10, 25, 50 or 100 errors).
DATANORM import (4.0 & 5.0)
Besides CSV, the importer supports the DATANORM format common in trades and wholesale for reading article data from supplier catalogues:
- DATANORM 4.0 and 5.0: both versions are detected automatically via the
V;header (incl. version and manufacturer detection). DATANORM 5.0 uses its own field layout for name, price and EAN. - Volume files: any volume extension from
.001to.999is accepted (not only.001-.003) - so split catalogues likeDATANORM.500can be read too. - Record types: supported are e.g. A (article master record), B (product groups), T (long text/description) and P (prices / DATPREIS).
After reading, DATANORM files go through the same mapping, validation and import logic as CSV files.
Data type detection
- Boolean: 1/0, true/false, yes/no, active/inactive
- Date: ISO notation and German notation
- Number: comma or dot as decimal separator
- Array: pipe separator for multi-select
- JSON: for complex fields
Importable and exportable fields
The following columns are available in the CSV export; all except those marked "export only" can also be imported. The column names match the header row of the export file.
productNumber;name;price_gross;stock;taxRate;active;manufacturerName;categoriesSW-TSHIRT-001;Organic Cotton T-Shirt "Summit";24.90;120;19;1;Nordtrek;Clothing|T-ShirtsBasics
id,productNumber,name,description,active,ean,manufacturerNumber,manufacturerName,manufacturerId,markAsTopseller,isCloseout,shippingFreetagsandcategories- pipe-separated, e.g.Clothing|T-Shirts
Price & stock
price_gross,price_net,taxRate,taxId,stockpurchasePrice(purchase price gross),purchasePrice_net,listPrice(strike-through price gross),regulationPrice(RRP / regulation price)purchaseUnit,referenceUnit,packUnit,packUnitPlural,unitId,unitNameminPurchase,maxPurchase,purchaseSteps,deliveryTimeName,deliveryTimeId,restockTime
Dimensions & weight, SEO, date
weight(kg),width,height,length(cm)metaTitle,metaDescription,keywords,canonicalUrl,searchKeywordsreleaseDate
Variants and visibility
parentProductNumber,parentId,variantOptions(formatGroup:Option|Group:Option),mainVariantId,configuratorGroupConfigvisibilities(formatchannel-ID:value|…),productStreamIds,displayInListing,variantListingConfig,featureSetId,cmsPageId
Images, properties, cross-selling, custom fields, translations
coverUrl,imageUrls(pipe-separated)properties(formatGroup:Option|…),crossSellingcf_<name>- custom fields as individual columns, language-specific ascf_<name>__<language code>trans_<channel>_<language>_<field>- translations per sales channel and language for name, description, meta title, meta description, keywords, pack unit (singular/plural) and search keywords
Export only (not importable)
mainCategory,ratingAverage,sales,childCount,displayGroup,customFields(JSON),availableStock,available,productUrl,imageUrlAbsolute,imageUrlsAbsolute,createdAt,updatedAt
Feed Generator - automatic URL feeds
Via the Feeds tab you provide automatically updated URL feeds - e.g. for Google Shopping, price comparison portals or ERP connections. A feed delivers product data under a unique URL with token authentication.
Create feed from template or profile
At the top of the Feeds tab there's the "Create feed from template / profile" selector. With this you activate a new feed in one click:
- Pick a built-in template - master data, prices & stock, SEO, images, translations, variants, full export: A saved export profile with the matching field selection is created automatically, the feed activated, a token generated. The profile created from the template is named e.g. "Master data (Feed)".
- Pick an existing profile - Your own export profiles (saved in the export tab) can be activated directly as a feed.
Accordion list with status, chips and actions
All feeds and all custom export profiles appear as a compact list. Per row, you see:
- Name · renamable
- Status pill · "feed active" (green) or "no feed" (grey)
- Feed URL preview · the tokenised URL for active feeds
- Filter template chip · the chosen filter template or "no filter"
- Product count chip · determined live from the catalogue
- Pencil icon on the right (opens/closes the editor) and trash icon (deletes with confirmation)
Clicking the row reliably opens and closes the editor - a chevron on the right shows the state and rotates on opening. The trash button reacts separately (preventing accidental open/close).
Editor: general, columns, access, format
The expanded editor holds all options per feed:
- Name and "Provide feed via URL" (feed active or off)
- Generation: "Live on request (always current)" or "Via cron into a file (low load)"
- Streaming (large catalogues) - delivers the file in chunks; can be switched off, then it is buffered
- Preset - filter template from the product list or "no filter"
- Export variants, sales channel (determines domain and SEO URL for product URL and absolute image URLs) and language of the texts
- Columns, feed URL with token and format (see below)
Filter templates in the feed
Instead of simple filter checkboxes you pick a saved filter template in the feed - the same one you use in the listing or in bulk edit. The feed filters like the product overview. Only the approval status and "RRP invalid" cannot be mapped; the editor shows under "Applied in the feed" which criteria take effect.
Format, character set and columns
- File format: CSV (for spreadsheets and ERP), XML or JSON (for interfaces and portals). TSV does not exist in the feed; the default separator for CSV feeds is the semicolon.
- Character encoding: UTF-8, Windows-1252 (ANSI) or ISO-8859-1 (Latin-1); JSON is always delivered as UTF-8
- Prepend BOM (UTF-8 only, for Excel)
- Decimal separator for prices and dimensions: dot or comma
- Columns: add and remove freely, order by dragging or arrows, own column header per column (empty = default name). Also available: product URL, absolute image URL and absolute image URLs.
Migration of old feeds
Token and URL format
Every feed gets a unique token. The URL has this format:
https://your-shop.com/staw-pim/export/{token}- the suffix.csvis accepted as wellhttps://your-shop.com/api/staw-pim/export/{token}- alternative feed URL (API route), domain-independent, in case the shop URL redirects to the home page (e.g. with language path domains or in maintenance mode)
Both routes need no login and also work while the sales channel is in maintenance mode. The response carries X-Robots-Tag: noindex. "Generate token" creates a new token - the old URL becomes invalid.
Backend & streaming performance
The FeedExportService is built for large catalogues. Four performance layers work together:
- DBAL streaming in 2,000-batches - data is emitted in chunks via PHP generator (
yield) instead of kept entirely in memory. Memory usage is independent of catalogue size. - Keyset pagination on
product_number(unique, indexed column) instead ofLIMIT/OFFSET- output time stays linear, even for very large catalogues. - gzip compression server-side via
gzencode(), when the client sendsAccept-Encoding: gzip. Feed CSVs compress ~80-90 % - drastically shorter transfer. - File mode for the largest catalogues: the scheduled task
staw_pim_direct.export_feed(every 15 min) writes the filestaw-pim-direct-feeds/feed_<token>.csvinto Shopware's private file system. On request, the pre-generated file is served - no DB load on every poll.
Additionally: @ini_set('memory_limit', '1024M') defensively in the endpoint - wide column selections with dozens of custom fields generate cleanly. The filter criteria are applied server-side - no data roundtrip into the admin interface.
Variant generator - property selection
Creates variants from property combinations automatically. Visual selection of all properties with grouped values. Live preview of combinations.
Unified search
One single search at the top filters properties and options simultaneously. Type "red" and all property groups with the option "red" stay visible while matches on the right are highlighted.
Patterns for product number and name & pattern accordions
Product number and name of each variant can be generated from a pattern. You set the default patterns in the config matrix in the Variants tab (default product number {parentNumber}-{options}, name {parentName} {options}), together with separator, option name format (full, upper case, lower case, first 3 characters) and the maximum length of the product number (Shopware allows at most 64 characters).
Available variables
{parentNumber}- product number of the main product{firstVariantNumber}- number of the first variant{parentName}- name of the main product{options}- all options, joined with the separator{option1},{option2},{option3}- individual options in click order{group1},{group2}- names of the property groups{counter}- running number
{number} from older patterns is still understood as {parentNumber}. Variables such as {base}, {property:…} or {counter:03} do not exist.
Pattern accordions
Two separate accordions - one for the product number, one for the variant name. Collapsed they show the current pattern; expanded the input appears together with clickable variable chips. A click on a chip inserts the variable into the active pattern. The preview shows the first five combinations.
Variant matrix
From two property groups on, the variant overview offers a matrix view next to the list view: rows are the options of one group, columns those of the other. In every cell you edit one value directly - price, stock or active.
- Default view on opening and default cell value are set in the config matrix (Variants tab)
- "Max. variants for matrix view" limits the loaded amount (default 500)
- The list view pages with 10, 25, 50 or 100 rows
Safe deletion
You delete variants for many products in bulk edit in the "Generate variants" tab with the action "Delete variants":
- "Only without orders" (recommended): variants with orders are skipped and remain unchanged. The preview shows how many are deleted and how many are protected.
- "Delete ALL variants": also deletes variants with orders - this can affect order histories.
Transfer properties and images to variants
Inheritance in Shopware works all-or-nothing per field: as soon as a variant has an own value, it inherits nothing at all from the master product in that field. This is the most common explanation for fewer properties or no image appearing in the storefront although everything is maintained on the master product. Three buttons resolve exactly that.
- "Transfer properties to variants" (Properties tab): Adds the missing properties of the master product to variants that have own properties. Variants without own properties inherit everything anyway and stay untouched; existing own assignments are preserved.
- "Transfer images to variants" (Master data → Images & media): Creates own image assignments to the same media files for every variant without own images, including order, and sets the cover image to the variant's own copy of the parent cover. Display in the list then no longer depends on whether inheritance reaches the storefront. Variants with own images stay unchanged and are reported in the message.
- Variant assignment dialog: The same transfer is available there as well, complemented by the checkbox "Also assign to the master product".
- Bulk action "properties to variants": "reset to inheritance" removes the variants' own properties so they show those of the master product again and keep following it. "Copy from master product" writes them as own values into every variant.
Making deviations visible
- Properties that sit exclusively on variants are highlighted in orange; affected groups get an orange dot in the group list and the counter bar states the number.
- Groups with "display on product detail page" switched off are marked "not in storefront" - making it immediately clear why fewer properties appear in the storefront than in the admin.
- Variant completeness resolves inherited values: if the variant has no own value, the master product value counts. Product number and stock stay variant-specific by design.
Duplicating with selectable inheritance
When duplicating a variant product, a dialog asks which fields the variants should inherit from the main product: images, name, price, weight and EAN. Inherited fields automatically pick up later changes to the main product; non-inherited ones are copied as an own value. Stock and product number always stay variant-specific by system design; for simple products without variants the dialog does not appear. The duplicated master product receives its own correct SEO URL from the channel template.
AI text generation - providers and models
The PIM integrates four AI providers for text generation and DeepL for translations directly in the Shopware admin. Each has its own section in the config matrix in the Texts & translations tab (enable, API key, model, connection test, default tone). In detail: AI text generation.
- OpenAI ChatGPT: GPT-5.6 Sol, GPT-5.6 Terra, GPT-5.6 Luna, GPT-5.5, GPT-5.4 mini (preset), GPT-5.4 nano
- Anthropic Claude: Claude Haiku 4.5, Claude Sonnet 5 (preset), Claude Sonnet 4.6, Claude Opus 4.8, Claude Fable 5
- Mistral AI: Mistral Large 3 (preset), Mistral Medium 3.5, Mistral Small 4 (stored as
mistral-large-latest,mistral-medium-latest,mistral-small-latest) - Google Gemini: Gemini 3.1 Pro, Gemini 3.5 Flash (preset), Gemini 3.1 Flash-Lite
The model is chosen per provider in the config matrix. When several providers are active, you pick the provider per call in the AI window of the detail view (also for variants) and in category management. In bulk edit only ChatGPT, Claude and DeepL are available, each with its own switch.
Set up API key
- Create an API key at the respective provider (console.anthropic.com, platform.openai.com, console.mistral.ai or Google AI Studio)
- Enter it in Config matrix → Texts & translations
- "Test connection" button to verify (separately per provider)
- Pick model and tone
- For ChatGPT, Claude and DeepL optionally enable the switch for bulk edit
/api/_action/staw-pim-direct/ai-proxy), which forwards them server-side directly to the respective provider. They do not pass through Stone & Water servers.What can be generated
- Product name - not preselected, so existing names are not overwritten by accident; overly long names are truncated to 255 characters
- Description (HTML), meta title, meta description, keywords
Style templates
5 predefined: Professional, casual-modern, premium/luxury, technical, emotional.
Master prompt and length targets
Two central controls in the configuration under Texts & translations that apply to all providers alike.
Master prompt
The instruction stored here is passed to every AI request - in the detail view, in bulk edit and when rewriting as part of copying from the default language. Permanent rules can be set centrally once, such as salutation, brand spelling, mandatory information or forbidden phrasings, instead of entering them on every run. Instructions in the respective dialog are preserved and complement the master prompt.
Length targets per field
Targets in words and characters can be stored for product name, SEO title, meta description and description. The values go into the prompt and also determine the token budget of the call.
- Product name: 120 characters
- SEO title: 60 characters - the length Google usually displays in full
- Meta description: 155 characters
- Description: 250 words or 1500 characters
- A value of
0means no target
Filter "Missing text per language"
This filter reveals where text is missing in a particular language. You choose the fields - name, description, meta title, meta description, keywords - and the language. An article counts as a hit as soon as one of the chosen fields is empty.
The dialog shows the hits per field separately. With several fields selected it would otherwise be impossible to tell which field causes the number.
Two details decide what counts as present:
- Inheritance between languages is taken into account. If the chosen language hangs off a parent language, German (Switzerland) off German for example, that text counts as present.
- There is deliberately no fallback to the system language. Text that only appears in the shop through the system language counts as missing - that is precisely the gap to be closed in the language branch of a sales channel.
- "Own variant text only": variants count as hits when they have no text of their own - regardless of whether the master product has one. Without this option the inherited text counts as present.
For variants the effective value is checked: their own text, otherwise the one from the parent product. Below a hit only those variants are listed that actually lack the text.
Filter "Visibility of main products and variants"
This filter reveals variants that drop out of a sales channel although the article is assigned to it. The reason lies in Shopware itself: as soon as a variant has visibility rows of its own, they replace those of the parent product entirely. If the channel is missing there, the variant cannot be found in the shop - and nothing on the variant shows it.
- Variant missing in the selected channel
- Variant less visible than the article
- In a channel category but without visibility - parent products that sit in a category of the channel but carry no visibility there
- Main products & variants - runs the three single checks in one pass
The filter needs a selected sales channel and points that out in the dialog. The hit count sits on the chip, and below the article only the affected variants remain.
Transferring visibility to variants
Exactly the gap the filter reveals is closed by a button in the master data below the visibility list: "Transfer visibility to variants". It sets all variants to the same state as the parent product. The first click asks, the second executes.
The transfer runs server side in a transaction and is recorded in the change log.
Binding tier prices to the base price
The chain icon in a tier row binds that tier to the base price. The leading value is the percentage share: it is preserved when the base price changes, and all bound tiers follow.
- Bind all tiers at once through a button in the header of the tier group
- Update tier prices automatically as a setting, once under Products and once under Variants
- Rounding of bound tier prices in the general settings, again separately for products and variants
- In bulk edit tiers can be bound or released for many articles at once; the "define tiering" mode sets the steps from a price rule
- The tier row from quantity 1 is created automatically - Shopware reads the tiers of a price rule as a complete price table. Without the row from 1, a single tier appears in the storefront as a normal unit price. The bulk action "tier row from 1" repairs existing data.
- When duplicating, tier prices are now copied along, for the main product and for every variant.
Essential characteristics
Shopware shows the essential characteristics in the cart and at checkout. Which template a product uses can be controlled in the PIM in four places.
- On the individual product - in the master data next to the manufacturer and in the variant view. If a variant has no own value, the template of the parent product is shown as a placeholder; the field is inherited. Clearing the selection on a variant deliberately resets the value, so the variant inherits from the parent again.
- As a filter - with the values "No template set", "Template present", "Variant without its own template" and the individual templates. Newly created products never have the field set, so a preset that checks this regularly is worthwhile.
- In bulk editing - assign a template or remove it. Reverting a run covers this field as well.
- In the field configuration - can be shown, hidden and set as mandatory, separately for master data and variants.
The value "Variant without its own template" is not the same as "No template set". In Shopware an empty value on a variant means "same as the parent product", not "no template". Products without variants are left out of this selection, as they have nothing to inherit.
The filter also checks the variant rows and evaluates the effective value: a variant without its own template carries the one from the parent product. When a specific template is selected, only the variants that actually carry it remain under a hit.
The templates themselves are created by Shopware in the settings - the PIM deliberately does not rebuild that editor. Next to the selection field there is a link that opens the template management in a new tab. The list reloads when the field is opened, so a template created a moment ago is immediately available.
Warranty (GARAN label)
From 6.7.14 Shopware has two fields for the statutory warranty statement: the warranty period in months and the retailer confirmation. The PIM maintains both in one place.
- Its own section in the master data with a card frame - it can be hidden through the field configuration and moved in the section order like the other sections.
- Settable per variant: the warranty period is an inherited field. Without an own value the main product setting applies; the variant view has its own warranty section with a note about inheritance.
- In bulk edit as the "warranty" action: set or remove the period, set, revoke or leave the confirmation unchanged.
- Older installations: under Shopware 6.7.14 the section is visible but locked and explains why. The values are not written there either - otherwise a run would have sent the fields along and the interface would have rejected the entire batch.
Canonical variant
For products with many variants, their detail pages compete with each other in search. With the canonical variant, every variant of a product points to the same URL.
- Master data, SEO section - the switch "Same canonical URL for all variants" with a selection of the variant that is referenced.
- Bulk editing, SEO tab - with "Set first variant", "Specific variant" and "Remove". A specific variant can only be selected with exactly one product marked.
- Field configuration - own entries in the Products and Variants tabs, with visibility and mandatory setting like the other fields.
The field is inheritable: a variant without its own value inherits from the parent product. The inheritance is shown and can be unlinked and restored.
Syncing with external systems
The external system guard makes sure changes from a connected system do not overwrite the texts maintained in PIM. It is set up in the config matrix in the External systems tab. In detail: External system guard.
- Enable protection: while it is off, no reference state is recorded and nothing is restored.
- Protected languages and protected fields (name, description, meta title, meta description, keywords) - only these are compared and restored if necessary.
- Integrations treated as external: without a selection every access through an integration counts as external. Changes by logged-in users, including from PIM, are never touched.
- Trigger: events and scheduled run, events only, scheduled run only (cron job) or manual only. The scheduled task
staw_pim_direct.translation_guardruns every 5 minutes. - Waiting time between runs (seconds) - slows the sync down when an external system writes many products in quick succession.
- Reference state and log: "Set reference state", "Check only" and "Restore now"; the log shows time, trigger, checked, restored and duration. Restored products can be downloaded as CSV (product number, name, affected fields).
The sync can additionally be triggered in two ways.
- From the command line - the classic route when you have access
- Through a URL in the browser - for environments without console access, such as shared hosting
You find the address in the "Reference state and log" area. A cron service from your host or an external calling service can fetch it regularly. By default it only processes the flagged articles; adding ?full=1 checks the entire stock instead.
The call needs no login and is protected solely by a randomly generated access key in the address. The comparison runs in constant time, and the call can trigger this one sync and nothing else.
The two image filters
There are two separate filters for cover images, and the difference matters:
- Cover image (main product) - checks the cover image of the parent product
- Cover image (variants) - checks whether the variants have their own image, with the options "Variants without their own image" and "Variants with their own image"
Looking for variants without an image while choosing the first filter rightly returns nothing as long as the parent products have an image. Up to version 1.10.27 both were named "Cover image" and "Variant cover", which did not convey the difference.
The variant filter works through the variants onto the parent product: it finds parent products with at least one variant lacking its own cover image. The affected variants appear below as usual. Listing, saved presets and CSV export all return the same result.
Manufacturer selection
The manufacturer picker loads the full stock in blocks rather than a slice. This applies to the detail view, bulk edit and the variant view.
Import and export profiles
Saved profiles have been protected against data loss since 1.11.71. Previously a failed load on opening could mean that a subsequent save deleted all the other profiles.
- Read before write: every save and delete reads the current state immediately beforehand, changes only that one profile and then writes. If reading fails, nothing is written at all.
- In one transaction: deleting and rewriting run together - the previous state survives an error.
- No upper limit any more: the limit of 20 profiles is gone; it silently dropped the oldest profile on saving.
- Visible errors: if loading fails, a note appears with the option to load again - instead of an empty list without explanation.
Console commands and scheduled tasks
For servers with command line access the plugin provides two commands:
bin/console staw:pim:seo:generate- creates product SEO URLs server-side from the shop's SEO template (with 301 history). Options:--sales-channel(-s, hex ID or name),--language(-l, default: channel default language),--dry-run(simulate only),--no-redirects(replace old URLs hard),--overwrite(rewrite existing URLs too, default: only missing ones),--keep-modified(do not overwrite manually changed URLs).bin/console staw:pim:guard:snapshot- sets the reference state of the external system guard or compares against it. Options:--check(report only, write nothing),--restore(restore deviations and then refresh the reference state),--force(run even if the protection is switched off).
Scheduled tasks: staw_pim_direct.export_feed every 15 minutes for feeds in file mode and staw_pim_direct.translation_guard every 5 minutes for the external system guard.
Performance
- Browser-native virtualisation via
content-visibility: auto - Server-side filtering, lazy loading
- Bulk operations in batches with progress
- Minified bundle - ~23% smaller
Bulk edit & import: async indexing
- Queue indexing instead of sync: bulk-edit product writes default to Shopware's async queue indexing (header
use-queue-indexing) instead of synchronous in-request indexing. The write batch size is 25 (previously 10) - large bulk runs complete several times faster. Configurable viabulkIndexingBehavior:use-queue-indexing|disable-indexing|sync. - CSV import without full reindex: imports also use queue indexing - only the imported products are reindexed asynchronously. The previous full-catalogue reindex after every import is gone (only runs with
importIndexingMode = 'disable'). Modes:queue|disable|sync. - Batched requests: audit-log writes are saved as one batch every 600 ms (plus on page leave); bulk approvals run through a batch endpoint (one request per 200 products); bulk translations and approval/audit writes use
INSERT … ON DUPLICATE KEY UPDATE. - Batched variant deletion: one IN delete instead of one statement per variant, with per-ID error feedback and automatic single-delete fallback for e.g. foreign-key locks.
- Lazy snapshots: bulk-edit snapshots and undo data (potentially several MB) are loaded only once per session.
- Stale-response guard: rapid filter/page changes can no longer overwrite newer results with older ones.
Product list with variants
- Only the fields needed: When displaying variants, only the fields the list actually shows are loaded, along with preview image and variant options. Custom columns are still taken into account; if a custom column points at a nested field, the full record is loaded so that no column stays empty.
- Completeness from the server: The percentage is calculated server-side, following the same rule as the completeness filter. Description and meta texts of every variant no longer need to be loaded into the administration, and the transferred data volume drops considerably. If the query fails, the in-browser calculation still applies.
- Load timings: After loading, the times per phase (master product query, variant query, preparation) are available in the browser console under
window.stawPimLastLoadTimings- purely diagnostic.
Diagnostics & stability
- Session error log: the last 50 errors are kept in
window._stawPimErrLog- previously silent error paths (audit flush, batch approvals, snapshot loading) now log failures, so problems are diagnosable via the browser console even without server log access. - Internal test suite: lightweight test runner (no PHPUnit needed) checks SEO fallback logic, snippet consistency de-DE ↔ en-GB and version consistency on every release.
Troubleshooting
Listing does not load
Clear cache, check browser console, check PHP memory limit (512 MB recommended).
CSV import fails
Check encoding (UTF-8), separator, PHP limits.
AI generation fails
Test the API key under Config matrix → Texts & translations → Test connection. Anthropic: top up credit. OpenAI: check billing status.
Contact & support
- Feature request: via the form
- Frequent questions: FAQ
- Email support: pim@stoneandwater.online
- Vendor: Stone & Water - Schöppingen, Germany