Summary
We, at Annex Cloud, are a leading software company specializing in delivering comprehensive customer loyalty solutions, referral marketing platforms, and customer retention tools. Our core offering, the Loyalty Experience Platform, is a robust cloud-based software suite designed to help businesses cultivate and nurture customer loyalty. Through our platform, companies can effectively manage loyalty programs, incentivize repeat purchases, and personalize customer experiences to foster long-term engagement and brand loyalty.
The integration of Annex Cloud loyalty with BazaarVoice provides a comprehensive solution for rewarding customers based on moderated reviews.
Annex Cloud retrieves the latest moderated data from BazaarVoice. When a customer purchases a product, they typically write a review on the retailer's website. This review data is sent to BazaarVoice using their available APIs, after which Annex Cloud pulls the moderated data from BazaarVoice.
Annex Cloud then validates customers' loyalty and awards points based on the approved moderated data.
Pre-requisites
- Client's conversation API key - To retrieve member data.
- Client's shared secret API key - To decrypt email addresses.
Configuration with Annex Cloud
Site Administrator Instructions:
- Enable the Ratings and Review action.
- Navigate to the Actions section.
- Select Create new Action.
- From the list of available actions, choose Ratings and Reviews.
- Enter the number of points that members will earn for completing this action.
- Save the advanced settings.
Configuration in Bazaarvoice Admin
You need to follow the following process before sending the members' data to the Annex Cloud database to award points.
- Log in to BazaarVoice’s instance.
- Select the Workbench option from the menu, as shown below:
- Choose one of the two available options from the drop-down list: annexcloud (STAGING) or annexcloud (PRODUCTION).
- Navigate through the instance to check the Dashboards, Reports, Alerts, and Resources. The administrator can create and manage reports, analyze content trends, and view key performance indicators. Below is an image of what BazaarVoice's staging environment looks like:
- To manage content, click the Content tab and select Ratings & Reviews in the Manage Content section.
- After clicking on Ratings & Reviews, all members' ratings and reviews will be displayed as illustrated in the image below.
- The administrator has the option to approve or reject each review. Additionally, the administrator can respond to the review and, if needed, email the review to multiple stakeholders.
- The administrator can view a member's review in detail by clicking the Show Detail icon, as shown in the image below.
- The image below shows the review selected above in detail.
Annex Cloud Configuration to Pull the Moderated Data
- You can use this method to retrieve members' data from the Bazaarvoice conversation API by providing the following details:
- API Endpoint - https://stg.api.bazaarvoice.com/data/reviews.json?apiversion=5.4
- API Key – XXXXXXXXXXXXX (Provided by Annex Cloud)
- Method - GET
- Response - Once you execute the API, the following responses are retrieved:
{
"Limit": 10,
"Offset": 0,
"Total Results": 68,
"Locale": "en_US",
"Results": [
{
"Id": "46082471",
"CID": "173ba849-6e4a-5d9a-b76f-fdbef8c81af6",
"SourceClient": "test-annexcloud",
"LastModeratedTime": "2023-04-04T11:00:02.000+00:00",
"LastModificationTime": "2023-04-04T11:00:02.000+00:00",
"ProductId": "demo-product-1",
"AuthorId": "me439vw65lljz6fdkvmfrwotf",
"ContentLocale": "en_US",
"IsFeatured": false,
"TotalInappropriateFeedbackCount": 0,
"TotalClientResponseCount": 0,
"TotalCommentCount": 0,
"Rating": 5,
"IsRatingsOnly": true,
"TotalFeedbackCount": 0,
"TotalNegativeFeedbackCount": 0,
"TotalPositiveFeedbackCount": 0,
"ModerationStatus": "APPROVED",
"SubmissionId": "r210553_1__16806059bEVJERkpKo",
"SubmissionTime": "2023-04-04T10:58:36.000+00:00",
"UserNickname": "jimmy sinek",
"UserEmailAddress": "0eGkCOLTAjRxwM38N8Qg/p7Z7ruhbxjJfcQKxzURlHs=",
"ReviewText": null,
"SecondaryRatingsOrder": [],
"AdditionalFields": {},
"Badges": {},
"Photos": [],
"InappropriateFeedbackList": [],
"ProductRecommendationIds": [],
"ContextDataValues": {},
"Pros": null,
"SecondaryRatings": {},
"UserLocation": null,
"CommentIds": [],
"IsSyndicated": false,
"AdditionalFieldsOrder": [],
"CampaignId": null,
"Title": null,
"ContextDataValuesOrder": [],
"Helpfulness": null,
"TagDimensions": {},
"RatingRange": 5,
"BadgesOrder": [],
"IsRecommended": null,
"ClientResponses": [],
"Cons": null,
"TagDimensionsOrder": [],
"Videos": []
}
]
}
- The following conditions must be set to take the data:
- ModerationStatus = APPROVED (Equal To)
- LastModeratedTime != TodaysDate (Not Equal To)
Only data with an approved moderation status will be retrieved.
- After applying the conditions mentioned above, extract the encoded email from the filtered data. Use the client decryption code to decode it and verify whether the member’s email address is opted in. If the customer is not opted in, their data cannot be retrieved.
API to Retrieve Member details
This API method is used to fetch all the information for a loyalty member by passing the unique ID of the member.
- Method- GET: /users/{{memberId}}
- Function Location In Extension- ANNEXCLOUDV3SERVICE
Response:
Upon providing the unique member ID in the request body, the following parameters will be displayed in the response:
| Field | Type | Description | Example |
|---|---|---|---|
| id | string | Displays the unique ID of the loyalty member. | jacklee2023 |
| string | Displays the email address of the loyalty member. |
jacklee2023@gmail.com |
|
| firstName | string | Displays the first name of the loyalty member. | John |
| lastName | string | Displays the last name of the loyalty member. | Deo |
| zipCode | string | Displays the zip code of the loyalty member's residence. | 51750 |
| optInStatus | string |
Displays the opt-in status as YES for opt-in or NO for opt-out. The default opt-in status is YES. |
YES |
| status | string |
Displays the loyalty member’s status as active or inactive. By default, it is active and can be changed to inactive as per the client’s request. |
ACTIVE |
| phone | string | Displays the phone number of the loyalty member. | 123-123-4567 |
| birthDate | string | Displays the date of birth of the loyalty member in yyyy-MM-dd format. | 1989-12-11 |
| anniversaryDate | string | Displays the loyalty member's anniversary date, which can be their birthdate, the date they joined the loyalty program or marriage date in yyyy-MM-dd format. | 2023-12-11 |
| userProfileImageUrl | string | Displays the image URL for the loyalty member's profile picture. |
https://www.socialannex.com/public/manageoptionsdesign16/images/product_landing/loyalty-hover.png |
| createDate | string | Displays the date and time in yyyy-MM-dd’T’HH:mm:ssZ format on which the loyalty member was created. | 2021-08-08 07:00:12 |
| updateDate | string | Displays the date and time in yyyy-MM-dd’T’HH:mm:ssZ format on which the loyalty member was updated. | 2022-08-08 07:00:12 |
| totalSpendCurrency | integer | Displays the total currency spent by the loyalty member. | 134 |
| extendedAttribute | object | Displays the extended user attributes that are established in your program configuration. | User role, location, and uid. |
Sample Positive Response:
| Status code | Response |
|---|---|
| 200 |
An example of a positive response is: { "id": "user@domain.com", "email": "user@domain.com", "firstName": "John", "lastName": "Doe", "zipCode": "90002", "optInStatus": "YES", "status": "ACTIVE", "phone": "123-123-4567", "birthDate": "2018-04-01T00:00:00-0700", "anniversaryDate": "2018-04-01T00:00:00-0700", "userProfileImageUrl": "https://www.socialannex.com/public/manageoptionsdesign16/images/product_landing/loyalty-hover.png", "createDate": "2018-04-01T00:00:00-0700", "updateDate": "2018-04-01T00:00:00-0700", "totalSpendCurrency": "150", "extendedAttribute": ["KEY1": "VALUE1", "KEY2": "VALUE2"] } |
- ErrorCode: This attribute is shown only when an API request fails and indicates the type of error that occurred during the request.
- ErrorMessage: When an API request fails, this attribute explains the reason for the failure, providing more information about the error.
Sample Error Response:
| Status code | Response |
|---|---|
| AC1002 / AC1005 |
{ "errorCode": "AC1002", "errorMessage": "Request Not Authorized" } If Data is not found!! { "errorCode": "AC1005", "errorMessage": "No data found" } |
Process to Award Points to Members
If a member is found in the above API, points are awarded to them using the APIs listed below.
- API- https://s15.socialannex.net/api/3.0/points
- Method- POST
- Request Object- Not Blank
- Function Location in Extension- ANNEXCLOUDV3SERVICE
| Method | URL |
|---|---|
| POST | /points |
To Award Points
| Field | Type | Presence | Description | Example |
|---|---|---|---|---|
| id | string | Required | Enter the unique ID for the member. |
johan19.sa@gmail.com |
| actionId | string | Required | Enter the unique action ID of the action for which points are being awarded to the member. For example, the action ID for manual credit is 100. | 100 |
| activity | string | Required | Enter credit in the activity field to indicate that the points are awarded to the member’s account. | credit |
| credit | integer | Required | Enter the number of points credited to the member’s account for performing the action. | 435 |
| campaignId | integer | Optional | Enter the campaign ID of the campaign associated with the points. (The campaign ID needs to be entered only if the points being awarded are associated with campaign benefits.) | 12345 |
| orderId | string | Optional | Enter the loyalty member's order ID. | A12345 |
| reason | string | Optional | Enter the reason for crediting points to the member’s account. | bonus |
To Redeem Rewards
| id | string | Required | Enter the unique ID for the member. |
johan19.sa@gmail.com |
| rewardId | string | Required | Enter the specific reward ID that the member wants to claim or redeem. The reward should be configured in the site admin. | 121 |
| activity | string | Required | Enter debit in the activity field to indicate that the member is redeeming their points. | debit |
| orderId | string | Optional | Enter the loyalty member's order ID. | A12345 |
| reason | string | Optional | Enter the reason for deducting points from the member’s account. | points redeemed for discount |
| source | string | Optional | Enter the source from where the member performed the transaction. For example, Web or App. | web |
To Redeem Custom Points
| Field | Type | Presence | Description | Example |
|---|---|---|---|---|
| id | string | Required | Enter the unique ID for the member. |
johan19.sa@gmail.com |
| activity | string | Required | Enter debit in the activity field to indicate that the member is redeeming their custom points. | debit |
| orderId | string | Optional | Enter the loyalty member's order ID. | A12345 |
| debit | integer | Required | Enter the number of points debited from the member’s account for redeeming custom points by performing the redemption action. | 121 |
| reason | string | Optional | Enter the reason for removing points from the member’s account to redeem custom points. | custom points redeemed for discount |
| source | string | Optional | Enter the source from where the member performed the transaction. For example, Web or App. | web |
To Award or Deduct Custom Points from a member’s account.
Custom points are not predefined in the system; instead, they are set and managed based on specific member-defined criteria or rules. These points can be awarded or deducted according to custom parameters.
| Field | Type | Presence | Description | Example |
|---|---|---|---|---|
| id | string | Required | Enter the unique ID for the member. |
johan19.sa@gmail.com |
| actionId | string | Required | Enter the unique action ID for which you are awarding or deducting custom points for the member. For example, the action ID for manual credit or debit is 100. | 100 |
| activity | string | Required | Enter the name of the action to either award or deduct custom points. In this case, the action name is either credit (if awarding) or debit (if deducting). | credit or debit |
| orderId | string | Optional |
Enter the loyalty member's order ID. In order to associate points with an activity involving both credit and debit, the member’s order ID needs to be entered. |
A12345 |
| credit or debit | integer | Required | Enter the number of custom points that will be credited to the member’s account or debited from the member’s account. | 435 |
| reason | string | Optional | Enter the reason for awarding custom points to the member’s account or deducting custom points from the member’s account. | bonus |
Sample Request:
Response:
This provides a successful response detailing the points added or redeemed from the member's account.
| id | string | Displays the unique ID of the member. |
johan19.sa@gmail.com |
| actionId | integer | Displays the unique action ID of the action for which the member is being awarded points. | 100 |
| activity | string | Displays credit when points are awarded to the member’s account. | credit |
| credit | integer | Displays the number of points credited into the member’s account for performing the action. | 50 |
| pointsAwarded | integer | Displays the number of points awarded to the member’s account for performing the action. | 50 |
| reason | string | Displays the reason for awarding points to the member’s account. | bonus |
| updatedUserTier | string | Displays the member’s updated tier after the points are awarded to the member’s account. | gold |
| updatedAvailablePoints | integer | Displays the updated number of available points in the member’s account after points have been awarded. | 4545 |
| updatedLifetimePoints | integer | Displays the updated total number of points the member has earned in their lifetime with the loyalty program after points have been awarded. | 7860 |
To give points:
{
"id": "user@domain.com",
"actionId": "100",
"activity": "CREDIT",
"reason": "aj Bonus"
"credit": "50"
}
To redeem points:
{
"id": "user@domain.com",
"rewardId": "111",
"activity": "DEBIT",
"orderId": "OD001",
"reason": "claim"
"source": "web"
}
To redeem custom points:
{
"id": "user@domain.com",
"activity": "DEBIT",
"orderId": "OD001",
"debit": "500",
"reason": "used for purchase"
"source": "web"
}
To award custom points:
{
"id": "user@domain.com",
"actionId": "100",
"activity": "CREDIT",
"credit": "50",
"reason": "bonus"
}
To deduct custom points:
{
"id": "user@domain.com",
"actionId": "100",
"activity": "DEBIT",
"orderId": "OD001",
"debit": "50",
"reason": "adjustment"
}Response:
| Status code | Response |
|---|---|
| 200 |
To Award Points: { "id": "johan28.sa@gmial.com", "actionId": 100, "activity": "CREDIT", "credit": 50, "pointsAwarded": 50, "reason": "aj Bonus", "updatedUserTier": "Gold", "updatedAvailablePoints": "7561", "updatedLifetimePoints": "7561" } To Redeem Points: { "id": "user@domain.com", "rewardId": "111", "activity": "DEBIT", "orderId": "OD001", "debit": "500", "reason": "claim", "updatedUserTier": "Gold", "updatedAvailablePoints": "4545", "updatedLifetimePoints": "7860" } To Redeem Custom Points: { "id": "user@domain.com", "activity": "DEBIT", "orderId": "OD001", "debit": "500", "reason": "used for purchase", "updatedUserTier": "Gold", "updatedAvailablePoints": "4545", "updatedLifetimePoints": "7860" } To Award Custom Points: { "id": "user@domain.com", "actionId": "100", "activity": "CREDIT", "credit": "50", "reason":"bonus", "updatedUserTier": "Gold", "updatedAvailablePoints": "4545", "updatedLifetimePoints": "7860" } To Deduct Custom Points: { "id": "user@domain.com", "actionId": "100", "activity": "DEBIT", "orderId": "OD001", "debit": "50", "reason":"adjustment", "updatedUserTier": "Gold", "updatedAvailablePoints": "4545", "updatedLifetimePoints": "7860" } |
Sample Error Response:
| Status code | Response |
|---|---|
| AC1002 |
{ "errorCode": "AC1002", "errorMessage": "Request Not Authorized" } |
Functional Flow Diagram
