Pricing model
tickets_configuration defines the possible ticket types available for booking.
Under tickets_configurations, there are two layers:
- first layer is
sectionsof ticket types - second layer is ticket types under each section
Under each section, there are:
-
itemscontains the lists of ticket types available under this section. For each item, there are:maxis the max number of this ticket type selectable for passengertitleis the displayed ticket type when making bookingsubtitleis a subtitle next to the title of the displayed ticket type when making bookingdescriptionis a descriptive text of the demand typeticket_typedefines the name of this type- *Note: this is the key used in the rules section below
require_driver_verification
-
titledefines the display of the section title in each language -
section_constraintsdefines some section level constraints. Currently we support:total_minimum_demand: the minimum number of total demand selected in this section that allows the booking to proceed. (A booking is invalid if the number of demand across all ticket types under this section is lower than this number.)rulesdefines how the price will be calculated for each demand type.
-
For each demand type, these are the fields:
demand_limitNumber of demand covered by the base price- *Note: demand refers to number of tickets of this type in booking
- **Note: base price is a concept that will be explained in a lower section
intial_priceBase price when demand is less thandemand_limitdistance_coefficientAdditional price per km of air distanceextensionsCovers all the discounts and surcharges that are at demand type level-
There might be many
extensions, and eachextensionwill define a potentialsurge/discountfor price for the demand type. -
Currently, we only support extensions by
stop_idtype\{
"type": "stop_id",
"surcharge": 0,
"exact_price": 0,
"pickup_stop_ids": [],
"discount_percent": 0,
"dropoff_stop_ids": []
\}typedefines the type of extension this issurchargedefines the additional surcharge to be applied to the demand typeexact pricedefines a value that overwrites the price of the demand type if this extension takes effect- overwrites
air priceto 0, and set the value tosurge
- overwrites
discount_percentdefines a percentage of discount that will be applied onto (price + surge)- if
type = stop_id, if passenger makes a booking withpreferred_pickup_stop_idorpreferred_dropoff_stop_idinsidepickup_stop_idsordropoff_stop_ids, this extension will take effect.- *Note:
preferred_pickup_stop_idorpreferred_dropoff_stop_idare selected if passenger select via blue dots on PA currently
- *Note:
-
- Concept base payables is calculated by:
- concept air price: rounding(
initial_price+ air_distance / 1000 *distance_coefficient)- *Note: rounding here will be explained in the routing strategy section below
- + any surcharges calculated from
extensions - - any discounts calculated from
extensions
- concept air price: rounding(
demand_additional_pricedefines how price works when demand exceedsdemand_limit- concept: additional demand is (number of tickets for this type -
demand_limit) coefficient:coefficienttimes of base payables to be charged for each additional demandfixed_amount: a fixed amount to be charged for each additional demand
- concept: additional demand is (number of tickets for this type -
-
Total price per demand type =
- air price +
- surges from extensions +
- (demand -
demand_limit) * (base payables *demand_additional_price.coefficient+demand_additional_price.fixed_amount)
-
Total discount per demand type =
- discounts from extensions +
- discounts from payment methods
- *Note: discounts from payment methods will be explained in later section
-
Total payable per demand type =
- Total price - Total discount
variability defines whether the price based on request will change upon receiving offer. There are two values supported:
exactmeans that the price will not change upon receiving offer (this is always recommended as this is assumed in our UI flows at the momentapproximatemeans that the price can change upon receiving offer
currency defines the currency of the price
format defines the display of price
format_localized defines the display of the price by language
rounding_strategy defines the behaviour when rounding price, with:
minimal_unitdefines the minimal unit in the calculated price. Currently we support:cent- the price is in cent (e.g. if price = 100, it means 100 cent)integer- the price is in unit concept (e.g. if price = 100, it means 100 units, in Singapore’s case it means 100 dollars)
round_todefines the digit that we will round the price to. Currently we support:cent- round to the closest cent- *Note: only works if if
minimal_unit = cent - *Note: skipped if
minimal_unit = cent
- *Note: only works if if
tencent- round to the closest cent- *Note: only works if if
minimal_unit = cent
- *Note: only works if if
one- round to the closet unit- *Note: skipped if
minimal_unit = integer
- *Note: skipped if
ten- round to the closet ten
round_functionround- round off - find the closet qualifiable numberfloor- round down - find the closest smaller qualifiable numberceil- round up - find the closest larger qualifiable number
rounding_strategy_help contains all the options available for rouding_startegy
**cancellation_terms and fail_to_board_terms are implemented in pricing but not integrated with the cancellation and fail_to_board actions yet. - need to work on it when needed.
payment_method_configuration defines the list of payment methods selectable by passengers when making bookings via passenger application.
- Under each payment method, there are two features:
payment_providerpayment_method_type
- The options are defined in payment method schema https://sgerp.d.gcprod.swatrider.com/api/v2/paymentmethod/schema
- Currently, we support these options:
- Cash:
payment_provider = internalandpayment_method_type = cash - Credit Card:
payment_provider = stripeandpayment_method_type = card
- Cash:
payment_method_configuration_operator defines the list of payment methods selectable by operators when making bookings via operator interface.
- Details are the same as the above section of
payment_method_configuration
options object
cancellation_terms object
fail_to_board_terms object
format_localized object
payment_method_configuration object[]
payment_method_configuration_operator object[]
rounding_strategy object
rounding_strategy_help object
rules object
baby object
demand_additional_price object
extensions object[]
passenger object
demand_additional_price object
extensions object[]
passenger_child object
demand_additional_price object
extensions object[]
stroller object
demand_additional_price object
extensions object[]
wheelchair object
demand_additional_price object
extensions object[]
wheelchair_baby object
demand_additional_price object
extensions object[]
wheelchair_child object
demand_additional_price object
extensions object[]
tickets_configuration object[]
items object[]
description object
subtitle object
title object
section_constraints object
title object
Creation timestamp of an object
id object
Identifier of the object
- integer
- uuid
Can be integer
Can be UUID
Last modification timestampo of the object
URI of the object instance
{
"name": "string",
"options": {
"cancellation_terms": {
"grace_period": 0,
"penalty": 0
},
"currency": "string",
"fail_to_board_terms": {
"grace_period": 0,
"penalty": 0
},
"format": "string",
"format_help": "string",
"format_localized": {
"en": "string",
"ja": "string"
},
"payment_method_configuration": [
{
"payment_method_type": "string",
"payment_provider": "string"
}
],
"payment_method_configuration_operator": [
{
"payment_method_type": "string",
"payment_provider": "string"
}
],
"rounding_strategy": {
"minimal_unit": "string",
"round_function": "string",
"round_to": "string"
},
"rounding_strategy_help": {
"minimal_unit": [
"string"
],
"round_function": [
"string"
],
"round_to": [
"string"
]
},
"rules": {
"baby": {
"demand_additional_price": {
"coefficient": 0,
"fixed_amount": 0
},
"demand_limit": 0,
"demand_limit_help": "string",
"distance_coefficient": 0,
"distance_coefficient_help": "string",
"extensions": [
{
"discount_percent": 0,
"dropoff_stop_ids": [
{}
],
"exact_price": 0,
"pickup_stop_ids": [
{}
],
"surcharge": 0,
"type": "string"
}
],
"initial_price": 0,
"initial_price_help": "string"
},
"passenger": {
"demand_additional_price": {
"coefficient": 0,
"fixed_amount": 0
},
"demand_limit": 0,
"demand_limit_help": "string",
"distance_coefficient": 0,
"distance_coefficient_help": "string",
"extensions": [
{
"discount_percent": 0,
"dropoff_stop_ids": [
0
],
"exact_price": 0,
"pickup_stop_ids": [
0
],
"surcharge": 0,
"type": "string"
}
],
"initial_price": 0,
"initial_price_help": "string"
},
"passenger_child": {
"demand_additional_price": {
"coefficient": 0,
"fixed_amount": 0
},
"demand_limit": 0,
"demand_limit_help": "string",
"distance_coefficient": 0,
"distance_coefficient_help": "string",
"extensions": [
{
"discount_percent": 0,
"dropoff_stop_ids": [
{}
],
"exact_price": 0,
"pickup_stop_ids": [
{}
],
"surcharge": 0,
"type": "string"
}
],
"initial_price": 0,
"initial_price_help": "string"
},
"stroller": {
"demand_additional_price": {
"coefficient": 0,
"fixed_amount": 0
},
"demand_limit": 0,
"demand_limit_help": "string",
"distance_coefficient": 0,
"distance_coefficient_help": "string",
"extensions": [
{
"discount_percent": 0,
"dropoff_stop_ids": [
{}
],
"exact_price": 0,
"pickup_stop_ids": [
{}
],
"surcharge": 0,
"type": "string"
}
],
"initial_price": 0,
"initial_price_help": "string"
},
"wheelchair": {
"demand_additional_price": {
"coefficient": 0,
"fixed_amount": 0
},
"demand_limit": 0,
"demand_limit_help": "string",
"distance_coefficient": 0,
"distance_coefficient_help": "string",
"extensions": [
{
"discount_percent": 0,
"dropoff_stop_ids": [
{}
],
"exact_price": 0,
"pickup_stop_ids": [
{}
],
"surcharge": 0,
"type": "string"
}
],
"initial_price": 0,
"initial_price_help": "string"
},
"wheelchair_baby": {
"demand_additional_price": {
"coefficient": 0,
"fixed_amount": 0
},
"demand_limit": 0,
"demand_limit_help": "string",
"distance_coefficient": 0,
"distance_coefficient_help": "string",
"extensions": [
{
"discount_percent": 0,
"dropoff_stop_ids": [
{}
],
"exact_price": 0,
"pickup_stop_ids": [
{}
],
"surcharge": 0,
"type": "string"
}
],
"initial_price": 0,
"initial_price_help": "string"
},
"wheelchair_child": {
"demand_additional_price": {
"coefficient": 0,
"fixed_amount": 0
},
"demand_limit": 0,
"demand_limit_help": "string",
"distance_coefficient": 0,
"distance_coefficient_help": "string",
"extensions": [
{
"discount_percent": 0,
"dropoff_stop_ids": [
{}
],
"exact_price": 0,
"pickup_stop_ids": [
{}
],
"surcharge": 0,
"type": "string"
}
],
"initial_price": 0,
"initial_price_help": "string"
}
},
"tickets_configuration": [
{
"items": [
{
"description": {
"en": "string",
"ja": "string"
},
"max": 0,
"require_driver_verification": true,
"subtitle": {
"en": "string",
"jp": "string",
"ja": "string"
},
"ticket_type": "string",
"title": {
"en": "string",
"ja": "string"
}
}
],
"section_constraints": {
"total_minimum_demand": 0
},
"title": {
"en": "string",
"ja": "string"
}
}
],
"variability": "string"
},
"project": "string",
"strategy": "string",
"created_at": "2024-07-29T15:51:28.071Z",
"id": 0,
"modified_at": "2024-07-29T15:51:28.071Z",
"resource_uri": "string"
}