14 overdue records, 4 with no owner
Who takes the 4 unassigned records?
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.
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.
What lands on your board
Who takes the 4 unassigned records?
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.
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.
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.
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.
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.
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.
Pick your agent, where the data comes from and how to schedule it; the commands below follow.
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/airtable-overdue-records/install | shAsk Claude Code:
promptRun the airtable-overdue-records skillOr paste the prompt instead of installing:
promptUsing the Airtable Web API (or the Airtable MCP server), read the view <view> in table <table> of base <base>, keeping records whose Due date is before today and whose Status is not Done. Group them by Owner with days overdue, unassigned records first, and show each record's name, owner, due date, days overdue and status. Then ask me who should take the unassigned ones. When I answer, update the Owner field on those records. Change nothing else.Weekdays at 9:00, from cron on any machine where Claude Code is signed in:
crontab0 9 * * 1-5 claude -p "Run the airtable-overdue-records 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.
Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a question for you. How setup works
SKILL.md---
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
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.
https://mcp.airtable.com/mcp. In Claude Code, install it with claude plugin install airtable@claude-plugins-official, or add the URL as a remote HTTP server. Signing in with OAuth lets you choose which bases and workspaces it can reach (docs).AIRTABLE_PAT, and send it as Authorization: Bearer in the client's MCP config, for example claude mcp add --transport http airtable https://mcp.airtable.com/mcp --header "Authorization: Bearer $AIRTABLE_PAT".https://api.airtable.com/v0/... with the Bearer header; the skill also reads AIRTABLE_BASE_ID (it starts with app).Give the token only data.records:read and schema.bases:read, and add only the bases in the report under Access; without the write scopes, neither the MCP server nor the API can change a record.
Those whose due date is before today and whose status is not Done, inside the view you pick. If your base has more finished states, widen the formula, for example NOT(OR({Status} = 'Done', {Status} = 'Canceled')). Records with no due date never show up; ask for them as a separate list if they matter.
Yes. A linked record field returns record IDs instead of names, so the skill reads the names from the linked table and assigns by record ID when you answer. A collaborator field is assigned by email.
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 asks you, so you can glance at it instead of asking again.
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.
Yes. Switch the data source to "Your browser" and the steps change to the Airtable pages themselves: the agent opens airtable.com 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.
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.