ProductDate¶
A ProductDate represents a specific offering of a Product on a particular date. Each ProductDate is associated with a single Product, and inherits properties from the parent Product while also allowing for overrides at the ProductDate level. This allows for flexible management of offerings that may have different availability, reservation policies, booking policies, fee policies, or change policies on different dates.
ProductDates as System Governance Modules¶
ProductDates are where the system enforces time-dependent rules and policies that govern how users can interact with offerings on specific dates. For each date that a Product is offered, the corresponding ProductDate captures specifically how that offering will behave on that date. This includes:
- When the specific date of the offering is discoverable to users
- When the specific date of the offering can be reserved by users
- If the date is the user's arrival date, when they can check in
- If the date is the user's departure date, when they can check out
- If the date is the user's arrival date, when the cutoffs for making or changing/cancellations to reservations are
- If the date is the user's arrival date, when the cutoff before no-shows is
- When the specific date of the offering incurs a booking restriction and changes are permanently disallowed
- The estimated availability for booking on that date
- The specific assets allocated for that date
Properties¶
ProductDate¶
| property | type | description | derived from | evaluated when |
|---|---|---|---|---|
pk |
String | Partition key | productDate::collectionId::activityType::activityId::productId |
Searching for all ProductDates related to a specific Product. |
sk |
String | Sort key | date |
Searching for a specific ProductDate related to a specific Product (disambiguated by date) |
gsipk |
String | Global secondary index partition key | Reserved | Reserved |
gsisk |
String | Global secondary index sort key | Reserved | Reserved |
schema |
String | Data type/Schema | "productDate" | Identifying that this item is a "productDate" |
globalId |
String | Globally unique UUID | Automatically generating on ProductDate POST | Searching for this specific item using the globalId GSI |
collectionId |
String | The identifier of the collection this ProductDate belongs to | Parent Product's collectionId |
Determining which collection this ProductDate belongs to |
activityType |
String | The identifier of the activity type this ProductDate belongs to | Parent Product's activityType |
Determining which activity type this ProductDate belongs to |
activityId |
String | The identifier of the activity this ProductDate belongs to | Parent Product's activityId |
Determining which activity this ProductDate belongs to |
productId |
Number | The unique identifier of the parent Product | Parent Product's productId |
Determining which specific Product within the collectionId that this ProductDate refers to |
date |
Date | Calendar date uniquely identifying this ProductDate from other ProductDates with the same partition key | Automatically generating on ProductDate POST | Distinguishing this ProductDate from other ProductDates with the same partition key |
displayName? |
String | A human-readable name for this ProductDate. | Administrators on PUT/POST | Providing a human-readable title of the offering captured by this ProductDate (likely administrator facing) |
description? |
String | Descriptive text explaining the operational meaning of this ProductDate | Administrators on PUT/POST | Providing a human-readable description of the offering captured by this ProductDate (may be used to explain how policies on this date differ from the parent Product) |
availabilitySignal |
PrimaryKey | A reference to an AvailabilitySignal object containing an eventually-consistent estimate of the availability for booking on this date. | Determined inherently from parent Product | Providing a reference to an item containing estimate of availability for display to users or for internal planning |
allDatesBookedIntervalIds? |
[String] | An array of DateInterval IDs representing periods of time where a Booking must contain all DateInterval dates if one date touches the DateInterval | Parent Product | Determining if a booking of this ProductDate must contain all dates within any of the defined date intervals if one of the dates in the booking touches any of the dates in the date interval |
assetList |
[AssetRef] | A list of assetRefs allocated for this ProductDate. | Derived from parent Product's assetList or overridden by administrators on PUT/POST |
Determining which assetRefs are allocated through this offering on this specific date, potentially overriding the parent Product's assetList. |
reservationPolicy |
ProductDateReservationPolicyRef | Reference to the reservation policy that governs reservations of this ProductDate. | Inherited from parent Product or overridden by administrators on PUT/POST | Determining which reservation policy applies to reservations of this ProductDate, potentially overriding the parent Product's reservationPolicy. |
feePolicy |
ProductDateFeePolicyRef | Reference to the fee policy that governs fees applied to bookings of this ProductDate. | Inherited from parent Product or overridden by administrators on PUT/POST | Determining which fee policy applies to bookings of this ProductDate, potentially overriding the parent Product's feePolicy. |
creationDate |
String | ISO 8601 timestamp of when this item was created | Administrators on POST | Determining when this item was created |
lastUpdated |
String | ISO 8601 timestamp of when this item was last updated | Administrators on PUT/POST | Determining when this item was last updated |
version |
Number | Version number for optimistic locking | Automatically incremented on PUT/POST | Ensuring that updates to this item do not overwrite more recent changes made by other processes |
AvailabilityEstimate¶
| property | type | description | derived from | evaluated when |
|---|---|---|---|---|
availabilitySignalVersion |
Number | The version number of the availability signal used to generate this estimate. | Copied from the latest version of the AvailabilitySignal when updated | Tracking which version of the availability signal was used to generate this estimate, which can be used to compare and determine when availability may have changed |
type |
String | The type of availability estimate (e.g., "exact", "tiered") | Derived from the estimationMode in the parent Product's availabilityEstimationPattern |
Determining how to interpret the availability estimate for this ProductDate |
value |
Number or String | The value of the availability estimate, which could be a number (e.g., count of available items) or a string (e.g., "high", "medium", "low") depending on the type |
Calculated based on the estimationMode and the logic defined in the availability estimation process |
Providing an estimate of availability for this ProductDate that can be used for display to users or for internal planning |
lastUpdated |
DateTime | The timestamp of when this availability estimate was last updated. | Automatically set when the availability estimate is recalculated | Tracking the freshness of the availability estimate for this ProductDate |
ProductDateReservationPolicyRef¶
A ProductDateReservationPolicyRef defines a reference to a reservation policy that governs how reservations are made for this particular ProductDate. A ProductDateReservationPolicyRef will fully resolve rules that apply at the ProductDate level.
The related ReservationPolicy is exclusively applied to this ProductDate when enforcing reservation rules. Therefore, the primary key of the ReservationPolicy can be inferred.
| property | type | description | derived from | evaluated when |
|---|---|---|---|---|
isDiscoverable |
Boolean | Indicates whether this ProductDate is discoverable by users. | Administrators on PUT/POST | Determining if this ProductDate should be visible to users during the booking process. |
isReservable |
Boolean | Indicates whether this ProductDate can be reserved by users. | Administrators on PUT/POST | Determining if users are allowed to make reservations for this ProductDate. |
minDailyInventory |
Number | The minimum daily inventory that must be claimed by a user to initialize a Booking | Administrators on PUT/POST | Enforcing minimum inventory requirements for reservations on this ProductDate. |
maxDailyInventory |
Number | The maximum daily inventory that can be claimed by a user to initialize a Booking | Administrators on PUT/POST | Enforcing maximum inventory limits for reservations on this ProductDate. |
temporalWindows |
ProductDateReservationTemporalWindows | The temporal windows that govern when reservations can be made for this ProductDate. | Administrators on PUT/POST | Enforcing time-based rules for when reservations can be made for this ProductDate. |
temporalAnchors |
ProductDateReservationTemporalAnchors | The temporal anchors that define key time points for reservation rules on this ProductDate. | Administrators on PUT/POST | Determining the reference points for time-based reservation rules for this ProductDate. |
ProductDateReservationTemporalWindows¶
| property | type | description | derived from | evaluated when |
|---|---|---|---|---|
discoveryWindow |
ResolvedTemporalWindow | The temporal window during which this ProductDate is discoverable by users. | Administrators on PUT/POST | Enforcing the time period when this ProductDate is visible to users. |
reservationWindow |
ResolvedTemporalWindow | The temporal window during which reservations can be made for this ProductDate. | Administrators on PUT/POST | Enforcing the time period when reservations can be made for this ProductDate. |
restrictedBookingWindow |
ResolvedTemporalWindow | The temporal window during which reservations for this ProductDate incur a booking restriction and changes are permanently disallowed. | Administrators on PUT/POST | Enforcing the time period when reservations for this ProductDate cannot be changed. |
ProductDateReservationTemporalAnchors¶
A resolved temporal anchor is functionally equivalent to a specific timestamp, but is derived from dynamic inputs such as the check-in time of a reservation. This allows for more flexible and context-aware booking rules that can adapt based on the specifics of each reservation.
| property | type | description | derived from | evaluated when |
|---|---|---|---|---|
checkInAnchor |
TimeStamp | The temporal anchor defining the check-in time for this ProductDate. | Administrators on PUT/POST | Establishing the check-in time reference for arrivals on this ProductDate. |
checkOutAnchor |
TimeStamp | The temporal anchor defining the check-out time for this ProductDate. | Administrators on PUT/POST | Establishing the check-out time reference for departures on this ProductDate. |
noShowAnchor |
TimeStamp | The temporal anchor defining the time after which a reservation for this ProductDate is considered a no-show. | Administrators on PUT/POST | Establishing the reference time for determining no-shows for arrivals this ProductDate. |
ProductDatePartyPolicyRef¶
A ProductDatePartyPolicyRef defines a reference to a party policy that governs how parties are managed for this particular ProductDate. A ProductDatePartyPolicyRef will fully resolve rules that apply at the ProductDate level.
The related PartyPolicy is exclusively applied to this ProductDate when enforcing party rules. Therefore, the primary key of the PartyPolicy can be inferred.
| property | type | description | derived from | evaluated when |
|---|---|---|---|---|
partyCompositionRules |
PartyCompositionRules | The rules governing what types of party members/equipment can be included in a booking and what the minimum and maximum value for each type of party member/equipment is for this ProductDate. | Administrators on PUT/POST | Determining the rules for how parties can be composed for bookings of this ProductDate. |
ProductDateFeePolicyRef¶
A ProductDateFeePolicyRef defines a reference to a fee policy that governs how fees are applied to bookings of this particular ProductDate. A ProductDateFeePolicyRef will fully resolve rules that apply at the ProductDate level.
The related FeePolicy is exclusively applied to this ProductDate when enforcing fee rules. Therefore, the primary key of the FeePolicy can be inferred.
LineItems only need to be present on the ProductDate if the system is to provide a ProductDate-level fee estimate prior to booking. Otherwise, they can remain on the exclusive FeePolicy to be resolved at reservation time.
| property | type | description | derived from | evaluated when |
|---|---|---|---|---|
feeSchedule |
[FeeDefinition] | The fee schedule that defines how fees are calculated for reservations of this ProductDate. | Administrators on PUT/POST | Determining the fee structure and amounts that apply to bookings of this ProductDate. |
lineItems |
[LineItem] | The line items that define specific fee calculations for this ProductDate. | Administrators on PUT/POST | Defining how fees are calculated and applied to bookings of this ProductDate. |
ProductDateChangePolicyRef¶
A ProductDateChangePolicyRef defines a reference to a change policy that governs how changes/refunds are handled for this particular ProductDate. A ProductDateChangePolicyRef will fully resolve rules that apply at the ProductDate level.
The related ChangePolicy is exclusively applied to this ProductDate when enforcing change/refund rules. Therefore, the primary key of the ChangePolicy can be inferred.
| property | type | description | derived from | evaluated when |
|---|---|---|---|---|
temporalWindows |
ProductDateChangeTemporalWindows | The temporal windows that govern when changes/refunds can be made for this ProductDate. | Administrators on PUT/POST | Enforcing time-based rules for when changes/refunds can be made for this ProductDate. |
ProductDateChangeTemporalWindows¶
| property | type | description | derived from | evaluated when |
|---|---|---|---|---|
changeWindow |
ResolvedTemporalWindow | The temporal window during which changes/refunds can be made for this ProductDate. | Administrators on PUT/POST | Enforcing the time period when changes/refunds can be made for this ProductDate. |
cancellationWindow |
ResolvedTemporalWindow | The temporal window during which changes/refunds can be made for this ProductDate. | Administrators on PUT/POST | Enforcing the time period when changes/refunds can be made for this ProductDate. |
{
"pk": "productDate::mockPark1::backcountryCamp::1:1",
"sk": "2026-02-09",
"gsi1pk": "",
"gsi1sk": "",
"schema": "productDate",
"globalId": "c7e8b2e3-4f2a-4b8a-9d3a-8a1e5f7c2b6d",
"collectionId": "mockPark1",
"activityType": "backcountryCamp",
"activityId": "1",
"productId": "1",
"date": "2026-02-09",
"displayName": "Mock Backcountry Camping Offering for Mock Park 1 on February 9, 2026",
"description": "Mock backcountry camping reservation for Mock Park 1 on February 9, 2026.",
"availabilitySignal": {
"pk": "availabilitySignal::mockPark1::backcountryCamp::1:1",
"sk": "2026-02-09"
},
"allDatesBookedIntervalIds": [],
"assetList": [
{
"primaryKey": {
"pk": "asset::mockPark1::campground::1",
"sk": "campsite::1"
},
"allocationType": "fixed",
"quantity": 1
},
{
"primaryKey": {
"pk": "asset::mockPark1::campground::1",
"sk": "campsite::2"
},
"allocationType": "fixed",
"quantity": 1
},
{
"primaryKey": {
"pk": "asset::mockPark1::campground::1",
"sk": "campsite::3"
},
"allocationType": "fixed",
"quantity": 1
}
],
"reservationPolicy": {
"isDiscoverable": true,
"isReservable": true,
"minDailyInventory": 1,
"maxDailyInventory": 1,
"temporalAnchors": {
"checkInAnchor": "2026-02-09T14:00:00-08:00",
"checkOutAnchor": "2026-02-10T11:00:00-08:00",
"noShowAnchor": "2026-02-09T23:59:59-08:00"
},
"temporalWindows": {
"discoveryWindow": {
"open": "2026-01-01T07:00:00-08:00",
"close": "2026-12-31T23:59:59-08:00"
},
"reservationWindow": {
"open": "2026-01-26T07:00:00-08:00",
"close": "2026-02-08T23:59:59-08:00"
},
"restrictedBookingWindow": {
"open": "2026-01-26T07:00:00-08:00",
"close": "2026-01-27T07:00:00-08:00"
}
}
},
"reservationContext": {
"discoveryWindow": {
"open": "2026-01-01T07:00:00-08:00",
"close": "2026-12-31T23:59:59-08:00"
},
"reservationWindow": {
"open": "2026-01-26T07:00:00-08:00",
"close": "2026-02-08T23:59:59-08:00"
},
"restrictedBookingWindow": {
"open": "2026-01-26T07:00:00-08:00",
"close": "2026-01-27T07:00:00-08:00"
},
"productDate": "2026-02-09",
"checkInAnchor": "2026-02-09T14:00:00-08:00",
"checkOutAnchor": "2026-02-10T11:00:00-08:00",
"noShowAnchor": "2026-02-09T23:59:59-08:00"
},
"feePolicy": {
"feeSchedule": [
{
"id": "tentpadFee",
"label": "Nightly Tent Pad Reservation Fee",
"type": "unit",
"amount": 15
},
{
"id": "perAdultFee",
"label": "Nightly Adult Fee",
"type": "unit",
"amount": 10
},
{
"id": "perChildFee",
"label": "Nightly Child Fee",
"type": "unit",
"amount": 5
},
{
"id": "tax",
"label": "tax",
"type": "percentage",
"amount": 0.05
}
]
},
"lineItems": [
{
"id": "tentPadLineItem",
"label": "Tent Pad Fee",
"type": "unit",
"if": [],
"quantity": {
"type": "ref",
"value": "inventory.quantity"
},
"rate": {
"type": "ref",
"value": "feeSchedule.tentpadFee"
},
"taxApplied": [
{
"type": "ref",
"value": "feeSchedule.tax"
}
],
"discountsApplied": [],
"isReturnable": true
},
{
"id": "perAdultLineItem",
"label": "Per Adult Fee",
"type": "unit",
"if": [],
"quantity": {
"type": "ref",
"value": "partyContext.adults"
},
"rate": {
"type": "ref",
"value": "feeSchedule.perAdultFee"
},
"taxApplied": [
{
"type": "ref",
"value": "feeSchedule.tax"
}
],
"discountsApplied": [],
"isReturnable": true
},
{
"id": "perChildLineItem",
"label": "Per Child Fee",
"type": "unit",
"if": [],
"quantity": {
"type": "ref",
"value": "partyContext.children"
},
"rate": {
"type": "ref",
"value": "feeSchedule.perChildFee"
},
"taxApplied": [
{
"type": "ref",
"value": "feeSchedule.tax.amount"
}
],
"discountsApplied": [],
"isReturnable": true
}
],
"creationDate": "2026-01-01T12:00:00-08:00",
"lastUpdated": "2026-01-01T12:00:00-08:00",
"version": 1
}