Explore these examples
Edit the published examples in place. Running an example sends a real request to the instance you choose. Nothing runs when you open the page.
Checking sign-in…
Choose existing records
Read records from the selected instance. Nothing is created. Select a record to use it in the walkthrough.
Sign in and choose an instance to browse records.
Selected records survive page navigation in this tab for this sign-in and instance. Switching instances or signing out clears them. Responses and editor drafts stay on this page.
Working with the Data Model — Production
Use Production to turn a customer's order into a printing job: describe what must be made, prepare the artwork, plan the press and finishing work, and record what actually happened on the shop floor. The job brings those records together so you can follow the work from specification to completion.
Use IaC for infrastructure and provisioning. Use the API for runtime data. Provision work centres, production cells, capabilities, shifts, device assignments, substrate catalogues and reusable templates through IaC. Use the API to work with jobs, components, artwork, production steps, schedules, tasks and production reports.
This guide covers production work in jobs and the full productTemplates topic, with template definition and publication routed to IaC. Artwork preparation, imposition and related print.prepress operations are covered in the Prepress guide; the reference links to their new home. JMF device connectivity belongs to the separate print.jmf topic. The Production API reference lists the arguments, result types, input fields and enums; the sections here explain how they fit into a printing job.
Choose where to start
| What you need to do | Start here |
|---|---|
| Turn an order into work, or open a new job | Start the printing job |
| Find a template and inspect its published versions | Product templates |
| Describe a cover, text section or insert | Describe the parts to produce |
| Check artwork and arrange pages on sheets | Prepress guide |
| Plan printing, folding, stitching and trimming | Plan the production steps |
| Allocate work to presses and finishing equipment | Schedule the work |
| Record counts, time and progress | Record progress on the shop floor |
| Assign a task or track an approval | Coordinate people and milestones |
| Review the job and its costs | Review production and costs |
Read and change records safely
A query reads information. A mutation usually changes it; some production mutations calculate or preview a result. Check the operation's purpose before calling it. Send the operation and variables separately to your environment's GraphQL API using an authenticated account. Permissions still apply to related records selected inside a result.
The examples follow a brochure order for 5,000 finished copies, with a 4-page cover and a 32-page text section, finished to A4 and saddle stitched. They are recipes, not a complete production plan. The actual sheet layout, paper, press, spoilage allowance and finishing route must be agreed for your job. Replace the illustrative identifiers and dates with your own records. Keep each returned ID for later requests.
Check top-level GraphQL errors and any errors { path message } inside a result. Continue only when the expected record is present and errors are empty. A successful HTTP response alone does not confirm that work was saved. If a response is lost, read the job before repeating a creation request.
Start with create… for a new record and update… for changes to an existing record. These are the recommended operations for everyday work: the request makes your intention clear, and an update lets you supply the fields you want to change. Check each input’s treatment of omitted fields, nulls and nested values.
Treat upsert… as an advanced option. Use it when you deliberately need its create-or-update behaviour and understand how it identifies records, which fields it requires and whether it replaces child collections. It is not a general shortcut for a partial update or a promise to match an external reference.
Some resources expose only an upsert operation. Where that is the available route, this guide explains how to use it; do not invent a create or update operation that the API does not provide. A description or a name helps people recognise the work; it does not replace the structured specification needed for planning.
Start the printing job
An order records what the customer is buying. A job records the work needed to produce it. Keep both when the work comes from a sale, so production remains connected to the commercial commitment.
Bring an order into production
If the order already exists, use createJobsFromOrder. The same handover is described in the ERP guide:
mutation CreateCommerceProductionJobs($input: CreateJobsFromOrderInput!) {
createJobsFromOrder(input: $input) {
order { id status }
jobs { id name }
errors { path message }
}
}Variables:
{
"input": {
"orderId": "ord_01h455vb4pex5vsknk084sn02q",
"jobs": [
{
"orderLineId": "oln_01h455vb4pex5vsknk084sn02q",
"jobName": "Northstar packaging sleeves",
"quantity": 500
}
]
}
}Read the returned job IDs before adding specifications or operations. acceptEstimateAndCreateJobs is another handover when accepting an estimate is the starting point. These are alternative starting routes; do not also create a duplicate job by hand.
Open a job directly
For work that needs a job directly, create its header:
mutation CreatePrintingJob($input: CreateJobInput!) {
createJob(input: $input) {
job { id jobNumber name quantity status }
errors { path message }
}
}Variables:
{
"input": {
"name": "Autumn brochure — 5,000 copies",
"jobNumber": "PRINT-2026-1042",
"quantity": 5000,
"status": "DRAFT",
"description": "A4 brochure: 4-page cover and 32-page text, saddle stitched. Print specification and routing to be confirmed.",
"dueAt": "2026-11-06T16:00:00Z"
}
}quantity is the finished job quantity: 5,000 brochures in this example. It is not automatically the number of press sheets, impressions or signatures. Keep jobNumber as the recognisable production reference and use the returned id for relationships.
Job statuses available in the API are:
DRAFT, RFQ, CONFIRMED, PREPRESS, PRESS, POSTPRESS, PACKING, SHIPPED, COMPLETED, WAITING, CANCELLED, EXCEPTION
A job's overall status and an individual operation's execution status answer different questions. Do not treat changing the job status as a substitute for recording press or finishing progress.
Use a job group when several jobs need to be considered together. Removing a job from a group is different from deleting it. In particular, destroyJobGroupAndJobs deletes the jobs as well as the group; it is not a routine way to close completed work.
For repeat products, find a configured product template and inspect its published version before creating the job.
| Operation | Use it to |
|---|---|
Query.getJob |
Read a job. |
Query.getJobBy |
Read job by its identifying fields. |
Query.listJobs |
Browse jobs. |
Query.aggregateJobs |
Summarise jobs. |
Query.getJobGroup |
Read a job group. |
Query.listJobGroups |
Browse job groups. |
Mutation.upsertJob |
Advanced: Create or update a job. Prefer create/update for routine changes. |
Mutation.createJob |
Create a job. |
Mutation.updateJob |
Change a job. |
Mutation.deleteJob |
Delete a job. |
Mutation.createJobGroup |
Create a job group. |
Mutation.addJobToJobGroup |
Include a job in a group. |
Mutation.removeJobFromJobGroup |
Remove a job from a group. |
Mutation.destroyJobGroup |
Remove a job group. |
Mutation.destroyJobGroupAndJobs |
Delete a job group and the jobs it contains. |
Mutation.createJobsFromOrder |
Create production jobs from selected order lines |
Mutation.acceptEstimateAndCreateJobs |
Accept an estimate and create its order and production jobs |
Find product templates and published versions
A product template describes a repeatable product, such as a brochure with a cover and text section. Use a configured template when you want a new printing job to start from that agreed structure. The template is reusable configuration; the job created from it is a particular piece of production work.
Define, change and publish product templates through IaC. The steps here read configured templates and their published versions. If the product you need is missing, or its structure needs changing, update the IaC configuration before using it for production.
Browse the configured templates
Start with active templates:
query BrowsePrintingTemplates($first: Int!, $after: String) {
listProductTemplates(isActive: true, first: $first, after: $after) {
edges {
node { id name sku category isActive status version publishedVersion }
}
pageInfo { hasNextPage endCursor }
}
}Variables:
{
"first": 20
}Check the name, SKU, category and publishedVersion before choosing a template. The query can also filter by exact SKU or category. Continue with endCursor as after while hasNextPage is true, keeping the filters unchanged.
The available status values are DRAFT, PUBLISHED. Status and published version answer different questions. A template can be DRAFT because someone has changed its definition while an earlier version remains published. Filtering only for PUBLISHED would hide that template. This example therefore browses active templates and asks for both fields.
A null publishedVersion means there is no published version to use. Do not treat an active flag or a familiar SKU as proof that a template is ready for job creation.
Read the selected template
Keep the selected template ID:
query ReadPrintingTemplate($id: ProductTemplateID!) {
getProductTemplate(id: $id) {
id name description sku category tags isActive status version publishedVersion
}
}Variables:
{
"id": "ptl_00000000008008000000000281"
}The returned version is the current definition's version. publishedVersion identifies the most recently published snapshot. For example, version 4 may be a draft while published version 3 remains the production starting point.
Read the published snapshot when checking what will be used. The current template record may contain changes that have not yet been published.
Browse the published versions
query BrowsePrintingTemplateVersions($templateId: ProductTemplateID!, $first: Int!, $after: String) {
listProductTemplateVersions(templateId: $templateId, first: $first, after: $after) {
edges { node { id productTemplateId version publishedBy createdAt } }
pageInfo { hasNextPage endCursor }
}
}Variables:
{
"templateId": "ptl_00000000008008000000000281",
"first": 20
}This query lists published versions, newest first. It does not list every draft edit. Each entry has a version number, publication time and publisher, when recorded. Follow the pagination cursor to inspect older publications.
Keep the parent template ID and version number together. A version record also has its own id, but the single-version lookup below takes templateId and an integer version.
Inspect a published snapshot
Use the version number returned by publishedVersion to inspect the current published definition, or a version from the history to review an earlier publication:
query ReadPrintingTemplateVersion($templateId: ProductTemplateID!, $version: Int!) {
getProductTemplateVersion(templateId: $templateId, version: $version) {
id productTemplateId version publishedBy createdAt
snapshot { name description sku category tags isActive }
}
}Variables:
{
"templateId": "ptl_00000000008008000000000281",
"version": 3
}Version 3 is illustrative; replace it with the version you intend to inspect. The snapshot preserves the definition at publication time, so its name, SKU and active flag can differ from the current template record. A missing result means that this template/version pair did not resolve; check both values before continuing.
For a fuller print specification, the snapshot also exposes components, operations, configSchema and print settings. Request those fields when checking the parts, production steps and configuration choices for the job. Their field shapes are listed in the Production API reference.
Create the printing job from the published template
Use instantiateProductTemplate once the template and the customer's requirements agree. Supply the template ID and the job's configuration as described in the reference. Its configuration choices depend on the published template; there is no single set of options that suits every product.
Instantiation uses the template's current publishedVersion. The operation does not accept a version number to pin. Reading an older snapshot does not select it for job creation, and another publication between inspection and creation can change which version is used.
Read the returned templateVersion, job, components, operationCount and errors before continuing. Keep the job ID and confirm the result against the order. This is an alternative to creating the same job manually; do not run both paths for the same piece of work.
The operation list includes definition and publication methods for discoverability. Those writes remain IaC work, as does installing a canonical template. Creating an individual job from a published template is runtime work.
| Operation | Use it to |
|---|---|
Query.listProductTemplates |
Browse configured product templates by SKU, category, active flag or status. |
Query.getProductTemplate |
Read a template and identify its current published version. |
Query.listProductTemplateVersions |
Browse the published versions of a template. |
Query.getProductTemplateVersion |
Inspect a specific published template snapshot. |
Mutation.upsertProductTemplate |
Manage through IaC: create or update a reusable product template. |
Mutation.createProductTemplate |
Manage through IaC: define a reusable product template. |
Mutation.updateProductTemplate |
Manage through IaC: change a reusable product template. |
Mutation.deleteProductTemplate |
Manage through IaC: remove a reusable product template. |
Mutation.publishProductTemplate |
Manage through IaC: publish a reusable product template version. |
Mutation.instantiateProductTemplate |
Create a printing job from a published product template. |
Describe the parts to produce
A component is a part of the finished product with its own production requirements. For the brochure, use one component for the cover and another for the text section. An insert would be a further component. Components can have different paper, colours, artwork and production routes while belonging to the same job.
Add the cover component
mutation AddPrintingCover($input: CreateComponentInput!) {
createComponent(input: $input) {
component { id jobId name kind quantity }
errors { path message }
}
}Variables:
{
"input": {
"jobId": "job_0h248h248h848r248h248h248h",
"componentNumber": "COVER",
"name": "4-page cover",
"kind": "COVER",
"quantity": 5000,
"description": "Cover component for the autumn brochure. Add the print specification before planning."
}
}Create the text component separately with its own name and the TEXT kind. Here, each finished brochure needs one cover and one text section, so each component starts at 5,000. That does not mean each requires 5,000 press sheets: the imposition and production route determine sheet and operation quantities.
Component kinds available in the API are:
CONTENT, COVER, INSERT, MAIN, TEXT, DUST_JACKET, ENDPAPER, OUTSERT, OTHER
Complete the print specification
createComponent accepts the complete print specification when you create a part: pages, colours, layout, material, finished size, finishing and substrate choices. You can supply these fields alongside the cover details shown above.
To revise an existing part, call updateComponent with its id and only the fields you want to change. It accepts the same print specification fields as createComponent. Omitted print fields keep their current values; an explicit null clears that print field. A supplied colour, layout, material or finishing object replaces that whole field, so include the details you want to retain within it.
Advanced: upsertComponent. Prefer create/update for the steps above. If you deliberately use upsert, include the existing component id together with the required jobId, name, kind and quantity. Omitting the ID describes a new component, not an update to one you already created.
| Specification | Fields to use | For the brochure |
|---|---|---|
| Pagination | totalPages |
4 for the cover; 32 for the text section |
| Colour | colors |
Describe the front and back colour requirements |
| Material and layout | media, layout |
Describe the material dimensions and layout requirements |
| Finished dimensions | finishedSize |
210 × 297 mm for the trimmed A4 size |
| Paper choice | desiredSubstrateId, actualSubstrateId |
Distinguish the specified paper from the paper actually used |
| Finishing details | finishing |
Describe applicable finishing treatments |
media and finishedSize are JSON inputs, not plain strings such as “A4”. Use the dimension structure accepted by your print configuration. The reference lists the structured colour, layout and finishing inputs. A component's finishing details do not replace the operation route: saddle stitching, folding and trimming still need their production steps.
A component group lets you associate related components within the job. Use it where the route works on a group of parts, rather than creating an artificial extra finished product.
| Operation | Use it to |
|---|---|
Query.getComponent |
Read a component. |
Query.getComponentBy |
Read component by its identifying fields. |
Query.listComponents |
Browse components. |
Query.aggregateComponents |
Summarise components. |
Query.getComponentGroup |
Read a component group. |
Query.listComponentGroups |
Browse component groups. |
Mutation.upsertComponent |
Advanced: Create or update a component. Prefer create/update for routine changes. |
Mutation.createComponent |
Create a component. |
Mutation.updateComponent |
Change a component. |
Mutation.deleteComponent |
Delete a component. |
Mutation.upsertComponentGroup |
Advanced: Create or update a component group. Prefer create/update for routine changes. |
Mutation.createComponentGroup |
Create a component group. |
Mutation.updateComponentGroup |
Change a component group. |
Mutation.deleteComponentGroup |
Delete a component group. |
Hand artwork over to Prepress
Use the Prepress guide to receive files, associate artwork with a component, check preflight results, inspect separations and prepare imposition. It also explains running configured prepress workflows; define and deploy those workflows through IaC.
Before planning the press run, confirm that the artwork and saved imposition match the component specification. Use their resulting production requirements to review the route, quantities and finishing steps below. A file preview alone does not establish that the job is ready to print.
Plan the production steps
An operation describes a step of production. For the brochure, the route may include platemaking, cover printing, text printing, folding, saddle stitching, trimming and packing. The appropriate steps depend on the specification and the equipment used.
Associate a step with its component when it acts on that part. A finishing operation that combines the cover and text may need job or component-group context. Use dependency links to express what must happen first; a list's display order is not a substitute for those dependencies.
Add a press operation
mutation AddPrintingPressOperation($input: CreateOperationInput!) {
createOperation(input: $input) {
operation { id jobId componentId name kind status productionQuantity }
errors { path message }
}
}Variables:
{
"input": {
"jobId": "job_0h248h248h848r248h248h248h",
"componentId": "cmp_1248h248h288h848h248h248h2",
"name": "Print brochure covers",
"kind": "PRINTING",
"status": "PENDING",
"requestedWorkCenterId": "wcr_248h248h248h288h248h248h24"
}
}The work centre ID must refer to an already configured press. requestedWorkCenterId expresses the requested resource; it does not reserve a time slot. Select a suitable capability where needed, and use getOperationParameterSchema to discover the parameters for the operation kind.
This example deliberately leaves productionQuantity unset. Determine it from the agreed imposition, count basis and allowances before scheduling the actual run. Finished brochures, press sheets and impressions are different quantities.
Connect the route and its work items
inferOperations suggests the required production steps from either an existing component or a supplied specification. Review the result before relying on it as the route. Use listOperationEdges to inspect dependencies, and createOperationEdge or updateOperationEdge for individual links. For an advanced whole-graph change, upsertOperationGraph replaces the job's dependency edges and work centre preferences together, so supply the intended complete graph.
Operation items break a step into smaller pieces of work, such as separate batches or passes. Their links express dependencies at that finer level. Start with createOperationItem and updateOperationItem for individual items, and createOperationItemEdge and updateOperationItemEdge for individual links. Use the following bulk upserts only when you intend to replace the selected collection. upsertOperationItemEdges replaces the edges within the supplied job and optional source/target operation scope; inspect that scope before replacing links. upsertOperationItems replaces all existing items for the operation; use the individual create or update operations for a smaller change.
Production plans hold planned work. Start with createProductionPlan for a new plan and updateProductionPlan for revisions. Review the replacement rules for any child collections you supply, even in an update. The advanced upsertProductionPlan operation replaces its child records rather than appending to them. updatePlannedOperationQuantities adjusts quantities while retaining planned operation identities, allocations and durations; review the timing separately if the new quantities change how long the work will take.
| Operation | Use it to |
|---|---|
Query.getOperation |
Read an operation. |
Query.getOperationBy |
Read operation by its identifying fields. |
Query.listOperations |
Browse operations. |
Query.aggregateOperations |
Summarise operations. |
Query.getOperationParameterSchema |
Find the required parameters for an operation kind. |
Query.listOperationEdges |
Browse operation edges. |
Query.listOperationItems |
Browse operation items. |
Query.listOperationItemEdges |
Browse operation item edges. |
Query.listProductionPlans |
Browse production plans. |
Query.getProductionPlan |
Read a production plan. |
Mutation.upsertOperation |
Advanced: Create or update an operation. Prefer create/update for routine changes. |
Mutation.createOperation |
Create an operation. |
Mutation.updateOperation |
Change an operation. |
Mutation.deleteOperation |
Delete an operation. |
Mutation.upsertOperationGraph |
Replace the job’s dependency graph and work centre preferences together. |
Mutation.createOperationEdge |
Create an operation edge. |
Mutation.updateOperationEdge |
Change an operation edge. |
Mutation.upsertOperationItem |
Advanced: Create or update an operation item. Prefer create/update for routine changes. |
Mutation.createOperationItem |
Create an operation item. |
Mutation.updateOperationItem |
Change an operation item. |
Mutation.upsertOperationItems |
Replace all work items for an operation. |
Mutation.deleteOperationItem |
Delete an operation item. |
Mutation.upsertOperationItemEdges |
Replace the dependency links between operation items. |
Mutation.createOperationItemEdge |
Create an operation item edge. |
Mutation.updateOperationItemEdge |
Change an operation item edge. |
Mutation.updatePlannedOperationQuantities |
Adjust planned quantities while retaining operation identities and schedule allocations. |
Mutation.upsertProductionPlan |
Advanced: Save a production plan, replacing its child records. Prefer create/update for routine changes. |
Mutation.createProductionPlan |
Create a production plan. |
Mutation.updateProductionPlan |
Change a production plan. |
Mutation.inferOperations |
Suggest production steps for a component or a supplied specification. |
Schedule the work
A schedule scenario is a proposed or published arrangement of work. An allocation puts an operation on a work centre between a start and end time. The route describes what needs to happen; the schedule describes when and where it is expected to happen.
Prepare a draft scenario
mutation CreatePrintingSchedule($input: CreateScheduleScenarioInput!) {
createScheduleScenario(input: $input) {
scheduleScenario { id name status planningHorizonStart planningHorizonEnd }
errors { path message }
}
}Variables:
{
"input": {
"name": "Brochure production — proposed week 45",
"status": "DRAFT",
"planningHorizonStart": "2026-11-02T06:00:00Z",
"planningHorizonEnd": "2026-11-07T18:00:00Z"
}
}Schedule statuses available in the API are:
DRAFT, PUBLISHED, ARCHIVED, SIMULATION
A draft is useful for planning before committing to the production schedule. Keep the scenario's scope, planning horizon and any production cell consistent with the work you are arranging.
Allocate the cover press run
mutation AllocatePrintingPress($input: CreateScheduleAllocationInput!) {
createScheduleAllocation(input: $input) {
scheduleAllocation { id scheduleScenarioId operationId workCenterId startAt endAt }
errors { path message }
}
}Variables:
{
"input": {
"scheduleScenarioId": "sch_2nanananan8naranananananan",
"workCenterId": "wcr_248h248h248h288h248h248h24",
"operationId": "opr_1k6csk6csk8csr6csk6csk6csk",
"startAt": "2026-11-03T08:00:00Z",
"endAt": "2026-11-03T10:00:00Z"
}
}Use the IDs returned for your scenario and press operation, and the configured press ID. The example's two-hour slot is illustrative; it does not calculate production time from the brochure quantity. Review setup, running time, cleanup, shifts, dependencies and other allocations before publishing the schedule.
Use scenario locking and allocation locking deliberately: they apply at different levels. Read the current scenario and allocations before changing a published plan.
Compare alternatives and follow the day
simulateScheduleScenario runs a forecast for a scenario. Follow it through scenarioSimulationRun, scenarioSimulationRuns and scenarioSimulationProgress; cancel it with cancelScenarioSimulation when necessary. simulateWorkload explores a workload without saving changes.
startScheduleOptimization starts a search for a schedule against the supplied objectives. Read the run with getOptimizationRun or listOptimizationRuns, follow scheduleOptimizationProgress, and use cancelScheduleOptimization to stop it. A forecast or optimisation result needs review before it becomes your operating plan.
Work centre behaviour profiles describe expected production behaviour. The twin queries expose a work centre's represented state, events and projections. Use these to compare expectations with recorded progress; a forecast is not a production report. Configuration of the work centre and its twin remains an IaC concern.
For the current day, productionDay brings together status history, the published plan and shifts for up to 100 active work centres in a cell, over a window of at most 36 hours. productionSnapshot provides a broader current view. Keep date-time offsets explicit when planning across shifts.
| Operation | Use it to |
|---|---|
Query.productionSnapshot |
Read the current production situation. |
Query.productionDay |
Read status history, the published plan and shifts for a production cell. |
Query.getScheduleScenario |
Read a schedule scenario. |
Query.listScheduleScenarios |
Browse schedule scenarios. |
Query.listScheduleAllocations |
Browse schedule allocations. |
Query.getOptimizationRun |
Read an optimization run. |
Query.listOptimizationRuns |
Browse optimization runs. |
Query.workCenterBehaviorProfile |
Read a work center behavior profile. |
Query.workCenterBehaviorProfiles |
Read work center behavior profiles. |
Query.twinBehaviorAttributes |
Discover the attributes available for production behaviour models. |
Query.scenarioSimulationRun |
Read a scenario simulation run. |
Query.scenarioSimulationRuns |
Read scenario simulation runs. |
Query.simulateWorkload |
Explore a workload without saving changes. |
Query.workCenterTwinShadow |
Read a work center twin shadow. |
Query.workCenterTwinShadows |
Read work center twin shadows. |
Query.workCenterTwinEvents |
Read work center twin events. |
Query.projectWorkCenterTwin |
Project a work centre’s state over time. |
Mutation.upsertScheduleScenario |
Advanced: Create or update a schedule scenario. Prefer create/update for routine changes. |
Mutation.createScheduleScenario |
Create a schedule scenario. |
Mutation.updateScheduleScenario |
Change a schedule scenario. |
Mutation.deleteScheduleScenario |
Delete a schedule scenario. |
Mutation.lockScheduleScenario |
Lock a schedule scenario. |
Mutation.unlockScheduleScenario |
Unlock a schedule scenario. |
Mutation.upsertScheduleAllocation |
Advanced: Create or update a schedule allocation. Prefer create/update for routine changes. |
Mutation.createScheduleAllocation |
Create a schedule allocation. |
Mutation.updateScheduleAllocation |
Change a schedule allocation. |
Mutation.deleteScheduleAllocation |
Delete a schedule allocation. |
Mutation.refreshWorkCenterBehaviorProfile |
Refresh the production behaviour profile for a work centre. |
Mutation.simulateScheduleScenario |
Run a forecast for a schedule scenario. |
Mutation.cancelScenarioSimulation |
Cancel a running schedule forecast. |
Mutation.startScheduleOptimization |
Start a search for a schedule that meets the chosen objectives. |
Mutation.cancelScheduleOptimization |
Cancel a running schedule search. |
Subscription.scenarioSimulationProgress |
Follow the progress of a schedule forecast. |
Subscription.workCenterTwinShadowChanged |
Receive changes to a work centre’s projected state. |
Subscription.scheduleOptimizationProgress |
Follow the progress of a schedule search. |
Record progress on the shop floor
The plan describes what should happen. Production reports record what did happen: the operation, work centre, time, count and any material consumption. Preserve the count unit and meaning so the figures can be interpreted correctly later.
Record a press run
mutation RecordPrintingPressRun($input: CreateProductionReportInput!) {
createProductionReport(input: $input) {
productionReport { id operationId goodCount totalPlanned countUnit runKind }
errors { path message }
}
}Variables:
{
"input": {
"name": "Cover press run — first report",
"jobId": "job_0h248h248h848r248h248h248h",
"componentId": "cmp_1248h248h288h848h248h248h2",
"operationId": "opr_1k6csk6csk8csr6csk6csk6csk",
"workCenterId": "wcr_248h248h248h288h248h248h24",
"startedAt": "2026-11-03T08:00:00Z",
"endedAt": "2026-11-03T09:30:00Z",
"goodCount": 2500,
"totalPlanned": 2500,
"countUnit": "COUNT",
"runKind": "PRODUCTION",
"actualPrintingDurationSeconds": 3600
}
}This report illustrates 2,500 good press sheets against a plan of 2,500 sheets, using COUNT as the counting unit. It assumes that sheet quantity was established for this operation; it is not a calculation of the sheets needed for 5,000 brochures. The report covers 90 elapsed minutes, with 60 minutes recorded as actual printing time. These are deliberately separate measures.
Use consumption when reporting material use as part of the production report. Keep material use and warehouse movements consistent with your process; recording a count is not a substitute for issuing stock. Avoid submitting a second report simply because the first response was lost: read the saved reports first.
Track execution and completion
Use transitionOperation to request an execution status change, and inspect any returned errors. The current state and execution rules determine whether the transition is allowed. transitionOperationItem addresses an individual item. Operation statuses are:
PENDING, AVAILABLE, SETUP, RUNNING, CLEANUP, COMPLETED, FAILED, STOPPED, CANCELLED, RESTARTING
Work centre status events describe the equipment's state and history. Use recordWorkCenterStatusEvent to record an event and correctWorkCenterStatusEvent to correct a previous one. These events are different from a job's overall status or a report of good production.
After completion, read the recorded completion summary:
query ReadPrintingCompletion($operationId: OperationID!) {
getOperationCompletionByOperation(operationId: $operationId) {
id operationId startedAt completedAt actualDurationMinutes
goodCount wasteCount totalPlanned countUnit
}
}Variables:
{
"operationId": "opr_1k6csk6csk8csr6csk6csk6csk"
}A missing completion result is not a zero quantity or zero duration. Check the operation and its reports before treating the job as reconciled. The summary keeps good count, waste, planned count and unit together.
Use statusEvents to receive production changes, then read the relevant records when you need their current detail.
| Operation | Use it to |
|---|---|
Query.listWorkCenterStatusEvents |
Browse work centre status events. |
Query.getOperationCompletion |
Read an operation completion. |
Query.getOperationCompletionByOperation |
Read an operation completion by operation. |
Query.listOperationCompletions |
Browse operation completions. |
Query.getProductionReport |
Read a production report. |
Query.listProductionReports |
Browse production reports. |
Mutation.transitionOperation |
Move an operation to its next execution status. |
Mutation.correctWorkCenterStatusEvent |
Correct a previously recorded work centre status event. |
Mutation.recordWorkCenterStatusEvent |
Record a work centre status change. |
Mutation.createProductionReport |
Record production counts, time and material consumption. |
Mutation.transitionOperationItem |
Change the execution status of a work item. |
Subscription.statusEvents |
Receive production status changes. |
Coordinate people and milestones
Use a task for work a person needs to carry out, such as reviewing the cover proof or investigating a press stoppage. Read assigned work with myTasks, take responsibility with claimTask, and use task transitions to record progress. getTaskEvents supplies the task history.
A milestone marks an important point in the job, such as artwork approved, printing complete or ready for dispatch. Give it due dates and associate it with the job or a component. Starting, completing and cancelling are distinct actions; the corresponding undo operations correct those actions when appropriate.
A task, a milestone and a production operation are separate records. Completing an approval task does not by itself report press output or prove that every finishing operation is complete.
| Operation | Use it to |
|---|---|
Query.getMilestone |
Read a milestone. |
Query.getMilestoneBy |
Read milestone by its identifying fields. |
Query.listMilestones |
Browse milestones. |
Query.getTask |
Read a task. |
Query.listTasks |
Browse tasks. |
Query.myTasks |
Read the tasks assigned to you. |
Query.getTaskEvents |
Read a task’s history. |
Mutation.upsertMilestone |
Advanced: Create or update a milestone. Prefer create/update for routine changes. |
Mutation.createMilestone |
Create a milestone. |
Mutation.updateMilestone |
Change a milestone. |
Mutation.startMilestone |
Start a milestone. |
Mutation.unstartMilestone |
Undo the start of milestone. |
Mutation.completeMilestone |
Complete a milestone. |
Mutation.uncompleteMilestone |
Reopen a milestone. |
Mutation.cancelMilestone |
Cancel a milestone. |
Mutation.uncancelMilestone |
Undo cancellation of milestone. |
Mutation.deleteMilestone |
Delete a milestone. |
Mutation.createTask |
Create a task. |
Mutation.updateTask |
Change a task. |
Mutation.transitionTask |
Read a transition task. |
Mutation.claimTask |
Take responsibility for a task. |
Mutation.cancelTask |
Cancel a task. |
Mutation.deleteTask |
Delete a task. |
Review production and costs
Read the job as a whole
query ReadPrintingJob($id: JobID!) {
getJob(id: $id) {
id jobNumber name quantity status dueAt
components { id name kind quantity }
operations { id name kind status componentId }
milestones { id name dueAt completedAt }
}
}Variables:
{
"id": "job_0h248h248h848r248h248h248h"
}Review the components, operations and milestones together. The job may have reached the press while a later finishing step is still pending. productionBoard provides a wider view of active jobs with order context.
Use evaluateProducibility and producibilityIntelligence to assess production choices and constraints. previewPlannedOperationAudit previews an audit without saving changes; auditProduction and auditProductionEnriched support a broader review against the plan.
issueStockToProduction issues warehouse material, creates transfers and reduces stock quantities. Coordinate it with the warehouse process so the same material is not issued twice. Material receipts, purchasing and customer invoicing are covered in the Warehousing and Logistics and ERP guides.
Compare the job's costs
For entering and correcting actual costs, follow the ERP guide.
query ReviewPrintingCosts($jobId: JobID!) {
jobCostingSummary(jobId: $jobId) {
job { id name }
totalMaterialCost totalOperationCost totalCost
recordedCostsAvailable totalRecordedCost recordedCostCurrency
sellingPrice sellingPriceCurrency recordedCostMargin
errors { path message }
}
}Variables:
{
"jobId": "job_0h248h248h848r248h248h248h"
}Distinguish the summary's material and operation cost figures from its recorded cost totals. Check recordedCostsAvailable and the associated currency fields before interpreting a margin. A missing recorded total does not mean production was free. Do not combine amounts in different currencies as though they were one total.
Before treating the printing job as complete, reconcile required operations, production counts, material use and outstanding milestones. Packing and dispatch remain real steps in delivering the customer's order; completion of one press run does not establish fulfilment of the sale.
| Operation | Use it to |
|---|---|
Query.productionBoard |
Review active jobs with their components, operations and order context. |
Query.jobCostingSummary |
Compare material and operation costs for a job. |
Query.evaluateProducibility |
Assess whether a proposed job can be produced. |
Query.producibilityIntelligence |
Explore production constraints and possible choices. |
Query.previewPlannedOperationAudit |
Preview a production audit without saving changes. |
Query.auditProduction |
Review production against its plan. |
Query.auditProductionEnriched |
Review production with additional context. |
Mutation.issueStockToProduction |
Issue warehouse material to production and reduce the available stock. |
Read the configured production resources
A work centre is a resource that can perform work, such as a press or finishing station. A production cell groups work centres. Capabilities describe what they can do, and shifts describe availability. Device assignments connect configured equipment to the production resource.
Read these records to choose suitable resources for the job. Manage their definitions and relationships through IaC. Read the configured paper choices and their provisioning guidance in the Prepress guide. Selecting an existing paper for a component remains runtime work.
installCanonicalTemplate installs a reusable product template and belongs with provisioning. instantiateProductTemplate, described earlier, creates a particular printing job from a published template.
Shared paper-weight and imposing settings are covered in Prepress as administrative configuration.
| Operation | Use it to |
|---|---|
Query.getCapability |
Read a capability. |
Query.getExistingCapability |
Read an existing capability. |
Query.getCapabilityByCode |
Read a capability by code. |
Query.listCapabilities |
Browse capabilities. |
Query.getProductionCell |
Read a production cell. |
Query.listProductionCells |
Browse production cells. |
Query.getShiftDefinition |
Read a shift definition. |
Query.listShiftDefinitions |
Browse shift definitions. |
Query.getWorkCenter |
Read a work centre. |
Query.getWorkCenterBy |
Read work centre by its identifying fields. |
Query.listWorkCenters |
Browse work centres. |
Query.getWorkCenterCapability |
Read a work centre capability. |
Query.listWorkCenterCapabilities |
Browse work centre capabilities. |
Query.getWorkCenterDevice |
Read a work centre device. |
Query.listWorkCenterDevices |
Browse work centre devices. |
Query.getWorkCenterShiftProfile |
Read a work centre shift profile. |
Query.listWorkCenterShiftProfiles |
Browse work centre shift profiles. |
Mutation.upsertCapability |
Create or update a capability. Manage through IaC. |
Mutation.createCapability |
Create a capability. Manage through IaC. |
Mutation.updateCapability |
Change a capability. Manage through IaC. |
Mutation.deleteCapability |
Delete a capability. Manage through IaC. |
Mutation.upsertProductionCell |
Create or update a production cell. Manage through IaC. |
Mutation.createProductionCell |
Create a production cell. Manage through IaC. |
Mutation.updateProductionCell |
Change a production cell. Manage through IaC. |
Mutation.deleteProductionCell |
Delete a production cell. Manage through IaC. |
Mutation.upsertShiftDefinition |
Create or update a shift definition. Manage through IaC. |
Mutation.createShiftDefinition |
Create a shift definition. Manage through IaC. |
Mutation.updateShiftDefinition |
Change a shift definition. Manage through IaC. |
Mutation.deleteShiftDefinition |
Delete a shift definition. Manage through IaC. |
Mutation.configureWorkCenterTwin |
Configure the work centre’s production behaviour model. Manage through IaC. |
Mutation.upsertWorkCenter |
Create or update a work centre. Manage through IaC. |
Mutation.createWorkCenter |
Create a work centre. Manage through IaC. |
Mutation.updateWorkCenter |
Change a work centre. Manage through IaC. |
Mutation.deleteWorkCenter |
Delete a work centre. Manage through IaC. |
Mutation.createWorkCenterCapability |
Create a work centre capability. Manage through IaC. |
Mutation.updateWorkCenterCapability |
Change a work centre capability. Manage through IaC. |
Mutation.upsertWorkCenterCapability |
Create or update a work centre capability. Manage through IaC. |
Mutation.deleteWorkCenterCapability |
Delete a work centre capability. Manage through IaC. |
Mutation.createWorkCenterDevice |
Create a work centre device. Manage through IaC. |
Mutation.updateWorkCenterDevice |
Change a work centre device. Manage through IaC. |
Mutation.upsertWorkCenterDevice |
Create or update a work centre device. Manage through IaC. |
Mutation.deleteWorkCenterDevice |
Delete a work centre device. Manage through IaC. |
Mutation.upsertWorkCenterShiftProfile |
Create or update a work centre shift profile. Manage through IaC. |
Mutation.createWorkCenterShiftProfile |
Create a work centre shift profile. Manage through IaC. |
Mutation.updateWorkCenterShiftProfile |
Change a work centre shift profile. Manage through IaC. |
Mutation.deleteWorkCenterShiftProfile |
Delete a work centre shift profile. Manage through IaC. |
Mutation.installCanonicalTemplate |
Install a reusable product template. Manage through IaC. |
Keep instructions with the work
Use entity notes to keep instructions and decisions with the appropriate record. Link production instructions to the relevant job or component rather than relying on a detached message. Keep structured quantities, dates and statuses in their fields; a note should explain them, not replace them.
At the commercial handover, a note on the source order can record an instruction that production needs to see. This shared example uses an order target:
mutation AddCommerceOrderNote($input: CreateEntityNoteInput!) {
createEntityNote(input: $input) {
entityNote { id targetId body version }
errors { path message }
}
}Variables:
{
"input": {
"targetId": "ord_01h455vb4pex5vsknk084sn02q",
"body": "Customer requested delivery after 10:00. Confirm the delivery appointment before dispatch."
}
}Use the target type and ID appropriate to the record you are annotating. Read existing notes and their versions before updating them. reindexEntityNotes supports note search maintenance; it is not required for each new instruction.
| Operation | Use it to |
|---|---|
Query.getEntityNote |
Read a note attached to a record you can access |
Query.getEntityNoteBySource |
Find a note by its source integration and key |
Query.entityNotes |
Browse notes on a record |
Query.searchEntityNotes |
Search notes you are allowed to read |
Mutation.createEntityNote |
Add a note to a record |
Mutation.updateEntityNote |
Edit a note using its current version |
Mutation.deleteEntityNote |
Delete a note using its current version |
Mutation.reindexEntityNotes |
Request refreshed search indexing for a selected set of notes |
Discover the API and get help
The shared discovery operations expose schema information, available tools and help. Use them to find the precise inputs and capabilities available in your environment. They support working with Production; they do not create a printing route on their own.
The examples in this guide are also available through topicExamples(names: [...]), using names such as production.create-job, production.add-cover and production.record-press-run. The returned operation and variables belong together. Replace the illustrative IDs before using them for your own job.
| Operation | Use it to |
|---|---|
Query.magicQuery |
Read data with a compact named query |
Query.getMagicQuerySchema |
Inspect the inputs and result of a compact named query |
Query.listMagicQueries |
Discover the available compact named queries |
Query.getMagicQueryGraphQL |
Inspect the GraphQL operation for a compact named query |
Query.listDataChangeEventTopics |
Discover record-change event topics |
Query.generateDefaultDataQuery |
Prepare a query for a record-change event |
Query.ping |
Check whether the API responds |
Query.iacSchema |
Read the infrastructure schema for IaC tooling |
Query.iacValidate |
Validate an IaC source document |
Query.iacGuides |
Read IaC authoring guides |
Query.helpChapters |
Discover help chapters |
Query.helpChapter |
Read a help chapter |
Query.searchHelp |
Find help by search term |
Query.schemaAuthoringCatalog |
Discover supported schema authoring features |
Query.compileSchemaXML |
Convert an authored XML schema to JSON Schema |
Query.renderSchemaXML |
Convert JSON Schema to authored XML |
Query.iacSchemaDocument |
Read a schema document used by IaC tooling |
Subscription.dataChangeEvents |
Subscribe to record-change events |
Query.topicExamples |
Retrieve named examples with their operations and variables. |
Published platform manual · revision 7eb15cc0bae3