Zonal
Zonal (https://www.zonal.co.uk/) is a hospitality POS platform that provides a host of services to hospitality businesses.
Eagle Eye has been integrated with Zonal for a long time, with simple token-based "Verify" and "Redeem" capabilities managed through Campaign Manager (An EagleEye offer management addition to Zonal). As a POS platform used by multiple Food and Beverage merchants, having an integration to Zonal allows the bringing together of these capabilities to work together easily with little configuration effort.
To deepen the capabilities that exist between AIR and Zonal, an EagleEye Connects integration has been created to work with the AIR Smart Checkout capabilities. These capabilities allow retailers to define an offer in a single location (the loyalty platform) and apply it in the Zonal platform without the need for any build work to be completed.
Functional Capabilities
The capabilities below are stated in terms of the Zonal Standard Loyalty APIs. These APIs enable AIR to offer functionality to its loyalty members.
Functionality | Description |
|---|---|
Registration | Retailers can offer their customers the ability to sign up to the loyalty platform directly from the POS. This capability creates a wallet in AIR and (if configured) creates a set of initial offers in the customer wallet ready to use. This API Calls the AIR Services Walelt Create API. It will:
|
Balance Check | A retailer can query a customers loyalty account to check the balances of any accounts as well as any available instant rewards to which the customer is entitled and can select to apply to the current ticket. This call returns any accounts in the customer's wallet from Manual campaigns. The POS Reference for these accounts is returned to the POS allowing customers to choose how and what rewards they wish to apply to their account. |
Assign Loyalty Account | Allow a customer to add their loyalty card to the POS Account meaning any rewards in the customers wallet are returned to the POS platform ready for them to use. This action will also adjudicate the basket in AIR and store the results meaning any points based rewards will be calculated ready to be settled when the account is closed. Note: The POS is unaware of the loyalty points but the customer will receive their reward points in AIR ready to be used. This call translates into an AIR POS Connect Wallet Open call. Any rewards calculated in AIR will be returned to Zonal to apply.
|
Unassign Loyalty Account | Allow a customer to remove their loyalty account from the ticket in Zonal. This will call the AIR POS Connect Unlock endpoint in AIR to remove the locks placed on accounts. |
Redeem Rewards | Any available instant rewards in the customer's wallet will be returned to the POS in either the Assign Loyalty Account or Balance Check APIs. These rewards are redeemed via this capability. Rewards redeemed in this way will create a new Wallet Transaction in AIR independent of the Loyalty Redemption Journey. The value of the redemption is determined entirely by Zonal. |
Unredeem Rewards | If a reward is redeemed incorrectly this capability allows the retailer to undo the redemption and make the reward available to the customer again. This call finds the previous redemption of rewards and undoes the redemption putting the reward back in the customer's wallet ready for the next usage. |
Update ticket | Allow a Zonal ticket to be updated and the changes in the ticket items pushed to AIR to re-adjudicate the basket. The output of this functionality will update the Zonal ticket by removing any rewards which are no longer valid, update the value of variable value rewards and add any newly applied rewards. It's vital that the Update Ticket call is made prior to uploading a ticket as the last state of the account is settled. Upon the upload call, the customer has already paid and closed the account so no further adjustments can be made at this time. |
Upload Ticket | Upon completing the transaction, the account is uploaded to AIR. This triggers a call to the AIR POS Connect Wallet Settle of the transaction in AIR awarding any points and redeeming any coupons previously awarded.
|
VouchersThe capabilities of this integration tie into the Zonal Standard Loyalty APIs and does not use their Standard Vouchering capabilities. Zonal's Standard Vouchering functionality is already supported through Campaign Manager, which is a mature, stable integration that handles token-based voucher verification and redemption effectively. Since Campaign Manager already provides comprehensive voucher management capabilities and existing merchants rely on this functionality, we maintain this established integration path rather than duplicating the same voucher capabilities in the new EagleEye Connects integration. This allows merchants to benefit from both the proven voucher functionality via Campaign Manager and the enhanced loyalty features through the new integration.
Modes of Operation
The integration can be setup to deliver offers to members in two ways.
- Automatically triggered rewards that are applied automatically by the Zonal POS as a result of calling to Assign a Loyalty Account or Update the Ticket
- Triggered Promotions that allows a POS User to select the available rewards from a list returned on the "Balance Check" call.
These two modes of operation are described below.
Automatically Triggered Rewards
These offers in AIR are regular campaigns that POS Connect can adjudicate. They can be both discount and points based offers. On both the Assign Loyalty Account and Update Ticket calls the Integration translates the Zonal ticket into a POS Connect wallet open request with the "adjudicateBasket" and "adjustBasket" flags set to true. The resulting response is then translated back to a Zonal discount either at the Basket (Zonal Account) or Basket contents (Zonal Ticket Item) level.
Redemption Channel
By default, if no value is provided on the configuration of the integration, the redemptionChannel of "zonal" is sent in to AIR allowing offers to be setup to target POS offers differently than digital offers (order at table for example).
POS Applied Offers
Where there are offers setup on the Zonal POS (3 for 2 on Main meals for example), the integration has the ability to either allow offer stacking or not on items. If the relevant configuration is set to true, the item that has already got a discount applied to it, is set to be ignored by AIR in adjudication.
If the configuration is set to false and it already has a discount, the AIR applied discount is stacked on top of the Zonal POS supplied offer.
Triggered Promotions
This mode of operation allows a customer to setup an offer in the Zonal platform with a specific Promotion ID or Triggered Product ID. A manual campaign in AIR can be setup with that identifier linked. That promotion can then be targeted to customers wallets for instant redemption at the retailers outlet.
Points based coupons can be used in AIR if the below configuration is set to support points offers. The POS will not have visibility of these offers playing in the transaction but they will be applied in AIR.
The same applies for Continuity and Bounceback offers. These will apply in AIR when the Upload Ticket request comes into AIR when the account is closed in the Zonal Platform.
AIR Reward Configuration
For simple offers for which the POS is adjudicating and calculating the reward, these are identified to the POS using a Promotion Id. In AIR this type of offer is setup using the "Manual" campaign type. This offer holds no information about qualification and reward other than the stored PromoId.
If no Zonal custom form is added to the campaign, the offer will be tested as a "Product Triggered" reward in Zonal and the display text of the offer will be picked up from the campaign "Name" field.

Manual Campaign General Tab
The value entered in the "Name" field in AIR will be surfaced on the POS (if no Zonal custom form is added) as the name of the reward for the customer and printed on the customer's receipt.

Manual Campaign Creation Tab
On the creation tab, setup the rules around the lifespan of the accounts and to which redemption partner this reward will be available (see above regarding the parentIncomingIdentifier configuration item).

Manual Campaign Reward Tab
On the Reward tab of the offer, enter the Promotion ID as created in the POS platform.
If added, the Zonal custom form will look like the below.
As a json campaign structure, the above will appear on the campaign:
{
"custom": {
"zonal": {
"displayText": "Voucher 20% off food",
"rewardType": "productTriggered"
}
}
}{
"custom": {
"zonal": {
"displayText": "Voucher 20% off food",
"rewardType": "discount"
}
}
}Configuration
To setup this integration, a connector needs to be created in the AIR platform. This connector will give the EagleEye Connects connector the information it requires to operate. The required configuration details are as below:
Field Name | Data Type | Description |
|---|---|---|
schemeId | Optional: String | The ID of the scheme in AIR to add to a customer's wallet on registration. If not set, no points account will be added to the wallet |
adjustBasket | Required: Boolean | If set to true, discount based offers will be adjudicated when the loyalty Account is assigned to the account in Zonal |
adjudicateBasket | Rrequired: Boolean | If set to true, points based offers will be adjudicated when the loyalty Account is assigned to the account in Zonal |
external_key | Required: String | This is the "username" to be entered in the Zonal platform used to authenticate to the connector service |
password | Required: String | This is the "password" to be entered in the Zonal platform used to authenticate the connector service |
parentIncomingIdentifier | Required: String | This allows the user authenticating to specify it's "Banner" as defined in AIR. For example, a chain of pubs might have one called "My Amazing Pub Chain". The value entered here will represent this pub chain. This allows offers to be targeted to a specific banner. |
redemptionChannel | Optional: String | The channel to use in the call to AIR for full basket adjudication. If not provided, the value defaults to |
preventOfferStacking | Optional: Boolean | If set to If set to If no value is provided, the value defaults to |
posUserIdsToIgnore | Optional: Array | A list of Zonal posUserId's to ignore. If a call is made to "upload ticket" with an ignored user Id the request returns a "successful" response but takes no action in AIR. |
Once the connector in AIR is created, a URL will be provided which is to be entered into the Zonal platform. This URL will look something like:
The combination of the unique URL and authentication details is all that is required to establish the connection.
Default Configurations
The connector has a set of default configurations that can be overridden in the connection specific setup. These are detailed below:
| Field Name | Default Value | Description |
|---|---|---|
| walletType | CONSUMER | When registering using the on POS Registration capabilities, this identifies the Wallet type to create in AIR. The default value aligns to the AIR Standard Configurations. |
| householdWalletType | null | If the unit in AIR utilises Householding, this field identifies the name of the Household Wallet type to create. If no value is provided, no household wallet will be created upon registration. Householding is an additional "plugin" capability of AIR and is not a standard for all retailers. |
| identityType | CUSTOMER_ID | This specifies the type of identity to create in AIR when a customer registers via the POS. The default value aligns with the AIR Standard configurations. |
| initialOffersTag | InitialOffers | Upon Registration, any offers with this tag will be added to the customer's Wallet. This provides them with a set of initial offers to be able to use straight away after registration. The default value aligns to the standardised way of using this capability in AIR. |
AIR Configuration Requirements
This plug-in is dependent on the following wallet configurations.
| Config Item | Value | Notes |
|---|---|---|
| Wallet Transaction Type | SETTLE | Used to hold the redemptions and POS settle journeys |
| Wallet Transaction Type | VOID | Used to encompass the unredeeming of rewards |
To use full basket adjudication and points offers, a POS config is required to be set on the unit being integrated. There are no specific requirements for this POS journey.
Integration Flows
The below integration flows are supported in this integration. The diagrams show the interactions between the Zonal platform, the EagleEye Connects layer and the AIR platform.
Assign Loyalty Account
This journey allows a customer to have their loyalty card added to the transaction in the Zonal POS. This will trigger a call into AIR to retrieve the rewards in a customer's wallet and return them to the POS.
Balance Check
Based on a loyaltyId (Identity in an AIR wallet) the rewards in a customer's wallet is returned. This check also pulls back the balances of the assosicated points accounts and any stored value accounts. These details are printed on the receipt.
Redeem Reward
The redeem reward journey completes the redemption of accounts in AIR based on the request to redeem a reward. The redeem is wrapped in a wallet transaction using the ID passed from Zonal as the transaction reference. This reference is later required to support the unredeem/reversal flow.
Un-redeem Reward
The unredeem journey reverses the redemption of a reward previously redeemed by the above process. A new wallet transaction of type VOID is created to hold the account transactions.
Upload Ticket
The uploading of a ticket takes the previously applied ticket and makes the request into AIR to Settle the transaction. Any calculated points, continuity, bounceback and zero reward coupons are redeemed in this step.
Integration DeepeningAs we work more with Zonal, this integration will be getting deepend to make use of all the AIR offer types and auto rewarding of offers on the Zonal POS.
Updated about 4 hours ago
To see more information about the flows involved in this integration see the below three AIR APIs:
- Wallet Open API: https://developer.eagleeye.com/eagleeye-developer/reference/openwallet#/
- Wallet Settle API: https://developer.eagleeye.com/eagleeye-developer/reference/settletransaction#/
- Services Wallet Create API: https://developer.eagleeye.com/eagleeye-developer/reference/createwalletaccountservice#/
For more information about the Zonal Standard Loyalty APIs, please reach out to Zonal directly for access to their documentation.
