Skip to main content
Salfio Docs

Search documentation

Type to search this documentation.

On this pageOverview

Task routines

Save a prompt as a routine and let Salfio run it for you — on a schedule or whenever a new email or meeting lands — with the result delivered to Slack.

A task routine is a saved prompt that Salfio runs for you automatically and delivers to Slack. A routine fires in one of two ways:

  • On a schedule — hourly, daily, weekly, or monthly (a time trigger).
  • When a new activity is recorded — a new email or meeting (an event trigger).

Each routine runs as the person who created it, using that person's access to Salfio, and posts its output to a Slack channel or DM. In Slack and the dashboard they're labelled simply routines; if you create them from an MCP client or the API you'll see them as task_routine.

Not the same as the Claude Code routines in Guides. Those recipes wire an external Claude Code routine that Salfio fires through an outbound webhook — they live in your Anthropic account and can act across any connector you authorize. Task routines are built into Salfio: they run on Salfio's own assistant, see your Salfio data, and post back to Slack. No external account, no webhook to register.

  • A connected Slack workspace. Routines deliver to Slack, so your organization needs Slack connected — see Connect your Slack workspace.
  • Your Slack account linked to a Salfio user. A routine is attributed to the Salfio user who created it. Salfio links you automatically when your Slack account uses the same email as your Salfio account. If they differ, a routine created from Slack can't be attributed and creation is declined with a message telling you so; a routine created from the dashboard that delivers as a direct message can't resolve its recipient until the link exists.

There are four ways to create one. They share the same rules — the per-surface differences are only in how much you can configure in one step.

Open Settings → Routines and click New routine. The form covers the full configuration space in one place:

  • Name and Prompt — the label in your routines list and the instruction Salfio runs each time the routine fires.
  • Runs — on a schedule (hourly, daily, weekly, or monthly, with weekday, day-of-month, and timezone where relevant) or when something happens (a new email or meeting, optionally limited to one client or one label).
  • Deliver output to — a Slack channel the Salfio bot has joined, or a direct message to the routine's creator. The channel picker only lists channels the bot is in; invite it with /invite @Salfio and refresh the list if the one you want is missing.

The quickest path. Mention @Salfio in a channel, or DM the Salfio bot, and describe the routine in plain language. The assistant fills in the details and creates it. This path supports both time and event triggers.

@Salfio every Monday at 9am, DM me a summary of what's open with Acme.

@Salfio whenever a new meeting with Acme is recorded, post a recap to #acme.

The assistant confirms what it set up and tells you when the routine will next run. You can also ask it to list, pause, resume, or delete your routines.

Run /salfio routine in any Slack channel where the Salfio bot is present. A form opens with:

  • Description — the short label shown in your routines list.
  • Prompt — the instruction Salfio runs each time the routine fires.
  • Frequency — Hourly, Daily, Weekly, or Monthly.
  • Hour and Minute — the time of day to run (the form offers quarter-hour minutes; ask @Salfio or use MCP if you need an exact minute).
  • Day of week — for the weekly cadence.
  • Day of month — for the monthly cadence.
  • Timezone — an IANA name such as Europe/Rome; defaults to UTC.
  • Deliver output to — DM me, or a channel you pick.

The form creates time-triggered routines. For an event trigger, ask @Salfio or use an MCP client.

If you've connected Salfio to an MCP client such as Claude Desktop or Claude on the web (see MCP), it can manage routines directly through these tools:

Tool What it does
create_task_routine Create a routine (time or event trigger).
update_task_routine Edit an existing routine in place.
list_task_routines List your organization's routines in full (mine=true for just yours).
get_task_routine Read one routine by id.
pause_task_routine Pause a routine.
resume_task_routine Resume a paused routine.
delete_task_routine Delete a routine and its run history.

The tools always act in your organization — there is no way to create or read another organization's routines.

Editing is the right way to change a routine: update_task_routine keeps the routine's id and its run history, where deleting and recreating one loses that history for good. A few things to know:

  • Send only what changes. Every field except the routine id is optional, and anything you leave out keeps its current value. Editing a prompt won't disturb a routine's filter, condition, or delivery channel.
  • Clearing is explicit. Omitting a field never clears it. Pass filter: {} to remove an event filter, and validation_prompt: "" to remove a stored condition — if that condition is currently on, pass validation_enabled: false in the same request too, since a condition that is on can't be left with no text to evaluate.
  • Switching trigger type needs the new settings. Moving a routine from a schedule to an event (or back) requires the new trigger's configuration in the same request, because the routine holds no settings for a trigger it wasn't using. The routine's condition comes along with it — it belongs to the routine, not to the trigger, so it survives the switch and can be set on a scheduled routine just as well as an event one.
  • Only a schedule change moves the next run. Change any part of the schedule — the cadence, the time of day, the timezone — and the next run jumps to the next future slot of the new one; change anything else and the schedule is left alone.
  • Creator and status aren't editable. A routine keeps running as whoever created it, and editing a paused routine leaves it paused — use pause_task_routine / resume_task_routine for status.

A routine runs as a user, so every new one names a creator. Which user that is depends on how the client is connected:

Connection The routine is attributed to
A Just me OAuth connection, or a user API key You.
A service API key The person who issued that key.
A My organization OAuth connection Nobody — it carries no user identity, so create_task_routine is refused. Reconnect and choose Just me to create routines this way.

Attribution only affects creating a routine. Reading, editing, pausing, resuming, and deleting act on a routine that already names its creator, so they work on any connection to your organization — including a My organization one.

list_task_routines and get_task_routine both return the routine's full definition: its description, the complete prompt, the schedule or the events it reacts to, the condition that gates it, the Slack channel it delivers to, when it last ran and how that run ended, and when it runs next. That is enough to ask your MCP client questions like "which of my clients get a Monday briefing, and in which channel?" and to spot the ones that don't.

Two things are worth knowing when you do this:

  • A time-triggered routine has no structured link to a client. If the routine concerns one client, that is recorded only in the words you wrote — its description and its prompt. Naming the client in the description is the difference between an auditable set of routines and a pile of identical-looking schedules.
  • The delivery channel's name is looked up from Slack when you read a routine. If Slack can't be reached, or the Slack workspace the routine delivers through has been disconnected, the name comes back empty while the channel id is still returned. An empty channel name on a paused routine is usually the same story as its pause reason: the workspace is disconnected.

Reading a routine is also the safe way to prepare an edit: update_task_routine merges onto whatever is stored, so checking the current definition first tells you what you are about to leave unchanged.

A time routine runs on a fixed cadence:

Cadence Runs
Hourly Every hour, at the minute you choose.
Daily Once a day, at the hour and minute you choose.
Weekly Once a week, on the weekday and time you choose.
Monthly Once a month, on the day-of-month and time you choose.

A few things to know:

  • Timezones are honored, including daylight saving. A weekly "Monday 09:00 Europe/Rome" routine stays at 09:00 local on both sides of a DST change.
  • Months that don't contain the chosen day are skipped, not shifted. A routine set for the 31st only fires in months that have a 31st; a routine set for the 30th skips February. It is never moved to the last day of a short month.
  • The smallest interval is one hour. There is no sub-hourly cadence.

An event routine fires when a new activity is recorded in Salfio — a new email or meeting. These are the same activity.email.created and activity.meeting.created events used by Webhooks; see that page for exactly when each one fires.

You can narrow an event trigger so it only fires for the activity you care about:

  • By client — only activities for one specific client.
  • By label — only activities for clients carrying a given label.

Leave the filters off to react to every matching activity in the organization.

These two filters exist only on event triggers: they decide whether the routine fires at all by testing the activity that triggered it, and a scheduled routine has no such activity. To narrow a scheduled routine, use the condition check below.

Any routine — scheduled or event-triggered — can be given a condition in plain language. Before the routine produces anything, Salfio evaluates the condition and the routine runs only when it holds. Turn it on with Check a condition first in the routine dialog.

This is the way to stop a recurring routine from posting when there is nothing worth saying. A daily digest with the condition "Return true only if at least one client is still waiting on a reply" stays silent on quiet days instead of posting an empty digest.

Write the condition as a yes/no test, e.g. "The client has the VIP label, or Jane Doe was a participant." Conditions are capped at 2000 characters.

The check sees a bounded snapshot, and nothing else — it does not browse other conversations or external systems, so keep conditions self-contained.

Trigger The check sees
Event The triggering activity: its title, date, participants, the assigned client(s) and their labels, and the content summary.
Schedule Your organization's activity since this routine last posted: the activity summaries in that window, plus the clients involved and their labels.

For a scheduled routine the window runs from the routine's last successful post to now — so activity that a skipped run declined to report on is still there next time, and nothing falls through the gap. Two bounds apply:

  • A routine that has never posted looks back one scheduled interval (an hourly routine one hour, a weekly routine one week).
  • The window never reaches back further than 31 days, so a routine resumed after a long pause does not summarize months of history.
  • At most 50 activities enter the check. When there is more, the check is told that its view was cut short so it never reads a truncated window as "nothing happened."
  • It is strict by design. The routine runs only when the check explicitly confirms the condition. If the condition doesn't hold — or the check cannot complete for any reason — the run is skipped and nothing is posted. If you'd rather the routine always runs, turn the condition off.
  • Skipped runs are visible. The routines list shows each routine's active condition and how its last run ended, so a routine that stayed quiet on purpose is never mistaken for a broken one. Open the routine's run log for the full reason behind any skipped run.
  • The toggle keeps your text. Turning the condition check off preserves the written condition so you can re-arm it later without retyping it. Switching a routine between the two trigger types keeps it too.
  • It costs one AI check per run. A gated daily routine adds one check a day.

Every routine delivers to Slack — either a channel or a direct message to the creator. The Salfio bot posts the result through your connected workspace. Long results are split across a short series of threaded messages so nothing is truncated.

Open Settings → Routines in the Salfio dashboard to see every routine in your organization: its status, trigger type, who created it, when it will next run, and when it last ran. A routine runs on behalf of its creator, so the Created by column tells you whose access it uses; it reads “Removed user” when that account no longer exists. From here you can:

  • Create a routine — see From the dashboard above.
  • Edit a routine — change its name, prompt, trigger, schedule, or delivery target as structured fields. Edits follow the same rules regardless of where the routine was created, and an MCP client can make the same edits with update_task_routine. Changing the schedule moves the next run to the next future slot of the new cadence; editing anything else leaves the schedule untouched. Editing never resumes a paused routine.
  • Pause a routine — a paused time routine is skipped by the scheduler, and a paused event routine stops matching new activity.
  • Resume a paused routine — its next run is recomputed to the next future slot. Runs missed while it was paused are not back-filled.
  • Review recent runs — open a routine to see each execution: when it ran, whether it succeeded, and what it delivered.
  • Delete a routine — this also deletes its run history and cannot be undone.

A routine auto-pauses if it can no longer run safely — for example if the creator's Salfio account is deactivated, or the Slack workspace it delivers to is disconnected. When that happens, the reason appears under the routine's Paused badge (and on the routine when listed from Slack or an MCP client), so you can tell a system pause from one a teammate chose. Fix the underlying issue — re-enable the account or reconnect the workspace — then resume the routine; resuming clears the reason. A routine paused by hand shows no reason.

A routine runs unattended, so it uses your Agent Tools in read-only mode: it can look things up (search a CRM, list calendar events, read email) to build its result, but it will not take actions that change your other products — creating, sending, updating, or deleting. Those require you in the loop and are declined during a scheduled run. Salfio's own built-in tools and delivery to Slack are unaffected.

  • Up to 150 active routines per organization. Paused routines don't count toward the limit; pause or delete one to make room before creating another.
  • One hour is the shortest schedule interval.
  • Connect your Slack workspace — the Slack connection routines are created from and deliver to.
  • MCP — connect Claude Desktop or Claude on the web to manage routines with the *_task_routine tools.
  • Webhooks — the activity events that event triggers fire on, and their payloads.
  • Guides — the other kind of routine: external Claude Code automations Salfio fires through outbound webhooks.
Export
Suggest an edit to this page

Documentation menu