When you pipe meeting transcripts into Notion/Linear via n8n + an LLM, one failure mode is subtle: the model invents a due date (“Friday”, “end of week”, “next Tuesday”) that nobody said.
That looks helpful in the JSON preview. In production it creates false urgency, wrong sprint planning, and tickets that look “managed” when they are not.
## The pattern
**Rule:** if the transcript does not contain an explicit date (or a resolvable relative date with a clear anchor), output `due_date: null` — never guess.
### 1) Constrain the extract schema
Ask for strict JSON, e.g.:
```json
{
“action”: “string”,
“owner”: “string|null”,
“due_date”: “YYYY-MM-DD|null”,
“due_date_source”: “explicit|relative_resolved|null”,
“confidence”: 0.0,
“context”: “string”
}
```
Prompt hard constraints that work well:
- Only set `due_date` when the speaker named a calendar date, or a relative phrase you can resolve against the meeting timestamp (`tomorrow`, `next Monday` with known meeting date).
- Vague phrases (`soon`, `ASAP`, `this week`, `when you can`) → `due_date: null`, keep the phrase in `context`.
- If unsure → null. Prefer missing over wrong.
### 2) Resolve relatives in code, not in the prompt
Do relative date math in a Code node (or Date & Time) using the meeting’s `started_at`:
- LLM returns `due_raw: “next Friday”` + meeting ISO timestamp
- Code resolves to `YYYY-MM-DD` **only** when the phrase is unambiguous
- Otherwise force null
LLMs are worse than a 20-line resolver at calendar arithmetic across timezones.
### 3) Gate the write
Before Notion/Linear create:
- If `due_date` is null → omit the due field (don’t write epoch 0 / “today” / default Friday).
- Optionally set a `needs_due_date` checkbox/label so humans triage undated work.
- Log `due_date_source` on the ticket body for auditability.
### 4) Fixture the failure
Pin a transcript snippet that says “let’s follow up soon” with **no** date. Assert the workflow writes a ticket **without** a due date. Re-run that fixture after every prompt tweak.
## Why this beats “always fill a date”
Invented deadlines train teams to ignore due fields. Nulls keep the field meaningful. Your automation stays honest: structured where the meeting was structured, empty where it was not.
-–
I packaged this (plus owner routing to Notion and/or Linear) as **OpsPacket — Meeting → Action Items**, with setup notes for the webhook → JSON extract → write path. Soft landing / details: https://opspacket-meeting-actions.netlify.app/
Happy to share sanitized sample input/output JSON if useful — no fake metrics, just the schema pattern above.