Flow Step Types
Flows are built from a sequence of steps. Each step performs a specific action -- sending an email, waiting, checking a condition, or updating contact data. Steps execute in order for each contact that enters the flow.
Send Email
The most common step type. It renders a template with the contact's data and sends the email.
How It Works
- Synapse loads the email template you selected.
- All NLT expressions in the template are resolved using the contact's profile and the trigger event's attributes.
- If any
requiredvariable is missing, the email is suppressed (not sent) and logged as "suppressed" instead of "failed". - If everything resolves successfully, the email is sent via your configured sender domain.
- An email log entry is created to track delivery, opens, and clicks.
Configuration
| Setting | Description |
|---|---|
| Template | Select the email template to send |
| Description | Optional note explaining the purpose of this step |
You can reuse the same template across multiple flows. If you update the template, all flows using it will pick up the changes on the next send.
Wait
Pauses the flow for a specified duration before continuing to the next step. This is essential for building multi-step journeys like follow-ups and reminders.
How It Works
- When the flow reaches a wait step, a timer is set for that contact.
- The contact's trip status remains "active" during the wait.
- After the delay expires, the flow resumes with the next step.
Configuration
| Setting | Description | Examples |
|---|---|---|
| Duration | How long to wait | 1h (1 hour), 24h (1 day), 7d (7 days), 2w (2 weeks) |
Common Patterns
| Pattern | Duration | Use Case |
|---|---|---|
| Quick follow-up | 1h | Nudge after form start but no submission |
| Next-day reminder | 24h | Remind to complete a pending action |
| Weekly digest | 7d or 1w | Wait a week before sending a summary |
| Cooldown period | 48h | Space out messages to avoid overwhelming contacts |
Wait durations support hours (h), days (d), and weeks (w). For example: 1h, 24h, 7d, 2w. There is no maximum duration enforced by the system, but very long waits may result in stale data by the time the flow resumes.
Condition
Branches the flow based on a check. This lets you create different paths depending on contact data, event history, or other criteria.
How It Works
- Synapse evaluates the condition you define.
- If the condition is true, one action is taken (continue or skip to end).
- If the condition is false, a different action is taken.
Configuration
| Setting | Description |
|---|---|
| Check | What to evaluate (see check types below) |
| If True | What to do if the condition passes (continue to next step, or skip to end) |
| If False | What to do if the condition fails (continue to next step, or skip to end) |
Check Types
| Check | Description | Example |
|---|---|---|
| Event exists | Has the contact performed a specific event since entering the flow? | "Has the contact submitted a claim_completed event?" |
| Contact property | Check a value on the contact's profile | "Is the contact's subscription status subscribed?" |
| Event attribute | Check data from the trigger event | "Is the trigger event's claim_type equal to work_injury?" |
Example: Follow-Up Only If Not Completed
A common pattern is to send a reminder only if the contact hasn't taken the next action:
| Step | Type | Details |
|---|---|---|
| 1 | Send Email | "Please complete your submission" |
| 2 | Wait | 24 hours |
| 3 | Condition | Has the contact performed form_submitted? If yes: skip to end. If no: continue. |
| 4 | Send Email | "Reminder: you still need to complete your submission" |
Update Contact
Modifies properties on the contact's profile. This is useful for tagging contacts based on their flow participation or updating their status.
How It Works
- Synapse updates the specified properties on the contact's record.
- These changes persist and are visible in the Contacts section.
- Updated properties can be used by subsequent flow steps, other flows, and segment evaluations.
Configuration
| Setting | Description | Example |
|---|---|---|
| Property | The contact field to update | properties.onboarding_status |
| Value | The new value to set | completed |
Common Uses
- Mark a contact as
onboardedafter they complete a welcome flow - Set a
last_campaignproperty to track which flow the contact went through - Update a
segment_tagproperty used by segments for future targeting
Update Contact changes are applied immediately and are visible to all subsequent steps in the flow, as well as other flows and segments.
Conditional Split
Branches the flow into multiple paths based on contact attributes, event data, or property values. Unlike the basic Condition step (which has only true/false), a Conditional Split can have many branches -- each with its own condition and sequence of steps.
How It Works
- Each branch defines a condition (e.g., "contact's country is SG", "plan is premium").
- Synapse evaluates branches in order, from top to bottom.
- The contact enters the first branch whose condition is true.
- If no branch condition matches, the contact enters a default "Everyone Else" path (if configured) or continues to the next step.
Configuration
| Setting | Description |
|---|---|
| Branches | An ordered list of conditions, each with its own label and filter criteria |
| Label | A human-readable name for each branch (e.g., "Premium Users", "SG Region") |
Example: Region-Based Content
| Branch | Condition | Action |
|---|---|---|
| Branch 1 | properties.country is SG | Send "Singapore Welcome" email |
| Branch 2 | properties.country is US | Send "US Welcome" email |
| Everyone Else | (no condition) | Send "Global Welcome" email |
Branch conditions are evaluated in order. If a contact matches multiple branches, only the first match is used. Order your branches from most specific to most general.
A/B Split
Randomly divides contacts into two or more groups based on percentages. Use this to test different email content, subject lines, or flow paths against each other.
How It Works
- You define two or more variants, each with a percentage allocation.
- When a contact reaches the A/B Split step, they are randomly assigned to one variant.
- Each variant leads to a different path of subsequent steps.
- Percentages must add up to 100%.
Configuration
| Setting | Description |
|---|---|
| Variants | A list of variant names with percentage allocations |
Example: Subject Line Test
| Variant | Percentage | Action |
|---|---|---|
| Variant A | 50% | Send "Don't miss this" email |
| Variant B | 50% | Send "Limited time offer" email |
Example: 3-Way Split
| Variant | Percentage | Action |
|---|---|---|
| Control | 33% | Send original email |
| Variant A | 33% | Send new subject line |
| Variant B | 34% | Send new design |
Pair A/B Splits with Conversion Goals to measure which variant performs better. Set a goal event (like "purchase_completed") and compare conversion rates across variants.
Step Execution Order
Steps execute sequentially, from first to last. Each contact who enters the flow gets their own independent journey (called a "trip"). Key points:
- Each trip progresses through steps one at a time.
- If a step fails (e.g., email delivery error), it is logged and the trip continues to the next step.
- Wait steps pause only that contact's trip -- other contacts in the same flow are unaffected.
- Condition steps may cause a trip to skip remaining steps and end early.
Combining Steps
Here are some common flow patterns using multiple step types:
Welcome Series
| Step | Type | Details |
|---|---|---|
| 1 | Send Email | Welcome email |
| 2 | Wait | 3 days |
| 3 | Send Email | Getting started tips |
| 4 | Wait | 7 days |
| 5 | Condition | Has user completed onboarding? |
| 6 | Send Email | Reminder to complete setup (only if not completed) |
Transaction Follow-Up
| Step | Type | Details |
|---|---|---|
| 1 | Send Email | Order confirmation |
| 2 | Update Contact | Set last_order_date to today |
Conditional Notification
| Step | Type | Details |
|---|---|---|
| 1 | Condition | Is contact's plan "premium"? |
| 2 | Send Email | Premium notification (if yes) |
Start simple with one or two steps. You can always edit an active flow to add more steps -- new trips will use the updated flow, while existing trips continue with the version they entered on.
Looking for the API?
If you prefer to manage flow steps programmatically, see the Flows API Reference.