Deals
Deals allow for special pricing and free items to be offered to users as they shop. Throughout the Connect order endpoints, deals are automatically suggested as an order gets close to qualifying for a certain deal, and are applied automatically when the order qualifies for it.
There are two methods for using in Connect:
- show deals to customers first, before they add items to their order
- let customers add items to their order first, and then suggest deals as applicable
Note: The examples on this page have been truncated for brevity.
Supported deals
Deals Feature | Feature Description | Supported |
---|---|---|
Season passes | Admission to multiple sessions | ✓ |
Volume discount | Buy 1 item for $2, 2 for $3.50, 3 for $5, etc | ✓ |
Minimum spend deal | Spend $X to unlock a deal | ✓ |
Price reduction to a different item | Buy one, get one half price | ✓ |
Price reduction to an additional item | Buy one, get one half price and another item at a discount | ✓ |
Offering discounted item as a deal | If an item has a discount, choose to offer it as a deal or not | ✓ |
Item price off deal | Get a free small popcorn with an optional upgrade for discounted price | ✓ |
Deals exclusive to vouchers | Deals only available with a valid voucher | ✓ |
Deals exclusive to loyalty recognition | Deals only available with a loyalty recognition | ✓ |
Credit card deals | Deals only available with a certain credit card brand | ✓ |
Deal triggers | Configurable triggers for suggesting deals | ✗ |
Worse deals | Selecting a worse deal than the deal automatically selected by Connect | ✗ |
Double dealing | Applying more than one deal to a single item | ✗ |
View deals first
Deals can be viewed via the OData Get Deals endpoint.
GET: /OData.svc/Deals?$format=json
Response:
{
"odata.metadata": "https://abccinemas.com/WSVistaWebClient/OData.svc/$metadata#Deals",
"value": [
{
"ID": "0000000006",
"Description": "Sweet Treats",
"ExtendedDescription": "Buy a ticket and get a choc top half price",
"RequiresVoucher": false,
"RequiresLoyalty": false,
"IsSeasonPass": false,
"IsTicketUpgrade": false,
"LimitPerOrder": null,
"Priority": 1,
"CinemaIds": [
"0002"
],
"SalesChannels": [
"CALL",
"WWW",
"POS",
]
},
{
"ID": "0000000008",
"Description": "Date Night Deal",
"ExtendedDescription": "Buy one Adult ticket and get a second for cheap",
"RequiresVoucher": false,
"RequiresLoyalty": false,
"IsSeasonPass": false,
"IsTicketUpgrade": false,
"LimitPerOrder": null,
"Priority": 1,
"CinemaIds": [
"0002"
],
"SalesChannels": [
"CALL",
"WWW",
"POS",
]
}
]
}
The specific items required to qualify for a deal can then be retrieved via the GetDealItems endpoint.
GET: /RESTTicketing.svc/cinemas//deal/
Response:
{
"ExtendedResultCode": 0,
"DealDefinitionId": "0000000008",
"DealGroups": [
{
"Id": 5,
"Description": "First ticket",
"AcceptanceCriteria": {
"QuantityRange": {
"MinimumRequired": 1,
"MaximumAvailable": 1
},
"MinimumSpend": null,
"ForEachValueSpent": null
},
"Components": {
"Tickets": [
{
"DiscountType": 0,
"DiscountValue": 0,
"TicketTypeCode": "0022",
"FilmCode": null,
"FormatCode": null,
"OrderedQuantity": 0
}
],
"Concessions": []
},
"MatchingMovies": [
{
"Id": "HO00000004",
"Name": "The Notebook",
"HOCode": "A000000006",
"HOPK": "HO00000004",
"Sessions": [
{
"Id": "4452",
"StartTime": "2018-03-13T17:20:00.000"
},
{
"Id": "4456",
"StartTime": "2018-03-14T17:00:00.000"
}
]
},
{
"Id": "HO00000005",
"Name": "Love Actually",
"HOCode": "A000000008",
"HOPK": "HO00000005",
"Sessions": [
{
"Id": "4450",
"StartTime": "2018-03-13T12:05:00.000"
},
{
"Id": "4454",
"StartTime": "2018-03-14T11:45:00.000"
}
]
}
],
"MatchingConcessions": []
},
{
"Id": 6,
"Description": "Discounted ticket",
"AcceptanceCriteria": {
"QuantityRange": {
"MinimumRequired": 1,
"MaximumAvailable": 1
},
"MinimumSpend": null,
"ForEachValueSpent": null
},
"Components": {
"Tickets": [
{
"DiscountType": 1,
"DiscountValue": 10,
"TicketTypeCode": "0022",
"FilmCode": null,
"FormatCode": null,
"OrderedQuantity": 0
}
],
"Concessions": []
},
"MatchingMovies": [
{
"Id": "HO00000004",
"Name": "The Notebook",
"HOCode": "A000000006",
"HOPK": "HO00000004",
"Sessions": [
{
"Id": "4452",
"StartTime": "2018-03-13T17:20:00.000"
},
{
"Id": "4456",
"StartTime": "2018-03-14T17:00:00.000"
}
]
},
{
"Id": "HO00000005",
"Name": "Love Actually",
"HOCode": "A000000008",
"HOPK": "HO00000005",
"Sessions": [
{
"Id": "4450",
"StartTime": "2018-03-13T12:05:00.000"
},
{
"Id": "4454",
"StartTime": "2018-03-14T11:45:00.000"
}
]
}
],
"MatchingConcessions": []
}
],
"Result": 0,
"ErrorDescription": null
}
This endpoint returns all information regarding how the deal is triggered, and what discounts are offered.
DealGroups
contains lists of items which are either required to qualify for the deal or are discounted as part of the deal.AcceptanceCriteria
details how many items from the list have to be or can be purchased, and optionally how much must be spent on these items or how much will trigger an incremental deal.Components
details the items that are included in the deal group.MatchingMovies
shows the films and sessions the tickets inComponents
may be purchased for to qualify for the deal. Tickets may be restricted to certain films, certain movie formats (for example, 3D only), or to certain price cards (for example, Wednesday pricing only).MatchingConcessions
shows the concessions inComponents
that may be purchased to qualify for the deal. A certain class of concessions may qualify for the deal and theMatchingConcessions
field will include all concessions belonging to this class.
The items specified in the GetDealItems response can then be added to the order through the standard order tickets flow and order concessions flow.
Suggested deals
As tickets and concessions are added to an order, Connect will check for available deals. This can lead to one of the following scenarios:
- The order only needs a single item to qualify for a deal. In this case, Connect will 'suggest' the deal (return the deal in the response).
POST: /orders//sessions//set-tickets
Response:
{
"order": {
"cinemaId": "0002",
"userSessionId": "d8047d81457b425b89716faa9aac60e9",
"orderTotalValueInCents": 2325,
"taxValueInCents": 321,
"bookingFeeTotalValueInCents": 375,
"bookingFeeTaxValueInCents": 52,
"sessions": [
{
"id": 4452,
"filmTitle": "The Notebook",
"filmClassification": "M",
"startTime": "2018-03-13T17:20:00+12:00",
"allocatedSeating": true,
"tickets": [
{
"ticketDetails": {
"ticketId": 1,
"ticketTypeCode": "0022",
"description": "Adult",
"finalPriceInCents": 1950,
"originalPriceInCents": 1950,
"taxInCents": 269,
"dealDefinitionId": null,
"dealDescription": null,
"dealSequence": null,
}
}
]
}
]
},
"suggestedDeals": [
{
"id": "0000000008",
"description": "Date Night Deal",
"isSeasonPass": false,
"isTicketUpgrade": false,
"limitPerOrder": null,
"requiresLoyalty": false,
"requiresVoucher": false
},
{
"id": "0000000006",
"description": "Sweet Treats",
"isSeasonPass": false,
"isTicketUpgrade": false,
"limitPerOrder": null,
"requiresLoyalty": false,
"requiresVoucher": false
}
]
}
- The order qualifies for a deal. In this case, Connect will apply the deal that saves the most money for the customer, and return the order with an updated deal price.
POST: /orders//sessions//set-tickets
Response:
{
"order": {
"cinemaId": "0002",
"userSessionId": "d8047d81457b425b89716faa9aac60e9",
"orderTotalValueInCents": 3450,
"taxValueInCents": 476,
"bookingFeeTotalValueInCents": 500,
"bookingFeeTaxValueInCents": 69,
"sessions": [
{
"id": 4452,
"filmTitle": "The Notebook",
"startTime": "2018-03-13T17:20:00+12:00",
"tickets": [
{
"ticketDetails": {
"ticketId": 1,
"ticketTypeCode": "0022",
"description": "Adult",
"finalPriceInCents": 1950,
"originalPriceInCents": 1950,
"taxInCents": 269,
"dealDefinitionId": "0000000008",
"dealDescription": "Date Night Deal",
"dealSequence": 1
}
},
{
"ticketDetails": {
"ticketId": 2,
"ticketTypeCode": "0022",
"description": "Adult",
"finalPriceInCents": 1000,
"originalPriceInCents": 1950,
"taxInCents": 138,
"dealDefinitionId": "0000000008",
"dealDescription": "Date Night Deal",
"dealSequence": 1
}
}
]
}
]
}
}
Deals and suggestions are recalculated when items are removed from the order.
If you want to get suggested deals for a specific set of tickets and concessions before adding them to an order (for example, if you hold a virtual order in your app rather than calling Connect on every new item), then the GetDealSuggestions endpoint can be used.
POST: /RESTTicketing.svc/dealsuggestions
Request:
{
"CinemaId": "0002",
"Sessions": [
{
"SessionId": 4452,
"TicketTypes": [
{
"TicketTypeCode": "0022",
"Quantity": 1
}
]
}
]
}
Response:
{
"ExtendedResultCode": 0,
"CinemaId": "0002",
"Concessions": [],
"Sessions": [
{
"SessionId": 4460,
"TicketTypes": [
{
"TicketTypeCode": "0022",
"Description": "Adult",
"IsPackage": false,
"ChildTickets": null,
"ChildConcessions": null,
"PriceEachCents": 1950,
"DealPriceCents": 1950,
"DealDefinitionId": null,
"DealDescription": null
}
]
}
],
"SuggestedDeals": [
{
"Id": "0000000006",
"Description": "Sweet Treats",
"IsSeasonPass": false,
"IsTicketUpgrade": false,
"LimitPerOrder": null,
"RequiresLoyalty": false,
"RequiresVoucher": false
},
{
"Id": "0000000008",
"Description": "Date Night Deal",
"IsSeasonPass": false,
"IsTicketUpgrade": false,
"LimitPerOrder": null,
"RequiresLoyalty": false,
"RequiresVoucher": false
}
],
"Result": 0,
"ErrorDescription": null
}
Loyalty recognition deals
Loyalty recognition deals are supported within Connect. However, the following criteria need to be met before Connect can suggest or apply this kind of deal:
- A loyalty member must be logged in
- The loyalty member has to be eligible for the recognition. This means the recognition has to be available to the member, and the member must have enough points to redeem the recognition
- The deal can only be applied as many times as the member can afford the points cost, or as many times as the recognition is limited per order
Voucher deals
This requires Vista Vouchers and Gift Cards 4.5.8 or above
Deals exclusive to a voucher are supported within Connect. The voucher must be configured as a miscellaneous voucher, and the deal should be configured to be exclusive to this voucher.
To apply the deal, call the ApplyDealVoucher endpoint with the userSessionId
of your order, specifying the barcode
of the voucher and the ID of the deal to be applied.
Note that the items for the deal must still be added to the order separately, applying the voucher only enables the deal to be applied.
POST: /orders//deal-voucher
{
"barcode": "DV0010000001",
"dealDefinitionId": "0000000032"
}
To determine what deals are available for a voucher, call the GetVoucherDetails endpoint with the barcode of the voucher.
GET: /vouchers/
Response:
{
"id": "DV0010000001",
"code": "DV001",
"typeName": "Deal voucher",
"miscellaneousRedemptions": {
"available": 1,
"deals": [
{
"id": "0000000032",
"cinemaIds": ["0001", "0002", "0003"],
"description": "Deal exclusive to voucher"
}
]
},
"status": "Issued",
}