Skip to main content

Decisions and outcomes

Every check — an entity condition or a project restriction — resolves to one of three outcomes:

DecisionMeaning
AllowThe check passes.
Soft denyThe check couldn't be completed — usually because information it needed wasn't available. Checkout may prompt for that information or retry; it isn't a final "no."
Hard denyThe check fails outright.

How outcomes combine on one item​

An item can have several checks running against it at once — more than one entity condition, plus project restrictions when the purchase is against a project. The item is only allowed through if every one of its checks allows it; a single denial from any check denies the item. When more than one check fails, all of the failures are reported together, not just the first one, so everything that needs addressing is visible at once.

Reason codes​

Each denial carries a machine-readable reason code identifying exactly what failed:

CheckReason codeMeaning
Any entity conditioncondition.unknownThe item references a condition checkout doesn't recognize — the id doesn't exist, is disabled, or hasn't reached checkout yet (soft deny); see Entity condition
Age restrictionage_restriction.missing_contextShopper's age wasn't available (soft deny)
Age restrictionage_restriction.underageShopper is below the minimum age
License requirementlicense_requirement.missing_contextShopper's licenses weren't available (soft deny)
License requirementlicense_requirement.license_missingShopper's licenses don't include the required one
License requirementlicense_requirement.level_insufficientShopper holds the license, but not at the minimum level (lower, missing, or not a whole number)
Project restrictionproject_restriction.project_unreachableThe project's restrictions couldn't be looked up (soft deny)
Project restrictionproject_restriction.property_missingThe item was missing a property a restriction needed, and wasn't allowed to be
Project restrictionproject_restriction.whitelist_not_metItem property's value wasn't in the allowed list
Project restrictionproject_restriction.blacklist_not_metItem property's value was in the denied list
Project restrictionproject_restriction.item_not_whitelistedItem id wasn't in the allowed list
Project restrictionproject_restriction.blacklisted_itemItem id was in the denied list

See the API reference for the exact response shape these appear in.

Things worth knowing​

  • An unrecognized condition doesn't hide the others. The item's other checks still run and report their own outcomes — an unknown id next to a failed age check reports both the soft deny and the hard deny.
  • A condition.unknown result carries no rule, since checkout can't tell which check the condition would have been.
  • Unknown project restriction types work the other way round. An unrecognized restriction type on a project passes, while an unrecognized entity condition holds the item back — see Project restrictions.