DocMake
The PDF DocMake makes from the Controlled Procedure (ISO) template

The first page of the document DocMake makes from the sample values on this page.

Compliance

Controlled Procedure (ISO)

The standard management-system document pattern: document-control header repeating on each page, purpose and scope up front, responsibilities and records as loop tables, and a full revision history.

The annex only appears when your data says it exists - a conditional section in action. This is the same starter template that ships inside DocMake.

Blanks to fill

doc_title Document title
process_owner Process owner
purpose Purpose
scope Scope
has_annex Has annex
annex_title Annex title
annex_body Annex body
company_name Company
doc_id Document ID
revision Revision
effective_date Effective date
responsibilities[] One per item, so a row is added for every item in the list
steps[] One per item, so a row is added for every item in the list
records[] One per item, so a row is added for every item in the list
revisions[] One per item, so a row is added for every item in the list

The data behind the preview

This is the exact JSON that produced the document above. Change the values, POST them to the API, and you get your version back as DOCX or PDF. Lists grow and shrink with your data; the layout adapts.

  1. 01 Sign up free and duplicate this template into your workspace.
  2. 02 Adjust the wording and branding in the visual editor.
  3. 03 Fill it in the app, share it as a form link, or call the API.
sample-data.json
{
  "company_name": "Northwind Manufacturing",
  "doc_id": "PR-QMS-04",
  "revision": "3",
  "effective_date": "12 January 2026",
  "doc_title": "Control of Nonconforming Output",
  "process_owner": "Quality Manager",
  "purpose": "Describe how output that does not meet requirements is identified, recorded and dealt with, so that it is never used or delivered by mistake.",
  "scope": "Applies to every product and service the plant delivers, from goods receipt to dispatch, including work held at a supplier.",
  "responsibilities": [
    {
      "role": "Quality Manager",
      "duty": "Owns this procedure and decides how each nonconformity is dealt with."
    },
    {
      "role": "Production Lead",
      "duty": "Identifies and segregates affected output within the shift it is found."
    },
    {
      "role": "Internal Auditor",
      "duty": "Checks that records are complete during the yearly audit."
    }
  ],
  "steps": [
    {
      "action": "Identify the output that does not meet the requirement and label it.",
      "responsible": "Production Lead"
    },
    {
      "action": "Move it to the quarantine area and record it in the nonconformity register.",
      "responsible": "Production Lead"
    },
    {
      "action": "Decide the treatment: correct, regrade, return to the supplier or scrap.",
      "responsible": "Quality Manager"
    },
    {
      "action": "Inform the customer when delivered output is affected.",
      "responsible": "Quality Manager"
    },
    {
      "action": "Close the record once the treatment is verified.",
      "responsible": "Internal Auditor"
    }
  ],
  "records": [
    {
      "name": "Nonconformity register",
      "retention": "3 years"
    },
    {
      "name": "Concession request",
      "retention": "3 years"
    },
    {
      "name": "Customer notification",
      "retention": "5 years"
    }
  ],
  "has_annex": true,
  "annex_title": "Quarantine labels",
  "annex_body": "Red label for scrap, amber for output waiting on a decision, green once the treatment has been verified and the record closed.",
  "revisions": [
    {
      "number": "1",
      "date": "04 March 2024",
      "description": "First issue.",
      "approved_by": "A. Whitfield"
    },
    {
      "number": "2",
      "date": "18 June 2025",
      "description": "Quarantine area moved to Bay 4.",
      "approved_by": "A. Whitfield"
    },
    {
      "number": "3",
      "date": "12 January 2026",
      "description": "Customer notification step added.",
      "approved_by": "M. Okafor"
    }
  ]
}

Generate this document via the API

One template plus changing data is the whole point. The list of blanks above is the contract, and every new set of values comes back in the same layout: fill it in the app, hand someone a form link, or POST the JSON and get the file straight back.

The request below carries this page's own values, so it runs as soon as the template exists in your workspace. Swap the values for yours and the response is your document.

make-iso-controlled-procedure.sh
curl -X POST https://app.docmake.io/api/v1/render \
  -H "Authorization: Bearer $DOCMAKE_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json" \
  --output iso-controlled-procedure.pdf \
  --data-binary @- <<'JSON'
{
  "template_id": "tmpl_your_template_id",
  "format": "pdf",
  "data": {
    "company_name": "Northwind Manufacturing",
    "doc_id": "PR-QMS-04",
    "revision": "3",
    "effective_date": "12 January 2026",
    "doc_title": "Control of Nonconforming Output",
    "process_owner": "Quality Manager",
    "purpose": "Describe how output that does not meet requirements is identified, recorded and dealt with, so that it is never used or delivered by mistake.",
    "scope": "Applies to every product and service the plant delivers, from goods receipt to dispatch, including work held at a supplier.",
    "responsibilities": [
      {
        "role": "Quality Manager",
        "duty": "Owns this procedure and decides how each nonconformity is dealt with."
      },
      {
        "role": "Production Lead",
        "duty": "Identifies and segregates affected output within the shift it is found."
      },
      {
        "role": "Internal Auditor",
        "duty": "Checks that records are complete during the yearly audit."
      }
    ],
    "steps": [
      {
        "action": "Identify the output that does not meet the requirement and label it.",
        "responsible": "Production Lead"
      },
      {
        "action": "Move it to the quarantine area and record it in the nonconformity register.",
        "responsible": "Production Lead"
      },
      {
        "action": "Decide the treatment: correct, regrade, return to the supplier or scrap.",
        "responsible": "Quality Manager"
      },
      {
        "action": "Inform the customer when delivered output is affected.",
        "responsible": "Quality Manager"
      },
      {
        "action": "Close the record once the treatment is verified.",
        "responsible": "Internal Auditor"
      }
    ],
    "records": [
      {
        "name": "Nonconformity register",
        "retention": "3 years"
      },
      {
        "name": "Concession request",
        "retention": "3 years"
      },
      {
        "name": "Customer notification",
        "retention": "5 years"
      }
    ],
    "has_annex": true,
    "annex_title": "Quarantine labels",
    "annex_body": "Red label for scrap, amber for output waiting on a decision, green once the treatment has been verified and the record closed.",
    "revisions": [
      {
        "number": "1",
        "date": "04 March 2024",
        "description": "First issue.",
        "approved_by": "A. Whitfield"
      },
      {
        "number": "2",
        "date": "18 June 2025",
        "description": "Quarantine area moved to Bay 4.",
        "approved_by": "A. Whitfield"
      },
      {
        "number": "3",
        "date": "12 January 2026",
        "description": "Customer notification step added.",
        "approved_by": "M. Okafor"
      }
    ]
  }
}
JSON

tmpl_your_template_id is a stand-in: build this template in the visual editor and copy the id it shows, or create one with POST /api/v1/templates. Keys, formats, strict mode and batches are in the API reference.

Or let an AI assistant do it

The DocMake MCP server lets Claude and other assistants make this document the same way. Install it once:

claude mcp add docmake \
  --env DOCMAKE_API_KEY=dm_your_api_key \
  -- npx -y @docmake/mcp@latest

Then ask for the document in plain words:

Make a PDF from my Controlled Procedure (ISO) template with document title "Control of Nonconforming Output" and process owner "Quality Manager".

How the MCP server works →

More compliance templates