How a Recurring Order is built
POST /{projectKey}/recurring-orders HTTP/1.1
Content-Type: application/json
{
"key": "horizon-monthly-room-kit",
"cart": { "typeId": "cart", "id": "{cartId}" },
"cartVersion": 12,
"startsAt": "2026-07-01T00:00:00.000Z"
}
/{projectKey}/recurring-orders endpoint, not an as-associate path, and there are no Recurring-Order-specific Associate permissions. Scope and ownership flow from the source Cart, so the access control you want is the access control you apply to the Cart it is built from.Recurrence lives on the Cart's Line Items
setLineItemRecurrenceInfo action (or at add-line-item time), which references a Recurrence Policy and sets a price-selection mode.POST /{projectKey}/as-associate/{associateId}/in-business-unit/key=horizon-hotels/carts/{cartId} HTTP/1.1
Content-Type: application/json
{
"version": 11,
"actions": [
{
"action": "setLineItemRecurrenceInfo",
"lineItemId": "{lineItemId}",
"recurrenceInfo": {
"recurrencePolicy": { "typeId": "recurrence-policy", "key": "monthly-first" },
"priceSelectionMode": "Fixed"
}
}
]
}
Fixed versus Dynamic price selection
priceSelectionMode field offers two options.Fixed so every monthly Order keeps the agreed rate captured when the Recurring Order was created. For a buyer whose pricing is tied to a fluctuating commodity, choose Dynamic so each cycle re-resolves the current Channel-scoped Price.priceSelectionMode is a beta feature. Confirm its availability for your Project before committing a design to it, and note that beta behavior may change.Defining the schedule with a Recurrence Policy
POST /{projectKey}/recurrence-policies HTTP/1.1
Content-Type: application/json
{
"key": "monthly-first",
"name": { "en-AU": "First of every month" },
"schedule": { "type": "dayOfMonth", "day": 1 }
}
To order on two dates in the same month, for example the 1st and the 15th, create two Recurring Orders, each with its own day-of-month policy, rather than trying to express both in one schedule.
The Recurring Order lifecycle
Once active, a Recurring Order moves through these states:
Failed is not a transient blip the platform clears on its own. When an Order cannot be created, the Recurring Order transitions to Failed, records the cause in its failure field, and stops generating new Orders until the issue is resolved. It does not auto-pause, auto-retry indefinitely, or auto-cancel, so a replenishment design needs monitoring that watches for Failed and the accompanying failure message.Worked example: Horizon Hotels' monthly restock
Horizon Hotels wants its room-electronics kit ordered automatically on the first of each month, at the contracted price. Sequence the design like this:
- Build a scoped Cart. Assemble the kit in a Cart through the
as-associate/in-business-unit/key=horizon-hotelsendpoint, against the Horizon Store, with each Line Item carrying thehorizon-hotels-pricingdistribution Channel so the contracted prices resolve. - Create a Recurrence Policy.
POSTaDayOfMonthSchedulepolicy withday: 1. - Attach recurrence to the Line Items. Use
setLineItemRecurrenceInfoto reference the policy and setpriceSelectionMode: Fixed, because the contract price must hold every cycle. (ChooseDynamiconly if Horizon's pricing were meant to track the catalog.) - Create the Recurring Order from the Cart.
POSTto/recurring-orderswith the Cart reference andstartsAtof the next first-of-month. The Recurring Order inherits Horizon's Store and Business Unit from the Cart. - Monitor for
Failed. Add an operational check for theFailedstate so an out-of-stock item surfaces instead of silently skipping a month.
Horizon now has a standing monthly Order at the contracted price, scoped to its Business Unit, with no manual rebuild each cycle.
Key takeaways
- A Recurring Order is created from a Cart through the top-level
/recurring-ordersendpoint and inherits the Cart's Store and Business Unit; there are no Recurring-Order-specific Associate permissions. - Recurrence is configured on the Cart's Line Items with
setLineItemRecurrenceInfo, referencing a Recurrence Policy and apriceSelectionMode. Fixedreuses the original price each cycle (contract-locked);Dynamicre-resolves the current catalog price.priceSelectionModeis a beta feature.- A Recurrence Policy holds either a
StandardSchedule(interval) or aDayOfMonthSchedule(specific day); use separate Recurring Orders for multiple days in a month. - States are
Active,Paused,Expired,Canceled, andFailed;Failedstops generation until resolved and requires monitoring.