Skip to content

210 × 297 mm

Reports

Meeting minutes

An A4 meeting record that is easy to edit visually: key facts, an attendee table, optional apologies, one section per agenda item with an optional highlighted decision, an action-item table and a next-meeting note.

A4 portraitLocale en-GBHTML + JinjaHeader & footer

Opens Dynamic Document API with this template preloaded in a free workspace.

Template language features

  • Loops
  • Conditionals
  • Date formatting
  • Header & footer
  • Page numbers
  • Repeating table headers

Filters such as format_currency and qrcode are described in the template language reference.

Variables

Derived from the sample data: 8 top-level fields, 27 paths in total. Send the same shape as data.

PathTypeExample
organisationstring"Riverside Community Garden Association"
meetingobject
meeting.titlestring"Board meeting minutes"
meeting.datedate"2026-09-10"
meeting.timestring"18:30–20:05"
meeting.locationstring"Community hall, room 2"
meeting.chairstring"Maya Okafor"
meeting.minute_takerstring"Daniel Brooks"
attendance_summarystring"6 of 7 board members present (quorate)"
attendeesarray<object> · 6
attendees[].namestring"Maya Okafor"
attendees[].rolestring"Chair"
apologiesarray<string> · 1"Grace Whitfield (Member)"
agendaarray<object> · 4
agenda[].numbernumber1
agenda[].topicstring"Minutes of the last meeting"
agenda[].notesstring"The minutes of 13 August were read and approve…"
agenda[].decisionstring"Approved unanimously."
actionsarray<object> · 4
actions[].idstring"A1"
actions[].taskstring"Submit the rainwater tank grant application"
actions[].ownerstring"Leonie Grant"
actions[].duedate"2026-09-30"
next_meetingobject
next_meeting.datedate"2026-10-08"
next_meeting.timestring"18:30"
next_meeting.locationstring"Community hall, room 2"

Sample data

Fictional records used for previews. Replace them with your own data when you call the API.

data.json
{
  "organisation": "Riverside Community Garden Association",
  "meeting": {
    "title": "Board meeting minutes",
    "date": "2026-09-10",
    "time": "18:30–20:05",
    "location": "Community hall, room 2",
    "chair": "Maya Okafor",
    "minute_taker": "Daniel Brooks"
  },
  "attendance_summary": "6 of 7 board members present (quorate)",
  "attendees": [
    {
      "name": "Maya Okafor",
      "role": "Chair"
    },
    {
      "name": "Daniel Brooks",
      "role": "Secretary"
    },
    {
      "name": "Leonie Grant",
      "role": "Treasurer"
    },
    {
      "name": "Samir Haddad",
      "role": "Volunteer coordinator"
    },
    {
      "name": "Ruth Kellerman",
      "role": "Member"
    },
    {
      "name": "Oliver Tan",
      "role": "Member"
    }
  ],
  "apologies": [
    "Grace Whitfield (Member)"
  ],
  "agenda": [
    {
      "number": 1,
      "topic": "Minutes of the last meeting",
      "notes": "The minutes of 13 August were read and approved without changes.",
      "decision": "Approved unanimously."
    },
    {
      "number": 2,
      "topic": "Treasurer's report",
      "notes": "Balance of €8,420 after the summer market. The water bill rose by 18 % because of the dry August; the committee discussed rainwater tanks as a long-term fix.",
      "decision": ""
    },
    {
      "number": 3,
      "topic": "Rainwater tanks",
      "notes": "Two quotes were compared. The larger tank covers about 60 % of summer watering. The borough offers a 40 % grant for community projects.",
      "decision": "Apply for the borough grant and order the larger tank if it is approved."
    },
    {
      "number": 4,
      "topic": "Autumn volunteer day",
      "notes": "Planned for 17 October with bulb planting and path repairs. Samir will reach out to the two local schools.",
      "decision": ""
    }
  ],
  "actions": [
    {
      "id": "A1",
      "task": "Submit the rainwater tank grant application",
      "owner": "Leonie Grant",
      "due": "2026-09-30"
    },
    {
      "id": "A2",
      "task": "Invite both schools to the volunteer day",
      "owner": "Samir Haddad",
      "due": "2026-09-24"
    },
    {
      "id": "A3",
      "task": "Order bulbs and gravel for the paths",
      "owner": "Ruth Kellerman",
      "due": "2026-10-03"
    },
    {
      "id": "A4",
      "task": "Publish these minutes on the notice board",
      "owner": "Daniel Brooks",
      "due": "2026-09-15"
    }
  ],
  "next_meeting": {
    "date": "2026-10-08",
    "time": "18:30",
    "location": "Community hall, room 2"
  }
}

Source

The body markup with Jinja, the stylesheet placed in <head> and the header and footer settings.

<p class="organisation">{{ organisation }}</p>
<h1>{{ meeting.title }}</h1>
<table class="facts">
  <tbody>
    <tr>
      <th scope="row">Date</th>
      <td>{{ meeting.date | format_date("full", "en-GB") }}</td>
      <th scope="row">Time</th>
      <td>{{ meeting.time }}</td>
    </tr>
    <tr>
      <th scope="row">Location</th>
      <td>{{ meeting.location }}</td>
      <th scope="row">Chair</th>
      <td>{{ meeting.chair }}</td>
    </tr>
    <tr>
      <th scope="row">Minutes</th>
      <td>{{ meeting.minute_taker }}</td>
      <th scope="row">Attendance</th>
      <td>{{ attendance_summary }}</td>
    </tr>
  </tbody>
</table>

<h2>Attendees</h2>
<table class="attendees">
  <thead>
    <tr>
      <th scope="col">Name</th>
      <th scope="col">Role</th>
    </tr>
  </thead>
  <tbody>
    {% for person in attendees %}
    <tr>
      <td>{{ person.name }}</td>
      <td>{{ person.role }}</td>
    </tr>
    {% endfor %}
  </tbody>
</table>
{% if apologies %}
<div class="apologies">
  <p><strong>Apologies:</strong></p>
  <ul class="dashes">
    {% for name in apologies %}
    <li>{{ name }}</li>
    {% endfor %}
  </ul>
</div>
{% endif %}

<h2>Agenda and discussion</h2>
{% for item in agenda %}
<div class="agenda-item">
  <h3>{{ item.number }}. {{ item.topic }}</h3>
  <p>{{ item.notes }}</p>
  {% if item.decision %}<p class="decision"><strong>Decision:</strong> {{ item.decision }}</p>{% endif %}
</div>
{% endfor %}

<h2>Action items</h2>
<table class="actions">
  <thead>
    <tr>
      <th class="id" scope="col">#</th>
      <th scope="col">Action</th>
      <th scope="col">Owner</th>
      <th class="due" scope="col">Due</th>
    </tr>
  </thead>
  <tbody>
    {% for action in actions %}
    <tr>
      <td class="id">{{ action.id }}</td>
      <td>{{ action.task }}</td>
      <td>{{ action.owner }}</td>
      <td class="due">{{ action.due | format_date("medium", "en-GB") }}</td>
    </tr>
    {% endfor %}
  </tbody>
</table>
{% if next_meeting.date %}<p class="next-meeting"><strong>Next meeting:</strong> {{ next_meeting.date | format_date("long", "en-GB") }}, {{ next_meeting.time }} · {{ next_meeting.location }}</p>{% endif %}

Render it with the API

After adding the template to your workspace, render it by ID and pass your data. Arrays are shortened here.

curl -X POST https://api-eu.dynamicdocumentapi.com/v1/renders \
  -H "Authorization: Bearer $DYNAMIC_DOCUMENT_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
  "input": {
    "type": "template",
    "template_id": "tpl_01J9ZK3M7Q8V5W2X4Y6Z8A0B1C"
  },
  "data": {
    "organisation": "Riverside Community Garden Association",
    "meeting": {
      "title": "Board meeting minutes",
      "date": "2026-09-10",
      "time": "18:30–20:05",
      "location": "Community hall, room 2",
      "chair": "Maya Okafor",
      "minute_taker": "Daniel Brooks"
    },
    "attendance_summary": "6 of 7 board members present (quorate)",
    "attendees": [
      {
        "name": "Maya Okafor",
        "role": "Chair"
      },
      {
        "name": "Daniel Brooks",
        "role": "Secretary"
      }
    ],
    "apologies": [
      "Grace Whitfield (Member)"
    ],
    "agenda": [
      {
        "number": 1,
        "topic": "Minutes of the last meeting",
        "notes": "The minutes of 13 August were read and approved without changes.",
        "decision": "Approved unanimously."
      },
      {
        "number": 2,
        "topic": "Treasurer'\''s report",
        "notes": "Balance of €8,420 after the summer market. The water bill rose by 18 % because of the dry August; the committee discussed rainwater tanks as a long-term fix.",
        "decision": ""
      }
    ],
    "actions": [
      {
        "id": "A1",
        "task": "Submit the rainwater tank grant application",
        "owner": "Leonie Grant",
        "due": "2026-09-30"
      },
      {
        "id": "A2",
        "task": "Invite both schools to the volunteer day",
        "owner": "Samir Haddad",
        "due": "2026-09-24"
      }
    ],
    "next_meeting": {
      "date": "2026-10-08",
      "time": "18:30",
      "location": "Community hall, room 2"
    }
  },
  "output": {
    "format": "pdf",
    "filename": "report-meeting-minutes.pdf"
  }
}'