# Meeting Notes to Action Items (JSON)

> Turns meeting notes or an AI note-taker transcript into decisions, owned actions, open questions, risks and a recap message, as JSON.

- Category: Process
- Works with: Any chat AI
- Format: markdown
- Language of the prompt text: English
- Page: https://prompts.inocta.io/en/p/meeting-notes-to-action-items
- Source: https://prompts.chat/prompts/cmutianfl0007ld0465nojpe1_meeting-notes-to-action-items-extractor-json

## Blanks to fill

None. The prompt is ready as is.

## Prompt

````markdown
You turn a meeting into clear follow-ups. The input can be typed notes, a chat thread, or a transcript from an AI note-taker (Zoom, Teams, Google Meet, Granola, Otter) with speaker labels and timestamps. Output **only valid JSON** matching the schema below: no markdown fences, no commentary outside JSON.

## Task
Given raw notes (bullets, transcripts, or chat dumps), produce:
- meeting metadata (best-effort)
- decisions that were actually agreed
- action items with owners and due dates when stated
- open questions / parking lot
- risks or blockers mentioned
- a short recap message the organizer can send right away

## Strict JSON schema
```json
{
  "meeting": {
    "title": "string|null",
    "date": "YYYY-MM-DD|null",
    "participants": ["string"],
    "source_quality": "high|medium|low"
  },
  "summary": "string (2-4 sentences)",
  "follow_up_message": "string (5 to 8 short lines, ready to paste in Slack, Teams or email: the decisions, then each action with its owner and date)",
  "decisions": [
    {
      "id": "D1",
      "text": "string",
      "rationale": "string|null",
      "decided_by": "string|null"
    }
  ],
  "action_items": [
    {
      "id": "A1",
      "task": "string (imperative verb + object)",
      "owner": "string|null",
      "due_date": "YYYY-MM-DD|null",
      "priority": "P0|P1|P2|unknown",
      "depends_on": ["A2"],
      "status": "open",
      "evidence": "string (short quote or paraphrase from notes)"
    }
  ],
  "open_questions": [
    {
      "id": "Q1",
      "question": "string",
      "asked_by": "string|null",
      "needs_answer_from": "string|null"
    }
  ],
  "risks": [
    {
      "id": "R1",
      "description": "string",
      "severity": "high|medium|low|unknown"
    }
  ],
  "assumptions": ["string"],
  "unresolved_ambiguities": ["string"]
}
```

## Extraction rules
1. Do **not** invent owners, dates, or decisions. Use `null` / empty arrays when unknown.
2. Only list something under `decisions` if the notes show agreement (e.g. "we decided", "agreed", "approved"). Ideas and proposals are not decisions: put them in `open_questions` or skip.
3. Action items must be concrete tasks ("Ship API rate-limit docs"), not topics ("Discuss docs").
4. If multiple people are named without a clear owner, set `owner` to null and add an ambiguity.
5. Normalize relative dates ("next Friday") only if `meeting.date` is known; otherwise keep due_date null and mention the relative phrase in `evidence`.
6. `source_quality`: high = clear transcript with names; medium = decent notes; low = fragmentary.
7. IDs must be stable within the document: D1…, A1…, Q1…, R1…
8. `depends_on` may only reference other action item ids in this payload.
9. Ignore small talk, filler words and any summary the note-taker wrote itself. Work from what people actually said.
10. When the transcript has timestamps, start `evidence` with the timestamp, for example "[12:04]".
11. In `follow_up_message`, use names, not IDs, and write "owner to confirm" where `owner` is null.
12. If the input is empty or not meeting-related, return the schema with empty arrays, summary explaining the issue, and `source_quality: "low"`.

## Input
The notes or transcript come after this prompt, pasted or attached as a file. Optional context may include known participants or the meeting date: prefer that over guessing.
````
