Workflows
Build automated incident response workflows with a visual flow builder. Connect triggers, processing nodes, and notification destinations to create powerful automation pipelines.
Overview
Workflows are the heart of alerting and automation in upti.my. When an incident condition creates an incident, workflows take over and handle everything that happens next: where notifications go, how messages are formatted, which teams get paged, and what enrichment data is attached. You build all of this with a visual drag-and-drop flow builder.
Each workflow is a directed graph of nodes connected by edges. Data flows from a trigger node through optional processing nodes (conditions, delays, enrichment, HTTP requests) and terminates at one or more destination nodes (Slack, PagerDuty, email, webhooks, and more). You can branch, delay, loop, and transform data at every step. Workflows are managed through the dedicated API at workflows.upti.my.
ℹ️ Conditions + Workflows = Complete Alerting
Incident conditions decide when to create an incident. Workflows decide what happens after. This clean separation means you can change your notification routing, add new destinations, or tweak message templates without touching your detection logic.
Node Categories
The flow builder organizes nodes into three categories: triggers that start the workflow, processing nodes that enrich and shape the data, and destination nodes that deliver notifications and alerts.
Trigger Nodes (Entry Points)
Every workflow begins with exactly one trigger node. The trigger defines when and why the workflow executes. upti.my supports seven trigger types.
| Trigger | Description |
|---|---|
| Healthcheck Status Changed | Fires when a healthcheck transitions between up, down, or degraded states. You can filter by specific healthchecks, tags, or transition direction. |
| Incident Created | Fires when a new incident is opened, either automatically from incident conditions or manually by a team member. |
| Incident Status Changed | Fires on incident status transitions such as investigating, identified, monitoring, or resolved. |
| Condition Triggered | Fires when any incident condition is met. Useful for centralized notification routing based on incident severity or tags. |
| Manual Trigger | Allows on-demand execution from the dashboard or API. Ideal for testing workflows or running one-off automations. |
| Schedule | Cron-based recurring trigger. Define a cron expression and the workflow runs on that schedule, useful for periodic reports or proactive checks. |
| Heartbeat Missed | Fires when an expected heartbeat signal is late. Perfect for monitoring cron jobs, batch processes, and background workers. |
💡 Filtering Triggers
Most trigger nodes support filter conditions. For example, you can configure a "Healthcheck Status Changed" trigger to fire only when checks tagged with production go down. This prevents unnecessary workflow executions for staging or development environments.
Processing Nodes (Middle)
Processing nodes sit between the trigger and destinations. They let you add logic, delays, data transformations, and external API calls to your workflow. You can chain multiple processing nodes together and create branches for complex scenarios.
| Node | Description |
|---|---|
| Condition (If/Else) | Branch the workflow based on severity, status, tags, time of day, day of week, or custom expressions. Each branch can lead to different processing or destination nodes. |
| Delay | Wait a specified number of seconds or minutes before continuing. Useful for escalation chains where you wait before notifying higher-priority channels. |
| Transform Data | Modify the workflow payload using templates. Add computed fields, rename keys, or format data for downstream nodes. |
| HTTP Request | Call external APIs with configurable URL, method, headers, and body. The response is merged into the workflow context for use in subsequent nodes. |
| Loop | Iterate over an array in the payload. Each element is processed through the connected child nodes individually. |
| Aggregate | Collect and combine data from multiple parallel branches before continuing. Useful when you need results from several HTTP requests before making a decision. |
| Rate Limit | Throttle execution frequency to prevent notification floods. Configure maximum executions per minute, hour, or day. |
Example: Escalation Chain
A common pattern is to notify a Slack channel immediately, then wait 10 minutes. If the incident is still open, escalate to PagerDuty. This requires a Condition node after the Delay to check whether the incident has been resolved.
{
"name": "Production Escalation",
"trigger": {
"type": "healthcheck_status_changed",
"filter": { "tags": ["production"], "to_status": "down" }
},
"nodes": [
{ "id": "notify_slack", "type": "slack", "channel": "#incidents" },
{ "id": "wait", "type": "delay", "duration": "10m" },
{
"id": "check_resolved",
"type": "condition",
"expression": "incident.status != 'resolved'"
},
{ "id": "escalate", "type": "pagerduty", "severity": "critical" }
]
}Destination Nodes
Destination nodes deliver notifications and data to external services. Each workflow can have multiple destinations, and you can use Condition nodes to route different alerts to different channels based on severity, tags, or time of day. upti.my supports seven built-in destination types.
Slack
Send messages to any Slack channel or direct message. Configure a message template using variables from the workflow payload, and optionally use Slack Block Kit for rich formatting. Requires a Slack workspace connection via OAuth.
Discord
Post messages to Discord channels using incoming webhooks. Supports embed templates with custom title, description, color, and fields. Configure the webhook URL in the node settings.
Send email notifications to one or more recipients. Configure the subject line and body using templates. Supports HTML email bodies for rich formatting. Emails are sent fromnotifications@upti.my.
Microsoft Teams
Post messages to Microsoft Teams channels using incoming webhooks. Supports Adaptive Card templates for rich, interactive messages with buttons and sections.
Telegram
Send messages to Telegram chats or groups. Configure the bot token and chat ID, then define a message template. Supports Markdown and HTML formatting modes.
PagerDuty
Create PagerDuty incidents with configurable routing key, severity level (critical, error, warning, info), and summary. upti.my sends Events API v2 payloads, so incidents appear in your PagerDuty service with full context.
Custom Webhook
Send HTTP requests to any URL. Configure the HTTP method (GET, POST, PUT, PATCH), custom headers, and a JSON body template. This is the most flexible destination, allowing you to integrate with any service that has an HTTP API.
{
"type": "custom_webhook",
"url": "https://api.example.com/incidents",
"method": "POST",
"headers": {
"Authorization": "Bearer {{ secrets.EXAMPLE_API_KEY }}",
"Content-Type": "application/json"
},
"body": {
"title": "{{ incident.title }}",
"severity": "{{ incident.severity }}",
"check_name": "{{ healthcheck.name }}",
"status_url": "{{ incident.status_page_url }}"
}
}ℹ️ Template Variables
All destination nodes support template variables using double curly braces. Available variables depend on the trigger type and include fields likehealthcheck.name, incident.title,incident.severity, and incident.status. Use the "Test" button in the flow builder to preview rendered templates with sample data.
Workflow API
All workflow operations are available through the REST API at workflows.upti.my. You can create, update, delete, and trigger workflows programmatically. The API accepts JSON payloads and returns standard HTTP status codes.
curl -X GET https://workflows.upti.my/api/v1/workflows \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Best Practices
- Start simple. Build a single trigger-to-destination workflow before adding processing nodes.
- Use the Rate Limit node to prevent notification floods during major outages.
- Test workflows with the Manual Trigger before connecting them to live alerts.
- Use Condition nodes to route critical alerts to PagerDuty and low-severity alerts to Slack.
- Keep escalation delays reasonable. A 5 to 15 minute delay before escalation gives on-call engineers time to respond.
- Use Transform Data nodes to enrich payloads with context before sending to external services.
- Review workflow execution logs regularly to identify failures or misconfigured nodes.
⚠️ Execution Limits
Free plans are limited to 3 active workflows with up to 100 executions per day. Pro plans support 25 workflows with 10,000 daily executions. Enterprise plans have unlimited workflows and executions. Exceeding your plan's limits will pause workflow execution until the next billing cycle.