Fees
This section introduces you to the concepts that apply to RippleNet fees. Before you direct payments across RippleNet, familiarize yourself with:
If you want to configure fees for your server, complete the steps in the following tutorials depending on your goals:
Fees on RippleNet
Institutions that use RippleNet can collect fees with their accounts. Accounts collect fees from processing transfers across RippleNet during a payment. You can configure fees for each of your institution's RippleNet instances. There are many configurable possibilities for how you can collect fees, including the following typical high-level strategies:
- Sending institutions collect fees from their originating customer
-
Receiving institutions collect various fees:
- From sending institutions that hold a nostro account on its ledger
- From specific partners
- For payments using specific payout methods
Tip
Fees on RippleNet are a currency amount that a RippleNet account collects for servicing a transfer during a payment, instead of an amount that it applies or charges.
API references
For more information, see the API reference documentation for Fees. The following API operations are available:
-
Get fees
-
Create fee
-
Get fee by ID
-
Update fee
-
Delete fee
Note
The API reference describes each fee component field for the fee-related operations, but this document serves as a foundational introduction to fees on RippleNet.
Fee matching
For each payment that your institution's instance services, a configured fee applies only if each of the fee's components match those characteristics for the payment.
Read about each fee component to understand what constitutes a match.
Fee matching example
You may need to create multiple fees to handle the business cases for your institution. For example, if you want your institution's instance to collect a uniform fee for all regular payments, you must create a fee with payment_type: regular
values.
Applying multiple fees
You can set multiple fees for your RippleNet instance to cover many business use cases. More than one fee may apply to each payment your institution services.
Fee components
Understanding the components of a RippleNet fee will help you to properly plan out the correct fees for your institution's goals.
This section details each fee component. Several configurable components act as a condition for whether or not the instance collects a fee for a payment.
Fee conditionals
All conditional fee components must be met before a fee can apply to a payment.
Role type (conditional)
Role type specifies the role that the account plays in the transfer on the instance. It is set by the fee's role_type
value.
For any transfer between accounts on an instance (node), there is exactly one sender and one receiver account.
Possible values include the following:
-
sending
-
receiving
-
institution_sending
-
institution_receiving
The institution_sending
and institution_receiving
values apply only to payments with type
set to sender_institution_amount
and receiver_institution_amount
, respectively. For more information, see "Create quote collection" in the API reference.
Note
The role_type
value acts as a condition for a fee to apply.
Tips
- Because there is no transfer between correspondent accounts, no fee can be collected by correspondent (nostro and vostro) accounts.
- Accounts that make exchange transfers (FX conversion) do not collect fees.
Role type example
For a fee with role_type
set to sender
, only the account on the instance that sends a payment to another account on that RippleNet instance can collect the configured fee.
Role type impact on RippleNet Payment Object
Fees appear in the RippleNet Payment Object (RPO) as sending and receiving fees in each quote element. This section explains how sending and receiving fees affect sending and receiving amounts in the RPO.
Sending fees
The sending account in a transfer collects any fees set with "role_type": "sending"
from the transfer amount before RippleNet calculates the sending_amount
and receiving_amount
values.
A quote element's sending_amount
is the remainder amount after the account collects a fee. This means that adding the sending_amount
value to the sending_fee
value produces the total incoming transfer amount to the account from the previous hop (or origination) of the payment.
Receiving fees
The receiving account in a transfer collects any fees set with "role_type": "receiving"
from the transfer amount after RippleNet calculates the sending_amount
and receiving_amount
values.
A quote element's receiving_amount
is the amount produced by any foreign exchange conversion from the sending_amount
, before the account collects the receiving fee. This means that subtracting the receiving_fee
value from the receiving_amount
value produces the total outgoing transfer amount to the account in the next hop (or the payout) for the payment.
Node type (conditional)
A fee's node type indicates how the RippleNet instance (node) participates in the payment's movement across RippleNet. The node_type
field sets the value for what is the behavior of the node in the payment. If the node_type
value matches the fee to apply to payments in which the instance (node) acts as either the initial, intermediate, or terminal node in the payment across RippleNet.
Possible values include the following:
-
INITIAL
: The instance (node) acts as the sender for the payment. -
INTERMEDIATE
: The instance (node) services the payment as an intermediary. -
TERMINAL
: The instance (node) acts as the receiver for the payment.
Note
The node_type
value acts as a condition for a fee to apply.
Node type example
Each payment across RippleNet moves between at least two RippleNet instances (nodes). There can be only one node that initiates a payment and one that receives it. There may be any number of intermediary nodes in the payment path, including none.
If you configure a fee with node_type
set to sending
, the instance must act as the sender for the account to collect the fee. Other fees may be applied based on their configuration.
Currency (conditional)
Fees are configured with one currency, set by its currency
value. This must match the currency denominated for the account.
Note
The currency
value acts as a condition for a fee to apply.
Payment type (conditional)
A fee can be configured to apply to either regular payments or return payments, set by the payment_type
field.
Note
The payment_type
value acts as a condition for a fee to apply.
Fee type
A fee can be configured as a flat fee or a percentage fee, set by its fee_type
value.
Flat fees are specified with an amount in the fee's currency. Percentage fees are calculated as a percent of the payment amount when the instance services it.
Fee category
You can distinguish fees by assigning a fee_category
and applying a free-form text fee_description
.
The quote and payment contract responses show the fee category code and description, as well as the total fee value per node and currency.
The table below summarizes the possible fee category codes:
Caution
All existing fees are automatically assigned to NONE
to ensure forward compatibility in future API versions.
Category code | Category description |
---|---|
OVERSEAS_DELIVERY_CHARGE |
Fee for a payment sent or received overseas |
BENEFICIARY_BANK_CHARGE |
Fee to the receiving bank where the beneficiary account is located |
PROCESSING_HANDLING_CHARGE |
Fee to institution (such as an intermediary) helping to process a payment |
LOCAL_GOVERNMENT_CHARGE |
Fee to the local government authority (and deducted from payment) |
OTHER |
Miscellaneous fee |
NONE |
Default value |
Value
Amount of fee set by the value of the value
field.
Advanced fees
Fees can be configured with granular control that allows you to set premiums for specific partners, accounts, or payout methods.
With advanced fees and fees that do not specify this level of control, you can create the appropriate fee structures for your institution's business goals.
Note
Slab Fee Precedence: If your institution uses slab fees, slab fees take precedence over non-slab fees for two otherwise similar fees. For example, if you configure two account-level fees, one with slab pricing and the other without it, the slab fee applies to the transfers for that account.
Account fees
You can configure fees that apply only to transfers to or from a specified account.
Account fee precedence
An account fee takes highest precedence over other fees, including partner fees. If an account fee and another fee could both apply to a transfer, the account fee applies and the other fee does not.
Partner fees
You can configure fees that apply only to transfers to or from a specified partner.
Partner fee precedence
A partner fee takes precedence over fees that are not set for a specific partner or account. Only a fee that additionally specifies an account takes precedence over a partner fee. If a partner fee and another fee could apply to a transfer, the partner fee applies and other fee does not (unless the other fee is an account fee).
Payout method fees
You can set fees that apply only to transfers that use a specified payout method for the payment.
-
Receivers can configure one or more payout methods (free form text) using the
Payout method
API operations. They can also set one payout method as the
default
by enabling the
is_default
flag. -
Senders can request a quote collection for each of the receiver's configured payout methods by enabling
enable_quote_per_payout_method
flag in the request. They can also request a single quote by definingpayment_method
as one of the receiver's configured payout methods. Or, by not setting anything in the request, they can receive a single quote based on the receiver's default payout method.
The following table lists the API responses based on the receiver's payout method configuration and the sender's Create quote collection request.
Ver | Receiver payout method | Receiver default flag | Sender payout method | Sender enable flag | RippleNet Server Create quote collection response |
---|---|---|---|---|---|
4.6 | 1 or more configured | false | Valid method | true or false | Returns quote with fees based on payout method specified by sender and configured by receiver |
4.6 | 1 or more configured | false | - | true | Returns multiple quotes with fees based on payout methods configured by receiver |
4.6 | 0 or more configured | false | - | false | Returns regular quote with fees that are not calculated using a payout method |
4.6 | - | false | - | false | Returns regular quote with fees that are not calculated using a payout method |
4.7 | 1 or more configured | true | - | false | Returns quote with fees based on default payout method configured by receiver |
4.7 | 1 or more configured | false | Invalid method | true or false | Return no quotes/Throws an error |
Default payout method
If you want to specify a default payout method fee for all quote requests you can do so when you configure the payout method by passing the is_default
key with the true
value.
Payout method fee precedence
A fee that specifies a payout method takes precedence over fees that do not have a payout method. You can set partner-level and account-level fees that include payout methods.