getNodi

Templates / Slack reminder

Posting to Slack on a schedule

The simplest scheduled job there is, and a good first one: no backend of your own, no endpoint to write, and you can watch it work in a channel within a minute of setting it up.

The recipe

Request
POST {{slack_webhook}}
Schedule
At 09:20 AM, Monday through Friday (20 9 * * 1-5)
Body
{"text":"Standup in 10 minutes."}
Timeout
30s
Attempts
3
Counts as success
2xx

You supply

Slack incoming webhook URL
https://hooks.slack.com/services/T000/B000/xxxxstored encrypted

Slack → Apps → Incoming Webhooks.

Why this job exists

Slack has reminders built in, and for a personal nudge they are fine. They become awkward as soon as anyone else needs to change one — reminders belong to the person who created them, so a recurring team message lives in one individual’s account and quietly leaves when they do.

They are also limited in what they can say. A reminder posts fixed text. It cannot include yesterday’s numbers, the current on-call, or a link to the right document for this week, because it has nowhere to fetch any of that from.

An incoming webhook is one POST with a JSON body. That makes the message something your team owns rather than an individual, and it means the same job can later post something computed instead of something typed.

Setting it up

Create an incoming webhook in Slack — Apps → Incoming Webhooks → Add to Slack — and choose the channel. Slack gives you a URL that posts to that channel and nothing else. Treat it as a secret: anyone holding it can post as your app.

The body this sends

{ "text": "Standup in 10 minutes." }

Blocks give you more than plain text — headings, buttons, sections — and are worth the extra JSON once the message is doing real work. Slack’s Block Kit Builder produces the payload interactively, and you can paste the result straight in as the body.

Checking it actually works

  • Watch the channel. This is one of the few jobs where verification is simply looking.
  • A successful post returns 200 with the body "ok". Slack answers 404 for a revoked webhook and 400 for malformed JSON, both of which fail the run here.
  • Confirm the schedule is in your team’s timezone rather than UTC, and that the weekday restriction is doing what you expect.

Where it goes wrong

The webhook URL is a credential

Anyone with the URL can post to that channel. Store it as a secret placeholder — encrypted at rest, never rendered back — and never commit it. If it leaks, revoke it in Slack; there is no way to rotate it in place.

Posting on public holidays

Cron knows weekends and nothing else. A standup reminder on a holiday is mild noise, but the same pattern applied to something louder is worth guarding in an endpoint that knows your calendar.

Malformed JSON

Slack rejects an invalid body with 400 and a terse message. If the run fails immediately after an edit, paste the body into a JSON validator before looking anywhere else.

Questions

Why not use Slack reminders?

For a fixed personal nudge, do. Use this when the message should belong to the team rather than one account, when it needs to survive that person leaving, or when it needs to contain something computed.

Can I post to Discord or Teams the same way?

Yes. Both accept an incoming webhook with a JSON body — only the field names differ. Discord uses "content" rather than "text".

Can it mention people?

Use <!here>, <!channel> or <@USERID> inside the text. Plain @name does not resolve, which is the most common surprise here.

Running it here

This is a preset in the product, not an illustration. Pick it in the dashboard, fill in the one value above, and the job is created, scheduled and enabled — with retries, a record of every run showing status, latency and response, and an alert the first time one fails. Secret values are encrypted at rest and never rendered back.

The free plan runs 3 jobs hourly and needs no card. Where a recipe wants a finer cadence than your plan allows, it is slowed to the fastest schedule you are permitted rather than rejected.