Introducing Workflows and a New Starter 🌱 Edition in SaasRock v0.9.2

Alexandro Martinez
4 min readNov 27, 2023

--

Hey there! With SaasRock Workflows in the fresh v0.9.2 release, tackling complex tasks just got a whole lot easier with no-code. Also, a new Starter edition has been released!

TLDR: Watch a 1-min demo.

Summarizing the v0.9.2 release:

SaasRock v0.9.2 — Workflow Builder + Starter Edition

Why is this not v1.0 yet? Help Desk and Affiliates are the 2 missing features. But in order to build Help Desk, I needed to build a workflow engine first.

Concepts

  • Blocks: Triggers and Actions.
  • Variables and Credentials: Global variables and encrypted credentials.
  • Executions: A single run of a Workflow.
  • Workflow Context: Inputs and Outputs within a workflow execution.

Execution Modes

Choose between different modes for triggering a workflow:

  • Manual: Manually trigger a Workflow.
  • API 🪨: Use the API to trigger a Workflow @ /api/workflows/run/$id.
  • Stream 🚀: Get updates from a stream (chat-like).

Tenants/Accounts can also create and run their own Workflows 🪨.

Workflow Features

There are 4 workflows editions:

See the full feature comparison in the following table.

Workflow Features Comparison

Workflow Blocks

Triggers

  • Manual: By clicking a button
  • Row Event 🚀: created, updated, deleted

Actions

  • IF: True and False paths
  • HTTP Request: Set method, URL, Body, and Headers
  • Log: Logs to the system
  • Alert User: Sends alert to current user
  • Switch 🪨: Default, case1, case2… etc, paths
  • Iterator 🪨: For loop using a variable
  • Variable 🪨: Set a context variable
  • Wait for Input 🚀: Waits for user input (support in Manual, API, and streaming)
  • GPT Chat Completion 🚀: Call OpenAI API
  • Row Get 🚀: Create an entity row
  • Row Create 🚀: Create an entity row
  • Row Update 🚀: Update an entity row
  • Row Delete 🚀: Delete an entity row

Plus, on the Enterprise Edition 🚀, I’ll work on (long-term):

  • Crons support (Sleep, Delayed until…)
  • Send Emails
  • Global workflows (create a workflow in the admin dashboard for all tenants)
  • Advanced Workflow Analytics (i.e. percentages paths in a funnel)

Variables and Credentials

Variables

Sometimes it’s useful to have a global state. For example, you may have multiple GPT blocks across many workflows, and if there’s a new model released, you could create a variable {{$vars.gptModel}}.

Credentials

In the case of credentials 🚀, the only difference between them is that they’re encrypted before storing and decrypted before using it, click here to see the method.

Workflow Context

A workflow execution will always have an output similar to this:

{
"$params": {},
"$session": {
"tenant": {},
"user": {},
},
"$vars": {},
...blocksOutputs
}

Explanation:

  • $params: Every execution starts with a JSON input
  • $session.tenant: If the execution is on the admin side, it’s null
  • $session.user: If the execution is not started manually by a user, it’s null
  • $vars: Global variables are injected

Finally, each executed block will have a value with the block name. For example, the following output is from the “GPT Simulator” workflow template.

{
"$params": {},
"$session": { "tenant": null, "user": null },
"$vars": {
"gptModel": "gpt-3.5-turbo"
},
"waitForInput": {
"input": "Hi"
},
"if": {
"condition": false,
"expression": "{{waitForInput.input}} Equals bye"
},
"gpt": {
"result": "Hello! How can I assist you today?"
}
}

Using Variables

Since the workflow context has everything you need from the workflow execution, you now can access values from previous blocks. Using the previous example:

  • {{gpt.result}} will be “Hello! How can I assist you today?”
  • {{$session.tenant}} will be an empty string
  • {{$credentials.OPENAI_API_KEY}} will decrypt the value on the fly and destroy it

This is possible thanks to Handlebars.js.

Workflow Templates

I created a few templates that use every supported block, some of them are Core and/or Enteprise-only.

Workflow Templates

Input Examples

While building and testing your workflows, it’s useful to set a few input examples instead of having to type the input body every time. For example:

  • Existing item: The input is { id: 10 }, so you know the workflow must go through the success path
  • ID parameter not provided: This tests that the initial execution (manually, via the API, or in streaming mode) is sent correctly.

And so on.

Input Validation

The Manual Trigger has a special “validation” field that receives a JSON configuration. This validates the schema using Ajv JSON schema validator:

{
"type": "object",
"properties": {
"id": {
"type": "number"
}
},
"required": [
"id"
]
}

You can create any necessary validation schema to ensure the correct execution of a workflow.

I hope you’re as excited as I am for workflows!

Let me know what you think on the Discord server or subscribe to my newsletter to get notified on new saasrock features.

--

--

Alexandro Martinez

Building SaasRock, The One-Man SaaS Framework built with Remix + Tailwind CSS