Automations
Gatlas can tell a Slack channel when a sync fails, post a weekly digest or a board pack on a schedule, answer a reporting question for a company, and keep a dataset current in another tool. Nobody has to remember to check.
Connect a Slack channel for your business
Slack alerts and messages are set up for your business, or per company when you have several, or once for the whole workspace. The owner connects Slack for the workspace and for each top-level company. Admins and principals can also do it for companies nested under another company. Other roles do not see these settings.
A Slack connection and its reports cover a company and everything under it, so setting one up takes access to all of that. Someone whose access is Only specific companies cannot manage Slack or scheduled reports, whatever their role.
Choose where alerts should go
Open Automations in the sidebar. The list shows your workspace and your business, or each company, with its Slack channel and a status of Not connected, Connected or Paused. Choose one.
Connect Slack yourself, or send an install link
Connect Slack takes you to Slack to approve Gatlas and pick a channel. If someone else administers your Slack, choose how long the link should last under Install link expires in (1, 3 or 7 days), then Create install link. The link is copied for you to send; they need no Gatlas account.
Send a test
Once connected, Send test posts a message to the channel. If Gatlas cannot post there, invite @Gatlas to the channel. Change channel, Pause and Disconnect sit beside it.
Alerts tell you the moment something needs a person
Open Alerts under the company and tick the events Gatlas should post about. When you connect a channel, every event except Anomaly detection starts ticked. The events:
- Sync failures
- Stale connections
- Connection needs reconnecting
- Anomaly detection
- New connections
- New members
- New agent keys
- Sync recovered
- A brief stopped updating
- Agent key first used
- Agent key revoked or changed
- Agent feedback
- Connection removed
- Member removed
Anomaly detection posts when a sync brings in more than three times a source's recent average, less than a fifth of it, or nothing at all, and when a source's own row count for a stream and Gatlas's disagree several syncs in a row. It also posts when a stream has returned nothing for more than seven days from a saved position that has not moved, while the source's other streams kept syncing. A stream that is only quiet does not set it off, and a stuck stream posts once until it moves again. To read a stuck stream from the start, open the source and choose Full refresh in the menu beside Sync now.
Keep Sync failures, Stale connections and Connection needs reconnecting on at least. A broken connection is fixed in minutes when someone hears about it, and found weeks later when nobody does.
Scheduled messages arrive on a rhythm you set
Open Scheduled messages under the company and choose Add scheduled message. Pick the Message:
- Weekly digest: connection health, sync activity and approved datasets for the last seven days.
- Usage summary: how agents used Gatlas in the last 24 hours. It is skipped on days with no activity.
- Source health: which connections are failing or stale right now.
- Artifact: one of your artifacts, posted with a short intro and an Open artifact button.
Then set the Cadence (daily, twice daily, weekly or monthly), the Send time, the Timezone, and the Channel if it should go somewhere other than the connected one. Preview shows the message before you save. A channel connection holds up to 20 scheduled messages.
Every new channel comes with two: a usage summary every day at 09:00 UTC, switched on, and a weekly digest on Mondays at 09:00 UTC, switched off. Edit or switch off either one.
Tip
{artifact_name}, {artifact_description}, {scope_name} and {date}. Monthly board packs work well this way: build the artifact once, then schedule it for the first of the month.Scheduled reports answer a reporting question for a company
A scheduled report puts one question to an agent that reads a company and everything below it: its approved datasets, briefs and AI context. It cannot reach outside sources or change anything, and every answer cites the data it used.
Open Scheduled reports under the company
It appears once the company has a Slack channel connected. It is not available for the workspace as a whole.
Ask the question
Fill in Reporting question, for example "How did gross margin develop this quarter, and what drove it?", and check Reporting timezone. Additional context is a note for the people reading the report later; the agent never sees it. Choose Run report.
Read the result
The run is queued and appears under Recent runs. Open it to read the report and the evidence behind it, choose Run again for a fresh answer, or Revoke sign-off to stop it.
Note
Reverse syncs keep a dataset current in another tool
A reverse sync pushes a dataset into another tool, its destination, and keeps it current there: a Google Sheet, a Slack channel or a webhook. Open Reverse syncs on the Automations page and choose Create reverse sync.
Verify a reverse sync webhook
A reverse sync can send a dataset to a webhook. When its destination has a webhook secret, every delivery carries two headers. Gatlas-Timestamp is the time of the send in Unix seconds. Gatlas-Signature is v1= followed by the hex HMAC-SHA256, keyed by the secret, of the timestamp, a period and the exact request body. A delivery without a secret carries neither header, and a Slack destination is never signed.
To check a delivery, compute the same signature over the raw body before parsing it, compare the two in constant time, and reject a timestamp more than 5 minutes from your clock, so an old delivery cannot be replayed. In Python:
import hashlib, hmac, time
def verify(secret: str, body: bytes, timestamp: str, signature: str) -> bool:
try:
if abs(time.time() - int(timestamp)) > 300:
return False
except ValueError:
return False
expected = hmac.new(secret.encode(), timestamp.encode() + b"." + body, hashlib.sha256)
return hmac.compare_digest(("v1=" + expected.hexdigest()).encode(), signature.encode())