Rule & Warning types¶
In Supplier Data Manager (SDM), rules and warnings control how field values are validated during the Normalisation step. A rule is a hard requirement — a field that fails a rule blocks the job and prevents the user from advancing. A warning is a soft requirement — users can acknowledge the issue and continue. Both rules and warnings share the same set of types described below and are configured per field in the project settings.
General behavior¶
Info
- SDM does not execute rules or warnings if the field is empty, except when the requirement level of the field is
required, or when the field has a rule of typerequired,required_with,required_without, orrequired_on. - Rules and warnings are only applied during the Normalisation step.
- If a field has multiple rules or warnings, they are combined with an AND operator: all rules and all warnings must pass for the field to be valid.
All types¶
| Type | Description | Example | Executed when field is empty | Notes |
|---|---|---|---|---|
| required | Makes sure that a value is entered in the field, otherwise an error is displayed. | Field A must have a value. | YES | |
| required_with | Ensures field A is required if certain other fields are completed. | If fields B and/or C have values, field A must be completed. | YES | Options: columns, which (all or any) |
| required_without | Ensures field A is required if certain other fields are empty. | If fields B and/or C are empty, field A must be completed. | YES | Options: columns, which (all or any) |
| required_on | Ensures field A is required if another field matches a specific pattern. | Field A is required if field B contains the value "Red". |
YES | Only valid on string fields. Options: column, pattern |
| regex | Ensures the value matches a regular expression pattern. | Field A must match the pattern ^[a-zA-Z0-9]+$. |
❌ | Options: pattern |
| is_true | Ensures the field has a boolean value of true. |
Field A must be set to true. |
❌ | |
| unique | Ensures the value is unique across all rows. | Values in field A must be unique across the file. | ❌ | Case-sensitive: "Apple" and "apple" are treated as distinct values. |
| unique_with | Ensures the combination of values from multiple fields is unique across all rows. | The combination of values in fields A and B must be unique. | ❌ | Option: column. Case-sensitive: "Apple" and "apple" are treated as distinct values. |
| unique_on | Ensures the value is unique within rows that share a specific condition. | Field A must be unique among rows where field B has a specific value (e.g., "Active"). |
❌ | Option: columns. Case-sensitive: "Apple" and "apple" are treated as distinct values. |
| isin | Ensures the value is within a defined set of acceptable values. | Field A must be one of ["Red", "Green", "Blue"]. |
❌ | Options: values. Commonly used to validate that option values in Select attributes or family codes are within the allowed set. |
| max_length | Ensures the value does not exceed a maximum number of characters. | Field A must not exceed 255 characters. | ❌ | Options: threshold, strict. No type check is performed — this rule can be applied to both string and numeric fields (e.g., for EAN codes with a 13-digit maximum). |
| max_value | Ensures the value does not exceed a maximum number. | Field A must be less than or equal to 100. | ❌ | Options: threshold, strict |
| min_value | Ensures the value meets a minimum number. | Field A must be greater than or equal to 10. | ❌ | Options: threshold, strict |
| min_date | Ensures a date value is on or after a minimum date. | Field A must be on or after 2024-01-01. |
❌ | Options: min_date (ISO 8601 format: YYYY-MM-DD). The field's format property determines how the date string is parsed. |
| max_date | Ensures a date value is on or before a maximum date. | Field A must be on or before 2024-12-31. |
❌ | Options: max_date (ISO 8601 format: YYYY-MM-DD). The field's format property determines how the date string is parsed. |
| superior_to | Ensures the value in field A is greater than the value in field B. | Field A must be greater than field B. | ❌ | Numeric fields only. Options: column, strict |
| inferior_to | Ensures the value in field A is less than the value in field B. | Field A must be less than field B. | ❌ | Numeric fields only. Options: column, strict |
| uneditable | Prevents the field value from being edited after initial entry. | Field A cannot be changed once it has been set. | ❌ | |
| equal_to | Ensures the value in field A equals the value in another field. | Field A must equal field B. | ❌ | Option: column |
| any_of | Ensures that at least one of several cases passes. Each case contains conditions that must ALL be satisfied, but ANY case can pass for the rule to succeed. | Field A must either be 15 or more characters long, OR contain a premium keyword. | ❌ | Options: cases (list of validation cases). Each case has a conditions array. Conditions can include an optional field property to apply the condition to a different field. |
Examples¶
unique_with¶
An error is displayed for row 5 because the value in field A is not unique when combined with field B.

The screenshot above shows a normalisation step with a unique_with rule violation on row 5: the combination of values in fields A and B is duplicated, triggering an error.
any_of¶
The any_of rule passes if any of its cases succeed. Within each case, all conditions must pass (AND logic). Use this rule to express "either/or" validation requirements.
{
"name": "any_of",
"cases": [
{
"conditions": [
{"name": "regex", "pattern": "^.{15,}$"}
]
},
{
"conditions": [
{"name": "regex", "pattern": ".*(PRO|ELITE|PREMIUM|EXPERT).*"}
]
}
]
}
- Case 1: Field must be at least 15 characters long
- Case 2: Field must contain a premium keyword (
PRO,ELITE,PREMIUM, orEXPERT) - Result: The rule passes if either case succeeds (OR logic between cases)
- Within each case: All conditions must pass (AND logic within a case)
To apply a condition to a different field than the one the rule is defined on, add a field property to the condition:
{
"name": "any_of",
"cases": [
{
"conditions": [
{"name": "required"},
{"name": "isin", "field": "category", "values": ["Electronics", "Appliances"]}
]
}
]
}
In this example, the case passes only if the current field is filled in AND the category field contains one of the specified values.