Product 3 Processing
Visa's Commercial Enhanced Data Program (CEDP) is replacing the Level 2 and Level 3 programs and interchange rates with new Product 3 interchange rates. By including enhanced data with your payments you could qualify for decreased processing rates. The required data for Product 3 rates remain the same as Level 3 data that is being replaced.
CEDP will now be analyzing and validating the data provided using an AI-based monitoring and validation system that will help verify merchants for the program. It can take up to 3 months for a merchant to become verified and start seeing the lower rates.
CEDP Qualification and Enhanced Data Structure
The primary objective of this update is to enable transaction eligibility for the Commercial Enhanced Data Program (CEDP) and to secure Level 3 interchange rates, which offer significantly lower processing fees for corporate, government and business transactions.
Previously, shipping information was retrieved generically from the Customer object a legacy implementation that remained underutilized across most integrations. This update introduces a decoupled architecture that separates shipping logic into a dedicated object and implements a granular LineItems breakdown. These changes ensure the data precision required by payment processors to meet Level 3 compliance standards.
Request Data Structure
The developer must integrate two new structures within the payment request payload:
LineItems Object (Array)
Represents the granular breakdown of products. A maximum of 200 items is permitted per request.
| Field | Type | Required | Description |
|---|---|---|---|
| Name | String | Yes | Product name (Max 250 characters). |
| Code | String | Yes | SKU or UPC identifier (Max 50 characters). |
| Amount | Decimal | Yes | Unit price of the item |
| Quantity | Integer | Yes | Number of items purchased |
| TaxAmount | Decimal | Yes | Total tax amount applied to the item. |
| UnitOfMeasure | String | Yes | Measurement unit (e.g "oz", "meters", "unit") (Max 12 characters) |
| DiscountAmount | Decimal | No | Discount amount applied to the item |
| CommodityCode | String | No | Optional. Standardized code that should be provided that categorizes the item. This code is not required to receive the Product 3 interchange rates, but you're acquiring bank may eventually require them. Sources include but are not limited to UNSPSC, NAICS, NAPCS. |
Shipping Object
This object is mandatory for processing CEDP and Level 3 data when the order involves physical fulfillment.
| Field | Type | Required | Description |
|---|---|---|---|
| Amount | Decimal | Yes | Total shipping cost applied to the transaction. |
| DestinationPostalCode | String | Yes | Destination ZIP/Postal code (Max 10 characters) |
| DestinationCountryCode | String | Yes | 3-digit ISO 3166-1 numeric country code of the destination. |
| OriginalPostalCode | String | Yes | Origin ZIP/Postal code of the shipment (Max 10 characters). |
Amount Validation Logic
To ensure transaction acceptance under the level 3 (product 3) schema, all amounts must be mathematically precise. The system performs the following server-side validations:
Line Item Total (Per Item)
The total for each individual line item is calculated as follows:
Transaction Grand Total Validation
The primary Amount field of the payment request must be exactly equal to the sum of all components:
Any discrepancy, even by a single cent, will result in a validation error and the transaction will fail to qualify for discounted interchange rates.
Required Reference Fields
At least one of the following reference identifiers must be present in the request payload:
- OrderId
- InvoiceNo
- PONO (Purcharse Order Number)
- InvoiceId
Architecture and Persistence
The implementation is orchestrated though the following system components:
Data Flow
- Data enters via
MakePaymentControllerand is subsequently processed by thePaymentService. - Information is mapped to the
OrderInfoobject within theXenonPaymentAdapterBaseclass for transmission to the Xenon Gateway. - Currently, Level 3 (Product 3) data transmission to
Xenonis exclusively enable for Stripe and Worldpay processors.
Database Layer
Persistence is managed via SQL Server using NHibernate as the ORM
- PaymentInfo Table: New columns have been appended to persist the transaction's global shipping metadata.
- PaymentLineItem Table: A new table has been implemented to store granular item details.
Updated 3 days ago
