{
  "name": "Meeting Notes to Asana Tasks (AI Action Item Extractor)",
  "flow": [
    {
      "id": 1,
      "module": "gateway:CustomWebHook",
      "version": 1,
      "parameters": {
        "hook": "YOUR_WEBHOOK_ID",
        "maxResults": 1
      },
      "mapper": {},
      "metadata": {
        "designer": {
          "x": 0,
          "y": 0
        },
        "restore": {
          "parameters": {
            "hook": {
              "label": "Meeting transcript webhook"
            }
          }
        },
        "parameters": [
          {
            "name": "hook",
            "type": "hook:gateway-webhook",
            "label": "Webhook",
            "required": true
          }
        ],
        "interface": [
          {
            "name": "meeting_title",
            "type": "text"
          },
          {
            "name": "meeting_date",
            "type": "text"
          },
          {
            "name": "transcript",
            "type": "text"
          }
        ]
      }
    },
    {
      "id": 2,
      "module": "openai-gpt-3:CreateCompletion",
      "version": 1,
      "parameters": {
        "__IMTCONN__": "YOUR_OPENAI_CONNECTION"
      },
      "mapper": {
        "select": "chat",
        "model": "gpt-4o-mini",
        "max_tokens": "1500",
        "temperature": "0.1",
        "n_completions": "1",
        "response_format": "json_object",
        "messages": [
          {
            "role": "system",
            "content": "You extract action items from meeting transcripts. An action item is a concrete task someone committed to or was assigned.\n\nRules:\n- title: imperative, max 80 chars (e.g. 'Send pricing proposal to Acme').\n- assignee: the person's name as said in the meeting, or null if unassigned.\n- due_date: ISO date YYYY-MM-DD if a deadline was mentioned or clearly implied (resolve 'next Friday' relative to the meeting date), otherwise null.\n- notes: 1-2 sentences of context from the transcript.\n- Do NOT invent tasks. If there are no action items, return an empty array.\n\nRespond ONLY with valid JSON, no markdown fences, exactly this shape:\n{\"action_items\": [{\"title\": string, \"assignee\": string|null, \"due_date\": string|null, \"notes\": string}]}"
          },
          {
            "role": "user",
            "content": "Meeting: {{1.meeting_title}}\nDate: {{1.meeting_date}}\n\nTranscript:\n{{1.transcript}}"
          }
        ]
      },
      "metadata": {
        "designer": {
          "x": 300,
          "y": 0
        },
        "restore": {
          "parameters": {
            "__IMTCONN__": {
              "label": "My OpenAI connection"
            }
          }
        },
        "parameters": [
          {
            "name": "__IMTCONN__",
            "type": "account:openai-gpt-3",
            "label": "Connection",
            "required": true
          }
        ]
      }
    },
    {
      "id": 3,
      "module": "json:ParseJSON",
      "version": 1,
      "parameters": {},
      "mapper": {
        "json": "{{2.result}}"
      },
      "metadata": {
        "designer": {
          "x": 600,
          "y": 0
        },
        "restore": {},
        "parameters": []
      }
    },
    {
      "id": 4,
      "module": "builtin:BasicFeeder",
      "version": 1,
      "parameters": {},
      "mapper": {
        "array": "{{3.action_items}}"
      },
      "metadata": {
        "designer": {
          "x": 900,
          "y": 0,
          "name": "Iterate action items"
        },
        "restore": {},
        "parameters": []
      }
    },
    {
      "id": 5,
      "module": "asana:CreateTask",
      "version": 2,
      "parameters": {
        "__IMTCONN__": "YOUR_ASANA_CONNECTION"
      },
      "mapper": {
        "workspace": "YOUR_ASANA_WORKSPACE_ID",
        "projects": ["YOUR_ASANA_PROJECT_ID"],
        "name": "{{4.title}}",
        "notes": "{{4.notes}}\n\nAssignee mentioned in meeting: {{4.assignee}}\nSource meeting: {{1.meeting_title}} ({{1.meeting_date}})",
        "due_on": "{{4.due_date}}"
      },
      "metadata": {
        "designer": {
          "x": 1200,
          "y": 0
        },
        "restore": {
          "parameters": {
            "__IMTCONN__": {
              "label": "My Asana connection"
            }
          }
        },
        "parameters": [
          {
            "name": "__IMTCONN__",
            "type": "account:asana",
            "label": "Connection",
            "required": true
          }
        ]
      }
    },
    {
      "id": 6,
      "module": "slack:CreateMessage",
      "version": 4,
      "parameters": {
        "__IMTCONN__": "YOUR_SLACK_CONNECTION"
      },
      "mapper": {
        "channel": "#meeting-follow-ups",
        "channelType": "publicChannel",
        "text": ":white_check_mark: Task created from \"{{1.meeting_title}}\": *{{4.title}}*{{if(4.due_date; \" (due \" + 4.due_date + \")\"; \"\")}} — for {{ifempty(4.assignee; \"unassigned\")}}"
      },
      "metadata": {
        "designer": {
          "x": 1500,
          "y": 0
        },
        "restore": {
          "parameters": {
            "__IMTCONN__": {
              "label": "My Slack connection"
            }
          }
        },
        "parameters": [
          {
            "name": "__IMTCONN__",
            "type": "account:slack",
            "label": "Connection",
            "required": true
          }
        ]
      }
    }
  ],
  "metadata": {
    "version": 1,
    "scenario": {
      "roundtrips": 1,
      "maxErrors": 3,
      "autoCommit": true,
      "autoCommitTriggerLast": true,
      "sequential": false,
      "confidential": false,
      "dataloss": false,
      "dlq": false,
      "freshVariables": false
    },
    "designer": {
      "orphans": []
    },
    "zone": "eu1.make.com"
  }
}
