Skip to content

Constraint Studio

Elevate plan

Constraint Studio is the rule editor behind PO hints and the constraint optimizerConstraint optimizerA PO detail tool that builds a proposed additive plan from configured constraint rules. In Fill gaps mode, it can increase existing lines or add eligible variants; you confirm before anything is applied. Elevate-plan feature. Read more → . You configure business rules in a guided workflow; the technical graph is still available through Advanced graph for inspection and power-user changes.

Constraint Studio with compact readiness chips for semantic roles
The readiness chips show which semantic roles are already mapped from Product Settings or Data Modeling.
  • What a rule controls
  • Constraint readiness
  • Presets
  • Rule metadata
  • Field binding
  • Preview and save
  • Advanced graph nodes
  • Where rules appear on POs
  • See also

A constraint rule can:

  • Show line or PO-level hints when a PO is below MOQ, not in pack multiples, over budget, missing a group, or missing required data.
  • Act as an optimizer target, so the optimizer tries to close the gap by adding eligible variants or increasing existing lines.
  • Add an optimizer objective, so an already-valid plan is ranked toward a better fill or capacity outcome.

Rules are evaluated for Draft and Sent POs only. Other PO statuses keep their saved data, but active constraint rules do not apply there.

The readiness section checks whether common semantic roles are mapped:

RoleUsed by
Group keyGroup exact count, group minimum total, group coverage.
Unit CBMPO max CBM, container fill, capacity blocks.
Unit weightPO max weight and weight-based capacity rules.
Case sizeCase-size and multiple-based planning.
Pallet quantityPallet or block-capacity planning.
Purchase familyCoverage, bundle, and family-based rules.
Product MOQProduct-level MOQ summed across variants.

Mapped roles can come from Product & variant attributes or from Data Modeling semantic mappings. Hover a readiness chip to see the exact field source. Missing roles do not block saving every rule, but presets that need that role ask you to bind a field manually.

Click Add rule to open the preset picker.

Constraint preset picker showing MOQ and other rule presets
Start from a business preset whenever possible; use Advanced graph only for special cases.

The current presets are:

PresetWhat it checksOptimizer behavior
MOQEach line meets supplier-variant MOQ.Can increase/add lines to meet MOQ.
Pack size / multiplesEach line is a valid pack multiple.Final suggested quantities must respect multiples.
Min line quantityEvery line reaches a fixed minimum.Can increase lines.
Max line quantityEvery line stays under a fixed maximum.Fill gaps cannot reduce lines, so this appears as a warning/limit.
Supplier minimum valuePO value reaches a supplier minimum.Can add/increase eligible lines.
Supplier minimum unitsTotal ordered units reach a supplier minimum.Can add/increase eligible lines.
PO budget capPO value stays under a cap.Fill gaps cannot reduce an over-budget PO.
PO max unitsTotal ordered units stay under a cap.Hard limit for additive plans.
PO max CBMOrdered units times unit CBM stay under a cap.Hard limit when the rule is a target.
PO max weightOrdered units times unit weight stay under a cap.Hard limit when the rule is a target.
Container fill targetTotal capacity measure reaches a target.Adds a fill objective.
Exact group countPO contains exactly the required number of groups.Evaluates group count; additive fixes depend on candidate data.
Minimum units per variantEvery active variant reaches a shared minimum.Can increase/add eligible variants.
Minimum total per groupEvery active group reaches a summed minimum.Can increase/add lines in underfilled groups.
Product MOQAll variants of each product are summed and compared to a product-level MOQ field.Can increase/add variants until product MOQ gaps are filled.
Group coverageActive groups cover available supplier variants in the same group.Can add missing variants from uncovered groups.
Ratio / bundleA numerator measure divided by a denominator measure reaches a minimum ratio.Evaluates the ratio; additive fixes depend on candidate data.
Fill capacity blocksCurrent capacity block is underfilled and should move toward the next full block.Objective-only by default.

Every guided rule has the same high-level settings:

SettingBehavior
NameMerchant-facing rule name shown in settings, PO hints, and optimizer reasons.
EnabledDisabled rules are saved but ignored.
ScopeGeneral applies to all POs. Supplier scope applies only to selected active suppliers.
StatusesOnly Draft and Sent are valid active statuses. At least one must be selected.
SeverityControls the PO hint tone: Info, Warning, or Error. It does not by itself make a rule hard.
Optimizer targetMakes the optimizer treat the rule as a target/limit. Warning-only rules still show hints but are not a target.

Some presets can use built-in PO fields immediately. Others need a field binding:

  • Product MOQ needs a product identity field, ordered units, and a product-level MOQ field.
  • CBM and weight rules need a per-unit Number field.
  • Group rules need a group key or purchase family field.
  • Ratio rules need two numeric fields.

Constraint Studio suggests fields from semantic roles first. It does not silently bind an unsafe field when the role or type does not match; choose the field explicitly if the suggestion is missing.

Product MOQ preset with product identity, ordered units, and Product MOQ field bindings
One Product MOQ rule can use a product-level attribute value for every product instead of hard-coding thresholds per product.
PO max CBM preset with a Unit CBM field and maximum CBM threshold
Capacity rules multiply ordered quantity by a per-unit measure such as Unit CBM.

Before saving, preview a rule against sample data or a real PO. Real-PO preview is the best check because it uses your PO lines, supplier, fields, and current saved values.

Preview and evaluation do not change PO quantities. They return pass/fail state, severity, and missing-data reasons such as missing Product MOQ, Unit CBM, Unit weight, Group key, or Purchase family.

Settings saves are versioned. If another tab changes the constraint settings first, Logistified rejects the stale save and asks you to reload instead of overwriting someone else’s rules.

Guided presets compile to a technical graph. Most teams never need to edit it, but it is useful for debugging.

DatasetWhat it contains
line_itemsCurrent PO lines after data-quality exclusions. Use this for normal rule checks.
all_line_itemsCurrent PO lines before exclusions. Use this when the rule itself must report missing data.
supplier_variantsEligible supplier catalog variants, including variants not yet on the PO.
combined_line_itemsCurrent PO lines plus simulated optimizer additions.
candidate_line_itemsOnly simulated optimizer candidate rows.
NodeInput -> outputMain settings
meta.ruleNone -> metadataInternal rule metadata; not needed in guided rules.
source.poNone -> objectCurrent PO context: header fields, current lines, supplier variants, optimizer candidates. A normal graph has one.
source.datasetNone -> datasetReads a named dataset. This is valid for legacy/advanced graphs but hidden from the normal library.
source.fieldNone -> scalarReads one field path, for example line_item.quantityOrdered or a mapped Product Settings/Data Model field.
source.valueNone -> scalarStatic text, number, boolean, or date value.
transform.extractPO object/dataset -> dataset or scalarSelects line_items, all_line_items, supplier_variants, combined_line_items, candidate_line_items, or a nested PO field.
transform.filterDataset + optional compare input -> datasetFilters rows by field path, operator, and right value.
transform.mapDataset -> datasetAdds or replaces a row value. Modes: copy field, write constant, or calculate math into an output field.
transform.group_byDataset -> grouped datasetGroups rows by a field such as product ID, variant ID, group key, or purchase family.
transform.aggregateDataset/grouped dataset -> scalar or grouped valuessum, count, distinct_count, min, max, avg; grouped input returns one result per group.
transform.set_operationDataset -> scalar/set/booleandistinct_values, distinct_count, cardinality_in_set, contains_all, contains_any.
logic.mathScalars -> scalar+, -, *, /, min, max, ceil, floor, round, abs. Used for ratios and capacity blocks.
logic.compareOne or two values -> boolean>=, >, <=, <, ==, !=, contains, not_contains, in_set, before, after; pack-size presets also generate multiple_of.
logic.group_compareGrouped left + grouped/right limits -> booleanCompares each group to its own limit. Missing-right behavior can fail, ignore, or use a default. Product MOQ uses this node.
logic.booleanBooleans -> booleanand, or, not, xor.
logic.dateDates -> scalar or booleanbefore, after, diff_days.
logic.quantifierDataset -> booleanRequires all, any, or none of the rows to satisfy a row comparison. Line MOQ and min/max line quantity use this.
logic.coverageCurrent rows + universe rows -> booleanChecks whether PO groups/variants cover the available supplier universe. Can check only groups already present or the full universe.
output.findingBoolean -> PO hint/badgeEmits pass/fail text, severity, affected fields, affected variants/groups, and missing-data details. It never changes PO data.
output.optimizer_scoreScalar -> optimizer objectiveAdds a numeric ranking signal for candidate plans. Hard feasibility still wins over score.

Malformed graphs, cycles, missing nodes, wrong input/output types, missing source.po, and finding outputs that are not driven by logic nodes are rejected. Use the guided workflow unless you need a graph-level rule.

Saved rules appear in three places:

  • The Constraints column on PO line items.
  • Purchase-order hints in the guided PO preview area.
  • The Optimize dialog, where target rules, remaining reasons, and proposed actions are explained.
Purchase order line items with a failing Product MOQ constraint badge on two variants of the same product
This Product MOQ example counts two variants of the same product together. Both rows are marked because the combined ordered units are still below that product's MOQ value.