PDFPipe

Correspondence and reporting / A4

Meeting minutes HTML template

Numbered agenda items with decisions pulled out of the narrative, and an actions table with an owner and a date on every row.

When this document is the right one

A meeting produced decisions that someone who was not there will need to act on. The value is entirely in the decisions and the actions, and the narrative exists to explain them.

Why each part is there

The fields are visible in the markup. What is not visible is why they are present, which is the part that gets removed first when someone adapts a template for their own use.

  • Present and apologies, because a decision taken without someone present is a different kind of decision.
  • Decisions pulled into their own bordered blocks rather than left inside the discussion, since that is what gets re-read.
  • An actions table at the end with a number, an owner and a date on every row. An action with no owner is a wish.
  • Actions carried from a previous meeting listed in the same table rather than referred to, so the table is the complete list.
  • A correction window, which is what turns minutes into an agreed record rather than one person's account.

The template

A complete file. Doctype, stylesheet, body: paste it into a renderer unchanged and it produces a finished A4 page. Replace the sample data and the styling holds.

html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Minutes, operations meeting, 14 May 2026</title>
<style>
  @page { size: A4; margin: 20mm 18mm 22mm; }
  * { box-sizing: border-box; }
  body { margin: 0; font: 10pt/1.55 "Helvetica Neue", Arial, sans-serif; color: #17202a;
         counter-reset: item; }

  header { border-bottom: 2px solid #17202a; padding-bottom: 5mm; }
  h1 { margin: 0; font-size: 17pt; }
  .when { color: #5b6b7c; margin-top: 1.5mm; }

  .attendance { display: grid; grid-template-columns: 1fr 1fr; gap: 8mm; margin: 6mm 0;
                font-size: 9pt; }
  .attendance h2 { margin: 0 0 1.5mm; font-size: 7.5pt; text-transform: uppercase;
                   letter-spacing: 0.08em; color: #5b6b7c; }

  h2.item { font-size: 11pt; margin: 7mm 0 2mm; break-after: avoid; }
  h2.item::before { counter-increment: item; content: counter(item) ". "; color: #5b6b7c; }
  p { margin: 0 0 3mm; }

  /* Decisions and actions are the only parts of minutes anyone reads twice.
     They are pulled out of the narrative rather than buried in it. */
  .decision { border-left: 3px solid #17202a; padding: 1mm 0 1mm 5mm; margin: 3mm 0;
              break-inside: avoid; }
  .decision .k { font-size: 7.5pt; text-transform: uppercase; letter-spacing: 0.08em;
                 color: #5b6b7c; }

  table.actions { width: 100%; border-collapse: collapse; margin-top: 6mm;
                  break-inside: avoid; }
  thead { display: table-header-group; }
  table.actions th { text-align: left; font-size: 7.5pt; text-transform: uppercase;
                     letter-spacing: 0.06em; color: #5b6b7c;
                     border-bottom: 1.5px solid #17202a; padding-bottom: 2mm; }
  table.actions td { padding: 2.5mm 3mm 2.5mm 0; border-bottom: 1px solid #eef2f5;
                     vertical-align: top; }
  table.actions tr { break-inside: avoid; }

  footer { margin-top: 8mm; border-top: 1px solid #dbe2e8; padding-top: 4mm;
           font-size: 8.5pt; color: #5b6b7c; break-inside: avoid; }
</style>
</head>
<body>
  <header>
    <h1>Operations meeting, minutes</h1>
    <div class="when">Thursday 14 May 2026, 09:00 to 10:15, studio office and video</div>
  </header>

  <div class="attendance">
    <div>
      <h2>Present</h2>
      E. Prentice (chair), A. Boland, S. Whitlock, D. Okafor (video)
    </div>
    <div>
      <h2>Apologies and circulation</h2>
      M. Ellery (apologies). Circulated to all of the above plus the board.
    </div>
  </div>

  <h2 class="item">Minutes of the previous meeting</h2>
  <p>
    Approved without amendment. Two actions from 30 April remain open and are carried
    into the table below rather than restated here.
  </p>

  <h2 class="item">Kiln 2 loss rate</h2>
  <p>
    A. Boland presented the March and April figures. Loss on the reduction glaze in
    kiln 2 is running at 9.4 per cent against 5.8 per cent for the same glaze in kiln 1,
    which points at the firing schedule rather than the formulation. Two weeks of
    controlled cooling trials would cost about nine days of capacity.
  </p>
  <div class="decision">
    <div class="k">Decision</div>
    Approved. Trials to run from 26 May and to finish before the Ravenshill production
    run starts on 08 June. If the trials are not conclusive by 05 June the run goes
    ahead in kiln 1 only and the schedule slips by a week rather than the quality.
  </div>

  <h2 class="item">Rim detail pricing</h2>
  <p>
    The hand-applied rim line is quoted at 2.20 and is costing 2.90 in labour at the
    current loss rate. D. Okafor argued for withdrawing it. E. Prentice noted it is the
    line that wins the hospitality work and that withdrawing it changes what the studio
    sells rather than what it charges.
  </p>
  <div class="decision">
    <div class="k">Decision</div>
    Deferred to the Autumn price revision. A. Boland to bring a costing that separates
    the labour from the loss, so the decision is about one of them rather than both.
  </div>

  <h2 class="item">Any other business</h2>
  <p>
    S. Whitlock raised that the goods-in window is being missed by two suppliers. Handled
    outside the meeting.
  </p>

  <table class="actions">
    <thead>
      <tr><th>#</th><th>Action</th><th>Owner</th><th>By</th></tr>
    </thead>
    <tbody>
      <tr><td>1</td><td>Book kiln 2 cooling trials, 26 May to 05 June, and hold the slots</td>
          <td>A. Boland</td><td>16 May</td></tr>
      <tr><td>2</td><td>Costing for the rim line separating labour from loss</td>
          <td>A. Boland</td><td>30 Jun</td></tr>
      <tr><td>3</td><td>Confirm the Ravenshill run start date with D. Quinn in writing</td>
          <td>E. Prentice</td><td>20 May</td></tr>
      <tr><td>4</td><td>Carried from 30 Apr: supplier goods-in window notice</td>
          <td>S. Whitlock</td><td>21 May</td></tr>
    </tbody>
  </table>

  <footer>
    These minutes are a record of decisions and actions, not a transcript. Corrections
    to E. Prentice within five working days; after that they are taken as agreed and
    will be approved at the next meeting.
  </footer>
</body>
</html>

The layout decision worth understanding

Agenda items are numbered by a CSS counter rather than typed, so inserting an item under any other business does not require renumbering everything below it. The decision blocks carry break-inside: avoid, because a decision split across a page break is the one thing in these minutes that must be readable in one piece.

The mistake people make adapting it

Writing minutes as a transcript. Nobody reads them, the decisions are buried in the discussion, and the person who has to act three weeks later cannot find their action. Minutes are a record of decisions and actions; the discussion is context and belongs in a sentence.

Rendering it

The page box is declared in the template's own CSS as A4, so the size travels with the markup rather than living in the code that calls the renderer. A4 is also one of the six named formats the API accepts, so it can be passed in the request options instead if that suits your setup better.

bash
curl -X POST https://api.pdfpipe.xyz/v1/pdf \
  -H "Authorization: Bearer $PDFPIPE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "html": "<!doctype html>...",
    "options": { "format": "A4" }
  }' \
  --output meeting-minutes.pdf

Frequently asked

Can I use this template commercially?

Yes. Copy it, change it, ship it. It is sample markup written to be taken, and the sample data in it is invented, so replace the names and the numbers before anyone sees it.

Why is the page size in the CSS rather than in the API call?

Because a meeting minutes is a A4 document, and that is a property of the document rather than of the code that renders it. Declaring it in the page box means the size cannot be lost between the template and the call, which is the usual way a document ends up on the wrong paper.

Will it look the same in every renderer?

The layout will, because it uses ordinary CSS. The page break behaviour will not: break-inside and break-after are implemented differently by browser engines and by dedicated print engines, and some of the paged media specification is not implemented in browser renders at all. That difference is documented per property in the paged CSS reference.

Other templates

Documents from the same part of a business, and one from each of the other groups.

Paste the template into the playground and get the PDF back. No signup, no key.