# Waterfall Enrichment

### What is waterfall enrichment?

Waterfall enrichment lets you try multiple providers in sequence — only moving to the next if the previous one didn’t return data. This avoids wasting API credits, prevents conflicting results, and increases coverage.

It works like this:

* Run the first provider.
* If the output column is still empty, run the second.
* If still empty, run the third — and so on.

***

### How to set it up

#### Step 1: Add the first enrichment node

* Start with your primary provider. Add an enrichment node to the canvas.
* Select the provider, map the required inputs (for example, an `email` field), and configure outputs.
* Leave the **“Run only if column is empty”** setting blank. Since this is the first node in the chain, it should run unconditionally.

#### Step 2: Add fallback nodes

* Now add a second enrichment node to the right of the first. This is your fallback provider — it should run only if the previous one didn’t return a value.
* In the **“Run only if column is empty”** dropdown, select the output column from the first node (e.g. `Email Status`). This makes the second provider conditional — it will only run when the chosen column is empty.

Repeat this step to add more fallback nodes. Each one should:

* Be placed to the right of the previous one.
* Use the same “Run only if column is empty” setting, pointing to the same target column.

***

### Important options

#### Map new columns to existing ones.

When you apply **“Run only if column is empty”**, the **“Map new columns to existing ones”** option is automatically turned ON.

This ensures the node writes into an existing column (same name and type), instead of creating a new one. It merges outputs from different nodes into the same column.

You can switch this option manually:

* **Keep it ON** to use a shared field across providers.
* **Turn it OFF** if you need to store each provider’s result separately.

#### Show response status

Adds a column that shows the status for each row:

* `Processed`
* `Not found`
* `Empty input`
* `Error: <reason>`

Useful to track which node returned a result.

#### Show original response

Saves the complete raw API response in a separate column. This is helpful when:

* You need an audit trail.
* You want to extract extra fields that have not been mapped yet.

***

### Example: Email verification with three providers

You want to verify email addresses using **MillionVerifier**, **NeverBounce**, and **ZeroBounce** - in that order.

1. **MillionVerifier** (first node):
   * Input: `email`
   * Output: `Email Status`
   * **Run only if column is empty**: *(leave blank)*
   * **Map new columns to existing ones**: *(not applicable)*
2. **NeverBounce** (second node, after MillionVerifier):
   * Input: `email`
   * Output: `Email Status`
   * **Run only if column is empty**: `Email Status`
   * **Map new columns to existing ones**: auto-enabled (writing to the same `Email Status`)
3. **ZeroBounce** (third node):
   * Input: `email`
   * Output: `Email Status`
   * **Run only if column is empty**: `Email Status`
   * **Map new columns to existing ones**: auto-enabled

Now the waterfall logic is in place:

* MillionVerifier runs first and fills `Email Status` if possible.
* If it's empty, NeverBounce runs and writes into the same column.
* If it's still empty, ZeroBounce tries last.

This way, you get one clean output column and only pay for what's needed.
