Flow Engine v1.0
Part of CloudWizard Email Suite
Flow Engine runs timed, multi-step email sequences — welcome series, onboarding drips, nurture flows — triggered either automatically when a subscriber confirms onto an Audience Manager list, or manually. A cron job checks every few minutes for enrollments due to receive their next step. It sends independently, with its own bundled mailer — Mail Engine is an optional enhancement, not a requirement.
Requirements
| Requirement | Detail |
|---|---|
| PHP | 8.1 or higher |
| MariaDB / MySQL | 5.7+ / 10.3+ |
| Web server | Nginx or Apache |
| Outgoing mail | SMTP credentials configured in the controller's shared Settings |
| Cron access | A way to trigger a URL or run a PHP script every 5-15 minutes |
Step 1 — Install the Controller
Flow Engine runs inside the CloudWizard Controller. The controller handles authentication, shared database config, and module detection. Install it first.
Upload the controller
Unzip the download. It holds one folder, CW/, with the controller and Flow Engine inside. Upload that whole folder to a directory on your server — typically public_html/CW/. The controller part looks like this:
public_html/CW/
bootstrap.php
config_path.php
admin/
index.php
login.php
logout.php
settings.php
setup.php
style.css
...
Run the setup wizard
Visit https://yourdomain.com/CW/admin/setup.php to run the wizard. Fill in:
- Database — host, name, username, password, table prefix (default:
cw_) - SMTP — outgoing mail server credentials and sender address
- Admin password — minimum 8 characters
- Site URL — your public domain
Click Complete setup. The config file is written outside your webroot where possible.
Log in
You're redirected to the login page. Enter your admin password to reach the CloudWizard dashboard.
Step 2 — Install Flow Engine
Upload the module
The module is already inside the zip you just uploaded, at CW/FlowEngine/. Adding it to an existing CloudWizard install instead? Don't upload the whole CW/ folder again: copy this module's FlowEngine/ folder into your existing controller directory, together with the short-URL files fo.php, fc.php, and u.php (if you don't already have it from another module), and the vendor/ folder if you do not already have CW/vendor/, then reload the dashboard. Its file layout:
public_html/CW/FlowEngine/
module.php
bootstrap.php
cron.php
click.php ← public endpoint, click tracking
track_open.php ← public endpoint, open tracking
admin/
_bootstrap.php
index.php ← Overview
flows.php ← Flow list
flow_edit.php ← Create/edit a flow and its steps
enrollments.php
step_preview.php
step_preview_post.php
Flow Engine sends via a shared PHPMailer library at CW/vendor/ — installed once with the controller, used by every module. No separate Flow Engine dependency to worry about.
Verify detection
Reload the controller dashboard. The Flow Engine card should show Open →.
Step 3 — Activate your license
Get your license key
Whether you purchase through cloudwizard.eu or via Gumroad, your license key is shown on the confirmation page and emailed to you. Format: XXXX-XXXX-XXXX.
Enter the key
In the controller go to Settings → License key, paste it, and click Save settings. The key is verified against the CloudWizard license server immediately.
Step 4 — Set up the cron job
Nothing sends without this. Flow Engine's cron.php checks for enrollments due their next step and enrolls newly-confirmed subscribers into signup-triggered flows. Open Flow Engine → Overview for the exact command generated for your install:
| Option | When to use it |
|---|---|
A — URL (wget) | Works on any host with outbound HTTP access from cron; the URL includes a per-install secret key so it can't be triggered by anyone else |
| B — PHP (direct) | Runs the script directly via the PHP CLI — no key needed, since reaching it this way already requires shell access to the server |
Add it under Virtualmin → Scheduled Cron Jobs, running every 5-15 minutes — more frequent than that gains little, since step delays are rarely shorter.
Overview
Flow Engine → Overview is the landing page: active flows, active/completed/failed enrollment counts, total sent, cron status, and the cron setup block above.
Flows
Flow Engine → Flows lists every flow with its trigger type, step count, active/completed enrollment counts, and status. Click + New flow to create one:
| Field | Notes |
|---|---|
| Flow name | Internal label |
| Trigger | On signup / list confirmation — enrolls automatically when a subscriber confirms onto the selected Audience Manager list; Manual enrollment — no automatic trigger |
| AM List | Only shown if Audience Manager is installed. Leave as "any list" to trigger from any confirmed signup |
| Status | Draft, Active, or Paused — only Active flows process enrollments |
Pause/Activate toggles a flow without deleting anything. Delete removes the flow along with every step and enrollment — this cannot be undone.
Steps & the step editor
Once a flow is saved, add steps with + Add step. Each step is one email in the sequence:
| Field | Notes |
|---|---|
| Delay | A number plus minutes/hours/days — time after the previous step (0 = send immediately on enrollment, for the first step) |
| Template | Optional, and only available if Mail Engine is installed — merges the step into a Mail Engine template. Without Mail Engine, this field is replaced with a note and steps send as plain content |
| CTA button | Optional. If the selected template contains a {{cta_url}} (or older [cta_url]) placeholder, fill these in to have a real button link to somewhere specific |
| Load AI draft | Only shown if AI Writer has generated drafts — pulls Subject/Preheader/Headline/Message from one |
| Subject / Preheader / Headline | Standard fields, supports a {{first_name}} merge tag |
| Message | Rich-text editor |
When a template is selected, it's merged in using the same placeholders Mail Engine templates use: {{preheader}} {{headline}} {{message}} {{tracker}} {{unsubscribe}} {{sender_name}} {{cta_url}} {{cta_text}} — the older square-bracket form works too, for templates built before this naming existed.
Use the ↑/↓ arrows in the steps table to reorder — delays are always relative to the step before, so reordering changes actual send timing, not just display order.
Preview & test send
While editing an existing step, Preview → saves your current edits and opens a modal showing the step rendered with its template applied (if one is selected). Send test reveals a small inline form to send that exact step to one address immediately, using Flow Engine's own mailer — useful for checking how it actually looks in an inbox before it goes live in the sequence.
Enrollments
Click Subscribers on any flow in the Flows list to see everyone enrolled in it — their current step, status (active/completed/failed), and next scheduled send time.
Running without Mail Engine
Flow Engine ships its own copy of PHPMailer and sends every step independently — it does not require Mail Engine to be installed. The only thing Mail Engine adds is templates: without it, the Template field in the step editor is simply unavailable, and steps send as plain HTML with no template merge.
Running without Audience Manager
Flow Engine runs standalone without Audience Manager too, with one real limit: since a signup-triggered flow is inherently about matching a confirmed list signup to a flow, that trigger type genuinely needs Audience Manager's subscriber/list data to work at all. Without Audience Manager:
- Signup-triggered flows never auto-enroll anyone — there's no signup event to trigger from. Manual enrollment flows are unaffected.
- The AM List and Exit list fields on a flow simply don't appear.
- The Enrollments page still works, just without a subscriber's name — only email, step, and status are shown.
Security
- Always use HTTPS. Enrollment and subscriber data should never travel over plain HTTP.
- The cron URL contains a secret key — don't share it publicly. The key is only checked for the URL-based option; running the script directly on the server requires no key, since shell access is already a higher trust level.
- Restrict admin access by IP if possible, in Nginx:
allow 1.2.3.4; deny all;
Troubleshooting
| Error | Cause | Fix |
|---|---|---|
| Enrollments never advance to the next step | Cron isn't running, or isn't running often enough | Check cron status on the Overview page; confirm the schedule matches your shortest step delay. |
| New signups aren't auto-enrolling | Flow's trigger is set to Manual, its status isn't Active, or Audience Manager isn't installed | Confirm trigger type, flow status, and that the subscriber actually confirmed (not just pending) on the matching list. |
| Template field missing in the step editor | Mail Engine isn't installed — expected, see Running without Mail Engine | Install Mail Engine if you want template support; otherwise steps send as plain content as designed. |
| Reordering steps changed send timing unexpectedly | Delays are relative to the step before, not fixed dates | Expected behavior — review each step's delay after reordering. |
| Test send or live send fails with an SMTP error | SMTP misconfigured in the controller's shared settings | Verify SMTP host/port/credentials under Settings. |
| Module not detected on dashboard | module.php missing or not readable |
Confirm CW/FlowEngine/module.php exists. Restart PHP-FPM: systemctl restart php8.3-fpm |
| License key not accepted | Wrong key format or server can't reach cloudwizard.eu | Key format: XXXX-XXXX-XXXX. Check outbound HTTPS: curl -s https://cloudwizard.eu/license/ping.php |
| 500 error on admin pages | DB error, missing table, or file permissions | tail -20 /home/yourusername/logs/php_log |
CloudWizard Email Suite — Flow Engine v1.0
cloudwizard.eu —
support@cloudwizard.eu