Promotions allow you to offer discounts, credits, and special pricing to customers through coupon codes, automatic rules, or manual application.
Key concepts:
- Code - the coupon code a customer enters (e.g.,
SAVE20) - Effects - what the promotion does: percentage discount, fixed discount, free trial extension, or credit grant
- Conditions - eligibility rules: minimum spend, specific plans, customer segments, date ranges
- Budget - optional spending cap; the promotion deactivates when the budget is exhausted
- Stackable - whether this promotion can combine with other active promotions
- Simulation - preview the financial impact of a promotion before activating it
List promotions
Returns a paginated list of promotions. Supports the unified field.op=value filter grammar (see /docs/pagination).
query Parameters
limitPage size
cursorPagination cursor
statusFilter by status (sugar for status.eq); also supports status.ne, status.in
visibilityFilter by visibility (sugar for visibility.eq); also supports visibility.in
List promotions › Responses
Paginated list wrapped in data envelope
application_timingarchetypearchived_atbudget_behaviorcodecondition_modecreated_atcurrent_budget_usedcurrent_redemptionsdeleted_atdescriptionhead_version_ididis_phasedmax_budgetmax_redemptionsmax_redemptions_per_customernameorganization_idpopulated when is_phased=true; single Default phase otherwise
prioritypublic_descriptionpublished_atpublished_byrequires_continuous_coveragestackablestatusupdated_atvalid_fromvalid_toversionvisibilityCreate a promotion
Creates a new promotion in draft status
Create a promotion › Request Body
application_timingarchetypebudget_behaviorcodecondition_modedescriptionis_phasedmax_budgetmax_redemptionsmax_redemptions_per_customernamerequired when archetype is loyalty_ladder / growth_ladder
prioritypublic_descriptionstackablevalid_fromvalid_tovisibilityCreate a promotion › Responses
Wrapped in data envelope
application_timingarchetypearchived_atbudget_behaviorcodecondition_modecreated_atcurrent_budget_usedcurrent_redemptionsdeleted_atdescriptionhead_version_ididis_phasedmax_budgetmax_redemptionsmax_redemptions_per_customernameorganization_idpopulated when is_phased=true; single Default phase otherwise
prioritypublic_descriptionpublished_atpublished_byrequires_continuous_coveragestackablestatusupdated_atvalid_fromvalid_toversionvisibilitySimulate promotion impact
Runs the invoice pipeline without persisting invoices or incrementing promotion budgets
Simulate promotion impact › Request Body
billing_period_endbilling_period_startcustomer_idpromotion_idssubscription_idSimulate promotion impact › Responses
Wrapped in data envelope
Get a promotion
Retrieves a single promotion by ID
path Parameters
idPromotion UUID
Get a promotion › Responses
Wrapped in data envelope
application_timingarchetypearchived_atbudget_behaviorcodecondition_modecreated_atcurrent_budget_usedcurrent_redemptionsdeleted_atdescriptionhead_version_ididis_phasedmax_budgetmax_redemptionsmax_redemptions_per_customernameorganization_idpopulated when is_phased=true; single Default phase otherwise
prioritypublic_descriptionpublished_atpublished_byrequires_continuous_coveragestackablestatusupdated_atvalid_fromvalid_toversionvisibilityUpdate a promotion
Updates an existing promotion
path Parameters
idPromotion UUID
Update a promotion › Request Body
application_timingarchetypebudget_behaviorcodecondition_modedescriptioneffective_atADR-0006 edit-as-publish controls.
expected_versionis_phasedmax_budgetmax_redemptionsmax_redemptions_per_customernamefull replacement when non-nil; draft-only
prioritypublic_descriptionsave_as_draftstackablevalid_fromvalid_tovisibilityUpdate a promotion › Responses
Wrapped in data envelope
application_timingarchetypearchived_atbudget_behaviorcodecondition_modecreated_atcurrent_budget_usedcurrent_redemptionsdeleted_atdescriptionhead_version_ididis_phasedmax_budgetmax_redemptionsmax_redemptions_per_customernameorganization_idpopulated when is_phased=true; single Default phase otherwise
prioritypublic_descriptionpublished_atpublished_byrequires_continuous_coveragestackablestatusupdated_atvalid_fromvalid_toversionvisibilityActivate a promotion
Transitions a promotion from draft to active status
path Parameters
idPromotion UUID
Activate a promotion › Responses
Wrapped in data envelope
application_timingarchetypearchived_atbudget_behaviorcodecondition_modecreated_atcurrent_budget_usedcurrent_redemptionsdeleted_atdescriptionhead_version_ididis_phasedmax_budgetmax_redemptionsmax_redemptions_per_customernameorganization_idpopulated when is_phased=true; single Default phase otherwise
prioritypublic_descriptionpublished_atpublished_byrequires_continuous_coveragestackablestatusupdated_atvalid_fromvalid_toversionvisibilityCopy a promotion as a new draft
Clones an existing promotion (any status) into a new draft
path Parameters
idSource promotion UUID
Copy a promotion as a new draft › Request Body
codenamevalid_fromvalid_toCopy a promotion as a new draft › Responses
Wrapped in data envelope
application_timingarchetypearchived_atbudget_behaviorcodecondition_modecreated_atcurrent_budget_usedcurrent_redemptionsdeleted_atderived_statusdescriptionhead_version_ididis_phasedmax_budgetmax_redemptionsmax_redemptions_per_customernameorganization_idpopulated when is_phased=true; single Default phase otherwise
prioritypublic_descriptionpublished_atpublished_byremaining_budgetremaining_redemptionsrequires_continuous_coveragestackablestatusupdated_atvalid_fromvalid_toversionvisibilityDeactivate a promotion
Transitions a promotion from active to archived status
path Parameters
idPromotion UUID
Deactivate a promotion › Responses
Wrapped in data envelope
application_timingarchetypearchived_atbudget_behaviorcodecondition_modecreated_atcurrent_budget_usedcurrent_redemptionsdeleted_atdescriptionhead_version_ididis_phasedmax_budgetmax_redemptionsmax_redemptions_per_customernameorganization_idpopulated when is_phased=true; single Default phase otherwise
prioritypublic_descriptionpublished_atpublished_byrequires_continuous_coveragestackablestatusupdated_atvalid_fromvalid_toversionvisibilityPreview promotion eligibility
Evaluates a single promotion's conditions for a customer and returns per-condition pass/fail details
path Parameters
idPromotion UUID
Preview promotion eligibility › Responses
Wrapped in data envelope
effect_summaryeligiblepromotion_idpromotion_namereasonList promotion versions (with lifecycle filter)
path Parameters
idPromotion UUID
query Parameters
statusLifecycle status filter (repeatable)
List promotion versions (with lifecycle filter) › Responses
OK
archived_reasoncreated_atcreated_byeffective_fromeffective_toidID is the *_versions.id UUID. Phase 2.D needs it so the FE stage-mode chip can wire selection→pin map without a separate number→ID lookup; older clients can ignore the field.
published_atstatususage_countversionGet a promotion version snapshot
path Parameters
idPromotion UUID
versionVersion number
Get a promotion version snapshot › Responses
OK
application_timingbudget_behaviorcodedescriptioneffective_fromeffective_toidmax_budgetmax_redemptionsnameprioritypromotion_idpromotion_statuspublished_atpublished_byrelease_strategystackablestatusvalid_fromvalid_toversionvisibility