Event feed reporting
Overview
The Event feed service was created to meet the requirements of customers who require more control over the time and format of shopper events occurring within their stores to allow for a more flexible and scalable integration with back-office systems such as Point of Sale and ERP. The Event feed service is targeting three types of events, 1)Ordering, 2) Payment and 3) Shopper.
The Event feed solution guide is applicable for all retail integration models supported by Amazon Just Walkout services.
Prerequisites
The following are the prerequisites to enable retailers to take advantage of the Event feed solution.
AWS EventBridge: the sample solution depends on AWS EventBridge service to receive events from the Amazon systems. You will also need to have permissions to create, update AWS EventBridge resources and IAM roles and policies.
Just Walk Out Store: the Event feed solution uses cart event data generated in an operational Just Walk Out store.
AWS account: An AWS account is required to utilize the Event feed solution. For steps on how to get an AWS account follow steps here.
Common use cases
Below are some sample use cases to enable most flexibility and provides easy access to data across multiple merchant accounts and Just Walk Out stores. Select the most applicable use case for your company based on your reporting need and technical solution complexity.
Stage incoming cart data on an S3: this approach works best for customers that have already invested in mechanisms to ingest reporting data from an S3 or a file mount. This allows you to control the frequency of generating the event file to you need as well as doing schema translation to match your reporting intake process.
Store incoming cart data into a document database: this approach allows you to pass the incoming cart data to a data store, in this case a document database to enable use cases such as available inventory in a store in near time and alerting to reaching a threshold Pipe the incoming event into a destination API: this use case allows you to pass the payload to an API endpoint you might have. EventBridge supports most common authorization mechanisms to provide maximum flexibility. Note: there are additional integration options so please consult the EventBridge documentation for more detailed use cases.
High level event flow
A shopper will complete their trip at an Amazon Just Walkout store. As soon as the shopping trip ends, Amazon will complete the validation process and send the event to the process in Figure 1
1- The EventBridge service in the Amazon system will use a pre-configured EventBus endpoint to deliver the cart data. For steps on how to onboard to the Amazon system, see below. For steps on how to create an event bus see steps here.
2- As soon as the event is received in the customer account, it will validated against a rule that you have configured in your EventBridge. The event validation must comply with the Amazon event schema to ensure delivery of the cart events. For steps on how to configure EventBridge rules, see here. Below is a sample of event rule based on current cart schema. Note that the event schema can change so please review the latest documentation from Amazon.
{
"source": ["AmazonEventsService"],
"detail-type": ["CART"]
}
3- Once the event has been validated, the event data will be routed to the target defined in the EventBridge. Event bridge supports multiple types of targets. Please select the applicable target for your company. For steps on how to configure a target for an EventBridge rule, see here..
4- Depending on your use case you can process the incoming event. For an example of an event received from the Amazon systems see below
Sample event where Amazon is calculating the cart with an Amazon applied promotion. The merchantPromotionId in the payload will match the promotion in the Amazon merchant portal
{
"version": "0",
"id": "a001e3f8-2c20-973e-b477-436332a4ee31",
"detail-type": "CART",
"source": "AmazonEventsService",
"account": "216989093685",
"time": "2025-09-26T14:44:49Z",
"region": "eu-west-1",
"resources": [],
"detail": {
"eventId": "fc85b59a-ba21-4bd9-ba8e-84c262df9e25",
"eventName": "CHECKOUT",
"storeId": "<STORE-ID>",
"eventPayload": {
"sessionId": "fc85b59a-ba21-4bd9-ba8e-84c262df9e25",
"orderId": "204-2193710-1358720",
"sessionStartTime": 1758895638479,
"sessionEndTime": 1758895677726,
"cartItems": [
{
"quantityValue": "1.0",
"quantityUnit": "unit",
"priceValue": "4.25",
"priceCurrency": "GBP",
"taxValue": "0.0",
"merchantSku": "3986",
"taxDiscountValue": "0.0",
"taxCurrency": "GBP",
"taxDiscountCurrency": "GBP",
"listPriceValue": "4.25",
"listPriceCurrency": "GBP",
"totalPromotion": "-2.13",
"orderLineItemId": "54636766128162",
"promotionInfos": [
{
"merchantPromotionId": "63c06f6f-0276-4b06-b395-cf80724b3e89",
"promotionValue": "-2.13",
"taxDiscountValue": "0.0"
}
]
}
]
}
}
}
You can apply schema translation to match the interface or input to any of your data ingestion targets.
For a sample Python Lambda solution to process the incoming message and store into an S3 file see below
-
When the incoming message is matches the Eventbus rule, the event is passed to the DataEmissions lambda
-
The Data emissions lambda is configured to record the incoming event to a file that will roll every minute using a configuration value. Full Lambda code below.
For CloudFormation template, sample Python Lambda on how to process incoming message please contact your Amazon team.
Data dictionary
Cart event
Field Name | Data Type | Sample Value | Description |
---|---|---|---|
quantityValue | number | 2 | Numerical value representing the quantity of the item in the cart. Supports decimal quantities for weight-based or fractional items. |
quantityUnit | string | "unit" | Unit of measurement for the quantity. Standard values include "unit", "kg", "lb", "oz", etc. Ensures proper quantity interpretation across systems. |
priceValue | number | 4.99 | Final per-unit price of the item after all applicable discounts (excluding tax). Used for order total calculations and financial reporting. |
priceCurrency | string | "USD" | ISO-4217 currency code associated with the price value. Supports multi-currency operations and international commerce. |
taxValue | number | 0.41 | Tax amount applied to this line item. Calculated based on applicable tax rules for the item, store, and customer location. |
merchantSku | string | "089765432109" | Merchant-specific Stock Keeping Unit identifier. Used for inventory management and product identification in merchant systems. |
taxDiscountValue | number | 0 | Discount amount specifically applied to the tax value. Used in promotional scenarios for tax inclusive pricing where tax may be reduced or waived. |
taxCurrency | string | "USD" | ISO-4217 currency code associated with the tax value. Typically matches priceCurrency . |
taxDiscountCurrency | string | "USD" | ISO-4217 currency code associated with the tax discount value. Typically matches taxCurrency. |
listPriceValue | number | 4.99 | Original per-unit price of the item before any discounts or promotions were applied. Used for discount calculations and price comparison. |
listPriceCurrency | string | "USD" | ISO-4217 currency code associated with the list price value. Typically matches priceCurrency. |
orderLineItemId | string | "127984561298765" | Unique identifier for this specific line item within the order. Used for line-item level operations and tracking. |
promotionInfo | array/null | null | Array of PromotionInfo objects, each containing: merchantPromotionId (String): unique identifier for the promotion; promotionValue (BigDecimal): monetary value of the promotion discount; taxDiscountValue (BigDecimal): discount amount specifically applied to tax. Null if no promotions were applied. |
Payment event
Field Name | Type | Definition | Required | Pattern/Constraints |
---|---|---|---|---|
amount | Structure | Payment amount information with value (String) and currencyCode (String of length 3) | Yes | N/A |
brand | String | Card brand (e.g., VISA, MASTERCARD, AMEX) | No | ^[A-Za-z]+$, max length: 20 |
cardLastFourDigits | String | Last four digits of the payment card | No | ^[0-9]{4}$ |
currency | String | Currency code (e.g., USD, CAD, GBP) | Yes | ^[A-Z]{3}$ |
expirationDate | Structure | Card expiration information with: month (String) and year (String) | No | N/A |
paymentRequestTime | Timestamp | When the initial charge/refund was created | Yes | Timestamp format |
paymentRequestId | String (UUID) | Unique identifier for the payment request | Yes | ^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$ |
paymentReceivedTime | Timestamp | When the processor response/completion occurred | Yes | Timestamp format |
posEntryMode | String | Point of Sale entry mode | No | ^[0-9]{2}$ |
reconciliationId | String | Identifier used to reconcile a transaction | Yes | ^[0-9a-zA-Z_-]+$, max length: 255 |
authorizationResponseCode | String | Authorization response code from payment processor | No | ^[0-9]{4}$ |
authorizationCode | String | Authorization code from payment processor | No | ^[A-Za-z0-9_-]+$, max length: 50 |
cryptogramInformationData | String | Cryptogram information data for EMV transactions | No | ^[A-Za-z0-9_-]+$, max length: 255 |
cardholderVerificationMethod | String | Method used to verify the cardholder | No | ^[A-Za-z0-9_-\s]+$, max length: 50 |
panSequenceNumber | String | Primary Account Number sequence number | No | ^[A-Za-z0-9_-]+$, max length: 50 |
terminalId | String | Identifier for the payment terminal | No | ^[A-Za-z0-9_-]+$, max length: 50 |
cardStatementTransactionId | String | Transaction ID that appears on the card statement | No | ^[A-Za-z0-9_-]+$, max length: 255 |
status | String | Status of the eventName (e.g. AuthorizationApproved, AuthorizationDeclined, RefundPending, RefundApproved, CaptureApproved, CapturePending, AuthorizationCancelled, etc.) | Yes | ^[A-Za-z_]+$, max length: 50 |
applicationId | String | Application identifier for EMV transactions | No | ^[A-Za-z0-9_-]+$, max length: 50 |
Testing
You can validate your event processing rule and target setup by sending a test event to your event bus following these steps
- Login to the AWS account where the eventbus is deployed
- Navigate to EventBridge service
- Select event bus from the left navigation section
- On the upper right side, click on send events
- Fill the pop up window with the following value. Note you need to select the event bus you created
Use the following for the EventDetail
{
"detail": {
"eventId": "bcf4d0e9-94ea-4b5e-9775-810aebb1e446",
"eventName": "CHECKOUT",
"storeId": "<STORE_ID>",
"eventPayload": {
"sessionId": "bcf4d0e9-94ea-4b5e-9775-810aebb1e446",
"orderId": "113-5204848-9196220",
"sessionStartTime": 1756143973871,
"sessionEndTime": 1756143999192,
"cartItems": [{
"quantityValue": "1.0",
"quantityUnit": "unit",
"priceValue": "4.25",
"priceCurrency": "USD",
"taxValue": "0.0",
"merchantSku": "786162200433",
"taxDiscountValue": "0",
"taxCurrency": "USD",
"taxDiscountCurrency": "USD",
"listPriceValue": "4.25",
"listPriceCurrency": "USD",
"totalPromotion": "0",
"orderLineItemId": "137392212080481",
"promotionInfos": []
}]
}
}
}
Click on send events. You can validate the events will be delivered to the target you have setup for the event rule