-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Session extension to indicate membership inclusive classes #45
Comments
Really great idea! Potentially we could use membership type IDs as references here, so something like the below? This way a membership such as So within
And as a response to
(N.B. we probably need a whole new proposal for memberships, which includes potentialActions to allow them to be bookable natively. We also need to think about how they can be exposed as open data so they can be referenced from the main session feed.) |
One route might be to embed memberships in the feed itself as part of the event:
|
Spec will also need to cover those venues who do not wish to make their member rates public. Some venues will not be happy revealing grandfathered, exclusive, etc rates. In those cases, I think we can just leave "price" off the entry, as such:
|
As a general point of process, I think there's actually two aspects to this proposal:
I want to flag that the second aspect is currently out of scope for v1.0 of the booking API. This is based on the requirements and use cases we have agreed with the community. Suggest we continue to discuss the changes to the data model here, but noting that the initial changes may be to make this information available as open data before its supported in booking. |
Noting here some overlap with #60, where Also noting that schema.org's |
Also note an exact mapping between the
|
Further notes on this considering properties that should be included in a membership; we should consider including:
|
Also perhaps |
It would also be useful to investigate |
Another question is whether Similar requirement to |
To add further thoughts to this, the types of membership options seem to break out into two main categories:
Also it's become apparent that although some publishers want to specify membership options in detail, and provide the option to purchase these, other publishers might want to simply specify a "membership required" flag for an Event or Offer with a link to where to find out more information. Some properties that might be interesting to think about (see UserPaymentOption of Google Reserve):
|
Another two type of "membership" / booking constraints to consider:
Both of the above constraints could be satisfied by an additional property on the |
Further considerations as we move towards a concrete proposal:
This also mirrors what is described in Google Reserve: #45 (comment) For large leisure operators, there a large number of possible memberships available across their Places, within the same Seller. For smaller organisations, it is likely that a Seller will have only a limited number of memberships (that may still be limited to Places. A membership could be described in some detail, with a number of pricing options, and therefore the data object could be of a reasonable size. Describing MembershipsOption 1Embed memberships data in existing opportunity feeds Advantages
Disadvantages
Option 2A Sellers feed could be created that includes embedded membership data relating to each Seller. This also removes the need for Seller data to be included in every opportunity. There has been discussion during a larger implementation on the advantages of encouraging the use of a Seller feed, for the same reason that a Places feed is beneficial. Advantages
Disadvantages
Option 3A separate memberships feed could be created, which references the Sellers Advantages
Disadvantages
Option 4Memberships could be embedded in For reference, for this option, the proposal below would be adjusted with the below in place of the MembershipProduct feed example. Click here to expand{
"@type": "Place",
...
"eligibleMembershipProduct": [
{
"@type": "MembershipProduct",
"@id": "https://api.example.com/membership-products/1",
"name": "Off-Peak Fitness",
"description": "Unlimited access to the gym, fitness classes, swimming pool and select facilities at off-peak times",
"membershipProductType": "https://openactive.io/MembershipSubscription",
"offers": [
{
"@type": "Offer",
"price": 45,
"priceCurrency": "GBP",
"paymentFrequency": "http://openactive.io/ns#Monthly",
"url": "https://bookingsystem.example.com/membership/purchase/deep/link/4"
}
]
},
{
"@type": "MembershipProduct",
"@id": "https://api.example.com/membership-products/2",
"name": "Yoga Off-Peak 5 Session Pass",
"description": "5 yoga sessions at select facilities at off-peak times",
"membershipProductType": "https://openactive.io/MembershipPass",
"offers": [
{
"@type": "Offer",
"@id": "https://api.example.com/membership-products/2#/offers/1",
"price": 90,
"priceCurrency": "GBP",
"url": "https://bookingsystem.example.com/membership/purchase/deep/link/8"
}
]
},
{
"@type": "MembershipProduct",
"@id": "https://api.example.com/membership-products/3",
"name": "Family Membership",
"description": "The family membership entitles the whole household to book a court to play tennis for up to 1 hour a day, 5 times a week, all year round for a £55 fee.",
"membershipProductType": "https://openactive.io/MembershipPass",
"duration": "P12M",
"offers": [
{
"@type": "Offer",
"@id": "https://api.example.com/membership-products/3#/offers/1",
"price": 55,
"priceCurrency": "GBP",
"url": "https://bookingsystem.example.com/membership/purchase/deep/link/8"
}
]
},
{
"@type": "MembershipProduct",
"@id": "https://api.example.com/membership-products/4",
"name": "Junior Membership",
"description": "Our junior membership is available for free to individuals under 16 and will enable young people to book and play tennis for 1 hour a day 5 times a week. This includes juniors playing with an adult.",
"membershipProductType": "https://openactive.io/MembershipPass",
"duration": "P12M",
"ageRestriction": {
"@type": "QuantitativeValue",
"maxValue": 15
},
"offers": [
{
"@type": "Offer",
"@id": "https://api.example.com/membership-products/4#/offers/1",
"price": 0,
"url": "https://bookingsystem.example.com/membership/purchase/deep/link/8"
}
]
},
{
"@type": "MembershipProduct",
"@id": "https://api.example.com/membership-products/5",
"name": "Female Concession Fitness",
"description": "For females over 60 years of age. Unlimited access to the gym, fitness classes, swimming pool and select facilities at off-peak times",
"genderRestriction": "https://openactive.io/FemaleOnly",
"ageRestriction": {
"@type": "QuantitativeValue",
"minValue": 60
},
"membershipProductType": "https://openactive.io/MembershipSubscription",
"offers": [
{
"@type": "Offer",
"price": 25,
"priceCurrency": "GBP",
"paymentFrequency": "http://openactive.io/ns#Monthly",
"url": "https://bookingsystem.example.com/membership/purchase/deep/link/16"
}
]
}
]
} Advantages
Disadvantages
ProposalOption 3 appears to have the best balance of working for independent session operators, facilities-based venues, and large leisure operators. (However note that Option 2 or 4 might be more straightforward for smaller booking systems, so perhaps should be supported alongside or in place of Option 3. A consideration relating to this more pluralistic approach is that it creates additional complexity for Brokers that are aggregating across multiple Booking Systems - as they would need to dereference a Following on from the modelling discussion above, a membership can therefore be represented in a feed: {
"next": "https://www.example.com/api/rpde/membership-products?afterTimestamp=1521565719&afterId=1402CBP20150217",
"items": [
{
"state": "updated",
"kind": "MembershipProduct",
"id": "1402CBP20150217",
"modified": 1521565719,
"data": {
"@context": "https://openactive.io/",
"@type": "MembershipProduct",
"@id": "https://api.example.com/membership-products/1",
"name": "Off-Peak Fitness",
"description": "Unlimited access to the gym, fitness classes, swimming pool and select facilities at off-peak times",
"hostingOrganization": "https://api.example.com/sellers/1",
"membershipProductType": "https://openactive.io/MembershipSubscription",
"offers": [
{
"@type": "Offer",
"price": 45,
"priceCurrency": "GBP",
"paymentFrequency": "http://openactive.io/ns#Monthly",
"url": "https://bookingsystem.example.com/membership/purchase/deep/link/4"
}
]
}
},
{
"state": "updated",
"kind": "MembershipProduct",
"id": "1402CBP20150218",
"modified": 1521565719,
"data": {
"@context": "https://openactive.io/",
"@type": "MembershipProduct",
"@id": "https://api.example.com/membership-products/2",
"name": "Yoga Off-Peak 5 Session Pass",
"description": "5 yoga sessions at select facilities at off-peak times",
"hostingOrganization": "https://api.example.com/sellers/1",
"membershipProductType": "https://openactive.io/MembershipPass",
"offers": [
{
"@type": "Offer",
"@id": "https://api.example.com/membership-products/2#/offers/1",
"price": 90,
"priceCurrency": "GBP",
"url": "https://bookingsystem.example.com/membership/purchase/deep/link/8"
}
]
}
},
{
"state": "updated",
"kind": "MembershipProduct",
"id": "1402CBP20150219",
"modified": 1521565719,
"data": {
"@context": "https://openactive.io/",
"@type": "MembershipProduct",
"@id": "https://api.example.com/membership-products/3",
"name": "Family Membership",
"description": "The family membership entitles the whole household to book a court to play tennis for up to 1 hour a day, 5 times a week, all year round for a £55 fee.",
"hostingOrganization": "https://api.example.com/sellers/1",
"membershipProductType": "https://openactive.io/MembershipPass",
"duration": "P12M",
"offers": [
{
"@type": "Offer",
"@id": "https://api.example.com/membership-products/3#/offers/1",
"price": 55,
"priceCurrency": "GBP",
"url": "https://bookingsystem.example.com/membership/purchase/deep/link/8"
}
]
}
},
{
"state": "updated",
"kind": "MembershipProduct",
"id": "1402CBP20150220",
"modified": 1521565719,
"data": {
"@context": "https://openactive.io/",
"@type": "MembershipProduct",
"@id": "https://api.example.com/membership-products/4",
"name": "Junior Membership",
"description": "Our junior membership is available for free to individuals under 16 and will enable young people to book and play tennis for 1 hour a day 5 times a week. This includes juniors playing with an adult.",
"hostingOrganization": "https://api.example.com/sellers/1",
"membershipProductType": "https://openactive.io/MembershipPass",
"duration": "P12M",
"ageRestriction": {
"@type": "QuantitativeValue",
"maxValue": 15
},
"offers": [
{
"@type": "Offer",
"@id": "https://api.example.com/membership-products/4#/offers/1",
"price": 0,
"url": "https://bookingsystem.example.com/membership/purchase/deep/link/8"
}
]
}
},
{
"state": "updated",
"kind": "MembershipProduct",
"id": "1402CBP20150221",
"modified": 1521565719,
"data": {
"@context": "https://openactive.io/",
"@type": "MembershipProduct",
"@id": "https://api.example.com/membership-products/5",
"name": "Female Concession Fitness",
"description": "For females over 60 years of age. Unlimited access to the gym, fitness classes, swimming pool and select facilities at off-peak times",
"genderRestriction": "https://openactive.io/FemaleOnly",
"ageRestriction": {
"@type": "QuantitativeValue",
"minValue": 60
},
"hostingOrganization": "https://api.example.com/sellers/1",
"membershipProductType": "https://openactive.io/MembershipSubscription",
"offers": [
{
"@type": "Offer",
"price": 25,
"priceCurrency": "GBP",
"paymentFrequency": "http://openactive.io/ns#Monthly",
"url": "https://bookingsystem.example.com/membership/purchase/deep/link/16"
}
]
}
},
],
"license": "https://creativecommons.org/licenses/by/4.0/"
} The membership can also be referenced both within Places and opportunities to which it applies, such that it can be displayed when appropriate (for example as shown in the PDF flow attached here): {
"@type": "Places",
...
"eligibleMembershipProduct": [
"https://api.example.com/membership-products/3",
"https://api.example.com/membership-products/4"
],
...
} {
"@type": "SessionSeries",
...
"eligibleMembershipProduct": [
"https://api.example.com/membership-products/3",
"https://api.example.com/membership-products/4"
],
...
} {
"@type": "FacilityUse",
...
"eligibleMembershipProduct": [
"https://api.example.com/membership-products/3",
"https://api.example.com/membership-products/4"
],
...
} A broker would be expected to display the memberships only at the level that they are described in the data i.e.
A broker SHOULD NOT infer that a A membership with an Modelling notes
Booking activities using membership pricingProposalUsing the patterns already included in the Customer Accounts API, the existing use of
Getting current memberships of an authenticated Customer AccountWithin the Customer Account API, it is possible to surface the ProposalAdd an additional property
Other considerationsNote the above proposals assume that the purchase of a subscription Additionally it’s worth noting that if a particular As always, thoughts and feedback on all of the above very welcome! |
My concern is that we're getting to the point where we need a relatively large amount of feeds which all serve a single purpose of reducing data in the main feeds, but with data that doesn't actually have a high rate of churn (e.g. Sellers, Memberships Places etc.). I'm wondering if it would be easier from a broker/on-boarding perspective to have a single-feed (called something like
This would be harder to implement from a booking system perspective (although I can't see that it would be a huge difficulty), but enables adding future items into this feed without requiring onboarding between the Broker & Booking System. |
Which organisation(s) are proposing this issue?
Usecase
To enable membership options to be offered inline booking journey.
Please describe why your use case is not covered by the existing specification
Classes are not returned with a flag indicating which Memberships offer the class inclusive of the membership. Details of these Membership offers should be available elsewhere in the API.
What are you proposing should be changed in the specification?
Example
References
MemberShipFlow.pdf
The text was updated successfully, but these errors were encountered: