Creating Your First Workflow
Build your first automated workflow using Expedify's visual workflow builder. This guide walks you through creating a practical automation from start to finish.
Time to complete: 20-30 minutes
What You'll Build
We'll create a Welcome Email Automation that:
- Triggers when a webhook receives data
- Validates the incoming email
- Sends a personalized welcome email
- Returns a success response
This covers the essential concepts: triggers, logic, actions, and variables.
Opening the Workflow Builder
Step 1: Navigate to Workflows
- Go to Automation → Workflows
- Click + New Workflow
- The workflow builder opens with a blank canvas
Understanding the Interface
| Area | Description |
|---|---|
| Left Sidebar | Node categories and search |
| Center Canvas | Visual workflow design area |
| Right Panel | Properties for selected node |
| Top Toolbar | Save, test, execute, settings |
| Bottom Panel | Execution logs and history |
Node Categories
Workflows are built from nodes organized into categories:
| Category | Purpose | Examples |
|---|---|---|
| Triggers | Start workflow execution | Webhook, Database, Scheduler |
| Data | Transform and process data | Transform, Variables, SQL |
| Logic | Control flow and decisions | Conditions, Loops, Delays |
| Messaging | Send communications | Email, WhatsApp, Slack |
| Contacts | CRM operations | Create, Update, Search |
| Integrations | External services | API Request, Google Sheets |
| Knowledge Base | Document operations | Search, Add, Update |
| Output | Return results | Text Response, Builder |
Building the Workflow
Step 1: Add a Trigger
Every workflow needs a trigger. Let's use a Webhook Trigger.
- Click + Add Node in the sidebar
- Select Triggers → Webhook Trigger
- Drag the node onto the canvas
Configure the Trigger:
- Click the node to open Properties Panel
- Create or select a webhook
- Note the auto-generated webhook URL
The trigger is now listening for incoming HTTP requests.
Step 2: Add Data Validation
Let's validate the incoming data has an email.
- Add Logic → Condition Node
- Connect: Webhook Trigger → Condition Node
- Drag from the output handle (right side of webhook)
- Drop on the input handle (left side of condition)
Configure the Condition:
Field: {{webhooktrigger_1.payload.email}}
Operator: is not empty
The condition now has two outputs:
- True → Email exists, continue
- False → Email missing, handle error
Step 3: Transform the Data
Process the validated data.
- Add Data → Transform Data Node
- Connect: Condition (True branch) → Transform
Configure the Transform:
// Extract and format data
const email = input.payload.email;
const name = input.payload.name || "Friend";
return {
email: email.toLowerCase().trim(),
name: name,
welcomeSubject: `Welcome, ${name}!`,
signupDate: new Date().toISOString()
};
Step 4: Send Welcome Email
Now send the actual email.
- Add Messaging → Email Send Node
- Connect: Transform → Email Send
Configure the Email:
| Field | Value |
|---|---|
| To | {{transformdata_1.email}} |
| Subject | {{transformdata_1.welcomeSubject}} |
| Body | See template below |
| Integration | Select your email integration |
Email Body Template:
Hello {{transformdata_1.name}},
Welcome to our platform! We're excited to have you join us.
You signed up on {{transformdata_1.signupDate}}.
Best regards,
The Team
Step 5: Add Success Response
Return a response to the webhook caller.
- Add Output → Text Response
- Connect: Email Send → Text Response
Configure the Response:
Message: Successfully sent welcome email to {{transformdata_1.email}}
Step 6: Handle Missing Email (Error Path)
Let's handle the error case when email is missing.
- Add another Output → Text Response
- Connect: Condition (False branch) → Error Response
Configure the Error Response:
Message: Error: Email address is required
Status Code: 400
The Complete Workflow
Your workflow should now look like this:
┌─────────────────┐
│ Webhook Trigger │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Condition │
│ (email exists?) │
└───┬─────────┬───┘
│ │
True False
│ │
▼ ▼
┌─────────┐ ┌─────────┐
│Transform│ │ Error │
│ Data │ │Response │
└────┬────┘ └─────────┘
│
▼
┌─────────┐
│ Email │
│ Send │
└────┬────┘
│
▼
┌─────────┐
│ Success │
│Response │
└─────────┘
Saving Your Workflow
First Save
- Click Save in the toolbar
- Enter workflow name: "Welcome Email Automation"
- Add description: "Sends welcome email when new user signs up"
- Click Save Workflow
Workflow Settings
Before activating, configure additional settings:
| Setting | Recommended Value |
|---|---|
| Icon | 📧 |
| Category | Automation |
| Complexity | Beginner |
| Tags | email, welcome, onboarding |
Testing Your Workflow
Manual Test
- Click Test in the toolbar
- Enter sample input:
{
"email": "test@example.com",
"name": "John"
}
- Click Run Test
- Watch nodes execute in sequence
- View results in each node
What to Check
| Node | Expected Result |
|---|---|
| Webhook Trigger | Receives test payload |
| Condition | Returns true (email exists) |
| Transform Data | Outputs formatted data |
| Email Send | Shows success message |
| Response | Returns success text |
Debug Mode
Click any node during test to see:
- Input: Data flowing into node
- Output: Data produced by node
- Duration: Processing time
- Errors: Any issues encountered
Activating the Workflow
Once testing passes:
- Click Activate button
- Workflow status changes to Active
- Webhook URL is now live
Copy Your Webhook URL:
https://api.expedify.ai/webhooks/incoming/abc123...
This URL can now receive real requests from external systems.
Understanding Variables
Variables pass data between nodes using this syntax:
{{node_alias.output_field}}
Variable Examples
| Variable | Meaning |
|---|---|
{{webhooktrigger_1.payload}} | Full webhook body |
{{webhooktrigger_1.payload.email}} | Email from payload |
{{transformdata_1.name}} | Name from transform output |
{{emailsend_1.success}} | Email send status |
Finding Variables
- Click in any input field
- Type
{{to see available variables - Browse by node or search
- Click to insert
Variable Tips
✅ Use descriptive node aliases
✅ Access nested properties with dots
✅ Check variable exists before using
✅ Use Transform node to combine variables
❌ Don't reference nodes that haven't executed yet
❌ Don't assume array access without checking length
Workflow Execution States
| State | Description |
|---|---|
| Pending | Queued, waiting to start |
| Running | Currently executing |
| Completed | Finished successfully |
| Failed | Error occurred |
Viewing Executions
- Click Executions tab in bottom panel
- See all workflow runs
- Click any execution to view details
- Replay execution on canvas
Best Practices
Naming Conventions
| Element | Convention | Example |
|---|---|---|
| Workflow | Action + Target | "Welcome Email Automation" |
| Node Alias | verb_noun | "transform_user_data" |
| Variables | Clear context | user.email not just email |
Error Handling
Always handle potential failures:
✅ Add condition nodes before critical operations
✅ Use error response paths
✅ Log errors for debugging
✅ Notify team of failures
Common checks:
- Is email valid?
- Does record exist?
- Is API response successful?
- Is data in expected format?
Performance Tips
✅ Keep workflows focused (one purpose)
✅ Use transforms to reduce data early
✅ Add delays between API calls (rate limits)
✅ Test with realistic data volumes
❌ Don't loop over very large arrays
❌ Don't chain too many API calls
❌ Don't store sensitive data in variables
Common Workflow Patterns
Pattern 1: CRM Automation
Database Trigger (new contact)
→ Transform Data
→ Check Lead Score
→ IF high score: Assign to Sales
→ IF low score: Add to Nurture Campaign
Pattern 2: Scheduled Report
Scheduler (daily at 9am)
→ Database Query (get metrics)
→ Transform Data (format report)
→ Email Send (to team)
Pattern 3: Webhook Integration
Webhook Trigger (from Stripe)
→ Condition (payment success?)
→ Update Contact (mark as customer)
→ WhatsApp Send (receipt)
→ Response (200 OK)
Pattern 4: AI Processing
User Message Trigger
→ KB Search (find relevant docs)
→ LLM Node (generate response)
→ Text Response (reply to user)
Troubleshooting
Workflow Not Triggering
- Check activation - Is workflow active?
- Verify webhook URL - Correct endpoint?
- Check payload format - JSON structure correct?
- View logs - Any errors in execution panel?
Node Failing
- Check inputs - Are variables available?
- Verify configuration - All required fields set?
- Test integration - Is service connected?
- Review error message - What specific error?
Variable Not Found
- Check node alias - Spelled correctly?
- Verify execution order - Node executed before use?
- Check output field - Field exists in output?
- Use preview - See what data is available
Email Not Sending
- Check integration - Email service connected?
- Verify recipient - Valid email address?
- Check template - Variables resolving?
- View email logs - Delivery status?
Next Steps
With your first workflow complete, continue with:
- Using Conditions & Branches - Complex logic
- AI Nodes & Prompts - AI integration
- Testing Workflows - Debug techniques
Quick Reference
Node Connection
- Drag from output handle (right)
- Drop on input handle (left)
- Click edge to delete
Variable Syntax
{{node_alias.field}}
{{node_alias.nested.field}}
{{node_alias.array[0].field}}
Workflow States
- Draft - Not activated, testing only
- Active - Live, receiving triggers
- Inactive - Paused, not executing
Keyboard Shortcuts
| Key | Action |
|---|---|
Delete | Remove selected node |
Ctrl/Cmd + S | Save workflow |
Ctrl/Cmd + Z | Undo |
Space + Drag | Pan canvas |
Scroll | Zoom in/out |