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
- 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.