Streamline operations and eliminate manual tasks with intelligent, scalable workflow automation that executes backend processes, responds to events, and adapts to your business logic in real time.
Workflow Automation
What Is Workflow Automation?
Workflow automation is the process of designing and executing logic-driven flows that can perform backend operations without constant human intervention. These workflows consist of modular actions - such as triggering an API, processing data, or making decisions - that run based on specific conditions or events.
The workflow engine is built to be secure, flexible, and reliable. Whether you're connecting different systems, handling data, or automating everyday tasks, it adapts to your needs and grows with your business.

Workflow Engine
Parallel & sequential execution, full traceability, resilient by design
The workflow engine orchestrates complex backend automations with precision. It can run nodes in parallel or sequentially, captures a detailed execution log/trace for every run, gracefully handles errors, and exposes a clean, API‑first surface for triggering and inspecting workflows programmatically.

Execution Model
Workflows support both sequential and parallel execution, allowing tasks to run in order or simultaneously based on your logic. Built-in conditional branching enables intelligent data-driven decisions, making your automation flows highly adaptive and efficient.

Observability & Logs
Every node records inputs, outputs, timestamps, and
duration.
A per‑run runId
plus node‑level tracing makes debugging and
auditing straightforward.

Error Handling & Resilience
Structured errors, safe client messages, optional retries, and fallback paths ensure that one bad item never takes the whole run down.

Input & Output Mapping
Node parameters are dynamically handled using a custom template
language.
This allows referencing previous node outputs (e.g.
{{nodeId.field}}
) and injecting
fallback values or dynamic expressions without writing extra logic.

API
Workflows can be created, edited, triggered, and monitored entirely via a REST/HTTP API (or SDK/CLI), giving developers full programmatic control over automation. Whether you're triggering flows (manually, on a schedule, or in response to events), passing dynamic inputs, or retrieving execution logs and traces-our API makes it seamless to integrate workflows into any system.

Secure & Extensible
Credentials are injected securely at runtime and are strongly encrypted during transmission and storage. Nodes can also attach to custom storage backends (e.g., Postgres, Redis, S3) for persistence, isolation, and idempotency.
Workflow Triggers
Different ways to initiate workflows
Workflows can be initiated in various ways, allowing you to automate tasks based on your specific requirements. Here are the main trigger types we support:

Manual
Execute workflows instantly on demand through a user interface, CLI command, or API call. This gives teams direct control and flexibility when automation isn’t continuously needed.

Scheduled
Automatically initiate flows at predefined intervals using cron expressions or similar time-based rules - perfect for routine checks, reports, or recurring background jobs.

Event-Driven
Trigger workflows dynamically in response to real-time events from external systems. Use webhooks, message queues, or app signals to create fully reactive and integrated processes.
Workflow Nodes
Building blocks of your automation logic
Each workflow consists of modular nodes that perform specific actions. These nodes can be combined to create complex workflows that automate your backend processes. Here are the main types of nodes we support:

API & Service Calls
Enable your workflows to communicate with external services through RESTful APIs or internal endpoints. This is useful for pushing data to CRMs, triggering third-party systems, sending notifications, or retrieving real-time information from integrated platforms.

Data Processing
Clean, transform, enrich, or reshape incoming data as it moves through your workflow. Ideal for parsing structured content (like JSON), formatting messages, validating input, or mapping between systems before execution or storage.

Logic & Branching
Introduce dynamic behavior in your flows by evaluating conditions and branching accordingly. This enables intelligent routing - such as checking if data is valid, whether a record already exists, or deciding which service to trigger next.

Error Handling
Build resilient workflows with error detection, automatic retries, timeouts, and fallback paths. This ensures that transient issues (e.g. failed API calls or missing input) don’t cause system-wide failures or lost data.

AI
Integrate AI models directly into workflows. These nodes enhance automation with summaries, categorization, translation, and intelligent text generation based on your input.

Node Definition
Every node is described using a standardized definition object. This definition outlines expected inputs, outputs, configuration parameters, and credentials - making integration with the Workflow API clean, validated, and developer-friendly.
Example of a chatGPT prompt node definition
This file defines the schema, configuration, and metadata for the OpenAI ChatGPT prompt node. It includes input validation, output structure, and credentials management. The definition file is used to describe the node's behavior and integration with the workflow system.
Each node in the system is defined with a similar schema.
import { z } from 'zod';
import createNodeDefinition from '../../../../types/CreateNodeDefinition';
//Supported OpenAI Engines
const OpenAIEngines = z.enum([
'gpt-4o',
'gpt-4',
'gpt-4-turbo',
'gpt-3.5-turbo',
'gpt-3.5-turbo-16k',
]);
//Input Schema
const InputSchema = z
.object({
prompt: z.string().describe('Full prompt text to send to OpenAI'),
})
.passthrough();
//Config Schema
const ConfigSchema = z.object({
engine: OpenAIEngines.describe('OpenAI model to use').default('gpt-4o'),
});
//Credentials Schema
const CredentialsSchema = z.object({
secretKey: z
.string()
.describe('Secret key used to authenticate with OpenAI')
.default(''),
});
//Output Schema
const OutputSchema = z.object({
answer: z.string().describe('Text returned from OpenAI completion'),
});
//Node Definition
const node = createNodeDefinition({
name: 'OpenAI - Direct Prompt',
type: 'ai',
description:
'Sends a full user-defined prompt directly to OpenAI and returns the model’s response.',
input: InputSchema,
output: OutputSchema,
config: ConfigSchema,
credentials: CredentialsSchema,
meta: {
svgIcon:
'data:image/svg+xml;base64,...',
i18n: {
en: {
name: 'OpenAI - Direct Prompt',
description:
'Sends a full user-defined prompt directly to OpenAI and returns the model’s response.',
},
es: {
name: 'OpenAI - Solicitud Directa',
description:
'Envía un aviso completo definido por el usuario directamente a OpenAI y devuelve la respuesta del modelo.',
},
},
fields: {
credentials: {
secretKey: {
scope: 'private',
},
},
input: {
prompt: {
scope: 'public',
svgIcon:
'data:image/svg+xml;base64,...',
i18n: {
en: {
name: 'Prompt',
description:
'The full prompt text to send to OpenAI.',
placeholder: 'Enter your prompt here...',
helpText:
'This is the complete prompt that will be sent to OpenAI.',
},
es: {
name: 'Aviso',
description:
'El texto completo del aviso para enviar a OpenAI.',
placeholder: 'Ingresa tu aviso aquí...',
helpText:
'Este es el aviso completo que se enviará a OpenAI.',
},
},
},
},
output: {
answer: {
scope: 'public',
i18n: {
en: {
name: 'Answer',
description:
'The text returned from the OpenAI completion.',
placeholder: 'OpenAI response will appear here...',
helpText:
'This is the response text generated by OpenAI based on your prompt.',
},
es: {
name: 'Respuesta',
description:
'El texto devuelto por la finalización de OpenAI.',
placeholder:
'La respuesta de OpenAI aparecerá aquí...',
helpText:
'Este es el texto de respuesta generado por OpenAI basado en tu aviso.',
},
},
},
},
},
},
});
//Exports
export type OpenAITextProcessorNode = typeof node.fields;
export type OpenAITextInput = z.infer;
export type OpenAITextConfig = z.infer;
export type OpenAITextCredentials = z.infer;
export type OpenAITextOutput = z.infer;
export {
InputSchema as OpenAITextInputSchema,
ConfigSchema as OpenAITextConfigSchema,
CredentialsSchema as OpenAITextCredentialsSchema,
OutputSchema as OpenAITextOutputSchema,
OpenAIEngines,
};
export default node;
Workflow Use Cases
Real-world automation powered by workflows
The workflow system supports a wide range of automation scenarios. Whether you're streamlining internal ops, integrating systems, or handling complex data, these use cases show how flexible and powerful workflows can be.

Backend Ops
Automate background tasks like log rotation, temp file cleanup, backup syncing, or regular report generation. Keep your systems clean and consistent with minimal manual intervention.

Integrations
Seamlessly connect third-party tools and internal platforms. From syncing data with CRMs or ERPs to triggering messages in Slack or submitting forms to Notion, integration flows simplify cross-system communication.

Data Pipelines
Move, transform, and validate data between storage systems, APIs, or databases. Perfect for ETL tasks, reporting pipelines, or syncing analytics-ready datasets across services.

Dev Productivity
Automate CI/CD steps, code linting, test execution, and deployment orchestration. Developers can spend more time writing features while workflows handle routine development operations.
Example of a scheduled & manual email processing workflow JSON definition
This workflow demonstrates how incoming emails can be automatically processed, with key data extracted, evaluated, and routed based on specific conditions. It supports both scheduled and manual execution.
Workflows can be fully defined using a JSON object or programmatically via the provided API.
Initiates every minute via cron or manually on demand.
Connects to an IMAP inbox to fetch new emails.
Extracts essential fields from each email such as
subject
, messageId
,
and body text.
Attempts to insert a unique entry in the database using
messageId
to prevent duplicates.
Evaluates whether the email is new based on the DB insert result.
Sends content to OpenAI for summarization, then forwards to an external API.
Terminates the flow with no further action.
{
"workflow": {
"id": "4b42271e-8411-4320-b263-2e5b28ebdf2f",
"triggers": [
{
"id": "02166879-b6bc-43bf-b181-48352dabcc1a",
"slug": "scheduleTrigger",
"config": {
"cron": "0 0/1 * * * ?"
},
"nodes": [
"node-fetchEmail"
]
},
{
"id": "10d9e8e2-2440-41b3-9c29-5240a2a7e274",
"slug": "manualTrigger",
"config": {},
"nodes": [
"node-fetchEmail"
]
}
],
"nodes": [
{
"id": "9e416074-1a2a-4ad1-8df7-0e177e41381c",
"registryName": "newMail",
"credentials": {
"user": "[email protected]",
"password": "securepass",
"host": "imap.domain.com",
"port": 993
},
"config": {
"folder": "INBOX"
},
"input": {}
},
{
"id": "b1758d8f-f386-43b7-8333-31fb70043a9e",
"registryName": "dataConvertor",
"input": {
"text": "{{.text}}",
"subject": "{{.subject}}",
"messageId": "{{.messageId}}"
}
},
{
"id": "489dce77-ee26-445a-b40e-a664ec2576b2",
"registryName": "createUniqueKeyValue",
"input": {
"keys": {
"{{.messageId}}": "true"
},
"data": {
"text": "{{.text}}",
"subject": "{{.subject}}",
"messageId": "{{.messageId}}"
}
},
"storageName": "postgres_storage"
},
{
"id": "101ceecd-231b-4066-921e-b2c126527b95",
"registryName": "ifCondition",
"config": {
"rules": [
{
"field": "insert",
"type": "boolean",
"operator": "is equal to",
"value": true
}
]
},
"input": {
"insert": "{{.insert}}",
"text": "{{.data.text}}",
"subject": "{{.data.subject}}",
"messageId": "{{.data.messageId}}"
},
"condition": {
"true": "8da23c37-a787-4f13-85c4-8324794686e7",
"false": "da7c8cca-77b6-4dd4-926e-46debd53074d"
}
},
{
"id": "8da23c37-a787-4f13-85c4-8324794686e7",
"registryName": "openAITextProcessor",
"credentials": {
"secretKey": "sk-xxxxxxx"
},
"config": {
"engine": "gpt-4o"
},
"input": {
"prompt": "Summarize this email:\n\nSubject: {{.subject}}\n\nBody: {{.text}}"
}
},
{
"id": "8d7fc460-98e4-471f-9f7a-19d27c7a55b9",
"registryName": "externalCall",
"input": {
"method": "POST",
"url": "https://api.example.com/process",
"headers": {
"X-Message-ID": "{{.messageId}}",
"X-Trigger": "email-new"
},
"body": {
"subject": "{{.subject}}",
"text": "{{.text}}",
"summary": "{{.openAI.output}}"
}
}
},
{
"id": "da7c8cca-77b6-4dd4-926e-46debd53074d",
"registryName": "doNothing",
"input": {
"text": "{{.text}}",
"subject": "{{.subject}}",
"messageId": "{{.messageId}}"
}
}
],
"connections": {
"9e416074-1a2a-4ad1-8df7-0e177e41381c": [
"b1758d8f-f386-43b7-8333-31fb70043a9e"
],
"b1758d8f-f386-43b7-8333-31fb70043a9e": [
"489dce77-ee26-445a-b40e-a664ec2576b2"
],
"489dce77-ee26-445a-b40e-a664ec2576b2": [
"101ceecd-231b-4066-921e-b2c126527b95"
],
"101ceecd-231b-4066-921e-b2c126527b95": [
"8da23c37-a787-4f13-85c4-8324794686e7",
"da7c8cca-77b6-4dd4-926e-46debd53074d"
],
"8da23c37-a787-4f13-85c4-8324794686e7": [
"8d7fc460-98e4-471f-9f7a-19d27c7a55b9"
]
}
}
}
Key Features & Benefits
Principles that make our platform robust and developer-friendly
The workflow automation system is engineered to efficiently run tasks with a focus on performance, security, and flexibility. Below are the core principles that make our platform scalable and developer-friendly.

Modular Architecture
Design flows using self-contained, reusable nodes. Each component is isolated and configurable, making it easy to maintain, test, and evolve over time.

Secure Execution
All secrets and credentials are encrypted and injected at runtime.

Resilience
Flows are built to withstand failure. Built-in retry logic, fallback paths, and idempotent operations help maintain system integrity under stress.

Scalability
Supports containerized deployments with horizontal scaling using Docker or Kubernetes. Ideal for growing workloads and microservice-based systems.

Observability
Track execution, monitor performance, and debug issues through visual dashboards, real-time logs, and node-level tracing for every workflow run.