Configuring your own fee does not change Grid’s rates — Grid’s variable rate and fixed
fee stay exactly as contracted. It can still change the absolute amount Grid collects,
because Grid’s variable fee is proportional to the amount being sent. When you lock the
receiving amount, adding your fee raises the sending amount needed to deliver it, so the
absolute amount Grid takes rises with it.
What you can charge
A platform fee has two components, and you can use either or both:
Both are denominated in the sending currency and are charged on the sending side of the
payment — your customer bears the fee as part of the transaction rather than you being
billed for it separately. Which side absorbs it depends on
lockedCurrencySide: lock the
sending amount and your fee comes out of what the recipient receives; lock the
receiving amount and the recipient still gets that amount, so the sender pays more.
Fees are configured per fee type, which identifies the activity being charged:
CROSS_CURRENCY_TRANSACTION— a transfer where the sending currency differs from the receiving currency.
Current limits. Platform fees are supported for a USD sending currency only, and
the fixed fee must be denominated in that same sending currency — other currencies return
NOT_IMPLEMENTED. CROSS_CURRENCY_TRANSACTION is the only fee type you can configure
today.Both are expanding: a RAIL fee type (charged for use of a payment rail) and support for
stablecoin sending currencies such as USDC are planned. Watch the
changelog for when they land rather than assuming today’s limits are
permanent.A fee can only be charged on a transaction if you hold a platform internal account in that
transaction’s sending currency — that account is where the fee is credited. As more
sending currencies become chargeable, add the matching platform account before you enable a
fee for them.
How the amount is calculated
Every fixed fee on the transaction — yours and Grid’s — is subtracted first. The variable rates are then applied together to what remains:The variable component is charged on the sending amount net of all fixed fees, not on
the gross sending amount — so Grid’s fixed fee reduces the base your variable rate applies
to, and yours reduces Grid’s.
Configuring your fees
Standing fees
Standing fees apply to every matching transaction until you change them. Set them withPATCH /config:
Set a standing platform fee
feeConfigs is a merge-by-key upsert keyed by (feeType, sourceCurrency):
- Only the keys you send are touched. Configs you omit are left unchanged.
- Omitting
feeConfigsentirely leaves all your fee configuration unchanged. - There is at most one active config per key.
GET /config — the response includes a feeConfigs
array with every currently-active config.
Read current fee configuration
Turning a fee off
Set bothvariableFeeBps and fixedFee.amount to 0 for that key. The config is
deactivated and stops applying to new transactions:
Per-transaction overrides
For promotions, negotiated rates, or VIP pricing, you can override your fee on a single transaction by passingplatformFeeOverride when you create the quote. The override
replaces every platform fee that would otherwise have applied to that transaction —
it is not added to your standing fee.
Quote with a discounted platform fee
platformFixedFee and platformVariableFeeBps are required inside the override
object — pass 0 for a component you want to waive. To waive your fee entirely on a
transaction, send 0 for both.
Overrides are rejected with a 400 INVALID_INPUT when:
- The quote’s sending currency is not USD.
platformFixedFee.currencydoes not match the quote’s sending currency.- Either value is negative, or
platformVariableFeeBpsis above10000(100%).
When fees are assessed
A platform fee moves through three stages:1
Priced at quote time
When you create a quote, Grid resolves your fee (standing config or override) and
prices it into the quote. The amount is returned as
platformFeesIncluded and is
locked for the lifetime of the quote.2
Charged when the payment executes
Executing the quote charges the fee as part of the sending amount. Your customer pays
it — you are not invoiced for it separately.
3
Credited during settlement
The fee is credited to your platform internal account in the sending currency as one
step of the payment’s settlement, not in a single moment at the end. It can land before
the transaction reaches
COMPLETED.platformFeesIncluded, the portion of feesIncluded that you
collect. It is 0 when no fee applies. Continuing the worked example above — a $10.00
send with your 30 bps + $0.50 fee and Grid’s 100 bps:
Quote response
platformFeesIncluded is already counted inside feesIncluded — do not add the two
together. Subtract it from feesIncluded to get Grid’s portion.Webhooks
Platform fees do not introduce new webhook types. Two existing events carry the information you need:
To reconcile fee revenue as it accrues, listen for
OUTGOING_PAYMENT.COMPLETED and read
platformFees from the payload:
OUTGOING_PAYMENT.COMPLETED
A fee is only earned once the payment completes. A transaction that fails or is refunded
generates no revenue — and if the fee had already been credited, the refund reverses it —
so reconcile against terminal statuses rather than counting
platformFees on every event
you receive.Querying transactions and revenue
Per-transaction fees
Every outgoing transaction carriesplatformFees, the portion of fees that you
collected. Fetch a single transaction:
platformFees across the completed ones:
nextCursor until hasMore is false so your totals
cover the whole period. See List transactions
for the full set of filters.
Accrued balance
Collected fees accumulate in your platform internal account. Query its balance for the running total credited to you and not yet withdrawn — bearing in mind it includes fees from payments still in flight, which a refund can still reverse:Your platform account is a single pool, like a bank balance — fee revenue is not held in a
separate sub-balance. If you deposit or spend from the same account, derive fee revenue by
summing
platformFees across transactions rather than reading the balance.Testing in sandbox
Platform fees work end to end in sandbox, so you can verify your pricing before going live. Money movements are simulated, but fees are calculated and credited exactly as they are in production.1
Confirm you have a platform account
Call
GET /platform/internal-accounts?currency=USD. If no account exists, fees have
nowhere to land and payments carrying them will fail.2
Configure a fee
PATCH /config with a feeConfigs entry, then GET /config to confirm it is active.3
Fund a customer account
Use
POST /sandbox/internal-accounts/{accountId}/fund to add a test balance. See
Sandbox testing.4
Create a quote and check the math
POST /quotes and confirm platformFeesIncluded matches what you expect for the
amount you sent. This is the fastest way to validate a fee change — no execution
needed.5
Execute and verify the credit
Execute the quote, wait for the transaction to reach
COMPLETED, then re-read your
platform account balance. It should have increased by exactly
platformFeesIncluded.platformFeeOverride to step 4 and confirm
platformFeesIncluded reflects the override rather than your standing config.