---
name: airtable-overdue-records
description: "Every weekday: the records in your Airtable view that are past their due date, grouped by owner, and a question on who takes the unassigned ones. Use when the user asks for this, or when it runs on a schedule."
---

# Airtable overdue records alert

Every weekday: the records in your Airtable view that are past their due date, grouped by owner, and a question on who takes the unassigned ones.

Airtable bases run a lot of small operations: content calendars, vendor renewals, hiring pipelines, request queues. Each has a due date column and a view someone built to catch what is late, and nobody opens that view until a deadline has already passed.

Every weekday the agent reads that view, keeps the records whose due date is behind them and whose status is not done, and groups them by owner. Records without an owner get the question on the card, and your answer is written back to the base.

## 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

- An Airtable personal access token with `data.records:read` on the base (add `data.records:write` to assign) in `AIRTABLE_TOKEN`, or the official Airtable MCP server (`https://mcp.airtable.com/mcp`) with the same access.
- The base, table and view, and the names of the due date, status and owner fields.

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

### Steps

1. **Read the view with a filter** (Airtable): Call `GET https://api.airtable.com/v0/{baseId}/{tableIdOrName}` with `view=<your view>`, `filterByFormula=AND(IS_BEFORE({Due date}, TODAY()), NOT({Status} = 'Done'))`, `fields[]` for the name, due date, status and owner, and `pageSize=100`, following `offset`. The formula applies on top of the view's own filters.
2. **Group by owner**: A collaborator field returns `{ id, email, name }`; a linked People record returns record IDs, which you look up in that table. Work out days overdue, put records with no owner under "Unassigned" at the top, and sort each group by days overdue.
3. **Ask, then assign** (Airtable): Post the list as an ask. On an answer, call `PATCH /v0/{baseId}/{tableIdOrName}` with up to 10 records per request, setting the owner field to `{ "email": "<person>" }` (or the linked record ID). Airtable allows 5 requests per second per base, so batch the updates.

## Route B: the browser

### What you need

- Signed in to Airtable with at least Editor access to the base to change owners; a Commenter or Read-only collaborator can run the report but not assign.

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

### Steps

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

1. **Open the view**: Open `https://airtable.com`, which lists your bases. Open the base, the table and the view you use for open work.
2. **Filter to overdue records**: Click **Filter** and add two conditions: the due date field **is before** `today`, and the status field **is not** `Done`. The view's own filters stay in place underneath.
3. **Group by owner**: Click **Group** and group by the owner field, then **Sort** by the due date, oldest first. Records with an empty owner appear in their own group; count each group and note the oldest record in it.
4. **Ask, then assign**: Read the list back with record, owner, due date, days overdue and status, and wait for an answer. Then set the owner field on each unassigned record directly in the grid; change nothing else and remove the temporary filter and grouping when done.

Note: Filters and grouping added in a shared view change it for everyone who uses it; create a personal view first or clear them afterwards. The grid shows all matching rows, so there is no row cap to work around.

## The report

- **Overdue records**: how many, and how many have no owner.
- **By owner**: a count per person and the oldest each one holds.
- **The list**, unassigned first: record, owner, due date, days overdue and status.
- The ask: who takes the unassigned records.

## 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": "airtable-overdue-records/<date of this run, e.g. 2026-10-16>",
  "item_key": "airtable-overdue-records",
  "project": "Acme",
  "source": "Airtable overdue records alert skill",
  "kind": "action",
  "title": "14 overdue records, 4 with no owner",
  "summary": "**14** records in Open requests are past their due date. Priya holds 5 of them, and **4** have no owner at all, the oldest 9 days overdue.",
  "action": {
    "request": "Who takes the 4 unassigned records?",
    "options": [
      "Assign all to Sam",
      "Split between Sam and Lena",
      "Go one by one",
      "Leave them"
    ]
  },
  "widget": [
    {
      "type": "Bars",
      "props": {
        "unit": "records",
        "items": [
          {
            "label": "Priya",
            "value": 5
          },
          {
            "label": "Unassigned",
            "value": 4
          },
          {
            "label": "Sam",
            "value": 3
          },
          {
            "label": "Lena",
            "value": 2
          }
        ]
      }
    },
    {
      "type": "Table",
      "props": {
        "columns": [
          "Record",
          "Owner",
          "Due",
          "Days late",
          "Status"
        ],
        "align": [
          "left",
          "left",
          "left",
          "right",
          "left"
        ],
        "rows": [
          [
            "Vendor renewal: Contoso",
            "Unassigned",
            "Oct 8",
            9,
            "In progress"
          ],
          [
            "Security questionnaire update",
            "Unassigned",
            "Oct 10",
            7,
            "Not started"
          ],
          [
            "Fabrikam onboarding notes",
            "Unassigned",
            "Oct 13",
            4,
            "Not started"
          ],
          [
            "Q4 budget sign-off",
            "Unassigned",
            "Oct 15",
            2,
            "Waiting"
          ],
          [
            "Press kit refresh",
            "Priya",
            "Oct 6",
            11,
            "In progress"
          ],
          [
            "Partner webinar slides",
            "Priya",
            "Oct 9",
            8,
            "Not started"
          ],
          [
            "Support macro audit",
            "Sam",
            "Oct 12",
            5,
            "In progress"
          ]
        ]
      }
    }
  ]
}
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: Weekdays at 9:00 (`0 9 * * 1-5`). From cron, with the agent signed in on that machine:

```bash
0 9 * * 1-5 claude -p "Run the airtable-overdue-records 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/airtable-overdue-records#schedule

Source: https://briefkin.dev/skills/airtable-overdue-records
