DocMake
The PDF DocMake makes from the HACCP Plan template

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

Compliance

HACCP Plan

A HACCP plan is the written result of the Codex application sequence: assemble the team and fix the scope, describe the product and who will eat it, draw the flow diagram and then walk the line to confirm it, analyse the hazards at every step, decide which steps are critical control points, and give each one a validated limit, a monitoring routine, a corrective action, a verification activity and a record.

The current wording is worth getting right, because the 2022 revision of CXC 1-1969 changed four of the seven principles. Principle 1 now reads conduct a hazard analysis and identify control measures. Principle 3 is establish validated critical limits. Principle 5 is establish the corrective actions to be taken when monitoring indicates a deviation from a critical limit at a CCP has occurred. Principle 6 is validate the HACCP plan and then establish procedures for verification. A great deal of material still in circulation carries the older 2003 phrasing.

Codex supplies two worksheets and this template follows their columns. The hazard analysis lists each process step with the hazards introduced, controlled or enhanced there, typed as biological, chemical or physical, whether the hazard has to be addressed in the plan, the justification for that answer, and the control measure available. The plan table then runs one row per critical control point: significant hazard, critical limit, monitoring split into what, how, when and who, corrective action, verification activity and records. A likelihood and severity score and a separate allergen column are widespread industry additions rather than Codex columns, so neither sits in the tables here, and a plan that needs one adds a column of its own.

What the document cannot do is stand in for the work behind it. Prerequisite programmes have to be running before a HACCP system means anything, and critical limits have to be validated for your own product and process rather than copied, which is why every number in the sample below is illustrative. EU food business operators are required to keep procedures based on the HACCP principles under Regulation (EC) No 852/2004, and an inspector reads the plan itself, not the tool that printed it. What generating the plan buys you is narrower and real: the working copy, the annual review and the version handed over at an audit all descend from one record.

Blanks to fill

plan_reference Plan reference
revision Revision
approved_by Approved by
approval_date Approval date
company_name Food business
site_address Site
scope Scope of the plan
product_name Product
product_description What it is
composition What is in it and the allergens
packaging Packaging
storage_and_distribution How it is kept and moved
shelf_life Shelf life
intended_use How it is meant to be used
intended_consumers Who it is for
vulnerable_groups Vulnerable groups considered
labelling_instructions What the label says
flow_diagram_reference Flow diagram
flow_diagram_verified_by Flow diagram confirmed by
flow_diagram_verified_date Date it was confirmed
prerequisite_programmes Prerequisite programmes
validation_summary Validation of the critical limits
next_review_date Next review
haccp_team[] One per item, so a row is added for every item in the list
hazard_analysis[] One per item, so a row is added for every item in the list
ccp_determination[] One per item, so a row is added for every item in the list
control_chart[] 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
{
  "plan_reference": "HACCP-SOUP-02",
  "revision": "4",
  "company_name": "Larkfield Foods Ltd",
  "site_address": "Unit 7, Larkfield Industrial Estate, Maidstone ME20 6QT, United Kingdom",
  "scope": "Covers the chilled soup line from goods receipt of raw vegetables and dairy through pasteurisation, hot fill, blast chilling and chilled dispatch. Ambient soup in retort pouches is covered by a separate study.",
  "product_name": "Carrot and coriander soup, 500 g chilled pouch",
  "product_description": "A pasteurised vegetable soup, hot filled into a laminate pouch, blast chilled and held under refrigeration. Water activity above 0.98, pH between 5.4 and 5.9, so the product relies on the heat step and the cold chain rather than on formulation.",
  "composition": "Water, carrot, onion, single cream, unsalted butter, coriander leaf, vegetable stock, salt, ground coriander seed, black pepper. Allergens present: milk, from the cream and the butter. Celery is present in the vegetable stock. No allergen is added after the pasteurisation step.",
  "packaging": "Laminate stand-up pouch with a heat seal, packed twelve to a case. Pouch and case both carry the lot code and the use by date.",
  "storage_and_distribution": "Held and distributed at 1 to 5 C. Vehicles are temperature logged and the load is rejected on arrival if the probe reads above 8 C.",
  "shelf_life": "18 days from production, established by challenge testing and shelf life trials held in the technical file.",
  "intended_use": "Reheated by the consumer to steaming hot before eating. Not intended to be eaten cold.",
  "intended_consumers": "General retail population buying from chilled supermarket shelves.",
  "vulnerable_groups": "The plan assumes the product may be eaten by young children, older adults, pregnant women and immunocompromised people, since nothing on the pack excludes them.",
  "labelling_instructions": "Keep refrigerated. Use by the date shown. Once opened, use within 24 hours. Heat until piping hot throughout, do not reheat more than once. Allergen declaration emphasised in the ingredient list.",
  "flow_diagram_reference": "FD-SOUP-02 revision 3, one page, covering seventeen steps from goods in to dispatch",
  "flow_diagram_verified_by": "Nadia Fischer and Sanne Kuipers, walked on both the day and the night shift",
  "flow_diagram_verified_date": "July 9, 2026",
  "prerequisite_programmes": "Cleaning and disinfection, personal hygiene and health screening, supplier approval and raw material specification, pest control, planned maintenance, glass and hard plastic control, allergen management and changeover cleaning, water quality monitoring, waste handling, traceability and recall, induction and refresher training. Each has its own procedure and its own records.",
  "haccp_team": [
    {
      "name": "Nadia Fischer",
      "role": "Technical Manager and HACCP team leader",
      "contribution": "Owns the study, chairs the reviews, signs the plan"
    },
    {
      "name": "Sanne Kuipers",
      "role": "Production Manager",
      "contribution": "Process detail, line speeds, changeover practice"
    },
    {
      "name": "Daniel Okafor",
      "role": "Engineering Manager",
      "contribution": "Pasteuriser and blast chiller capability, instrument calibration"
    },
    {
      "name": "Priya Raman",
      "role": "Quality Supervisor",
      "contribution": "Monitoring records, corrective action history, training evidence"
    },
    {
      "name": "Dr Elena Novak",
      "role": "External food safety consultant",
      "contribution": "Microbiological hazard review and validation of the heat step"
    }
  ],
  "hazard_analysis": [
    {
      "step": "1. Goods receipt, raw vegetables",
      "hazard": "Soil borne pathogens including Listeria monocytogenes on carrot and onion",
      "type": "Biological",
      "address_in_plan": "No",
      "justification": "Raw material specification and supplier approval reduce the load, and the pasteurisation step later in the process is validated to control vegetative pathogens.",
      "control_measure": "Approved supplier programme, specification checks on delivery, controlled by the heat step at 9"
    },
    {
      "step": "1. Goods receipt, raw vegetables",
      "hazard": "Pesticide residues above the permitted level",
      "type": "Chemical",
      "address_in_plan": "No",
      "justification": "Controlled by supplier approval and an annual residue testing schedule; no process step affects residues.",
      "control_measure": "Supplier approval programme with certificates of analysis and rotating residue tests"
    },
    {
      "step": "1. Goods receipt, raw vegetables",
      "hazard": "Stones, soil clumps and field debris",
      "type": "Physical",
      "address_in_plan": "No",
      "justification": "Washing, sorting and the later sieve remove field debris; residual metal is addressed at step 14.",
      "control_measure": "Wash and sort at step 4, in line sieve at step 10"
    },
    {
      "step": "2. Goods receipt, cream and butter",
      "hazard": "Undeclared milk allergen cross contact from a supplier changeover",
      "type": "Chemical",
      "address_in_plan": "No",
      "justification": "Milk is a declared allergen in this product, so supplier cross contact with milk presents no new risk. Cross contact with other allergens is controlled by supplier specification.",
      "control_measure": "Supplier allergen questionnaire and specification, goods in label check"
    },
    {
      "step": "4. Wash and sort",
      "hazard": "Build up of pathogens in recirculated wash water",
      "type": "Biological",
      "address_in_plan": "No",
      "justification": "Water is single pass with a documented change frequency, and the heat step controls vegetative pathogens.",
      "control_measure": "Wash water procedure, potable water monitoring"
    },
    {
      "step": "9. Pasteurisation",
      "hazard": "Survival of vegetative pathogens including Listeria monocytogenes and Salmonella",
      "type": "Biological",
      "address_in_plan": "Yes",
      "justification": "This is the only step that reliably reduces vegetative pathogens to an acceptable level. Loss of control here is not recovered by any later step.",
      "control_measure": "Validated time and temperature combination with continuous chart recording"
    },
    {
      "step": "11. Hot fill and seal",
      "hazard": "Post process contamination through an incomplete seal",
      "type": "Biological",
      "address_in_plan": "No",
      "justification": "Seal integrity is verified by an in line vision check and hourly destructive seal testing under the prerequisite programme; the chilled shelf life assumes an intact seal.",
      "control_measure": "Seal integrity checks, planned maintenance of the sealing jaws"
    },
    {
      "step": "12. Blast chill",
      "hazard": "Growth and toxin formation by Clostridium perfringens and Bacillus cereus during slow cooling",
      "type": "Biological",
      "address_in_plan": "Yes",
      "justification": "Spores survive pasteurisation. Cooling too slowly through the growth range allows outgrowth, and no later step reduces the resulting numbers or the toxin.",
      "control_measure": "Blast chiller with recorded product core temperature and a maximum cooling time"
    },
    {
      "step": "14. Metal detection",
      "hazard": "Metal fragments from the sieve mesh, blade wear or maintenance activity",
      "type": "Physical",
      "address_in_plan": "Yes",
      "justification": "Last point at which a metal fragment can be detected and the affected product removed before dispatch.",
      "control_measure": "In line metal detector with automatic reject and a locked reject bin"
    },
    {
      "step": "16. Chilled storage",
      "hazard": "Growth of Listeria monocytogenes if the cold chain is lost",
      "type": "Biological",
      "address_in_plan": "No",
      "justification": "Managed by the chilled storage prerequisite programme with alarmed continuous monitoring and a documented response, rather than as a CCP.",
      "control_measure": "Alarmed chill store monitoring, stock rotation, dispatch temperature check"
    }
  ],
  "ccp_determination": [
    {
      "step": "9. Pasteurisation",
      "hazard": "Survival of vegetative pathogens",
      "q1": "No",
      "q2": "Yes",
      "q3": "No",
      "q4": "Yes",
      "ccp": "CCP 1"
    },
    {
      "step": "12. Blast chill",
      "hazard": "Outgrowth of spore forming pathogens during cooling",
      "q1": "No",
      "q2": "Yes",
      "q3": "No",
      "q4": "Yes",
      "ccp": "CCP 2"
    },
    {
      "step": "14. Metal detection",
      "hazard": "Metal fragments in the sealed pouch",
      "q1": "No",
      "q2": "Yes",
      "q3": "No",
      "q4": "Yes",
      "ccp": "CCP 3"
    },
    {
      "step": "11. Hot fill and seal",
      "hazard": "Post process contamination through a weak seal",
      "q1": "Yes",
      "q2": "Stop",
      "q3": "Stop",
      "q4": "Stop",
      "ccp": "Not a CCP, controlled by prerequisite programme"
    },
    {
      "step": "16. Chilled storage",
      "hazard": "Growth of Listeria monocytogenes",
      "q1": "Yes",
      "q2": "Stop",
      "q3": "Stop",
      "q4": "Stop",
      "ccp": "Not a CCP, controlled by prerequisite programme"
    }
  ],
  "control_chart": [
    {
      "ccp": "CCP 1",
      "step": "9. Pasteurisation",
      "hazard": "Survival of vegetative pathogens including Listeria monocytogenes and Salmonella",
      "critical_limit": "Product held at or above 90 C for at least 10 minutes measured at the slowest heating point of the vessel, as validated in report VAL-2025-11",
      "monitor_what": "Product temperature at the validated slowest heating point and the hold time",
      "monitor_how": "Calibrated probe feeding a continuous chart recorder, with an independent hand probe check",
      "monitor_when": "Continuously through every batch, with the hand probe check once per batch at the start of the hold",
      "monitor_who": "Process operator, countersigned by the shift supervisor",
      "corrective_action": "Hold the batch, extend the hold or re-process where the validation allows it, and where neither applies dispose of the batch. Quarantine every batch back to the last compliant record, investigate, and raise a nonconformance report.",
      "verification": "Daily review of charts by the quality supervisor, probe calibration every three months, annual revalidation of the heat step",
      "records": "Pasteurisation chart, batch record, probe calibration certificate, corrective action log"
    },
    {
      "ccp": "CCP 2",
      "step": "12. Blast chill",
      "hazard": "Outgrowth of Clostridium perfringens and Bacillus cereus during cooling",
      "critical_limit": "Product core temperature falls from 90 C to below 5 C within 4 hours of the pouch leaving the filler",
      "monitor_what": "Core temperature of a probe pouch in the slowest cooling position, and elapsed time",
      "monitor_how": "Logged probe in a designated pouch per trolley, with the start time recorded at fill",
      "monitor_when": "Every trolley, every batch",
      "monitor_who": "Chill room operator",
      "corrective_action": "Quarantine the trolley, assess against the validated cooling profile, dispose of product that exceeded the limit, investigate the chiller and record the outcome before the next run.",
      "verification": "Weekly download and review of chiller logs, annual thermal mapping of the blast chiller, probe calibration every three months",
      "records": "Chiller log, trolley identity record, batch record, maintenance record"
    },
    {
      "ccp": "CCP 3",
      "step": "14. Metal detection",
      "hazard": "Metal fragments in the sealed pouch",
      "critical_limit": "Detector rejects certified test pieces of ferrous 2.0 mm, non ferrous 2.5 mm and stainless steel 3.0 mm on every routine check, and the reject mechanism operates every time",
      "monitor_what": "Detector response to the three test pieces and operation of the reject arm and the locked reject bin",
      "monitor_how": "Test pieces passed through the aperture with the pack, results recorded on the check sheet",
      "monitor_when": "At start up, every hour, at every product changeover, at shutdown and after any detector fault",
      "monitor_who": "Line operator, verified by the quality supervisor",
      "corrective_action": "Stop the line, quarantine all product back to the last passing check, re-test through a working detector, and release only what passes. Record the quantity held and the outcome, and raise a nonconformance report.",
      "verification": "Quality supervisor countersigns the check sheet daily, detector serviced annually by the supplier, quarterly review of reject bin contents",
      "records": "Metal detection check sheet, quarantine record, service report, nonconformance report"
    }
  ],
  "validation_summary": "The pasteurisation limit and the cooling limit were validated for this product and this equipment in reports VAL-2025-11 and VAL-2025-14, using worst case fill weight, worst case vessel loading and the slowest heating and cooling positions found during thermal mapping. Both are revalidated when the recipe, the pack format or the equipment changes, and at least annually.",
  "approved_by": "Nadia Fischer, Technical Manager",
  "approval_date": "July 20, 2026",
  "next_review_date": "July 20, 2027, or sooner on any change to the recipe, process, equipment or supplier base"
}

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-haccp-plan.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 haccp-plan.pdf \
  --data-binary @- <<'JSON'
{
  "template_id": "tmpl_your_template_id",
  "format": "pdf",
  "data": {
    "plan_reference": "HACCP-SOUP-02",
    "revision": "4",
    "company_name": "Larkfield Foods Ltd",
    "site_address": "Unit 7, Larkfield Industrial Estate, Maidstone ME20 6QT, United Kingdom",
    "scope": "Covers the chilled soup line from goods receipt of raw vegetables and dairy through pasteurisation, hot fill, blast chilling and chilled dispatch. Ambient soup in retort pouches is covered by a separate study.",
    "product_name": "Carrot and coriander soup, 500 g chilled pouch",
    "product_description": "A pasteurised vegetable soup, hot filled into a laminate pouch, blast chilled and held under refrigeration. Water activity above 0.98, pH between 5.4 and 5.9, so the product relies on the heat step and the cold chain rather than on formulation.",
    "composition": "Water, carrot, onion, single cream, unsalted butter, coriander leaf, vegetable stock, salt, ground coriander seed, black pepper. Allergens present: milk, from the cream and the butter. Celery is present in the vegetable stock. No allergen is added after the pasteurisation step.",
    "packaging": "Laminate stand-up pouch with a heat seal, packed twelve to a case. Pouch and case both carry the lot code and the use by date.",
    "storage_and_distribution": "Held and distributed at 1 to 5 C. Vehicles are temperature logged and the load is rejected on arrival if the probe reads above 8 C.",
    "shelf_life": "18 days from production, established by challenge testing and shelf life trials held in the technical file.",
    "intended_use": "Reheated by the consumer to steaming hot before eating. Not intended to be eaten cold.",
    "intended_consumers": "General retail population buying from chilled supermarket shelves.",
    "vulnerable_groups": "The plan assumes the product may be eaten by young children, older adults, pregnant women and immunocompromised people, since nothing on the pack excludes them.",
    "labelling_instructions": "Keep refrigerated. Use by the date shown. Once opened, use within 24 hours. Heat until piping hot throughout, do not reheat more than once. Allergen declaration emphasised in the ingredient list.",
    "flow_diagram_reference": "FD-SOUP-02 revision 3, one page, covering seventeen steps from goods in to dispatch",
    "flow_diagram_verified_by": "Nadia Fischer and Sanne Kuipers, walked on both the day and the night shift",
    "flow_diagram_verified_date": "July 9, 2026",
    "prerequisite_programmes": "Cleaning and disinfection, personal hygiene and health screening, supplier approval and raw material specification, pest control, planned maintenance, glass and hard plastic control, allergen management and changeover cleaning, water quality monitoring, waste handling, traceability and recall, induction and refresher training. Each has its own procedure and its own records.",
    "haccp_team": [
      {
        "name": "Nadia Fischer",
        "role": "Technical Manager and HACCP team leader",
        "contribution": "Owns the study, chairs the reviews, signs the plan"
      },
      {
        "name": "Sanne Kuipers",
        "role": "Production Manager",
        "contribution": "Process detail, line speeds, changeover practice"
      },
      {
        "name": "Daniel Okafor",
        "role": "Engineering Manager",
        "contribution": "Pasteuriser and blast chiller capability, instrument calibration"
      },
      {
        "name": "Priya Raman",
        "role": "Quality Supervisor",
        "contribution": "Monitoring records, corrective action history, training evidence"
      },
      {
        "name": "Dr Elena Novak",
        "role": "External food safety consultant",
        "contribution": "Microbiological hazard review and validation of the heat step"
      }
    ],
    "hazard_analysis": [
      {
        "step": "1. Goods receipt, raw vegetables",
        "hazard": "Soil borne pathogens including Listeria monocytogenes on carrot and onion",
        "type": "Biological",
        "address_in_plan": "No",
        "justification": "Raw material specification and supplier approval reduce the load, and the pasteurisation step later in the process is validated to control vegetative pathogens.",
        "control_measure": "Approved supplier programme, specification checks on delivery, controlled by the heat step at 9"
      },
      {
        "step": "1. Goods receipt, raw vegetables",
        "hazard": "Pesticide residues above the permitted level",
        "type": "Chemical",
        "address_in_plan": "No",
        "justification": "Controlled by supplier approval and an annual residue testing schedule; no process step affects residues.",
        "control_measure": "Supplier approval programme with certificates of analysis and rotating residue tests"
      },
      {
        "step": "1. Goods receipt, raw vegetables",
        "hazard": "Stones, soil clumps and field debris",
        "type": "Physical",
        "address_in_plan": "No",
        "justification": "Washing, sorting and the later sieve remove field debris; residual metal is addressed at step 14.",
        "control_measure": "Wash and sort at step 4, in line sieve at step 10"
      },
      {
        "step": "2. Goods receipt, cream and butter",
        "hazard": "Undeclared milk allergen cross contact from a supplier changeover",
        "type": "Chemical",
        "address_in_plan": "No",
        "justification": "Milk is a declared allergen in this product, so supplier cross contact with milk presents no new risk. Cross contact with other allergens is controlled by supplier specification.",
        "control_measure": "Supplier allergen questionnaire and specification, goods in label check"
      },
      {
        "step": "4. Wash and sort",
        "hazard": "Build up of pathogens in recirculated wash water",
        "type": "Biological",
        "address_in_plan": "No",
        "justification": "Water is single pass with a documented change frequency, and the heat step controls vegetative pathogens.",
        "control_measure": "Wash water procedure, potable water monitoring"
      },
      {
        "step": "9. Pasteurisation",
        "hazard": "Survival of vegetative pathogens including Listeria monocytogenes and Salmonella",
        "type": "Biological",
        "address_in_plan": "Yes",
        "justification": "This is the only step that reliably reduces vegetative pathogens to an acceptable level. Loss of control here is not recovered by any later step.",
        "control_measure": "Validated time and temperature combination with continuous chart recording"
      },
      {
        "step": "11. Hot fill and seal",
        "hazard": "Post process contamination through an incomplete seal",
        "type": "Biological",
        "address_in_plan": "No",
        "justification": "Seal integrity is verified by an in line vision check and hourly destructive seal testing under the prerequisite programme; the chilled shelf life assumes an intact seal.",
        "control_measure": "Seal integrity checks, planned maintenance of the sealing jaws"
      },
      {
        "step": "12. Blast chill",
        "hazard": "Growth and toxin formation by Clostridium perfringens and Bacillus cereus during slow cooling",
        "type": "Biological",
        "address_in_plan": "Yes",
        "justification": "Spores survive pasteurisation. Cooling too slowly through the growth range allows outgrowth, and no later step reduces the resulting numbers or the toxin.",
        "control_measure": "Blast chiller with recorded product core temperature and a maximum cooling time"
      },
      {
        "step": "14. Metal detection",
        "hazard": "Metal fragments from the sieve mesh, blade wear or maintenance activity",
        "type": "Physical",
        "address_in_plan": "Yes",
        "justification": "Last point at which a metal fragment can be detected and the affected product removed before dispatch.",
        "control_measure": "In line metal detector with automatic reject and a locked reject bin"
      },
      {
        "step": "16. Chilled storage",
        "hazard": "Growth of Listeria monocytogenes if the cold chain is lost",
        "type": "Biological",
        "address_in_plan": "No",
        "justification": "Managed by the chilled storage prerequisite programme with alarmed continuous monitoring and a documented response, rather than as a CCP.",
        "control_measure": "Alarmed chill store monitoring, stock rotation, dispatch temperature check"
      }
    ],
    "ccp_determination": [
      {
        "step": "9. Pasteurisation",
        "hazard": "Survival of vegetative pathogens",
        "q1": "No",
        "q2": "Yes",
        "q3": "No",
        "q4": "Yes",
        "ccp": "CCP 1"
      },
      {
        "step": "12. Blast chill",
        "hazard": "Outgrowth of spore forming pathogens during cooling",
        "q1": "No",
        "q2": "Yes",
        "q3": "No",
        "q4": "Yes",
        "ccp": "CCP 2"
      },
      {
        "step": "14. Metal detection",
        "hazard": "Metal fragments in the sealed pouch",
        "q1": "No",
        "q2": "Yes",
        "q3": "No",
        "q4": "Yes",
        "ccp": "CCP 3"
      },
      {
        "step": "11. Hot fill and seal",
        "hazard": "Post process contamination through a weak seal",
        "q1": "Yes",
        "q2": "Stop",
        "q3": "Stop",
        "q4": "Stop",
        "ccp": "Not a CCP, controlled by prerequisite programme"
      },
      {
        "step": "16. Chilled storage",
        "hazard": "Growth of Listeria monocytogenes",
        "q1": "Yes",
        "q2": "Stop",
        "q3": "Stop",
        "q4": "Stop",
        "ccp": "Not a CCP, controlled by prerequisite programme"
      }
    ],
    "control_chart": [
      {
        "ccp": "CCP 1",
        "step": "9. Pasteurisation",
        "hazard": "Survival of vegetative pathogens including Listeria monocytogenes and Salmonella",
        "critical_limit": "Product held at or above 90 C for at least 10 minutes measured at the slowest heating point of the vessel, as validated in report VAL-2025-11",
        "monitor_what": "Product temperature at the validated slowest heating point and the hold time",
        "monitor_how": "Calibrated probe feeding a continuous chart recorder, with an independent hand probe check",
        "monitor_when": "Continuously through every batch, with the hand probe check once per batch at the start of the hold",
        "monitor_who": "Process operator, countersigned by the shift supervisor",
        "corrective_action": "Hold the batch, extend the hold or re-process where the validation allows it, and where neither applies dispose of the batch. Quarantine every batch back to the last compliant record, investigate, and raise a nonconformance report.",
        "verification": "Daily review of charts by the quality supervisor, probe calibration every three months, annual revalidation of the heat step",
        "records": "Pasteurisation chart, batch record, probe calibration certificate, corrective action log"
      },
      {
        "ccp": "CCP 2",
        "step": "12. Blast chill",
        "hazard": "Outgrowth of Clostridium perfringens and Bacillus cereus during cooling",
        "critical_limit": "Product core temperature falls from 90 C to below 5 C within 4 hours of the pouch leaving the filler",
        "monitor_what": "Core temperature of a probe pouch in the slowest cooling position, and elapsed time",
        "monitor_how": "Logged probe in a designated pouch per trolley, with the start time recorded at fill",
        "monitor_when": "Every trolley, every batch",
        "monitor_who": "Chill room operator",
        "corrective_action": "Quarantine the trolley, assess against the validated cooling profile, dispose of product that exceeded the limit, investigate the chiller and record the outcome before the next run.",
        "verification": "Weekly download and review of chiller logs, annual thermal mapping of the blast chiller, probe calibration every three months",
        "records": "Chiller log, trolley identity record, batch record, maintenance record"
      },
      {
        "ccp": "CCP 3",
        "step": "14. Metal detection",
        "hazard": "Metal fragments in the sealed pouch",
        "critical_limit": "Detector rejects certified test pieces of ferrous 2.0 mm, non ferrous 2.5 mm and stainless steel 3.0 mm on every routine check, and the reject mechanism operates every time",
        "monitor_what": "Detector response to the three test pieces and operation of the reject arm and the locked reject bin",
        "monitor_how": "Test pieces passed through the aperture with the pack, results recorded on the check sheet",
        "monitor_when": "At start up, every hour, at every product changeover, at shutdown and after any detector fault",
        "monitor_who": "Line operator, verified by the quality supervisor",
        "corrective_action": "Stop the line, quarantine all product back to the last passing check, re-test through a working detector, and release only what passes. Record the quantity held and the outcome, and raise a nonconformance report.",
        "verification": "Quality supervisor countersigns the check sheet daily, detector serviced annually by the supplier, quarterly review of reject bin contents",
        "records": "Metal detection check sheet, quarantine record, service report, nonconformance report"
      }
    ],
    "validation_summary": "The pasteurisation limit and the cooling limit were validated for this product and this equipment in reports VAL-2025-11 and VAL-2025-14, using worst case fill weight, worst case vessel loading and the slowest heating and cooling positions found during thermal mapping. Both are revalidated when the recipe, the pack format or the equipment changes, and at least annually.",
    "approved_by": "Nadia Fischer, Technical Manager",
    "approval_date": "July 20, 2026",
    "next_review_date": "July 20, 2027, or sooner on any change to the recipe, process, equipment or supplier base"
  }
}
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 HACCP Plan template with plan reference "HACCP-SOUP-02" and revision "4".

How the MCP server works →

More compliance templates