The first page of the document DocMake makes from the sample values on this page.
Operations
Stock Count Sheet
A stock count sheet is printed to be written on. It lists the locations and part numbers somebody is about to walk, leaves room for what is actually on the shelf, and becomes the evidence behind whatever adjustment gets posted afterwards.
Blind counting is the version worth defaulting to. The sheet carries location, part number and description but leaves the expected quantity off the page, so nobody counts toward the number the system already believes. A second column takes the recount when a line falls outside the tolerance the team has agreed, and the variance and its explanation are written next to the line while the counter is still standing there rather than reconstructed from memory a week later. The header pins down the count date, the zone or aisle, who counted, who independently verified, and whether stock movement was frozen while the count ran.
Warehouses run cycles rather than one annual shutdown, so this template gets rendered dozens of times a month with a different location filter behind each copy. Drive the row list from a stock query, produce a PDF per zone, and file the signed sheets as the trail behind every posted correction.
Blanks to fill
| count_sheet_number | Count sheet number |
| count_date | Count date |
| count_type | Count type |
| warehouse | Warehouse |
| zone_or_aisle | Zone or aisle |
| movement_frozen | Stock movement frozen |
| tolerance_rule | Recount tolerance |
| notes | Notes |
| counted_by | Counted by |
| recounted_by | Recounted by |
| verified_by | Verified by |
| verification_date | Verification date |
| adjustments_posted_by | Adjustments posted by |
| company_name | Company |
| counted_items[] | 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.
- 01 Sign up free and duplicate this template into your workspace.
- 02 Adjust the wording and branding in the visual editor.
- 03 Fill it in the app, share it as a form link, or call the API.
{
"company_name": "Brightwater Components",
"count_sheet_number": "SC-2026-0148",
"count_date": "27 August 2026",
"count_type": "Rolling count",
"warehouse": "Brightwater main store, Rotherham",
"zone_or_aisle": "Zone B, aisles 4 to 6",
"movement_frozen": "Yes, 06:00 to 09:30",
"tolerance_rule": "Anything more than five units out, or more than two per cent by value, is counted a third time before it is posted.",
"counted_items": [
{
"location": "B-04-1",
"part_number": "BW-1140",
"description": "Hex bolt M10",
"first_count": "48",
"second_count": "48",
"difference_and_why": "Agrees"
},
{
"location": "B-04-2",
"part_number": "BW-1152",
"description": "Hex nut M10",
"first_count": "61",
"second_count": "59",
"difference_and_why": "2 under, opened"
},
{
"location": "B-04-4",
"part_number": "BW-1160",
"description": "Hex bolt M12",
"first_count": "22",
"second_count": "22",
"difference_and_why": "Agrees"
},
{
"location": "B-04-5",
"part_number": "BW-2207",
"description": "Washer M10",
"first_count": "112",
"second_count": "112",
"difference_and_why": "Agrees"
},
{
"location": "B-04-6",
"part_number": "BW-2211",
"description": "Washer M12",
"first_count": "74",
"second_count": "74",
"difference_and_why": "Agrees"
},
{
"location": "B-05-1",
"part_number": "BW-3310",
"description": "Bearing 6204",
"first_count": "36",
"second_count": "40",
"difference_and_why": "4 over, box behind"
},
{
"location": "B-05-2",
"part_number": "BW-3314",
"description": "Bearing 6205",
"first_count": "41",
"second_count": "41",
"difference_and_why": "Agrees"
},
{
"location": "B-05-3",
"part_number": "BW-3318",
"description": "Bearing 6206",
"first_count": "18",
"second_count": "18",
"difference_and_why": "Agrees"
},
{
"location": "B-05-5",
"part_number": "BW-3402",
"description": "Bearing block",
"first_count": "12",
"second_count": "12",
"difference_and_why": "Agrees"
},
{
"location": "B-06-1",
"part_number": "BW-4390",
"description": "Belt, 1000 mm",
"first_count": "16",
"second_count": "16",
"difference_and_why": "Agrees"
},
{
"location": "B-06-2",
"part_number": "BW-4402",
"description": "Belt, 1250 mm",
"first_count": "10",
"second_count": "9",
"difference_and_why": "1 under, no note"
},
{
"location": "B-06-4",
"part_number": "BW-4415",
"description": "Belt, 1600 mm",
"first_count": "14",
"second_count": "14",
"difference_and_why": "Agrees"
},
{
"location": "B-06-6",
"part_number": "BW-5120",
"description": "Grease, 400 g",
"first_count": "27",
"second_count": "25",
"difference_and_why": "2 under, damaged"
},
{
"location": "B-06-7",
"part_number": "BW-5130",
"description": "Chain oil 1 L",
"first_count": "19",
"second_count": "19",
"difference_and_why": "Agrees"
},
{
"location": "B-06-9",
"part_number": "BW-5144",
"description": "Solvent, 5 L",
"first_count": "6",
"second_count": "6",
"difference_and_why": "Agrees"
}
],
"notes": "Aisle 6 was counted last because the line was still drawing belts at 07:15. Three pallets in the goods inwards bay were booked in after the freeze and are counted on the next sheet.",
"counted_by": "Ines Kovacic",
"recounted_by": "Darius Pell",
"verified_by": "Marion Shaw, Stock Controller",
"verification_date": "27 August 2026",
"adjustments_posted_by": "Marion Shaw, 28 August 2026"
} 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.
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 stock-count-sheet.pdf \
--data-binary @- <<'JSON'
{
"template_id": "tmpl_your_template_id",
"format": "pdf",
"data": {
"company_name": "Brightwater Components",
"count_sheet_number": "SC-2026-0148",
"count_date": "27 August 2026",
"count_type": "Rolling count",
"warehouse": "Brightwater main store, Rotherham",
"zone_or_aisle": "Zone B, aisles 4 to 6",
"movement_frozen": "Yes, 06:00 to 09:30",
"tolerance_rule": "Anything more than five units out, or more than two per cent by value, is counted a third time before it is posted.",
"counted_items": [
{
"location": "B-04-1",
"part_number": "BW-1140",
"description": "Hex bolt M10",
"first_count": "48",
"second_count": "48",
"difference_and_why": "Agrees"
},
{
"location": "B-04-2",
"part_number": "BW-1152",
"description": "Hex nut M10",
"first_count": "61",
"second_count": "59",
"difference_and_why": "2 under, opened"
},
{
"location": "B-04-4",
"part_number": "BW-1160",
"description": "Hex bolt M12",
"first_count": "22",
"second_count": "22",
"difference_and_why": "Agrees"
},
{
"location": "B-04-5",
"part_number": "BW-2207",
"description": "Washer M10",
"first_count": "112",
"second_count": "112",
"difference_and_why": "Agrees"
},
{
"location": "B-04-6",
"part_number": "BW-2211",
"description": "Washer M12",
"first_count": "74",
"second_count": "74",
"difference_and_why": "Agrees"
},
{
"location": "B-05-1",
"part_number": "BW-3310",
"description": "Bearing 6204",
"first_count": "36",
"second_count": "40",
"difference_and_why": "4 over, box behind"
},
{
"location": "B-05-2",
"part_number": "BW-3314",
"description": "Bearing 6205",
"first_count": "41",
"second_count": "41",
"difference_and_why": "Agrees"
},
{
"location": "B-05-3",
"part_number": "BW-3318",
"description": "Bearing 6206",
"first_count": "18",
"second_count": "18",
"difference_and_why": "Agrees"
},
{
"location": "B-05-5",
"part_number": "BW-3402",
"description": "Bearing block",
"first_count": "12",
"second_count": "12",
"difference_and_why": "Agrees"
},
{
"location": "B-06-1",
"part_number": "BW-4390",
"description": "Belt, 1000 mm",
"first_count": "16",
"second_count": "16",
"difference_and_why": "Agrees"
},
{
"location": "B-06-2",
"part_number": "BW-4402",
"description": "Belt, 1250 mm",
"first_count": "10",
"second_count": "9",
"difference_and_why": "1 under, no note"
},
{
"location": "B-06-4",
"part_number": "BW-4415",
"description": "Belt, 1600 mm",
"first_count": "14",
"second_count": "14",
"difference_and_why": "Agrees"
},
{
"location": "B-06-6",
"part_number": "BW-5120",
"description": "Grease, 400 g",
"first_count": "27",
"second_count": "25",
"difference_and_why": "2 under, damaged"
},
{
"location": "B-06-7",
"part_number": "BW-5130",
"description": "Chain oil 1 L",
"first_count": "19",
"second_count": "19",
"difference_and_why": "Agrees"
},
{
"location": "B-06-9",
"part_number": "BW-5144",
"description": "Solvent, 5 L",
"first_count": "6",
"second_count": "6",
"difference_and_why": "Agrees"
}
],
"notes": "Aisle 6 was counted last because the line was still drawing belts at 07:15. Three pallets in the goods inwards bay were booked in after the freeze and are counted on the next sheet.",
"counted_by": "Ines Kovacic",
"recounted_by": "Darius Pell",
"verified_by": "Marion Shaw, Stock Controller",
"verification_date": "27 August 2026",
"adjustments_posted_by": "Marion Shaw, 28 August 2026"
}
}
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 Stock Count Sheet template with count sheet number "SC-2026-0148" and count date "27 August 2026".
More operations templates
Change Order
The instructed change, where it came from, what it costs line by line, what it does to the programme, and the contract sum it leaves behind.
View template →Daily Site Report
The day on site in one sheet: weather, crew, plant, work done, deliveries and what held the job up.
View template →Field Service Report
One engineer visit written down: the fault, the time on site, the parts fitted, the tests that proved it and the customer signature.
View template →