My name is Ismael Chang Ghalimi. I build the STOIC platform. I am a stoic, and this blog is my agora.

Workflows vs Processes

Having done 13 years of BPM before starting STOIC, the last thing that I wanted to hear about when starting this new company were business processes. Having gone totally gonzo for a solid third of my life on this concept, I wanted to go as far away from them as possible. Unfortunately, they’ve been catching up on me, and today I pretty much had to surrender.

For the past two years, anything that had to do with processes has been handled with what we call Workflows. Essentially, finite-state machines attached to the records of any object, with an object-specific execution model. It’s a great abstraction for most process-related use cases that you’ll ever come across, but it breaks down whenever you need cross-object process automation.

As we’re developing STOIC Education on top of STOIC CRM, we came across the need to automate complex marketing campaigns, and no matter how many times we flipped the problem around, we could not find a way to implement this use case with standard workflows. So, after much pondering, I decided to implement a BPM engine on top of the STOIC Platform. This engine is made of the following objects:

  • Processes, to define business processes
  • Steps, to define the individual steps of processes
  • Instances, to capture the instances of processes
  • States, to capture the individual steps of instances

In other words, Instances are instanciations of Processes, and States are instantiations of Steps, while Steps are components of Processes and States are components of Instances. While it’s too early to draw any conclusions, a few observations are worth making:

First, Processes differ from Workflows in the sense that Workflows are directly attached to the records of objects, while Processes are not. That being said, it should be noted that many process instances will be created by executing a Batch against a set of records. In this case, Instances will also be tightly related to the records of objects, yet their processes will execute processors that will potentially span across the records of many different objects.

Second, Workflows are modeled as finite-state machine. As such, they do not support any notion of parallelism, and this shortcoming was one of the primary reasons why I decided to create the Processes object. As a result, Processes are modeled in a very different way compared to Workflows. While workflow steps are designed by defining their multiple next steps, process steps are designed by defining their unique previous step. Consequently, Workflows have a graph structure, while Processes have a tree structure.

Third, Workflows are quite focused on human interactions, while Processes are more interested in system automation. Even though the boundary is quite fuzzy (you can invoke a Processor from a Workflow step and you can assign a human Task from a Process step), I really believe that different priorities call for different tools and different abstractions. That being said, Workflows and Processes have been designed in such a way that one can be used with the other. And when our understanding of both will reach some critical mass, we might get the necessary inspiration to fuse them back together —  who knows?…

With that in mind, we’ll try to implement this new BPM engine without writing any code. I do not know yet whether this is possible or not, but having pondered the issue for most of the day, I’m confident in saying that we should be able to go pretty far with nothing more than a few objects, some smarts operations, and a handful of processors. Of course, the user interface will have to be developed with some JavaScript code, but that’s something that can be added later on when the meta-data-driven engine has been proven to work. And if it really works, I can’t think of a better way of proving the genericity of our little platform…

This is a bit crazy (very crazy, actually), but I’ll try to implement a basic BPM engine on top of the STOIC Platform, with nothing more than meta-data. The right objects and a couple of smart operations tied to pretty fancy processors should do the trick, hopefully. Wish me luck…
This is a bit crazy (very crazy, actually), but I’ll try to implement a basic BPM engine on top of the STOIC Platform, with nothing more than meta-data. The right objects and a couple of smart operations tied to pretty fancy processors should do the trick, hopefully. Wish me luck…
This is a bit crazy (very crazy, actually), but I’ll try to implement a basic BPM engine on top of the STOIC Platform, with nothing more than meta-data. The right objects and a couple of smart operations tied to pretty fancy processors should do the trick, hopefully. Wish me luck…
This is a bit crazy (very crazy, actually), but I’ll try to implement a basic BPM engine on top of the STOIC Platform, with nothing more than meta-data. The right objects and a couple of smart operations tied to pretty fancy processors should do the trick, hopefully. Wish me luck…
This is a bit crazy (very crazy, actually), but I’ll try to implement a basic BPM engine on top of the STOIC Platform, with nothing more than meta-data. The right objects and a couple of smart operations tied to pretty fancy processors should do the trick, hopefully. Wish me luck…

This is a bit crazy (very crazy, actually), but I’ll try to implement a basic BPM engine on top of the STOIC Platform, with nothing more than meta-data. The right objects and a couple of smart operations tied to pretty fancy processors should do the trick, hopefully. Wish me luck…

Here is the new Expenses object of CRM, which will be used to track the expenses related to the organization of meetings. We now have all the objects we need in STOIC Platform and STOIC CRM to build STOIC Education. Let’s do it!
Here is the new Expenses object of CRM, which will be used to track the expenses related to the organization of meetings. We now have all the objects we need in STOIC Platform and STOIC CRM to build STOIC Education. Let’s do it!
Here is the new Expenses object of CRM, which will be used to track the expenses related to the organization of meetings. We now have all the objects we need in STOIC Platform and STOIC CRM to build STOIC Education. Let’s do it!

Here is the new Expenses object of CRM, which will be used to track the expenses related to the organization of meetings. We now have all the objects we need in STOIC Platform and STOIC CRM to build STOIC Education. Let’s do it!

Here are the new Meetings and Registrations objects of STOIC CRM. These objects are used to manage meetings and conferences, including user registrations. For the latter, waitlisting and capacity management are included. We just have to fix a tiny bug in the way workflows are being rendered (the arrow between Confirmed and Waitlisted goes the wrong way).
Here are the new Meetings and Registrations objects of STOIC CRM. These objects are used to manage meetings and conferences, including user registrations. For the latter, waitlisting and capacity management are included. We just have to fix a tiny bug in the way workflows are being rendered (the arrow between Confirmed and Waitlisted goes the wrong way).
Here are the new Meetings and Registrations objects of STOIC CRM. These objects are used to manage meetings and conferences, including user registrations. For the latter, waitlisting and capacity management are included. We just have to fix a tiny bug in the way workflows are being rendered (the arrow between Confirmed and Waitlisted goes the wrong way).
Here are the new Meetings and Registrations objects of STOIC CRM. These objects are used to manage meetings and conferences, including user registrations. For the latter, waitlisting and capacity management are included. We just have to fix a tiny bug in the way workflows are being rendered (the arrow between Confirmed and Waitlisted goes the wrong way).

Here are the new Meetings and Registrations objects of STOIC CRM. These objects are used to manage meetings and conferences, including user registrations. For the latter, waitlisting and capacity management are included. We just have to fix a tiny bug in the way workflows are being rendered (the arrow between Confirmed and Waitlisted goes the wrong way).

STOIC Pages can now be added to dashboards. With this latest addition, dashboards can now include Views, Sheets, or Pages, which is plenty enough to create the most advanced real-time dashboards. And all this is available on the mobile UI as well. Awesome!
STOIC Pages can now be added to dashboards. With this latest addition, dashboards can now include Views, Sheets, or Pages, which is plenty enough to create the most advanced real-time dashboards. And all this is available on the mobile UI as well. Awesome!
STOIC Pages can now be added to dashboards. With this latest addition, dashboards can now include Views, Sheets, or Pages, which is plenty enough to create the most advanced real-time dashboards. And all this is available on the mobile UI as well. Awesome!
STOIC Pages can now be added to dashboards. With this latest addition, dashboards can now include Views, Sheets, or Pages, which is plenty enough to create the most advanced real-time dashboards. And all this is available on the mobile UI as well. Awesome!
STOIC Pages can now be added to dashboards. With this latest addition, dashboards can now include Views, Sheets, or Pages, which is plenty enough to create the most advanced real-time dashboards. And all this is available on the mobile UI as well. Awesome!
STOIC Pages can now be added to dashboards. With this latest addition, dashboards can now include Views, Sheets, or Pages, which is plenty enough to create the most advanced real-time dashboards. And all this is available on the mobile UI as well. Awesome!

STOIC Pages can now be added to dashboards. With this latest addition, dashboards can now include Views, Sheets, or Pages, which is plenty enough to create the most advanced real-time dashboards. And all this is available on the mobile UI as well. Awesome!

Addictive

From one of our early adopters who is struggling with all our bugs:

"Otherwise, STOIC is addictive, did not stop working on it all day!"

We’re done configuring all the new platform objects that were needed for STOIC Education. Now, we can start configuring the new objects that have been added to STOIC CRM. After that, we’ll configure the objects of STOIC Education itself. We’re doing it in this order because some objects of STOIC Education will depend on new objects of STOIC CRM, and some objects of STOIC CRM will depend on new objects of STOIC Platform.

We’ve improved the look-and-feel of buttons for adding widgets on dashboards, and we’re now inserting widgets immediately after a widget that was selected earlier. With that piece working, I think we’re done with the Dashboard Editor.
We’ve improved the look-and-feel of buttons for adding widgets on dashboards, and we’re now inserting widgets immediately after a widget that was selected earlier. With that piece working, I think we’re done with the Dashboard Editor.
We’ve improved the look-and-feel of buttons for adding widgets on dashboards, and we’re now inserting widgets immediately after a widget that was selected earlier. With that piece working, I think we’re done with the Dashboard Editor.
We’ve improved the look-and-feel of buttons for adding widgets on dashboards, and we’re now inserting widgets immediately after a widget that was selected earlier. With that piece working, I think we’re done with the Dashboard Editor.
We’ve improved the look-and-feel of buttons for adding widgets on dashboards, and we’re now inserting widgets immediately after a widget that was selected earlier. With that piece working, I think we’re done with the Dashboard Editor.
We’ve improved the look-and-feel of buttons for adding widgets on dashboards, and we’re now inserting widgets immediately after a widget that was selected earlier. With that piece working, I think we’re done with the Dashboard Editor.

We’ve improved the look-and-feel of buttons for adding widgets on dashboards, and we’re now inserting widgets immediately after a widget that was selected earlier. With that piece working, I think we’re done with the Dashboard Editor.

Wow! Check this out! Before and After… Earlier this morning, we received a suggestion from our good friend Sébastien to get rid of some of the unnecessary padding that was surrounding many parts of our user interface. We briefly discussed it among ourselves, then Florian decided to take a first crack at it. And while he was at it, he made a few improvements here and there to make our design a bit flatter. This is the result. I love it!
Great work Florian! And many thanks for your suggestion Sébastien!
Wow! Check this out! Before and After… Earlier this morning, we received a suggestion from our good friend Sébastien to get rid of some of the unnecessary padding that was surrounding many parts of our user interface. We briefly discussed it among ourselves, then Florian decided to take a first crack at it. And while he was at it, he made a few improvements here and there to make our design a bit flatter. This is the result. I love it!
Great work Florian! And many thanks for your suggestion Sébastien!

Wow! Check this out! Before and After… Earlier this morning, we received a suggestion from our good friend Sébastien to get rid of some of the unnecessary padding that was surrounding many parts of our user interface. We briefly discussed it among ourselves, then Florian decided to take a first crack at it. And while he was at it, he made a few improvements here and there to make our design a bit flatter. This is the result. I love it!

Great work Florian! And many thanks for your suggestion Sébastien!

Here are the new Faxes and Letters objects, with custom forms. Scans will be stored directly on STOIC Drive, with or without an external online drive, and previews will be shown in the Scan section of the record view. These dedicated objects will make it easier to manage the inbound and outbound flow of documents, and to track all activities related to the records of objects like Cases, Opportunities, Projects, etc.
Here are the new Faxes and Letters objects, with custom forms. Scans will be stored directly on STOIC Drive, with or without an external online drive, and previews will be shown in the Scan section of the record view. These dedicated objects will make it easier to manage the inbound and outbound flow of documents, and to track all activities related to the records of objects like Cases, Opportunities, Projects, etc.

Here are the new Faxes and Letters objects, with custom forms. Scans will be stored directly on STOIC Drive, with or without an external online drive, and previews will be shown in the Scan section of the record view. These dedicated objects will make it easier to manage the inbound and outbound flow of documents, and to track all activities related to the records of objects like Cases, Opportunities, Projects, etc.

Florian just committed some major refactoring of the Dashboard Designer:
Widgets are added through simple wizards
The number of steps required to add a wizard goes from three down to one
Detailed properties are hidden by default
We still have a few cosmetic enhancements to make, but the overall user experience is dramatically improved from what it used to be. And we’re now working on the ability to show the exact same dashboards (aka slides) on the mobile user interface, with some reactive behavior. More on this very soon…
Florian just committed some major refactoring of the Dashboard Designer:
Widgets are added through simple wizards
The number of steps required to add a wizard goes from three down to one
Detailed properties are hidden by default
We still have a few cosmetic enhancements to make, but the overall user experience is dramatically improved from what it used to be. And we’re now working on the ability to show the exact same dashboards (aka slides) on the mobile user interface, with some reactive behavior. More on this very soon…
Florian just committed some major refactoring of the Dashboard Designer:
Widgets are added through simple wizards
The number of steps required to add a wizard goes from three down to one
Detailed properties are hidden by default
We still have a few cosmetic enhancements to make, but the overall user experience is dramatically improved from what it used to be. And we’re now working on the ability to show the exact same dashboards (aka slides) on the mobile user interface, with some reactive behavior. More on this very soon…
Florian just committed some major refactoring of the Dashboard Designer:
Widgets are added through simple wizards
The number of steps required to add a wizard goes from three down to one
Detailed properties are hidden by default
We still have a few cosmetic enhancements to make, but the overall user experience is dramatically improved from what it used to be. And we’re now working on the ability to show the exact same dashboards (aka slides) on the mobile user interface, with some reactive behavior. More on this very soon…
Florian just committed some major refactoring of the Dashboard Designer:
Widgets are added through simple wizards
The number of steps required to add a wizard goes from three down to one
Detailed properties are hidden by default
We still have a few cosmetic enhancements to make, but the overall user experience is dramatically improved from what it used to be. And we’re now working on the ability to show the exact same dashboards (aka slides) on the mobile user interface, with some reactive behavior. More on this very soon…
Florian just committed some major refactoring of the Dashboard Designer:
Widgets are added through simple wizards
The number of steps required to add a wizard goes from three down to one
Detailed properties are hidden by default
We still have a few cosmetic enhancements to make, but the overall user experience is dramatically improved from what it used to be. And we’re now working on the ability to show the exact same dashboards (aka slides) on the mobile user interface, with some reactive behavior. More on this very soon…
Florian just committed some major refactoring of the Dashboard Designer:
Widgets are added through simple wizards
The number of steps required to add a wizard goes from three down to one
Detailed properties are hidden by default
We still have a few cosmetic enhancements to make, but the overall user experience is dramatically improved from what it used to be. And we’re now working on the ability to show the exact same dashboards (aka slides) on the mobile user interface, with some reactive behavior. More on this very soon…
Florian just committed some major refactoring of the Dashboard Designer:
Widgets are added through simple wizards
The number of steps required to add a wizard goes from three down to one
Detailed properties are hidden by default
We still have a few cosmetic enhancements to make, but the overall user experience is dramatically improved from what it used to be. And we’re now working on the ability to show the exact same dashboards (aka slides) on the mobile user interface, with some reactive behavior. More on this very soon…
Florian just committed some major refactoring of the Dashboard Designer:
Widgets are added through simple wizards
The number of steps required to add a wizard goes from three down to one
Detailed properties are hidden by default
We still have a few cosmetic enhancements to make, but the overall user experience is dramatically improved from what it used to be. And we’re now working on the ability to show the exact same dashboards (aka slides) on the mobile user interface, with some reactive behavior. More on this very soon…
Florian just committed some major refactoring of the Dashboard Designer:
Widgets are added through simple wizards
The number of steps required to add a wizard goes from three down to one
Detailed properties are hidden by default
We still have a few cosmetic enhancements to make, but the overall user experience is dramatically improved from what it used to be. And we’re now working on the ability to show the exact same dashboards (aka slides) on the mobile user interface, with some reactive behavior. More on this very soon…

Florian just committed some major refactoring of the Dashboard Designer:

  • Widgets are added through simple wizards
  • The number of steps required to add a wizard goes from three down to one
  • Detailed properties are hidden by default

We still have a few cosmetic enhancements to make, but the overall user experience is dramatically improved from what it used to be. And we’re now working on the ability to show the exact same dashboards (aka slides) on the mobile user interface, with some reactive behavior. More on this very soon…

Pascal finally delivered many of the bug fixes related to the new meta-data cache that he had been working on for the past couple of weeks. This is taking us a lot closer to our goal of flushing our entire Pivotal Tracker out by August 18. We’re on a roll…

This one is pretty cool too: on the left-side panel, you can see all the field values of the record that was previoiusly shown on the Record View before the Expression Editor was open in order to edit a complex formula. For relationship fields, you can also see all the fields values of a related record, like stc_survey on the second screenshot. From there, you can click on a related field, and it will automatically add a FIELD expression in the formula editor in order to lookup this related field value. This is important, because for most records the shorter expression like record.stc_survey.stc_name would not work because the record loaded by default without relation pre-fetching (in order to improve performance).
This one is pretty cool too: on the left-side panel, you can see all the field values of the record that was previoiusly shown on the Record View before the Expression Editor was open in order to edit a complex formula. For relationship fields, you can also see all the fields values of a related record, like stc_survey on the second screenshot. From there, you can click on a related field, and it will automatically add a FIELD expression in the formula editor in order to lookup this related field value. This is important, because for most records the shorter expression like record.stc_survey.stc_name would not work because the record loaded by default without relation pre-fetching (in order to improve performance).
This one is pretty cool too: on the left-side panel, you can see all the field values of the record that was previoiusly shown on the Record View before the Expression Editor was open in order to edit a complex formula. For relationship fields, you can also see all the fields values of a related record, like stc_survey on the second screenshot. From there, you can click on a related field, and it will automatically add a FIELD expression in the formula editor in order to lookup this related field value. This is important, because for most records the shorter expression like record.stc_survey.stc_name would not work because the record loaded by default without relation pre-fetching (in order to improve performance).

This one is pretty cool too: on the left-side panel, you can see all the field values of the record that was previoiusly shown on the Record View before the Expression Editor was open in order to edit a complex formula. For relationship fields, you can also see all the fields values of a related record, like stc_survey on the second screenshot. From there, you can click on a related field, and it will automatically add a FIELD expression in the formula editor in order to lookup this related field value. This is important, because for most records the shorter expression like record.stc_survey.stc_name would not work because the record loaded by default without relation pre-fetching (in order to improve performance).