Skip to main content
Menu-level schedules control when an entire composed menu is active. Product-level schedules narrow orderability further — useful for happy-hour items, lunch-only specials, or seasonal products that stay in the catalog but are not always purchasable.

What this example includes

Request

Set availability.schedules on the product. Use the same weekly shape as menu schedules: exactly 7 day_of_week entries (mondaysunday), each with a periods array. Open periods use start_time / end_time; optional closed defaults to false; optional start_date / end_date bound a dated window. Use null when the product has no hour restriction. See Schedules.
product-special-schedule.json

Key points

  • Menu vs product schedules. The menu stays active all day. The beer is hidden outside 17:00–19:00 on weekdays even though the category and menu remain visible.
  • Full week required. Weekend days still appear with "periods": [] (closed all day). Partial weeks fail validation.
  • Categories can be scheduled too. Use categories[].availability.schedules when an entire section should appear only during certain hours.
  • Temporary unavailability. For one-off 86s, prefer availability.status: OUT_OF_STOCK with out_of_stock_until instead of rebuilding schedules.
  • Per-context overrides. To change product hours for one channel, store, fulfillment type, or composed menu without a full menu upsert, call Update product with ?store_id, ?channel_id, ?fulfillment_id, and/or ?menu_id, sending availability.schedules in the menu product body.

Menu sync — schedules

Menu, category, and product schedule levels

Multi-schedule menu

Two daypart menus in one upsert