Schedule Microsoft Teams messages

Post to a Microsoft Teams channel on a schedule: weekly reminders, daily numbers, and alerts filled in from any API. cronservices sends the message as an Adaptive Card through a Teams Workflows webhook.

Example: a Monday kickoff reminder

json
{
  "name": "Weekly kickoff",
  "cron": { "expression": "45 8 * * MON", "time_zone": "Europe/London" },
  "nodes": [
    { "id": "post", "teams_post_message": {
        "webhook_url": "https://prod-12.westeurope.logic.azure.com:443/workflows/abc123/triggers/manual/paths/invoke?api-version=2016-06-01&sig=XYZ",
        "text": "**Weekly kickoff in 15 minutes.** Agenda: {{ format(now:Europe/London, \"dddd DD MMMM\") }} priorities and blockers." } }
  ]
}

Example: who's on call, every morning

json
{
  "name": "On-call to Teams",
  "cron": { "expression": "0 9 * * 1-5", "time_zone": "America/Chicago" },
  "nodes": [
    { "id": "oncall", "pagerduty_list_on_calls": { "credential_id": "YOUR_PAGERDUTY_API_KEY_ID", "escalation_policy": "PABC123", "limit": 1 } },
    { "id": "post", "teams_post_message": {
        "webhook_url": "https://prod-12.westeurope.logic.azure.com:443/workflows/abc123/triggers/manual/paths/invoke?api-version=2016-06-01&sig=XYZ",
        "text": "On call today: **{{ $.oncalls[0].user.summary }}**" } }
  ]
}

Set up

In Teams, open the channel's Workflows and choose Post to a channel when a webhook request is received. Copy the URL it gives you into webhook_url. Older webhook.office.com connector URLs work too, while Microsoft still accepts them.

Reference

Post a Microsoft Teams message: teams_post_message

Sends POST to the Workflows webhook URL with an Adaptive Card holding the text. Output for the next step: The webhook’s response.

Field Type Notes
webhook_url string, required A Teams Workflows ("Post to a channel when a webhook request is received") URL on logic.azure.com, or a legacy webhook.office.com connector URL.
text string, required Up to 4,000 characters. Adaptive Card text supports simple markdown. Placeholders allowed.

More ideas

  • Post the sprint's open bug count from your tracker's API every morning.
  • Remind the team to submit expenses on the last weekday of the month: 0 10 LW * *.
  • Post a release freeze notice once, at an exact time, with run_at.