{"id":50573505,"url":"https://github.com/abderrahimghazali/sylius-workflow-plugin","last_synced_at":"2026-06-04T20:30:31.625Z","repository":{"id":347706187,"uuid":"1194987730","full_name":"abderrahimghazali/sylius-workflow-plugin","owner":"abderrahimghazali","description":"Visual marketing automation engine with node-based canvas editor for Sylius 2.x","archived":false,"fork":false,"pushed_at":"2026-04-06T19:15:32.000Z","size":10394,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-07T18:21:27.610Z","etag":null,"topics":["automation","ecommerce","marketing","php","react-flow","sylius","sylius-plugin","symfony","workflow"],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/abderrahimghazali.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-29T04:11:48.000Z","updated_at":"2026-04-18T12:37:05.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/abderrahimghazali/sylius-workflow-plugin","commit_stats":null,"previous_names":["abderrahimghazali/sylius-workflow-plugin"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/abderrahimghazali/sylius-workflow-plugin","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abderrahimghazali%2Fsylius-workflow-plugin","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abderrahimghazali%2Fsylius-workflow-plugin/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abderrahimghazali%2Fsylius-workflow-plugin/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abderrahimghazali%2Fsylius-workflow-plugin/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/abderrahimghazali","download_url":"https://codeload.github.com/abderrahimghazali/sylius-workflow-plugin/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/abderrahimghazali%2Fsylius-workflow-plugin/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33917202,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-04T02:00:06.755Z","response_time":64,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","ecommerce","marketing","php","react-flow","sylius","sylius-plugin","symfony","workflow"],"created_at":"2026-06-04T20:30:30.509Z","updated_at":"2026-06-04T20:30:31.607Z","avatar_url":"https://github.com/abderrahimghazali.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://sylius.com\" target=\"_blank\"\u003e\n        \u003cpicture\u003e\n            \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://media.sylius.com/sylius-logo-800-dark.png\"\u003e\n            \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://media.sylius.com/sylius-logo-800.png\"\u003e\n            \u003cimg alt=\"Sylius Logo\" src=\"https://media.sylius.com/sylius-logo-800.png\" width=\"300\"/\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eSylius Workflow Plugin\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n    Visual marketing automation engine with a node-based canvas editor for \u003ca href=\"https://sylius.com\"\u003eSylius 2.x\u003c/a\u003e stores.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/abderrahimghazali/sylius-workflow-plugin/actions/workflows/ci.yaml\"\u003e\u003cimg src=\"https://github.com/abderrahimghazali/sylius-workflow-plugin/actions/workflows/ci.yaml/badge.svg\" alt=\"CI\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/abderrahimghazali/sylius-workflow-plugin\"\u003e\u003cimg src=\"https://img.shields.io/packagist/v/abderrahimghazali/sylius-workflow-plugin.svg\" alt=\"Latest Version\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/abderrahimghazali/sylius-workflow-plugin\"\u003e\u003cimg src=\"https://img.shields.io/packagist/php-v/abderrahimghazali/sylius-workflow-plugin.svg\" alt=\"PHP Version\"/\u003e\u003c/a\u003e\n    \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"License\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/abderrahimghazali/sylius-workflow-plugin\"\u003e\u003cimg src=\"https://img.shields.io/badge/sylius-2.x-green.svg\" alt=\"Sylius 2.x\"/\u003e\u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/abderrahimghazali/sylius-workflow-plugin\"\u003e\u003cimg src=\"https://img.shields.io/badge/symfony-7.x-black.svg\" alt=\"Symfony 7.x\"/\u003e\u003c/a\u003e\n    \u003cimg src=\"https://img.shields.io/badge/PHPStan-level%205-brightgreen.svg\" alt=\"PHPStan Level 5\"/\u003e\n\u003c/p\u003e\n\n---\n\n## Screenshots\n\n### Canvas Editor — Visual Node-Based Workflow Builder\n![Canvas Editor](docs/images/canvas-editor.png)\n\n### Workflow List — Admin Grid\n![Workflow List](docs/images/workflow-list.png)\n\n### Run Detail — Execution Timeline\n![Run Detail](docs/images/run-detail.png)\n\n## Features\n\n- **Visual workflow builder** — design automation flows on a drag-and-drop canvas, no code required\n- **Branching logic** — condition nodes split into \"Then\" and \"Otherwise\" paths for different customer journeys\n- **Automated emails** — send personalized emails triggered by order events, registrations, or cart abandonment\n- **Coupon generation** — automatically create unique discount codes and deliver them to customers\n- **Delayed actions** — schedule follow-ups hours or days after an event (e.g. review request 7 days after purchase)\n- **Customer tagging** — segment customers automatically based on their behavior and order history\n- **Webhook integration** — push data to external CRMs, analytics tools, or any API endpoint\n- **8 ready-to-use templates** — install pre-built workflows in one click: abandoned cart recovery, welcome series, birthday coupon, win-back campaigns, and more\n- **Test run mode** — preview the execution path against a real order or customer without sending anything\n- **Execution log** — see exactly what happened in every workflow run, node by node, with timestamps\n- **Multiple workflows per event** — run several workflows on the same trigger (e.g. 3 different flows on order completion)\n- **Deduplication** — prevents the same workflow from firing twice for the same customer on the same day\n- **Works with existing plugins** — integrates with [sylius-loyalty-plugin](https://github.com/abderrahimghazali/sylius-loyalty-plugin) for loyalty points, degrades gracefully if not installed\n\n## Requirements\n\n| Requirement | Version |\n|-------------|---------|\n| PHP | ^8.2 |\n| Sylius | ^2.1 |\n| Symfony | ^7.0 |\n| Node.js | ^20 (for building canvas assets) |\n\n## Installation\n\n1. Require the plugin:\n\n```bash\ncomposer require abderrahimghazali/sylius-workflow-plugin\n```\n\n2. Register the bundle in `config/bundles.php` (if not auto-discovered):\n\n```php\nreturn [\n    // ...\n    Abderrahim\\SyliusWorkflowPlugin\\SyliusWorkflowPlugin::class =\u003e ['all' =\u003e true],\n];\n```\n\n3. Import routes — create `config/routes/sylius_workflow.yaml`:\n\n```yaml\nsylius_workflow:\n    resource: '@SyliusWorkflowPlugin/config/routes.yaml'\n```\n\n4. Generate and run the migration:\n\n```bash\nbin/console doctrine:migrations:diff\nbin/console doctrine:migrations:migrate\n```\n\n5. Build the React canvas assets:\n\n```bash\ncd vendor/abderrahimghazali/sylius-workflow-plugin\nnpm install --prefix assets\nnpx webpack --mode production\n```\n\nThen symlink the built file to your public directory:\n\n```bash\nbin/console assets:install public\n```\n\n## Usage\n\n### Creating a Workflow\n\n1. Navigate to **Marketing \u003e Automation Workflows** in the admin sidebar\n2. Click **New workflow** — enter a name and description\n3. You'll be redirected to the **canvas editor** with a default trigger node\n4. Add nodes from the **+ Add Node** dropdown (Condition, Action, Delay)\n5. Connect nodes by dragging from the **Then** handle to the entry handle\n6. Configure each node by clicking it — the right panel shows type-specific fields\n7. Click **Save** to validate and persist the graph\n8. Toggle **Activate** when ready\n\n### Installing a Template\n\n1. Go to **Marketing \u003e Automation Workflows**\n2. Click **Browse Templates** (or navigate to `/admin/workflows/templates`)\n3. Browse the 8 pre-built workflows by category\n4. Click **Install Template** — creates a draft workflow you can customize before activating\n\n### Test Run\n\n1. Open any workflow in the canvas editor\n2. Click **Test Run** in the toolbar\n3. Select a subject type (Order or Customer) and enter an ID\n4. The dry-run evaluates conditions for real but skips all actions\n5. The canvas highlights the execution path: green = passed, amber = skipped\n\n### Run Log\n\n1. From the workflow list, click **View Runs** on any workflow\n2. See all execution history with status badges (completed/failed/skipped/running)\n3. Click **View Details** to see the node-by-node execution timeline\n\n## Node Reference\n\n### Trigger Events\n\n| Event | Description |\n|-------|-------------|\n| `order.completed` | Fires when an order is completed |\n| `order.cancelled` | Fires when an order is cancelled |\n| `order.shipped` | Fires when an order is shipped |\n| `cart.abandoned` | Fires when a cart is abandoned |\n| `customer.registered` | Fires when a new customer registers |\n| `customer.birthday` | Fires on a customer's birthday |\n| `loyalty.tier_upgraded` | Fires when a loyalty tier is upgraded |\n| `payment.failed` | Fires when a payment fails |\n\n### Condition Rules\n\n| Rule | Operators | Description |\n|------|-----------|-------------|\n| `order_total` | is, is_not, gt, lt, gte, lte | Compare order total (in cents) |\n| `customer_first_order` | is, is_not | Check if this is the customer's first order |\n| `customer_tag` | is, is_not, contains | Check customer tags |\n| `customer_country` | is, is_not | Check customer address country code |\n| `loyalty_tier` | is, is_not | Check loyalty tier name |\n| `workflow_run_count` | is, is_not, gt, lt, gte, lte | How many times this workflow ran for this customer |\n\n### Action Types\n\n| Action | Config Fields | Description |\n|--------|--------------|-------------|\n| `send_email` | template, subject | Send an email via Symfony Mailer |\n| `generate_coupon` | promotion, discount, expires_in_days | Create a Sylius promotion coupon |\n| `add_customer_tag` | tag | Add a tag to the customer |\n| `remove_customer_tag` | tag | Remove a tag from the customer |\n| `add_loyalty_points` | amount, reason | Award loyalty points (requires loyalty plugin) |\n| `send_webhook` | url, method | Send an HTTP POST/PUT to an external URL |\n| `add_order_note` | note | Append a note to the order |\n\n## Built-in Templates\n\n| Template | Trigger | Flow |\n|----------|---------|------|\n| Abandoned Cart Recovery | cart.abandoned | Wait 1h \u003e Send email |\n| Post-Purchase Review | order.completed | Wait 7d \u003e First order? \u003e Send email |\n| Win Back Inactive | cart.abandoned | Generate coupon \u003e Send email |\n| Birthday Coupon | customer.birthday | Generate coupon \u003e Send email |\n| Loyalty Tier Upgrade | loyalty.tier_upgraded | Send email \u003e Add 50 points |\n| New Customer Welcome | customer.registered | Wait 1h \u003e Send email |\n| Post-Purchase Upsell | order.completed | Wait 3d \u003e First order? \u003e Send email |\n| Payment Failed Recovery | payment.failed | Wait 2h \u003e Send email |\n\n## Integration\n\n### Loyalty Plugin\n\nIf [`abderrahimghazali/sylius-loyalty-plugin`](https://github.com/abderrahimghazali/sylius-loyalty-plugin) is installed, the **Add Loyalty Points** action dispatches events to it. If not installed, the action logs a warning and skips gracefully.\n\n### Upsell Plugin\n\nThe **Post-Purchase Upsell** template works independently but can be enhanced with [`abderrahimghazali/sylius-upsell-plugin`](https://github.com/abderrahimghazali/sylius-upsell-plugin) for product recommendation data.\n\n## Testing\n\n```bash\n# PHP tests\nvendor/bin/phpunit\n\n# Static analysis\nvendor/bin/phpstan analyse\n\n# Build JS assets\ncd assets \u0026\u0026 npm install \u0026\u0026 cd .. \u0026\u0026 npx webpack --mode production\n```\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabderrahimghazali%2Fsylius-workflow-plugin","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fabderrahimghazali%2Fsylius-workflow-plugin","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fabderrahimghazali%2Fsylius-workflow-plugin/lists"}