line

Workflow Engine Built For Developers

Deliver world-class business processes as if you were hundreds of developers.

Zenaton workflow engine

Gain Superpowers

Whatever the size of your technical team, Zenaton empowers you to deliver world-class processes.

speed icon

x5 your speed to deliver new workflows

Implement sophisticated business processes, long-running marketing scenarios or data pipelines in a fraction of the time it usually takes.

productivity icon

Improve your team's productivity

Simplify the process of implementing workflows. When using Zenaton, there is no need to store transient states, write database requests or run cron jobs.

agile icon

Build a more agile company

Easily iterate or A/B test your business processes. Test if adding a moderation process will impact your KPIs or A/B test whether its more efficient to wait 2 vs 3 days for a valiation.

up to date icon

Ensure your processes documentation is up-to-date

The business logic is easy to read in the code - and it is always up to date and accurate. There is no need to maintain separate documentation.

readability icon

Improve your code readability

Zenaton allows you to separate tasks and workflows. The code describing your processes is well defined and easy to read for everyone on the team.

communication icon

Improve communication within your teams

Zenaton dashboards allow all of your teams including tech, product, support and marketing - to easily see how your processes are performing.

Zenaton workflow

Workflow as code

Zenaton provides a new revolutionary way to orchestrate distributedexecutions to build business processes as easily as you describe them.Just define the sequence of tasks as simply as if everything were local. Zenaton abstracts all the complexity from you.

<?php

use Zenaton\Interfaces\WorkflowInterface;
use Zenaton\Traits\Zenatonable;

class SequentialWorkflow implements WorkflowInterface
{
    use Zenatonable;

    public function handle()
    {
        $a = (new TaskA)->execute();

        if (0 < $a) {
            (new TaskB)->execute();
        } else {
            (new TaskC)->execute();
        }

        (new TaskD)->execute();
    }
}
<?php

use Zenaton\Interfaces\WorkflowInterface;
use Zenaton\Traits\Zenatonable;
use Zenaton\Parallel\Parallel;

class ParallelWorkflow implements WorkflowInterface
{
    use Zenatonable;

    public function handle()
    {
        [$a, $b] = (new Parallel(
            new TaskA,
            new TaskB
        ))->execute();

        if ($a > $b) {
            (new TaskC)->execute();
        } else {
            (new TaskD)->execute();
        }
    }
}
<?php

use Zenaton\Interfaces\WorkflowInterface;
use Zenaton\Traits\Zenatonable;

class AsynchronousWorkflow implements WorkflowInterface
{
    use Zenatonable;

    public function handle()
    {
        (new TaskA)->dispatch();
        (new TaskB)->dispatch();
        (new TaskC)->execute();
        (new TaskD)->execute();
    }
}

Time-based and Event-based orchestration

Zenaton is especially powerful when used to orchestrate workflows with triggersbased on time and external events.

TIME
<?php

use Zenaton\Interfaces\WorkflowInterface;
use Zenaton\Traits\Zenatonable;

class SequentialWorkflow implements WorkflowInterface
{
    use Zenatonable;

    public function handle()
    {
        $a = (new TaskA)->execute();

        if (0 < $a) {
            (new TaskB)->execute();
        } else {
            (new TaskC)->execute();
        }

        (new TaskD)->execute();
    }
}
WAIT 5S
<?php

use Zenaton\Interfaces\WorkflowInterface;
use Zenaton\Tasks\Wait;
use Zenaton\Traits\Zenatonable;

class WaitWorkflow implements WorkflowInterface
{
    use Zenatonable;

    public function handle()
    {
        (new TaskA())->execute();

        (new Wait())->seconds(5)->execute();

        (new TaskB())->execute();
    }
}
TIME
<?php

use Zenaton\Interfaces\WorkflowInterface;
use Zenaton\Tasks\Wait;
use Zenaton\Traits\Zenatonable;

class WaitEventWorkflow implements WorkflowInterface
{
    use Zenatonable;

    protected $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

    public function handle()
    {
        $event = (new Wait(MyEvent::class))->seconds(4)->execute();

        if ($event) {
            (new TaskA)->execute();
        } else {
            (new TaskB)->execute();
        }
    }

    public function getId()
    {
        return $this->id;
    }
}

Using code versatility

Building workflows in code lets you use the native versatility of yourpreferred programming language. Use and combine controlstructure (if, else, for each, while, ...) as well as whatever data structureand functions (map, filter, array...).