Level 2 and 3 Processing
Required Fields
Level 2 data
To qualify for Level 2 processing on a given transaction, include the following fields in the
Transaction: Sale
call:Interchange rates for Level 2 data
The values you pass in the required Level 2 fields determine whether you qualify for lower
interchange rates or not. US merchants must pass a
taxAmount
between
0.1% and 22% for Visa transactions, and between 0.1% and 30% for Mastercard transactions.taxExempt
transactions may not qualify for reduced L2 rates, but they could still be eligible for L3 rates.
Creating a transaction
Here's a full example with the required fields for Level 2:
- Callbacks
- Promises
gateway.transaction.sale({
amount: "100.00",
paymentMethodNonce: nonceFromTheClient,
purchaseOrderNumber: "12345",
taxAmount: "5.00"
}, (err, result) => {
});
Level 3 data
To qualify for Level 3 processing on a given transaction, you must pass
Level 2 data, along with specific additional Level 3 data and line
items. Line items are similar to the details you would find on an itemized invoice. When you create
a transaction, include the following fields in the
Transaction: Sale
call:- Level 2 fields
- Level 3 fields:
-
Level 3
lineItems
- lineItems.name
- lineItems.kind
- lineItems.quantity
- lineItems.unitAmount
- lineItems.unitOfMeasure
- lineItems.totalAmount
- lineItems.taxAmount
- lineItems.discountAmount
- lineItems.productCode
- lineItems.commodityCode
Supported characters
To ensure all line items appear as expected on the cardholder's statement, use only
a-z
, A-Z
, 0-9
, '
, .
,
-
, and spaces in the following fields:
Line items that contain other characters may still qualify for Level 3 processing, but unsupported
characters will be converted to a space on the cardholder's statement.
Amount validation
Each processor verifies that the total of the line item amounts matches the root transaction amount.
If there's a discrepancy, the transaction may be declined. To ensure these amounts match, it's
advisable to sum the per-item tax, subtotal amounts, shipping tax, and shipping amount to calculate
the total transaction amount. In the EU and UK regions, transactions with a non-zero shipping amount
may be rejected if the shipping tax amount is zero. Below is an example for validating the amounts
in Ruby.
Creating a transaction
Below is a full example using the minimum required fields for Level 3:
- Callbacks
- Promises
gateway.transaction.sale({
amount: "100.00",
paymentMethodNonce: nonceFromTheClient,
purchaseOrderNumber: "12345",
taxAmount: "5.00",
taxExempt: false,
shippingAmount: "1.00",
shippingTaxAmount: "0.1",
discountAmount: "0.00",
shipsFromPostalCode: "60654",
shipping: {
firstName: 'Clinton',
lastName: 'Ecker',
streetAddress: '1234 Main Street',
extendedAddress: 'Unit 222',
locality: 'Chicago',
region: 'IL',
postalCode: '60654',
countryCodeAlpha3: 'USA'
},
lineItems: [
{
name: "Product",
kind: "debit",
quantity: "10.0000",
unitAmount: "9.5000",
unitOfMeasure: "unit",
totalAmount: "95.0000",
taxAmount: "5.00",
discountAmount: "0.00",
productCode: "54321",
commodityCode: "98765"
}
]
}, (err, result) => {
});
Specifying level 2 and 3 data when submitting for settlement
Availability
Level 2 and 3 processing via submit for settlement requires internal approval. Please
contact us if you’re interested
in this functionality.
Note
Level 2 and 3 data provided via submit for settlement will override all Level 2 and 3 data
previously provided in a sale request. If you wish to pass Level 2 and 3 data, we recommend
utilizing either
transaction.sale
or transaction.submit_for_settlement, but not both at the same time.
- Callbacks
- Promises
gateway.transaction.submitForSettlement(
"theTransactionId",
null,
{
purchaseOrderNumber: "12345",
taxAmount: "5.00",
taxExempt: false,
shippingAmount: "1.00",
shippingTaxAmount: "0.1",
discountAmount: "0.00",
shipsFromPostalCode: "60654",
lineItems: [
{
name: "Product",
kind: "debit",
quantity: "10.0000",
unitAmount: "9.5000",
unitOfMeasure: "unit",
totalAmount: "95.0000",
taxAmount: "5.00",
discountAmount: "0.00",
productCode: "54321",
commodityCode: "98765"
}
]
}, (err, result) => {
if (result.success) {
const settledTransaction = result.transaction;
} else {
console.log(result.message);
}
}
);