Monitoring
Know about data problems before your users do.
Beacon runs saved SQL checks on a schedule, across every engine you connect, and records every run. Each check runs as the person who owns it, through the same read-only gate as everything else, and reports its health in the Control Tower.
- 9connectors
- 5-fieldcron schedules
- n stepsjoined in memory
Six steps from a cron tick to a message.
A subscription is a schedule attached to a saved query. When the schedule fires, your job runner calls Beacon, and Beacon does the rest.
- Schedule firesYour job runner triggers the subscription from its cron expression.
- Run as ownerBeacon runs it as its owner and re-checks access to every data source.
- Run each stepEach step runs on its own data source, through the read-only gate.
- Join in memoryA final query joins @result1, @result2 in an in-memory SQLite store.
- DecideThe trigger, minimum row count and anomaly detection decide whether to notify.
- DeliverRecipients get the result, a task opens or resolves, the run is recorded.
Paid orders that never shipped.
The shop database (PostgreSQL) knows which orders are paid; the warehouse database (SQL Server) knows which have shipped. No single database can answer the question, so the query has two steps and a final query that joins them.
-- Paid orders older than a daySELECT order_id, customer_id, total, paid_atFROM shop.ordersWHERE status = 'paid' AND paid_at < now() - interval '24 hours';-- Shipments created in the last two weeksSELECT order_id, carrier, created_atFROM dbo.ShipmentsWHERE created_at > DATEADD(day, -14, SYSUTCDATETIME());-- Runs in Beacon's in-memory SQLite storeSELECT a.order_id, a.customer_id, a.totalFROM @result1 aLEFT JOIN @result2 b ON b.order_id = a.order_idWHERE b.order_id IS NULLORDER BY a.paid_at;Both data sources are linked to the same project, so the query can read them together. The final query is SQLite SQL; it is set through the API or by an AI actor, and the editor shows it read-only.
- Cron expression
- 0 7 * * 1-5
- Send notification
- When result count changes
- Recipients
- Teams #fulfilment, email ops@acme.example
- Attachment
- CSV, up to the subscription's max rows
- Tasks
- Keep a task open while the query returns rows
| order_id | customer_id | total |
|---|---|---|
| 104 211 | 58 120 | 129.00 |
| 104 236 | 11 904 | 48.50 |
| 104 240 | 73 455 | 312.90 |
One page that shows whether your checks are healthy.
The Control Tower groups every subscription by its success rate over the selected window. Success means a run that sent, silenced or found nothing; a skipped run counts against it.
| State | Subscription | Success | Runs | Open tasks |
|---|---|---|---|---|
| Red | Nightly ledger balance | 62.5% | 24 | 2 |
| Green | Paid orders without shipment | 95.5% | 22 | 1 |
| Amber | Duplicate invoice numbers | 88.0% | 50 | 0 |
| Stalled | Stale exchange rates | no runs | 0 | 0 |

What every run can rely on.
Runs as its owner
A scheduled run uses its owner's access, checked again before any SQL runs. If the owner loses access, the run is recorded as skipped and nothing is sent.
Read-only, always
Every step passes the SQL execution gate in its own dialect. Writes, DDL, other databases and dynamic SQL are rejected before anything reaches the database.
Bounded results
A row cap (100,000 by default) is written into the SQL, and each statement has a timeout (120 seconds by default). A larger result fails the run rather than being cut silently.
Masked before delivery
Rows that reach recipients and attachments are PII-masked under the strictest settings of the projects that link the data.
Reviewed SQL only
With the approval workflow on, a scheduled run executes only the query's active version. Anything else is skipped and marked "Not approved". In strict mode the version must also carry an approval for exactly its content.
Every run recorded
Each run keeps its status, row count and timing. The count drives the trigger, the minimum row count, anomaly detection and tasks; the status drives the Control Tower.