-
Notifications
You must be signed in to change notification settings - Fork 293
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
Extend system_pricing_plans.json #252
Conversation
Addition of Core Pricing for new PR in response to Kristian's original proposal.
Co-authored-by: Sean Barbeau <sjbarbeau@gmail.com>
Co-authored-by: Sean Barbeau <sjbarbeau@gmail.com>
Something that I don't think could be reflected in this model is Gig's scheme where they have several different pricing schemes and charge you whichever one would result in the lowest total at the end of your rental: https://gigcarshare.com/rates/ |
Hi all! After the developers workshop and some individual stakeholder feedback - we now have a Pricing v2.1!. Some notable changes:
To note:
@jiffyclub to model Gig would require the use of GBFS-CapPricing which is in the Google Doc proposal but not this MVP, I've added Gig as an example in Section 7 of the document! |
Hi @josee-sabourin! This looks really good and it's clear, but I just realized that in our case we can have different For example, a plan could have a single
I don't know if it's only applicable to us or if other systems would have plans that are eligible for multiple vehicle types and where the trip fees (pricing per km or min) would be different based on the vehicle type used within a given plan. In this case, could we add the specific Or maybe I just missed something and there's an easier way to do this? |
Hi @sfaubert1 , you are correct you would need have separate plans for each vehicle type, this was chosen to avoid parsing errors of having multiple vehicle type ID's scattered in the same plan. I'm wondering what implications your suggestion would have on the consumer side, @kanagy, what are your thoughts on this? |
Hi @sfaubert1, in this case I think the clearest and easiest thing to do is to treat these as two separate plans in the feed (i.e. duplicate the plan, first plan charges 0.5 per hour, second plan charges 1 per hour). I also personally think of these as two different pricing schemes, each applying to different vehicle type. I would be against the suggestion of complicating the feed to reduce minor duplication (is that the goal?). The feed should be kept simple and a common denominator of different schemes (as long different schemes can be represented, we're good). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks pretty good, left some comments.
gbfs.md
Outdated
\- `plan_id` | Yes | ID | Identifier for a pricing plan in the system. | ||
\- `vehicle_type_id` | Optional | Array | `vehicle_type_id` of the vehicle eligible for this pricing plan as described in [vehicle_types.json](#vehicle_typesjson-added-in-v21-rc).<br /><br />If this field is empty, the plan applies to all vehicle types defined in the dataset.<br /><br />In the case of a vehicle type being attributed to different plans, all plans associated with the vehicle type are valid. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would love to hear community's opinion on two approaches here:
- The one defined here where a pricing plan references vehicle type feed via vehicle_type_id.
- One where vehicle type feed references pricing plan via plan_id (i.e. the opposite of 1). I personally slightly prefer this one (because existing plan_id in the spec can be reused for referencing).
As mentioned in a previous comment, now that #261 has passed, this proposal has been updated to reflect those changes. Now that each vehicle can be represented in
With that, I am hoping we can move to a vote for this proposal. I hereby call a vote on this proposal. Voting will be open for 7 full calendar days until 11:59PM UTC on October 6th, 2020. |
+1 from Google Maps. We don't have cycles to implement it in Q4, but we do already use a very similar and compatible format with Lime. |
+1 from Transit |
+1 from Populus, looks like it can cover many cases. Populus, though, does not have any current plans to integrate with this endpoint. |
+1 from IBI Group |
gbfs.md
Outdated
@@ -576,10 +578,83 @@ Field Name | Required | Type | Defines | |||
\- `url` | Optional | URL | URL where the customer can learn more about this pricing plan. | |||
\- `name` | Yes | String | Name of this pricing plan. | |||
\- `currency` | Yes | String | Currency used to pay the fare. <br /><br /> This pricing is in ISO 4217 code: http://en.wikipedia.org/wiki/ISO_4217 <br />(e.g. `CAD` for Canadian dollars, `EUR` for euros, or `JPY` for Japanese yen.) | |||
\- `price` | Yes | Non-negative float OR String | Fare price, in the unit specified by currency. If String, must be in decimal monetary value. | |||
\- `price` | Yes | Non-Negative float OR String | Fare price, in the unit specified by currency. If string must be in decimal monetary value. Note: v3.0 will only allow non-negative float, therefore future implementations must be non-negative float.<br /><br />In case of non-rate price, this field is the total price. In case of rate price, this field is the base price that is charged only once per trip (e.g., price for unlocking) in addition to `per_km_pricing` and/or `per_min_pricing`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For the description of price
, it could also be the base price that is charged to access the vehicles for a certain period of time (instead of being per trip). For example, a flat fee to have access to bikes for 24 hours, which is not charged per trip but once at the start of the 24h period, and then each trip can be charged per min or per km within these 24 hours.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Currently, this MVP is designed for modelling one-way trips, so passes are not easily modelled this way, however it can be done using two concurrent rates (one with an interval of 1440 minutes). We can add more specific language about price
acting as an unlock fee, and once this is in the spec we will be sure to add a handful of examples to show how it can be used in these various ways. Hope that helps!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK I see, thanks!
gbfs.md
Outdated
@@ -468,6 +469,7 @@ Field Name | Required | Type | Defines | |||
\- `vehicle_type_id` <br/>*(added in v2.1-RC)* | Conditionally Required | ID | The vehicle_type_id of this vehicle as described in [vehicle_types.json](#vehicle_typesjson-added-in-v21-rc). This field is required if the [vehicle_types.json](#vehicle_typesjson-added-in-v21-rc) is defined. | |||
\- `last_reported` <br/>*(added in v2.1-RC)* | Optional | Timestamp | The last time this vehicle reported its status to the operator's backend. | |||
\- `current_range_meters` <br/>*(added in v2.1-RC)* | Conditionally Required | Non-negative float | If the corresponding vehicle_type definition for this vehicle has a motor, then this field is required. This value represents the furthest distance in meters that the vehicle can travel without recharging or refueling with the vehicle's current charge or fuel. | |||
\- `pricing_plan_id` | Optional | ID | The `plan_id` of the pricing plan this vehicle is eligible for as described in [system_pricing_plans.json](#system_pricing_plans.json). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I understand that the pricing_plan_id
is at the vehicle type level (instead of the vehicle type at the pricing level) to allow for easier dynamic pricing based on location, but based on my comment from September 15th (about the same plan having different pricing based on the vehicle type), this would be confusing.
For example, if vehicle ABC is eligible for plan 123 with a certain per_min_princing
and vehicle XYZ is also eligible for plan 123 but with another per_min_princing
. Both ABC and XYZ vehicles would be linked to the same pricing_plan_id=123, but there would actually be 2 objects with plan_id
=123 in system_pricing_plans
including different per_min_princing
based on the vehicle type and no way to know which vehicle is linked to which of the plan_id
=123 objects in this case (without data manipulation).
I'm curious to know if we are the only ones with this particular case?
(FYI the "vehicle_type_id" is still in the system_pricing_plans.json
example)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This would effectively be two different pricing plans, and therefore would have two separate plan IDs, for example plan ID 123-ABC and plan ID 123-XYZ, the public name for these can be the same, but in the back end they are different. As a general rule of thumb, even if the public plan name is the same (ex: one-way), if the prices are different, they should be treated as separate plans with separate plan IDs.
Thanks for catching the example error! I'll make sure to fix that!
+1 from PBSC |
+1 from Lime |
The vote on this is now closed, and it passes! Votes in favor: No votes against. We'll be merging, creating v2.1RC2, and then we'll follow up with those of you who said you'd be implementing. v2.1RC2 will include the recently passed #261 in addition to #269 if it passes - the vote's open, so please chime in there, too! |
Hey folks, this PR is marked in README and other places as being in v2.1-RC2 (https://github.com/NABSA/gbfs/blob/master/README.md#read-the-spec--version-history), but it is not actually merged into that branch. https://github.com/NABSA/gbfs/blob/v2.1-RC/gbfs.md#system_pricing_plansjson doesn't contain the fields added in this PR. Should it be merged to v2.1-RC2 too? |
Hi Kristian, I believe you may be looking at the wrong tag (your link is to v2.1-RC), take a look here at v2.1-RC2: https://github.com/NABSA/gbfs/blob/v2.1-RC2/gbfs.md, let me know if that clarifies things! |
Wooops, my bad, thanks! |
Prepare for v2.1 release Updates README version history for v2.1 release Changes labels from v2.1-RC and v2.1-RC2 to v2.1 Moves #252 Extend system_pricing_plans to v2.2-RC
Prepare for v2.1 release Updates README version history for v2.1 release Changes labels from v2.1-RC and v2.1-RC2 to v2.1 Moves #252 Extend system_pricing_plans to v2.2-RC
Context
In October 2019 during the GBFS Developers' workshop, before the NABSA annual conference, Kristian (@kanagy) shared a proposal for enhancing pricing information in GBFS. Participants agreed that it was a promising "minimum viable proposal" (MVP), and Kristian (@kanagy) opened PR #194. The proposal was discussed again at MobilityData's Shared Mobility Workshop in Paris in December 2019, and participants agreed it was a good place to start. However, we have received very little producer input on the proposal, and we will need at least one producer to vote on the proposal and to implement it. Starting in 2020, the scope of GBFS has been expanding to be able to support carsharing, which ultimately complicated the needs of a minimum viable proposal for extending system_pricing_plans.
Pull Request
MobilityData drafted up a proposal to cover most existing use cases along with future carsharing use cases. We heard during initial conversations with stakeholders that it was overly complex and would be difficult to implement all at once. We've scaled it back to a minimum viable proposal, while still being able to support a handful of carsharing pricing schemes. This specific PR is representative of our MVP, the full proposal can be found here.
The specific changes in the MVP are:
day
,month
,start_time
, andend_time
of pricing plans) to allow for future trip planning.vehicle_type_id
to reflect the various pricing schemes that are available to certain vehicle types.surge_pricing
to support demand-driven pricing.Some of our open questions are:
Please let us know what you think of these open questions as well as general comments/questions/concerns!