Coupon
object type
A Coupon — the CODE-GATED entry to the discount engines: a normalized code (trim+UPPERCASE, stored normalized-only, IMMUTABLE at birth — re-code = a new coupon) that either UNLOCKS a couponGated Promotion (trigger flavor — the reduction is source=promo at position 3) or CARRIES its own simple effect (discount flavor — source=coupon at position 2, BEFORE promotions). Attach to an OPEN order via applyOrderCoupon (HARD 1 coupon/order — the strict default); redemption counts per ORDER in the place transaction — a capped-out coupon refuses CONFLICT/COUPON_EXHAUSTED. NAMED deferrals: CouponBatch (unique single-use child codes) · per-customer caps.
Fields
| Field | Type | Notes |
|---|---|---|
id | ID ID! | The record’s id — a UUID the platform assigned when the record was created; every reference to this record uses it. |
sysId | String String! | The group-scoped human-facing system id (CP-…). |
type | String String! | The kind of record — always Coupon here. |
caption | String String! | The record’s display name — what people see it called. |
status | String String! | The FSM state: active | inactive | doomed. |
parentId | ID ID! | The parent org group; for a Coupon parentId === rootId. |
rootId | ID ID! | The org-group family root. |
createdAt | String String! | When the record was created, as a UTC timestamp. |
updatedAt | String String! | When the record last changed, as a UTC timestamp. |
revisionNum | Int Int! | How many times this record has been edited; the first save is 0. |
revision | ID ID! | The OCC revision token — supply it on every mutation of this record; rotates on every write. |
refCaptions | RefCaption [RefCaption!]! | The server-composed captions of this record's declared references (the referenced-caption rule) — one row per referenced id; see RefCaption. |
flavor | CouponFlavor CouponFlavor! | The canned flavor (SPEC_REGISTRY row 106) — IMMUTABLE at birth. |
code | String String! | No further notes. |
promotionId | ID | trigger flavor ONLY: the unlocked couponGated Promotion (same-tenant + ACTIVE at create) — IMMUTABLE (re-point = a new coupon). |
effect | CouponEffect | discount flavor ONLY: the carried effect — wholesale-replace on edit (refused on trigger, the cross-flavor gate). |
startAt | String String! | The half-open window start (kit-stamped NOW when omitted at create). |
endAt | String | The half-open window end — ABSENT = evergreen; out-of-window redemption refuses CONFLICT/COUPON_EXPIRED. |
totalUsesCap | Int | Total-use cap. |