---
title: Conditional Branching
description: If/then logic in workflows
icon: GitBranch
---

## Overview

Conditions split workflows into two paths based on contact data.

```
[Condition: plan equals "premium"]
    ├─ True → [Send: Premium features]
    └─ False → [Send: Upgrade offer]
```

Both paths required.

## Operators

| Operator | Use | Example |
|----------|-----|---------|
| `equals` | Exact match | `plan equals "pro"` |
| `notEquals` | Not matching | `plan notEquals "free"` |
| `contains` | Substring | `company contains "tech"` |
| `greaterThan` | Greater than | `mrr greaterThan 100` |
| `lessThan` | Less than | `loginCount lessThan 5` |
| `greaterThanOrEqual` | Greater than or equal | `age greaterThanOrEqual 18` |
| `lessThanOrEqual` | Less than or equal | `daysInactive lessThanOrEqual 30` |
| `exists` | Has value | `company exists` |
| `notExists` | Missing/null | `lastName notExists` |
| `startsWith` | Prefix | `coupon startsWith "SAVE"` |
| `endsWith` | Suffix | `email endsWith "@company.com"` |

**Important:** Numeric operators require field stored as number, not string.

## Common patterns

### Filter by plan

```
[Condition: plan equals "enterprise"]
    ├─ True → [Send: Enterprise onboarding]
    └─ False → [Send: Standard onboarding]
```

### Activity check

```
[Condition: loginCount greaterThan 10]
    ├─ True → [Send: Power user tips]
    └─ False → [Send: Getting started]
```

### Nested conditions

Chain for multi-tier logic:

```
[Condition: plan equals "enterprise"]
    ├─ True → [Send: Enterprise email]
    └─ False ↓
        [Condition: plan equals "pro"]
            ├─ True → [Send: Pro email]
            └─ False → [Send: Free email]
```

### Multiple field checks (AND)

Nest conditions:

```
[Condition: plan equals "pro"]
    ├─ True ↓
    │   [Condition: trialDaysLeft lessThan 3]
    │       ├─ True → [Send: Trial ending]
    │       └─ False → [Exit]
    └─ False → [Exit]
```

Matches: `plan = "pro"` AND `trialDaysLeft < 3`

## Nested data

Access with dot notation:

```json
{
  "field": "preferences.newsletter",
  "operator": "equals",
  "value": true
}
```

## Best practices

**Store correct types** — `99` (number) not `"99"` (string) for numeric comparisons.

**Check existence first** — If field might not exist:

```
[Condition: mrr exists]
    ├─ True → [Condition: mrr greaterThan 100]
    └─ False → [Exit]
```

**Limit nesting** — More than 3 levels gets hard to maintain. Use separate workflows.

**Test both paths** — Verify true and false outcomes work.

**Use segments when filtering many** — Segment-based triggers more efficient than in-workflow conditions for large audiences.

## Common mistakes

**Case sensitivity** — `equals "Pro"` doesn't match `"pro"`

**Type mismatch** — `"100" greaterThan 50` fails (string vs number)

**Missing both paths** — Every condition needs true AND false connections

## Debugging

Check contact data first:

```bash
curl -X GET {{API_URL}}/contacts/contact_id \
  -H "Authorization: Bearer sk_your_secret_key"
```

Verify field names and types match your condition.

## Next steps

- [See workflow patterns](/automation-patterns/workflow-patterns)
- [Build segments](/guides/segments) for trigger filtering
