Know what is due, late and published in your Notion content calendar

Every Monday: the pieces due this week in your Notion content calendar, the ones past their date and not yet live, and what went out last week.

Runs
Mondays at 8:30
Uses
Notion
Posts
Report card

What lands on your board

AcmeNotion content calendar status · Claude Code

6 pieces due this week, 2 running late

6 due this week, 2 late, 4 published last week. The logistics case study is 10 days past its date and still in review, and the webinar recap due Friday is only an idea.

TitleOwnerDateStatus
Case study: Acme LogisticsMayaOct 2 (10 days late)In review
Year-end invoicing checklistJonOct 8 (4 days late)Drafting
Newsletter: OctoberPriyaOct 13Scheduled
Guide: e-invoicing rules for 2027JonOct 14Drafting
Template: packing slipSamOct 14In review
LinkedIn post: late payments studyPriyaOct 15Scheduled
Webinar recapMayaOct 16Idea
Blog: invoice vs billSamOct 16Drafting
Late: 2Due: 6Published last week: 4
Done
An example with made-up numbers. Your agent posts your real ones.

What it does

A content calendar in Notion is only as good as its Status column, and Monday is when everyone finds out that three posts have been "In review" for two weeks. The calendar view shows dates, not drift, so whoever runs it ends up asking around before the planning meeting.

The agent queries the database directly: what is due this week, what passed its publish date without going live, and what shipped. Each item comes with its owner and status, so the meeting starts from the list and spends its time on the late ones.

How it works

  1. 1Learn the database's fields

    Retrieve the calendar database once for its property names and types: a date property (often "Publish date"), a status property, a people property for the owner and a select for the channel.

  2. 2Query this week and the overdue

    Filter the date property on_or_after Monday and on_or_before Sunday; in a second query, take items dated before today whose status does_not_equal "Published". With Notion-Version: 2025-09-03 or later, query the database's data source (POST /v1/data_sources/{id}/query); older versions use POST /v1/databases/{id}/query.

  3. 3Get last week's published pieces

    A third query: status equals "Published" and a date from last Monday to Sunday. Page with has_more and next_cursor when the calendar is busy.

  4. 4

    4Sort and label

    Group items as due, late or published. For late items, add the days past the date and the page's last_edited_time, which tells a stalled piece apart from one that is nearly done.

  5. 5

    5Post the card

    Counts in the summary, then a table of title, owner, date and status, with late items first.

  6. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

What you get

  • Counts: due this week, late, and published last week.
  • Late: title, owner, original date, days late and status, longest overdue first.
  • Due this week: title, owner, date and status.
  • Published last week, with links to the Notion pages.
  • One line on what most needs a decision, for example a post stuck in review.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/notion-content-calendar-status/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the notion-content-calendar-status skill

    Or paste the prompt instead of installing:

    promptRead my Notion content calendar database ([database link]) through the Notion API or MCP server. First get its schema to find the publish date, status and owner properties. Then list: items due this week (date from Monday to Sunday), items whose date is before today and whose status is not Published, and items published last week. For each give title, owner, date and status; for late items add days late and when the page was last edited. Put late items first, longest overdue at the top, and finish with the one item that most needs a decision.
  3. Put it on a schedule

    Mondays at 8:30, from cron on any machine where Claude Code is signed in:

    crontab30 8 * * 1 claude -p "Run the notion-content-calendar-status skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a report card. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: notion-content-calendar-status
description: "Every Monday: the pieces due this week in your Notion content calendar, the ones past their date and not yet live, and what went out last week. Use when the user asks for this, or when it runs on a schedule."
---

# Notion content calendar status

Every Monday: the pieces due this week in your Notion content calendar, the ones past their date and not yet live, and what went out last week.

A content calendar in Notion is only as good as its Status column, and Monday is when everyone finds out that three posts have been "In review" for two weeks. The calendar view shows dates, not drift, so whoever runs it ends up asking around before the planning meeting.

The agent queries the database directly: what is due this week, what passed its publish date without going live, and what shipped. Each item comes with its owner and status, so the meeting starts from the list and spends its time on the late ones.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- A Notion integration with read access to the content calendar database; share the database with it under Connections.
- Notion's MCP server or a Notion connector, or the integration token in `NOTION_TOKEN` for the REST API.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Learn the database's fields** (Notion): Retrieve the calendar database once for its property names and types: a date property (often "Publish date"), a status property, a people property for the owner and a select for the channel.
2. **Query this week and the overdue** (Notion): Filter the date property `on_or_after` Monday and `on_or_before` Sunday; in a second query, take items dated `before` today whose status `does_not_equal` "Published". With `Notion-Version: 2025-09-03` or later, query the database's data source (`POST /v1/data_sources/{id}/query`); older versions use `POST /v1/databases/{id}/query`.
3. **Get last week's published pieces** (Notion): A third query: status equals "Published" and a date from last Monday to Sunday. Page with `has_more` and `next_cursor` when the calendar is busy.
4. **Sort and label**: Group items as due, late or published. For late items, add the days past the date and the page's `last_edited_time`, which tells a stalled piece apart from one that is nearly done.
5. **Post the card**: Counts in the summary, then a table of title, owner, date and status, with late items first.

## Route B: the browser

### What you need

- Signed in to Notion with at least Can view on the calendar database; adding a temporary view needs Can edit, otherwise use the existing table view's filters and reset them afterwards.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://www.notion.so/. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Open the calendar as a table**: Open `https://www.notion.so/`, pick the workspace, and open the content calendar database as a full page. Add a new `Table` view (the `+` next to the view tabs) so the filters below do not change the views the team uses, and delete it at the end.
2. **Filter to this week**: Click `Filter`, add the publish date property with `Is on or after` this Monday and a second filter `Is on or before` this Sunday. Sort by the date ascending and read title, owner, date and status for each row.
3. **Find the late ones**: Replace the filters with the date `Is before` today and `Status` `Is not` `Published`. Show the `Last edited time` property (Properties, toggle it on) so a stalled piece stands apart from one nearly done. Note days late for each.
4. **List what shipped**: Filter to `Status` `Is` `Published` and the date between last Monday and last Sunday, and copy each page's link from its `...` menu.
5. **Write the update**: Counts first (due, late, published), then late items longest overdue first, then the week's list, then the one item that most needs a decision.

Note: Filters set on a shared view are visible to everyone in the workspace, so work in a new view or clear them afterwards. If the calendar uses a Select property instead of Status, the filter reads `Is not` on that property. Long databases load more rows as you scroll; for a calendar with hundreds of pages, Export the view as CSV instead.

## The report

- **Counts**: due this week, late, and published last week.
- **Late**: title, owner, original date, days late and status, longest overdue first.
- **Due this week**: title, owner, date and status.
- **Published last week**, with links to the Notion pages.
- One line on what most needs a decision, for example a post stuck in review.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "notion-content-calendar-status/<date of this run, e.g. 2026-10-16>",
  "item_key": "notion-content-calendar-status",
  "project": "Acme",
  "source": "Notion content calendar status skill",
  "kind": "update",
  "title": "6 pieces due this week, 2 running late",
  "summary": "**6** due this week, **2** late, **4** published last week. The logistics case study is 10 days past its date and still in review, and the webinar recap due Friday is only an idea.",
  "widget": [
    {
      "type": "Table",
      "props": {
        "columns": [
          "Title",
          "Owner",
          "Date",
          "Status"
        ],
        "rows": [
          [
            "Case study: Acme Logistics",
            "Maya",
            "Oct 2 (10 days late)",
            "In review"
          ],
          [
            "Year-end invoicing checklist",
            "Jon",
            "Oct 8 (4 days late)",
            "Drafting"
          ],
          [
            "Newsletter: October",
            "Priya",
            "Oct 13",
            "Scheduled"
          ],
          [
            "Guide: e-invoicing rules for 2027",
            "Jon",
            "Oct 14",
            "Drafting"
          ],
          [
            "Template: packing slip",
            "Sam",
            "Oct 14",
            "In review"
          ],
          [
            "LinkedIn post: late payments study",
            "Priya",
            "Oct 15",
            "Scheduled"
          ],
          [
            "Webinar recap",
            "Maya",
            "Oct 16",
            "Idea"
          ],
          [
            "Blog: invoice vs bill",
            "Sam",
            "Oct 16",
            "Drafting"
          ]
        ]
      }
    },
    {
      "type": "Badges",
      "props": {
        "items": [
          {
            "label": "Late: 2",
            "tone": "bad"
          },
          {
            "label": "Due: 6",
            "tone": "warn"
          },
          {
            "label": "Published last week: 4",
            "tone": "ok"
          }
        ]
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Mondays at 8:30 (`30 8 * * 1`). From cron, with the agent signed in on that machine:

```bash
30 8 * * 1 claude -p "Run the notion-content-calendar-status skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/notion-content-calendar-status#schedule

Source: https://briefkin.dev/skills/notion-content-calendar-status

What your agent needs

  • A Notion integration with read access to the content calendar database; share the database with it under Connections.

  • Notion's MCP server or a Notion connector, or the integration token in NOTION_TOKEN for the REST API.

Connecting Notion

  1. Notion MCP, Notion's hosted server at https://mcp.notion.com/mcp. Add Notion from Claude's connector directory, or run claude mcp add --transport http notion https://mcp.notion.com/mcp, and approve access with OAuth; it sees the pages your Notion account can see.
  2. API with an internal integration. Create an internal integration in Notion's integration settings, store its secret (it starts with ntn_) in NOTION_TOKEN, send Notion-Version: 2025-09-03, and share each page or database with the integration from its ••• menu under Connections.

Give the integration only the Read content capability and share just the databases the report uses; Notion MCP acts as you and can edit, so it fits interactive work better than unattended runs.

Questions

Our calendar uses a select, not a status property. Does that work?

Yes. The agent reads the schema first and uses the matching filter type, select with does_not_equal instead of status. Tell it which option means published if that option is not called "Published".

Can it move dates or change statuses?

Not in this skill. Give the integration read-only content access in Notion, so a misread filter can never reschedule your calendar.

Do I need Briefkin to use the Notion content calendar status skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a report card, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Notion pages themselves: the agent opens www.notion.so in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Read this report on your board, not in a chat log

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.