The first page of the document DocMake makes from the sample values on this page.
Operations
Job Card
A job card is the document that travels with the work. A work order authorises a job and a service report describes a visit, but the job card is what sits on the bench, collects a booking every time somebody picks the job up, and comes back to the office covered in the numbers that decide whether the shop made money on it. Anyone who has tried to reconstruct a repair from an invoice alone knows why the card exists.
The operation list is the spine. Each operation carries an allowed time, the person who booked to it, the actual time, and a status, and the gap between allowed and actual is the only honest measure of a workshop. Quoting from allowed hours and paying from actual hours without ever comparing the two is how a repair shop discovers at year end that overhauls have been running at a loss since spring. The same list is what lets a supervisor see at a glance that a job is stuck at inspection rather than at the bench.
Parts and materials belong on the card rather than on a separate requisition. A part issued from stores has a code, a quantity, a batch or serial where it matters, and a stores signature, and pulling that history back onto the card is what makes a warranty claim provable months later. Serial-traced components need the old serial recorded next to the new one, because a rotable that goes back into stock without its history attached is a component nobody can certify again.
Closing the card is a release, not a tick. Somebody names the tests that were run, the results measured, the standard they were measured against, and then signs to release the item back to the customer or back to the fleet. Generating the card from JSON means the shop system prints it with the operations, allowed times and drawing references already filled in, and reprints the completed copy as a PDF for the customer pack without anyone retyping a line of it.
Blanks to fill
| job_card_number | Job card number |
| work_order_reference | Work order |
| raised_date | Raised |
| required_by | Required by |
| workshop | Workshop |
| supervisor | Supervisor |
| customer | Customer |
| customer_reference | Customer reference |
| priority | Priority |
| item_description | Item |
| item_asset_id | Asset or plant number |
| received_date | Received into the workshop |
| manufacturer | Manufacturer |
| model | Model |
| serial_number | Serial number |
| received_condition | Condition on receipt |
| work_requested | Work requested |
| reference_documents | Reference documents |
| total_allowed_hours | Total allowed hours |
| total_actual_hours | Total actual hours |
| labour_variance_note | Variance note |
| materials_value | Materials value |
| additional_work_found | Additional work found |
| additional_work_authorised_by | Additional work authorised by |
| test_summary | Test summary |
| release_statement | Release statement |
| released_by | Released by |
| released_date | Released |
| collected_by | Collected by |
| company_name | Company |
| operations[] | One per item, so a row is added for every item in the list |
| parts_issued[] | One per item, so a row is added for every item in the list |
| components_removed[] | One per item, so a row is added for every item in the list |
| inspection[] | 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": "Kestrel M&E Ltd",
"job_card_number": "JC-2026-0873",
"work_order_reference": "WO-2026-2288",
"raised_date": "October 7, 2026",
"required_by": "October 14, 2026",
"priority": "Standard, spare unit in service so the site is covered",
"workshop": "Kestrel M&E Ltd, Avonmouth plant workshop, bay 2",
"supervisor": "Gareth Iles",
"customer": "Internal, Kestrel M&E service contracts",
"customer_reference": "Removed under FSR-2026-4402, Brookmill Business Park",
"item_description": "End suction centrifugal pump, chilled water secondary circuit",
"item_asset_id": "P-CHW-02",
"manufacturer": "Larne Pumps",
"model": "ES-65-160",
"serial_number": "LP-65160-2019-0447",
"received_date": "October 7, 2026",
"received_condition": "Received drained and capped. Mechanical seal weeping at the gland, bearing housing hot to the touch when removed, coupling guard bent on the drive side. Nameplate legible, impeller trim stamped 152 mm.",
"work_requested": "Strip, inspect and overhaul. Replace the mechanical seal and both bearings, check the shaft for run out, rebalance if the impeller is out of tolerance, then run test on the workshop rig before return to site.",
"reference_documents": "Larne Pumps ES series workshop manual revision 6, Kestrel work instruction WI-MEC-014 revision 3, balance tolerance per the manual table 4",
"operations": [
{
"number": "10",
"description": "Strip pump, record clearances, photograph wear pattern on the casing",
"allowed_hours": "2.0",
"actual_hours": "2.3",
"booked_by": "Sam Okoro",
"status": "Complete"
},
{
"number": "20",
"description": "Clean and crack test the impeller and shaft",
"allowed_hours": "1.5",
"actual_hours": "1.4",
"booked_by": "Sam Okoro",
"status": "Complete"
},
{
"number": "30",
"description": "Shaft run out check between centres",
"allowed_hours": "0.5",
"actual_hours": "0.7",
"booked_by": "Gareth Iles",
"status": "Complete"
},
{
"number": "40",
"description": "Replace mechanical seal, drive end and non drive end bearings",
"allowed_hours": "3.0",
"actual_hours": "3.1",
"booked_by": "Sam Okoro",
"status": "Complete"
},
{
"number": "50",
"description": "Dynamic balance of the impeller assembly",
"allowed_hours": "1.5",
"actual_hours": "2.6",
"booked_by": "Dana Whitcombe",
"status": "Complete, over allowed time, see variance note"
},
{
"number": "60",
"description": "Rebuild, align to the test motor, fill and vent",
"allowed_hours": "2.0",
"actual_hours": "1.9",
"booked_by": "Sam Okoro",
"status": "Complete"
},
{
"number": "70",
"description": "Run test on the workshop rig, two hours at duty with vibration and temperature logging",
"allowed_hours": "2.5",
"actual_hours": "2.4",
"booked_by": "Dana Whitcombe",
"status": "Complete"
},
{
"number": "80",
"description": "Paint, tag, crate and book back to stores",
"allowed_hours": "1.0",
"actual_hours": "1.1",
"booked_by": "Sam Okoro",
"status": "Complete"
}
],
"parts_issued": [
{
"code": "LP-SEAL-65",
"description": "Mechanical seal cartridge, 35 mm, silicon carbide faces, EPDM elastomers",
"quantity": "1",
"batch_or_serial": "Batch SC-26-0912",
"issued_by": "Stores, Marek Nowicki"
},
{
"code": "BRG-6308-C3",
"description": "Deep groove ball bearing 6308 C3, drive end",
"quantity": "1",
"batch_or_serial": "Batch BR-26-3311",
"issued_by": "Stores, Marek Nowicki"
},
{
"code": "BRG-6306-C3",
"description": "Deep groove ball bearing 6306 C3, non drive end",
"quantity": "1",
"batch_or_serial": "Batch BR-26-3319",
"issued_by": "Stores, Marek Nowicki"
},
{
"code": "GSK-CAS-65",
"description": "Casing gasket set",
"quantity": "1",
"batch_or_serial": "Batch GK-26-0204",
"issued_by": "Stores, Marek Nowicki"
},
{
"code": "GRD-COUP-STD",
"description": "Coupling guard, replacement for the bent original",
"quantity": "1",
"batch_or_serial": "Not serialised",
"issued_by": "Stores, Marek Nowicki"
},
{
"code": "PNT-2K-RAL5010",
"description": "Two pack machine enamel, RAL 5010, 1 litre",
"quantity": "1",
"batch_or_serial": "Batch PT-26-0771",
"issued_by": "Stores, Marek Nowicki"
}
],
"components_removed": [
{
"component": "Mechanical seal cartridge",
"old_serial": "Not serialised, original 2019 fit",
"new_serial": "Batch SC-26-0912",
"disposition": "Scrapped, faces chipped and elastomers hardened"
},
{
"component": "Impeller, 152 mm trim",
"old_serial": "LP-IMP-2019-0447",
"new_serial": "LP-IMP-2019-0447, same impeller refitted",
"disposition": "Retained and rebalanced, wear inside the manual limit"
},
{
"component": "Bearing pair",
"old_serial": "Not serialised",
"new_serial": "Batch BR-26-3311 and BR-26-3319",
"disposition": "Scrapped, drive end raceway spalled"
}
],
"inspection": [
{
"check": "Shaft run out at the seal face",
"standard": "0.05 mm maximum, manual table 3",
"measured": "0.02 mm",
"verdict": "Pass"
},
{
"check": "Impeller residual unbalance",
"standard": "G6.3 at 2900 rpm, manual table 4",
"measured": "G2.8 after two correction runs",
"verdict": "Pass"
},
{
"check": "Vibration on the rig at duty, bearing housings",
"standard": "Below 2.8 mm per second RMS",
"measured": "1.4 mm per second drive end, 1.1 mm non drive end",
"verdict": "Pass"
},
{
"check": "Bearing temperature after two hours at duty",
"standard": "Below 70 C",
"measured": "48 C drive end, 44 C non drive end",
"verdict": "Pass"
},
{
"check": "Seal leakage on test",
"standard": "No visible leakage",
"measured": "Dry throughout the run",
"verdict": "Pass"
}
],
"additional_work_found": "The coupling guard was bent beyond straightening and the drive end bearing raceway was spalled rather than worn, which points at the seal leak having washed the grease out over a long period.",
"additional_work_authorised_by": "Gareth Iles, workshop supervisor, October 9, 2026, within the standing limit for internal jobs",
"total_allowed_hours": "14.0",
"total_actual_hours": "15.5",
"labour_variance_note": "Operation 50 ran 1.1 hours over because the impeller needed a second correction run to bring residual unbalance inside the manual limit. Everything else came in at or near the allowed time. The overhaul standard time is being reviewed to carry two balance runs rather than one for pumps that arrive with a failed seal.",
"materials_value": "$684.20 at stores issue price",
"test_summary": "Two hour run at duty on the workshop rig. Vibration, bearing temperature and seal condition all inside the manual limits, with the logged trace attached as sheet 2.",
"released_by": "Gareth Iles, workshop supervisor",
"release_statement": "The work on this card was carried out to the referenced manual and work instruction, the inspection results above are within tolerance, and the item is released for return to service.",
"released_date": "October 13, 2026",
"collected_by": "Kestrel M&E service logistics, booked into stores as a serviceable spare on October 13, 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 job-card.pdf \
--data-binary @- <<'JSON'
{
"template_id": "tmpl_your_template_id",
"format": "pdf",
"data": {
"company_name": "Kestrel M&E Ltd",
"job_card_number": "JC-2026-0873",
"work_order_reference": "WO-2026-2288",
"raised_date": "October 7, 2026",
"required_by": "October 14, 2026",
"priority": "Standard, spare unit in service so the site is covered",
"workshop": "Kestrel M&E Ltd, Avonmouth plant workshop, bay 2",
"supervisor": "Gareth Iles",
"customer": "Internal, Kestrel M&E service contracts",
"customer_reference": "Removed under FSR-2026-4402, Brookmill Business Park",
"item_description": "End suction centrifugal pump, chilled water secondary circuit",
"item_asset_id": "P-CHW-02",
"manufacturer": "Larne Pumps",
"model": "ES-65-160",
"serial_number": "LP-65160-2019-0447",
"received_date": "October 7, 2026",
"received_condition": "Received drained and capped. Mechanical seal weeping at the gland, bearing housing hot to the touch when removed, coupling guard bent on the drive side. Nameplate legible, impeller trim stamped 152 mm.",
"work_requested": "Strip, inspect and overhaul. Replace the mechanical seal and both bearings, check the shaft for run out, rebalance if the impeller is out of tolerance, then run test on the workshop rig before return to site.",
"reference_documents": "Larne Pumps ES series workshop manual revision 6, Kestrel work instruction WI-MEC-014 revision 3, balance tolerance per the manual table 4",
"operations": [
{
"number": "10",
"description": "Strip pump, record clearances, photograph wear pattern on the casing",
"allowed_hours": "2.0",
"actual_hours": "2.3",
"booked_by": "Sam Okoro",
"status": "Complete"
},
{
"number": "20",
"description": "Clean and crack test the impeller and shaft",
"allowed_hours": "1.5",
"actual_hours": "1.4",
"booked_by": "Sam Okoro",
"status": "Complete"
},
{
"number": "30",
"description": "Shaft run out check between centres",
"allowed_hours": "0.5",
"actual_hours": "0.7",
"booked_by": "Gareth Iles",
"status": "Complete"
},
{
"number": "40",
"description": "Replace mechanical seal, drive end and non drive end bearings",
"allowed_hours": "3.0",
"actual_hours": "3.1",
"booked_by": "Sam Okoro",
"status": "Complete"
},
{
"number": "50",
"description": "Dynamic balance of the impeller assembly",
"allowed_hours": "1.5",
"actual_hours": "2.6",
"booked_by": "Dana Whitcombe",
"status": "Complete, over allowed time, see variance note"
},
{
"number": "60",
"description": "Rebuild, align to the test motor, fill and vent",
"allowed_hours": "2.0",
"actual_hours": "1.9",
"booked_by": "Sam Okoro",
"status": "Complete"
},
{
"number": "70",
"description": "Run test on the workshop rig, two hours at duty with vibration and temperature logging",
"allowed_hours": "2.5",
"actual_hours": "2.4",
"booked_by": "Dana Whitcombe",
"status": "Complete"
},
{
"number": "80",
"description": "Paint, tag, crate and book back to stores",
"allowed_hours": "1.0",
"actual_hours": "1.1",
"booked_by": "Sam Okoro",
"status": "Complete"
}
],
"parts_issued": [
{
"code": "LP-SEAL-65",
"description": "Mechanical seal cartridge, 35 mm, silicon carbide faces, EPDM elastomers",
"quantity": "1",
"batch_or_serial": "Batch SC-26-0912",
"issued_by": "Stores, Marek Nowicki"
},
{
"code": "BRG-6308-C3",
"description": "Deep groove ball bearing 6308 C3, drive end",
"quantity": "1",
"batch_or_serial": "Batch BR-26-3311",
"issued_by": "Stores, Marek Nowicki"
},
{
"code": "BRG-6306-C3",
"description": "Deep groove ball bearing 6306 C3, non drive end",
"quantity": "1",
"batch_or_serial": "Batch BR-26-3319",
"issued_by": "Stores, Marek Nowicki"
},
{
"code": "GSK-CAS-65",
"description": "Casing gasket set",
"quantity": "1",
"batch_or_serial": "Batch GK-26-0204",
"issued_by": "Stores, Marek Nowicki"
},
{
"code": "GRD-COUP-STD",
"description": "Coupling guard, replacement for the bent original",
"quantity": "1",
"batch_or_serial": "Not serialised",
"issued_by": "Stores, Marek Nowicki"
},
{
"code": "PNT-2K-RAL5010",
"description": "Two pack machine enamel, RAL 5010, 1 litre",
"quantity": "1",
"batch_or_serial": "Batch PT-26-0771",
"issued_by": "Stores, Marek Nowicki"
}
],
"components_removed": [
{
"component": "Mechanical seal cartridge",
"old_serial": "Not serialised, original 2019 fit",
"new_serial": "Batch SC-26-0912",
"disposition": "Scrapped, faces chipped and elastomers hardened"
},
{
"component": "Impeller, 152 mm trim",
"old_serial": "LP-IMP-2019-0447",
"new_serial": "LP-IMP-2019-0447, same impeller refitted",
"disposition": "Retained and rebalanced, wear inside the manual limit"
},
{
"component": "Bearing pair",
"old_serial": "Not serialised",
"new_serial": "Batch BR-26-3311 and BR-26-3319",
"disposition": "Scrapped, drive end raceway spalled"
}
],
"inspection": [
{
"check": "Shaft run out at the seal face",
"standard": "0.05 mm maximum, manual table 3",
"measured": "0.02 mm",
"verdict": "Pass"
},
{
"check": "Impeller residual unbalance",
"standard": "G6.3 at 2900 rpm, manual table 4",
"measured": "G2.8 after two correction runs",
"verdict": "Pass"
},
{
"check": "Vibration on the rig at duty, bearing housings",
"standard": "Below 2.8 mm per second RMS",
"measured": "1.4 mm per second drive end, 1.1 mm non drive end",
"verdict": "Pass"
},
{
"check": "Bearing temperature after two hours at duty",
"standard": "Below 70 C",
"measured": "48 C drive end, 44 C non drive end",
"verdict": "Pass"
},
{
"check": "Seal leakage on test",
"standard": "No visible leakage",
"measured": "Dry throughout the run",
"verdict": "Pass"
}
],
"additional_work_found": "The coupling guard was bent beyond straightening and the drive end bearing raceway was spalled rather than worn, which points at the seal leak having washed the grease out over a long period.",
"additional_work_authorised_by": "Gareth Iles, workshop supervisor, October 9, 2026, within the standing limit for internal jobs",
"total_allowed_hours": "14.0",
"total_actual_hours": "15.5",
"labour_variance_note": "Operation 50 ran 1.1 hours over because the impeller needed a second correction run to bring residual unbalance inside the manual limit. Everything else came in at or near the allowed time. The overhaul standard time is being reviewed to carry two balance runs rather than one for pumps that arrive with a failed seal.",
"materials_value": "$684.20 at stores issue price",
"test_summary": "Two hour run at duty on the workshop rig. Vibration, bearing temperature and seal condition all inside the manual limits, with the logged trace attached as sheet 2.",
"released_by": "Gareth Iles, workshop supervisor",
"release_statement": "The work on this card was carried out to the referenced manual and work instruction, the inspection results above are within tolerance, and the item is released for return to service.",
"released_date": "October 13, 2026",
"collected_by": "Kestrel M&E service logistics, booked into stores as a serviceable spare on October 13, 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 Job Card template with job card number "JC-2026-0873" and work order "WO-2026-2288".
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 →