Build an uptime monitor: the database, the four workflows, the Status page, the live app and the schedule (1:25).

The full uptime monitor in our test organisation. The page you build here shows the same services in a simpler table.
How it works
Dispatch Checks reads the monitors from your database and starts Check Monitor for each one without waiting. Check Monitor runs Probe Endpoint and waits for its answer: a site that doesn’t answer at all fails only the probe’s run, recorded as No response. It then saves the result, marks the monitor down after two failures in a row and emails when it goes down or comes back. The page can’t read your database, so it calls Status through its webhook, and its Check now button starts a sweep withtriggr.runWorkflow.
Build it
Create the tables
uptime_monitors row per site to watch.Connect the database
Import Uptime - Probe Endpoint


Import Uptime - Check Monitor

Uptime - Check Monitor after import.

failures >= 2 to failures >= 1 in Evaluate.Import Uptime - Dispatch Checks

Uptime - Dispatch Checks after import.

Import Uptime - Status
Add the app page
Uptime and click Create App. Click Design on its row, click Add Page, name it Status and click Create Page.Paste this page and replace STATUS_WORKFLOW_ID and DISPATCH_WORKFLOW_ID with the IDs of Uptime - Status and Uptime - Dispatch Checks, from each workflow’s address in Studio (app.triggr-app.com/workflows/<id>/design). Click Save, then Preview.
Preview loads the table from Uptime - Status.
Let the page start sweeps

https://app.triggr-app.com/telescope/apps/<org-id>/<app-id> with their staff sign-in (Support > Copy Org ID in the top bar gives the first ID; the second is in the designer’s address bar). Open on Internal Apps shows the page without the SDK, so Check now only works on that link.Test it
Probe a URL
{ "url": "https://www.example.com" } and click Trigger Workflow. In the run, Finish Workflow’s output has comment: "200".
Check one monitor
status in your database is now up.Run a sweep from the app
Test an alert
DELETE FROM uptime_monitors WHERE name = 'Alert test';Go live
Open Uptime - Dispatch Checks, click Trigger, then Add Trigger, set Trigger Type to Cron, enter*/5 * * * * and click Save.

uptime_monitors for each site to watch, and the next sweep picks it up.
FAQ
Can it check more often than every five minutes?
Can it check more often than every five minutes?
Why are there so many runs?
Why are there so many runs?
How do I stop uptime_checks growing forever?
How do I stop uptime_checks growing forever?
15 3 * * * and an Execute SQL step that runs DELETE FROM uptime_checks WHERE checked_at < now() - interval '90 days'.Can it check sites on a client's internal network?
Can it check sites on a client's internal network?
Troubleshooting
Test Connection fails, and my password has special characters
Test Connection fails, and my password has special characters
@, : and / encoded.Execute SQL fails with “invalid SQL query”
Execute SQL fails with “invalid SQL query”
EXPLAIN first, so statements such as CREATE TABLE fail. Create tables in your database’s own SQL editor.A run fails with “trigger node … not found” or “no trigger node found”
A run fails with “trigger node … not found” or “no trigger node found”
"id". Import the JSON from this page again.The page shows “Status request failed (HTTP 404)” or Check now shows “this app is not allowed to run that workflow”
The page shows “Status request failed (HTTP 404)” or Check now shows “this app is not allowed to run that workflow”
Check now shows “triggr is not defined”
Check now shows “triggr is not defined”
A monitor stays unknown
A monitor stays unknown
last_error column says why.
