Navigate to yStore → Marketing → Flows.
The Flow Manager is yStore's built-in visual automation engine. It lets you build workflows that fire automatically in response to store events — from a simple "send a welcome email" to multi-branch sequences with conditions, delays, A/B tests, and third-party integrations. No coding required.
Flows run in the background via the Craft queue system. Every pending flow step is evaluated on each CRON run (default: every 5 minutes). Time-delayed steps wait their full duration before the next action executes.
How flows work
Every flow follows the same structure:
Trigger → Conditions (optional) → Actions / Logic
| Component | Role |
|---|
| Trigger | The event that starts the flow |
| Condition | Optional filter — if the condition fails, the flow stops for that event |
| Action | What happens — send email, create coupon, update customer, etc. |
| Logic | Control structures — wait, branch, loop, A/B test, etc. |
Flows can have any number of actions and logic nodes arranged in any order. You can build simple linear sequences or complex branching trees.
Triggers
Triggers are the entry points for flows. Each trigger fires when a specific store event occurs and passes relevant data (the payload) into the flow.
Orders
| Trigger | When it fires | Payload |
|---|
| Order Placed | Immediately after a successful checkout | Order, customer, cart items |
| Order Status Changed | When an order moves to a specific status | Order, old status, new status |
| Order Cancelled | When an order is cancelled | Order, cancellation reason |
| Checkout Payment Failed | When a payment attempt fails at checkout | Order draft, payment method |
Cart & Abandonment
| Trigger | When it fires | Payload |
|---|
| Cart Abandoned | When a cart has not been updated for the configured timeout | Cart, customer (if logged in), items |
| Cart Total Threshold Reached | When the cart subtotal crosses a configured value | Cart, threshold, customer |
Customers
| Trigger | When it fires | Payload |
|---|
| Customer Registered | New customer account created | Customer |
| Customer Approved | Admin approves a pending account | Customer |
| Customer Rejected | Admin rejects a pending account | Customer |
| Customer Blocked | Customer is added to the banned list | Customer |
| Customer First Order | Customer completes their very first purchase | Customer, order |
| Customer Birthday | Today matches the customer's birth date | Customer |
| Customer Logged In | Customer authenticates | Customer, session |
| Customer Auth Activity | Any authentication event (login, logout, token refresh) | Customer, event type |
Marketing
| Trigger | When it fires | Payload |
|---|
| Coupon Redeemed | A coupon code is used at checkout | Coupon, customer, order |
| Newsletter Subscribed | Subscriber status becomes active | Subscriber, customer |
| Wishlist Item Added | Customer adds any product to a wishlist | Wishlist, product, customer |
| Catalog Rule Matched | A catalog price rule is applied to a product | Rule, product |
Subscriptions
| Trigger | When it fires | Payload |
|---|
| Subscription Started | Customer starts a subscription plan | Subscription, customer |
| Subscription Ended | Subscription expires or is cancelled | Subscription, reason |
Content (Craft)
| Trigger | When it fires | Payload |
|---|
| Asset Uploaded | A file is uploaded to Craft | Asset, volume |
| Asset Deleted | A file is deleted | Asset |
| Category Created | A category entry is created | Category |
| Category Updated | A category entry is saved | Category, changed fields |
Manual
| Trigger | When it fires |
|---|
| Manual Trigger | Flow is run on demand from the admin list |
Every trigger injects its payload as flow variables. You can reference them in action templates using {{ order.total }}, {{ customer.email }}, {{ coupon.code }}, etc. Use the variable picker in the node editor to browse available fields.
Conditions
Conditions are evaluated after the trigger fires. If the condition returns false, the flow branch stops for that event — other branches may continue.
Order conditions
| Condition | Options |
|---|
| Order Total | Greater than / less than / equals |
| Order Status | Is / is not a specific status |
| Product in Order | A specific product (by ID or SKU) is / is not in the order |
| Coupon Was Applied | True / false |
| Payment Method | Is / is not a specific method |
| Shipping Method | Is / is not a specific method |
Customer conditions
| Condition | Options |
|---|
| Customer Group | Is / is not in a group |
| Customer is Guest | True / false |
| Customer Order Count | Greater than / less than / equals |
| User in Group | Same as Customer Group — works for Craft users |
Date & Time conditions
| Condition | Options |
|---|
| Date Compare | Current date is before / after / equals a date |
| Time Window | Current time is within / outside a configured window |
Value conditions
| Condition | Options |
|---|
| Compare Values | Two flow variables are equal / not equal / greater / less |
| String Contains | A string variable contains / does not contain a substring |
| List Contains | A collection variable includes / excludes a value |
| Random Chance | True with a configured probability (e.g., 30%) — useful for A/B tests |
Content conditions
| Condition | Options |
|---|
| Entry Exists | A Craft entry matching a query exists / does not exist |
Actions
Actions perform operations when executed. They run sequentially by default; use Logic nodes to branch or parallelize.
Email & Messaging
- Email
- SMS
- Push & Messaging
- Mailchimp
| Action | Description |
|---|
| Send Email to Customer | Send a custom Twig-templated email to the flow's customer |
| Send Email Template | Send a saved Marketing Email Template — reusable, managed from the admin |
| Send Email to Admin | Notify a configured admin email address |
| Action | Description |
|---|
| Send SMS to Customer | Send an SMS (requires Profi SMS or SMS Brána plugin) |
| Send SMS to Admin | Notify admin via SMS |
| Action | Description |
|---|
| Send Push Notification | Send a web push notification to the customer |
| Send Telegram Message | Send a message to a Telegram channel or user (requires Telegram plugin) |
| Send Slack Notification | Post to a Slack channel via webhook |
| Send Teams Notification | Post to a Microsoft Teams channel |
| Send Discord Notification | Post to a Discord channel |
| Action | Description |
|---|
| Add to Mailchimp | Add or update a subscriber in a Mailchimp audience (requires Mailchimp credential) |
Discounts & Coupons
| Action | Description |
|---|
| Create Coupon | Generate a new coupon from an existing coupon template and attach it to the customer |
| Apply Discount | Apply a fixed or percentage discount directly to the triggering order |
| Add Reward Points | Add loyalty points to the customer's account (requires Reward Points plugin) |
| Remove Reward Points | Deduct loyalty points |
Customer Management
| Action | Description |
|---|
| Update Customer | Update customer fields (name, phone, custom fields) |
| Change User Group | Move the customer to a different Craft user group |
| Add to Segment | Tag the customer for segmentation |
| Block Customer | Add the customer to the banned customers list |
| Approve Customer | Auto-approve a pending account |
| Subscribe to Newsletter | Set subscriber status to active |
| Unsubscribe from Newsletter | Set subscriber status to unsubscribed |
Order Management
| Action | Description |
|---|
| Update Order Status | Move the order to a new status |
| Cancel Order | Cancel the triggering order |
| Add Order Note | Add an internal note to the order |
| Add Order Tag | Attach a tag to the order for filtering |
| Recalculate Order | Re-run price calculations on the order |
External & Webhooks
| Action | Description |
|---|
| Send Webhook | POST a JSON payload to any external URL |
| HTTP Request | Make a GET, POST, PUT, or DELETE request to any API |
| Run Flow | Trigger another flow by ID — for modular, reusable sub-flows |
Logic
Logic nodes control the structure of your flow — branching, looping, timing, and deduplication.
Branching
| Node | What it does |
|---|
| If / Else | Evaluate a condition and route to different branches |
| Switch | Multi-branch routing based on a variable value |
| A/B Test | Split the flow into two paths by a configured probability |
Loops & Collections
| Node | What it does |
|---|
| For Each | Iterate over a collection (e.g., order items) and run actions for each item |
| Map | Transform each item in a collection |
| Filter Collection | Remove items from a collection that do not meet a condition |
| Reduce | Aggregate a collection to a single value |
| Split | Divide a flow into parallel branches |
| Merge | Wait for all parallel branches to complete before continuing |
Timing
| Node | What it does |
|---|
| Wait (Delay) | Pause execution for a set duration (minutes, hours, days) |
| Time Window | Block execution until a certain time of day |
Rate & Safety
| Node | What it does |
|---|
| Throttle | Limit how often this flow path runs (e.g., max once per customer per day) |
| Rate Limit | Cap total executions across all customers in a time period |
| Deduplicate | Skip execution if the same trigger has fired for this customer within a window |
| Retry | Automatically retry a failed action up to a configured number of times |
| Accumulator | Collect multiple trigger events before proceeding (e.g., batch 10 events) |
| Priority Queue | Hold execution until higher-priority flows for the same customer finish |
| Batch | Process a collection in chunks (e.g., 50 items at a time) |
Use the Test button to dry-run the flow before setting it to Active. Without testing, a newly activated flow could immediately email your entire customer base depending on the trigger.
Building a flow
- Go to
yStore → Marketing → Flows.
- Click New Flow.
- Enter a name and optional description.
- Click the canvas to add the first node — select your Trigger.
- Add Condition nodes if you want to filter who this flow runs for.
- Add Action and Logic nodes by clicking
+ below any existing node.
- For multi-step sequences, insert a Wait node between steps.
- Use the Variable Picker (the
{} button in any text field) to inject flow data into templates.
- Set the flow Status to Active.
- Click Save.
Real-world examples
Abandoned cart recovery (3-step)
[Cart Abandoned]
↓
[Condition: Cart total > €10]
↓
[Send Email: "You left something behind" + cart link]
↓
[Wait: 23 hours]
↓
[Condition: Cart not yet converted]
↓
[Send Email: 5% coupon code offer]
↓
[Wait: 48 hours]
↓
[Condition: Cart still not converted]
↓
[Send Email: Final reminder]
↓
[End]
Configure how long a cart must be inactive before it counts as abandoned at yStore → Settings → Sales → Marketing → Abandoned Cart Timeout.
Welcome sequence for new subscribers
[Newsletter Subscribed]
↓
[Send Email: Welcome + 10% first-order coupon]
↓
[Wait: 3 days]
↓
[Condition: Customer has placed 0 orders]
↓
[Send Email: "Don't forget your discount" reminder]
VIP upgrade flow
[Customer First Order trigger is not needed here — use Customer Rules to move to VIP group]
[Customer Group Changed] (fired by Customer Rule when order count ≥ 5)
↓
[Condition: Customer is in "VIP" group]
↓
[Send Email: VIP welcome + exclusive discount]
↓
[Add Order Tag: "vip-enrolled"]
Email Templates
Go to yStore → Marketing → Flows → Templates tab.
Email templates are reusable, centrally managed email designs. Instead of writing HTML inline in each flow action, you build templates once and reference them in flows using Send Email Template.
Each template has:
- A name (internal identifier)
- A subject line (supports flow variables)
- An HTML body (Twig, with access to all flow variables)
- An optional plain text fallback
Templates can be updated independently of the flows that use them — changing the template updates all flows that reference it automatically.
Credentials
Go to yStore → Marketing → Flows → Credentials tab.
Credentials store API keys and connection settings for third-party integrations used inside flows (Mailchimp, Slack, custom webhook auth, etc.). Credentials are stored securely and referenced by name in action nodes.
| Field | Description |
|---|
| Name | Internal label used to select the credential in action nodes |
| Type | The integration type (Mailchimp, Slack, HTTP Bearer, HTTP Basic, etc.) |
| Configuration | Type-specific fields (API key, URL, username/password, etc.) |
Flow runs (execution history)
Go to yStore → Marketing → Flows → [Flow name] → Runs, or yStore → Logs → Automation.
Every flow execution is logged with full step-by-step detail.
| Column | Description |
|---|
| Flow | The flow that ran |
| Trigger | What event started the run |
| Status | completed, failed, running, paused |
| Started at | When the run began |
| Duration | Total elapsed time |
| Steps | Number of nodes executed |
Click any run to see the per-node execution log — including inputs, outputs, and error messages for failed steps.
If a run shows failed, open it and look for the red node. The error message usually tells you exactly what went wrong — a missing variable, a bad API response, or a condition that could not be evaluated.
Flow health
Go to yStore → Marketing → Flows → [Flow name] → Health.
The health panel shows an overview of a flow's recent execution history:
- Success rate over the last 7 / 30 days
- Most common failure reasons
- Average run duration
- Active vs. paused executions
Managing flows
| Action | How |
|---|
| Activate / Deactivate | Toggle the Status field on the flow list |
| Duplicate | Click ⋮ → Duplicate on any flow |
| Archive | Disable and move out of the active list without deleting |
| Delete | Click ⋮ → Delete (cannot be undone; run history is also deleted) |
Deleting a flow removes all its run history permanently. If you want to keep history for auditing, disable the flow instead.
Console commands
php craft yui/flow/run --id=123
php craft yui/flow/retry-failed
php craft yui/flow/cleanup