# Validation Nodes
URL: https://docs.valsight.ai/validation-nodes/
Description: Validation nodes let you define custom conditions inside your model that flag deviations during validation checks.
Validation nodes let you define **custom conditions** inside your model that flag **deviations** during validation checks.

## When to use it

* When formulas can produce results that are technically valid but logically wrong (e.g. negative volumes, margins exceeding 100%)
* When you want automated checks for business rules that model validation cannot catch

## How it works

Validation nodes work like regular nodes but serve a specific purpose: their result is interpreted as a pass/fail signal during validation.

* A result of **0** (or all zeros): the check **passes** (no issues).
* A result **other than 0**: the check **fails** (the non-zero value indicates the deviation).

You can use any formula logic to express the condition. Common patterns use [IF](/if/), [MIN](/min/), [MAX](/max/) and [Comparisons & boolean operators](/comparisons-boolean-operators/)

## Adding a validation node

1. Open your model in the **Model Editor**.
2. Click **Add Node** in the action bar.
3. Select **Validation Node** from the node type menu.
4. Name the node and define its formula.

![image-20260402-092417.png](./images/6861455367.png)

## Common patterns

### Check that a value is never negative

| Node               | Formula                          | Logic                                                                                                                        |
| ------------------ | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| **PositiveVolume** | `IF('Volume' >= 0, 0, 'Volume')` | Returns **0** when volume is non-negative (passes). Returns the actual volume when negative (fails and shows the deviation). |
| **PositiveVolume** | `MIN(0, 'Volume')`               | Equivalent shorthand. Returns **0** when volume is positive, returns the negative value otherwise.                           |

### Ensure a value stays within a range

Use `IF` with combined conditions to check a lower and upper bound at the same time.

| Node                | Formula                                                                   | Logic                                                                                                                          |
| ------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| **DiscountInRange** | `IF('Discount Rate' >= 0 AND 'Discount Rate' <= 0.5, 0, 'Discount Rate')` | Returns **0** when the discount rate is between 0% and 50% (passes). Returns the actual value when outside that range (fails). |

### Flag values that should never be zero

Use `IF` to detect zeros where a positive value is expected.

| Node                 | Formula                      | Logic                                                                                              |
| -------------------- | ---------------------------- | -------------------------------------------------------------------------------------------------- |
| **NonZeroHeadcount** | `IF('Headcount' != 0, 0, 1)` | Returns **0** where headcount is non-zero (passes). Returns **1** where headcount is zero (fails). |

### Combine multiple conditions

Use `AND`, `OR` to check several rules in one validation node.

| Node                   | Formula                                    | Logic                                                                                                                    |
| ---------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ |
| **RevenueConsistency** | `IF('Revenue' > 0 AND 'Volume' > 0, 0, 1)` | Returns **0** when both revenue and volume are positive (passes). Returns **1** when either is zero or negative (fails). |

## Running validation node checks

You can evaluate validation nodes in two ways:

**From the Model Editor:**

Click the **Validation Node Checkup** button in the header bar. This runs all validation nodes against the current model state.

![image-20260402-092712.png](./images/6862831642.png)

**From a Workspace:**

Validation nodes are also evaluated automatically during [Workspace Validation](/workspace-validation/), which checks conditions across all active scenarios.

## Limitations

* Validation nodes only check results. They do not change calculations or outputs of other nodes.
* The pass/fail signal is based on the numeric result: zero passes, non-zero fails. Design your formula accordingly.
* Validation nodes are evaluated per intersection (every combination of dimension values), so a single validation node can flag multiple issues at different intersections.

## FAQ

**Do validation nodes affect model results?**

No. They only check results. They do not influence the calculations of other nodes.

**What is the difference between model validation and validation node checks?**

Model validation checks syntax and structure. Validation node checks evaluate whether your custom conditions are met at the result level.

**Can I use validation nodes without workspace validation?**

Yes. You can run the Validation Node Checkup directly from the Model Editor at any time.

## Related

* [Model Validation](/model-validation/): syntax and structure checks
* [Workspace Validation](/workspace-validation/): evaluates validation nodes across scenarios
* [Expected Levels](/expected-levels/): pre-define the shape of empty nodes used as blueprints
* [IF](/if/), [MIN](/min/), [MAX](/max/), [Comparisons & boolean operators](/comparisons-boolean-operators/): functions and operators commonly used in validation node formulas
