Data quality rules
Rules define what a complete product is for your shop. Product Studio checks every product against the active rules when it changes, and shows the result in the sheet, on the Health tab and on the product page. Managing rules needs the "Manage data quality rules" permission.
Checks
| Check | Settings | Passes when |
|---|---|---|
| Is filled in | Field | The field has a value. An HTML description with only tags or spaces counts as empty. |
| Text length | Text field, minimum and/or maximum characters; for HTML fields the visible text or the HTML source | The length is within the limits. An empty value fails when a minimum is set. |
| Format | Text field, format | The value has the format. Empty values are skipped (combine with "Is filled in"). |
| Number range | Number field (prices, stock, weight, dimensions, purchase quantities, number custom fields, ...), minimum and/or maximum | The value is between the limits; both limits are included. Empty values are skipped. |
| Compare two fields | Field, comparison, second field | The comparison holds, for example "List price > Price", "Maximum order quantity ≥ Minimum order quantity" or "Meta title ≠ Name". Empty values are skipped. |
| Unique across products | EAN, manufacturer number, name or meta title | No other product has the same value. |
| Contains a word | Text field, word list; for HTML fields the visible text or the HTML source | The text contains at least one of the words. Empty values are skipped. |
| Doesn't contain words | Text field, word list; for HTML fields the visible text or the HTML source | The text contains none of the words, for example no "lorem", "TODO" or "€" in names. Empty values are skipped. |
| Minimum number | Images, categories, tags, property values or sales channels; minimum | The product has at least that many. |
| Has a property | Property groups | The product has a value in each chosen property group. |
Formats: valid EAN/GTIN (GTIN-8, 12, 13 or 14 with check digit), web address (http/https), plain text without HTML, a number, and no extra spaces (none at the start or end, no double spaces).
Number range
Every number field can be checked, including all prices: price and list price (gross and net), purchase price, lowest price (30 days) and the prices in other currencies. Prices are the default currency's unless the field names a currency. Decimals are allowed ("weight between 0.01 and 500"). For "more than 0", use a small minimum such as 0.01.
Compare two fields
Only fields with the same kind of value can be compared: numbers with numbers (prices, stock, purchase quantities, dimensions, ...), dates with dates, texts with texts, yes/no with yes/no, and a reference only with a reference to the same kind of thing (a manufacturer with a manufacturer). Numbers and dates support all comparisons (>, ≥, <, ≤, =, ≠); texts and the other kinds only = and ≠. Texts are compared without surrounding spaces and regardless of upper and lower case; HTML is compared as visible text. When one of the fields is translatable, the rule is checked in each of its languages.
Unique across products
Duplicates are found across the whole catalogue, not only among the products being checked. Only values stored on the product itself count: a variant that shows its main product's EAN or name is not a duplicate of it, but two variants with the same own EAN are. Names and meta titles are compared per language (the rule's languages). Values are compared like the shop's database does: upper and lower case and trailing spaces don't make values different. Product numbers are not offered: Shopware keeps them unique already.
When a value changes, every product that had the old value and every product that has the new value is checked again, so fixing one of two duplicates clears both.
Contains / doesn't contain
Enter one word or phrase per line (commas also separate words; up to 100). The search ignores upper and lower case (also for accented and non-Latin letters) and finds the text anywhere, also inside longer words: "todo" matches "TODO:" and "Todos". There are no wildcards or regular expressions: every character is searched literally.
Visible text or HTML source
For HTML fields (the description and HTML custom fields), "Text length", "Contains" and "Doesn't contain" check the
visible text by default: tags removed, entities like & decoded, whitespace collapsed. Choose "HTML source" to
check the stored markup instead, for example to limit the size of a description or to find style= attributes.
For translatable fields you choose which value is checked:
| Value to check | What is checked |
|---|---|
| The text in that language | What is stored in that language. Variants use their main product's text if they have none. Use this for translation completeness. |
| What the storefront shows | The text in that language, or the default language's text when there is no translation. |
Applies to
A rule applies to all products unless you limit it:
| Condition | Effect |
|---|---|
| Languages | Each language is checked on its own, and a product gets one issue per failing language. Without languages the default language is checked. |
| Categories (including subcategories), manufacturers, sales channels, tags | Only products assigned to one of the chosen entries. |
| Dynamic product groups | The products the group's filters match, evaluated with Shopware's own product stream filters as in the storefront. When a group used by a rule is changed, all products are checked again. |
| Property values | Products with one of the chosen values. Variants also match through their options (a variant with the option "Red" matches "Colour: Red"). |
| Active state | Only active or only inactive products. |
| Products | Main products only, or variants only. |
| Variants | Only products with variants (main products that have variants), or only products without variants (products without variants and the variants themselves). |
| Release date | Only released products (release date in the past, or none), or only products that are not released yet (release date in the future). A product that reaches its release date is checked again the next time it changes or when the whole catalogue is checked. |
All conditions must hold; within one condition (for example several tags) one match is enough.
Variants inherit like in the storefront: a variant without its own images, properties or price uses the main product's.
Severity and score
The status of a product is "Errors" when an error rule fails, "Warnings" when only warning rules fail, and "Complete" when all applicable rules pass. Products no rule applies to show "No rules apply"; products that weren't checked yet (right after the installation) show "Not checked yet".
The score is the share of applicable checks a product passes, from 0 to 100. It reflects your rules, not a general standard.
Testing and saving
"Test on recent products" runs the rule on the latest 200 products without saving it (uniqueness is still checked against the whole catalogue), and lists the failing ones. When you save a rule, all products are checked again in the background; the rule list updates its failing counts when that is done. "Check quality again" in the sheet re-checks the selection immediately (up to 500 products) or queues the rest.
"Show failing products" (Rules and Health tabs) opens the sheet with those products and the columns the rule checks, in the rule's languages, so you can fix them there.
The command bin/console dal:refresh:index --only=lae_product_studio.status re-checks the whole catalogue.
Product list
Catalogues → Products shows a "Quality" column for users with the Product Studio permission. It shows the status and score, followed by the languages with missing or outdated translations as text, for example "Missing: DE, FR". Hover the text for the counts per language. Click the column header to sort by score; click a cell to see the failing rules, the translation gaps and the recent changes of that product, with a link to the product. Hide or move the column with the list's column settings, like any other column.
The filter sidebar gets a "Quality status" filter (Errors, Warnings, Complete, No rules apply). Products that weren't checked yet have no status and are not matched by the filter.
Users without the Product Studio permission see the list unchanged.
Examples
| Rule | Check | Settings |
|---|---|---|
| Manufacturer set | Is filled in | Manufacturer |
| Description long enough | Text length | Description, minimum 300, languages: all shop languages |
| Valid EAN | Format | EAN, Valid EAN/GTIN |
| Enough images | Minimum number | Images, 3; main products only |
| Meta title fits | Text length | Meta title, maximum 60; warning |
| Has a colour | Has a property | Colour; categories: Clothing |
| Price set | Number range | Price, minimum 0.01 |
| Realistic weight | Number range | Weight, minimum 0.01, maximum 500; main products only |
| List price above price | Compare two fields | List price > Price; warning |
| Order limits make sense | Compare two fields | Maximum order quantity ≥ Minimum order quantity |
| Own meta title | Compare two fields | Meta title ≠ Name; languages: all shop languages; warning |
| No duplicate EANs | Unique across products | EAN |
| Unique names | Unique across products | Name; languages: all shop languages; warning |
| No placeholders | Doesn't contain words | Name: lorem, TODO, test, € |
| Description size | Text length | Description, maximum 20,000, HTML source; warning |
| Pre-orders have a date note | Contains a word | Description: "available from"; release date: not released yet |
| Sale group priced | Number range | List price, minimum 0.01; dynamic product group: Sale |