opsintermediate12 min setupby Mantle

Daily standup digest from Notion to Teams

Query the standup database in Notion each morning and post it to the team's Teams channel.

Weekdays 08:45Today's entriesPost the digest

Drag to pan, pinch to zoom. This is the real graph the template installs.

Purpose

Query the standup database in Notion each morning and post it to the team's Teams channel.

How it works

What it does

  • Runs at 08:45 on weekdays.
  • Queries a Notion database for the most recent standup entries.
  • Posts a short HTML digest into a Microsoft Teams channel.

Validation

This template is contract-validated: the unit suite checks every node type, every config key and the whole graph against the same rules a saved workflow passes. It has not been run against the live provider — the ids, names and columns below are placeholders to replace with your own.

Nodes 3

  1. 01Weekdays 08:45trigger.scheduleTrigger
  2. 02Today's entriesnotion.query_databaseApp
  3. 03Post the digestteams.send_messageApp
View template JSON
{
  "format": "mantle-workflow/v1",
  "id": "teams-notion-standup-digest",
  "name": "Daily standup digest from Notion to Teams",
  "graph": {
    "nodes": [
      {
        "id": "cron",
        "type": "trigger.schedule",
        "label": "Weekdays 08:45",
        "config": {
          "cron_expr": "45 8 * * 1-5",
          "timezone": "UTC"
        },
        "worker_type": "generic-worker",
        "position": {
          "x": 60,
          "y": 220
        }
      },
      {
        "id": "query",
        "type": "notion.query_database",
        "label": "Today's entries",
        "config": {
          "database_id": "00000000000000000000000000000000",
          "sorts": [
            {
              "timestamp": "created_time",
              "direction": "descending"
            }
          ],
          "page_size": 20
        },
        "worker_type": "generic-worker",
        "position": {
          "x": 380,
          "y": 220
        }
      },
      {
        "id": "post",
        "type": "teams.send_message",
        "label": "Post the digest",
        "config": {
          "team_id": "00000000-0000-0000-0000-000000000000",
          "channel_id": "19:0000000000000000000000000000000@thread.tacv2",
          "message": "<b>Standup — {{ $today }}</b><br>{{ steps.query.count }} entr(ies) in Notion.",
          "content_type": "html"
        },
        "worker_type": "generic-worker",
        "position": {
          "x": 700,
          "y": 220
        }
      }
    ],
    "edges": [
      {
        "from": "cron",
        "to": "query"
      },
      {
        "from": "query",
        "to": "post"
      }
    ]
  }
}

Requirements

The connections and permissions each step needs, from the node contracts in the catalog.

  • NotionAPI key

    Used by Today's entries.

    Credential: the integration token, or {"token": "…"}

    • Share the database with your integration in Notion first, or the query returns 'Could not find database'.
  • Used by Post the digest.

    Credential: {"client_id", "client_secret", "refresh_token"}

    • Needs a delegated ChannelMessage.Send permission on the Azure AD app; the team/channel ids come from the channel's ••• → Get link to channel.

Setup

  • Set database_id and share the database with your Notion integration; add a filter to restrict the digest to today.
  • Replace team_id and channel_id.
  • Pick Notion and Teams connections.

Sample input and output

Synthetic examples: node-contract samples or placeholders, never customer data.

Input

Runs on the cron schedule 45 8 * * 1-5 (UTC). There is no incoming payload: the first step fetches the data.

Output

Post the digest teams.send_message

{
  "message_id": "",
  "ok": true,
  "web_url": ""
}

Failure handling

What the graph does when a step fails, read from its retry settings, error branches and error policies.

  • A step that fails, after any retries, fails the run. The failed step is kept with its input and error.

See it run, then make it yours.

Templates install as drafts. Edit any step, and Workflow Health re-checks the graph on every save.