Skip to main content

Transaction Fees

Overview

Acquiring payment transactions surface a fee breakdown via the fees field. Each entry describes one fee associated with the transaction, with a sign that tells you whether the fee debits or credits your payable amount.

The fees: [PaymentTransactionFee!] field is exposed on:

Fee shape

PaymentTransactionFee is an interface. All concrete fee types share the same two fields:

FieldTypeDescription
accountingDirectionAccountingDirectionDirection the fee is moving from the subscriber's perspective. DEBIT deducts the fee from the total payable amount; CREDIT credits it.
feeAmountAmountThe amount of the fee.

Fee categories

Discriminate concrete fee types via __typename. Each concrete type currently exposes the same fields as the interface; identification is by __typename only.

Concrete TypeWhat It Represents
MerchantFeePaymentTransactionFeeMerchant-side processing fees (Highnote's discount fee and per-transaction surcharges such as keyed-in, virtual terminal, cross-border, foreign exchange).
InterchangeFeePaymentTransactionFeeInterchange fee assessed between the acquirer and the card issuer.
NetworkFeePaymentTransactionFeeNetwork assessment fee charged by the card network (for example, Visa or Mastercard).
UndeterminedFeePaymentTransactionFeeAppears when the underlying fee category is UNSPECIFIED, UNKNOWN, or any unrecognized value — read accountingDirection and feeAmount like the other types.

Fees by pricing model

Whether a fee category is populated depends on the Pricing Model configured on the subscriber's contract. UndeterminedFeePaymentTransactionFee can appear on any model when the network or processor has not classified the fee.

Network Fee is not currently populated

Production code does not emit fees for NetworkFeePaymentTransactionFee today. The schema includes the type so subscribers can parse __typename defensively for forward compatibility as the schema evolves.

Pricing ModelInterchangeMerchantNetwork
BlendedYes
Interchange Plus (IC+)YesYes
Interchange Plus Plus (IC++)YesYesPlanned
TieredYesYesPlanned

Query fee details

The following request and response demonstrate the fees array when populated.

Request example

Query the transaction by ID and select __typename on each fee to discriminate the concrete fee type:

query PaymentTransactionFees($id: ID!) {
node(id: $id) {
__typename
... on PaymentTransaction {
id
fees {
__typename
accountingDirection
feeAmount {
currencyCode
value
decimalPlaces
}
}
}
}
}

Response example

Interchange fees use four decimal places to support sub-cent precision. The transaction's payable amount is reduced by $0.0165 of interchange and $0.30 of merchant fees. See Acquiring transaction precision for the convention.

{
"data": {
"node": {
"__typename": "PaymentDebitTransaction",
"id": "<PAYMENT_DEBIT_TRANSACTION_ID>",
"fees": [
{
"__typename": "InterchangeFeePaymentTransactionFee",
"accountingDirection": "DEBIT",
"feeAmount": {
"currencyCode": "USD",
"value": 165,
"decimalPlaces": 4
}
},
{
"__typename": "MerchantFeePaymentTransactionFee",
"accountingDirection": "DEBIT",
"feeAmount": {
"currencyCode": "USD",
"value": 30,
"decimalPlaces": 2
}
}
]
}
}
}