Skip to content

Account capabilities

The eleven capabilities, which ones are enforced, and how your commission is computed.

The three modes

account_type says what the merchant owns at Wajub and where the money sits. Everything else — capabilities, commission, consent, webhooks, KYC — is the same across the three. It is chosen when you create the connection and never changes afterwards: switching mode changes what the merchant agreed to, so it is a new connection they accept again.

ModeThe merchantThe moneyUse it for
direct (default)A full Wajub account they run themselvesWajub rail, or their own provider contractsMerchants already set up
liteA light hosted portalWajub rail, alwaysSmall sellers — the common case
relayNo Wajub account: a payout destinationYours — you collect and Wajub relays the payoutsMarketplaces that are merchant of record

Two rules follow from the mode, and only two:

  • a lite connection refuses to start a payment while the merchant is not on the Wajub rail (409) — it exists so the commission is taken at the source and the payout is automatic, and both need the money to pass through Wajub;
  • a relay connection has no onboarding: there is no merchant account to claim.

The eleven capabilities

A connection is granted a subset of this list, and the list is closed. At least one is required at creation, and an unknown value is refused with 422.

CapabilityWhat it names
readReading the connected account's own resources
writeCreating and updating resources on its behalf
paymentsInitiating and managing payments
withdrawalsInitiating transfers and payouts
refundsIssuing refunds
disputesManaging disputes
customersManaging customers
invoicesManaging invoices
subscriptionsManaging subscriptions
analyticsReading analytics and reporting
settingsManaging the connected account's settings

Every resource states what it requires

Capabilities are a real boundary: each resource declares the capability it takes, and a request carrying X-Sync without that capability is refused with 403.

The request touchesThe capability checked
/payments, /linkspayments
/invoicesinvoices
/customers, /customers/{id}/tax_idscustomers
/refundsrefunds
/disputesdisputes
/transfers, /beneficiaries, /identitywithdrawals
/webhooks, /tax, /shieldsettings
/, /providers, /balance, /events, /listenread
/channels, /countries, /currenciesnone — the catalogues answer the same to everyone
/accounts, /keys/currentcannot be called with X-Sync at all

A capability covers what the connection brought

Capabilities say what a platform may touch; the connection says whose. With X-Sync, a platform sees the payments it initiated, the refunds of those payments, the customers who bought through it and the payouts it sent — never the merchant's direct sales, and never another platform's.

ResourceWhat the platform sees
/payments, /refundsOnly those carrying this connection
/customersOnly customers seen on this connection's payments
/transfersOnly payouts this connection initiated
/balanceThe merchant's balance as a whole — a balance is not per connection

A resource that names no capability cannot be reached on behalf of a connection, so a capability you did not grant is a capability the platform does not have. write, subscriptions and analytics name no resource today: they are recorded on the connection and shown to the merchant, but nothing checks them yet.

Changing the terms of a live connection

Capabilities and pricing are what the merchant agreed to, so once a connection is active they are proposed rather than changed. PUT /accounts/{id} answers 202 Accepted and returns the proposal in pending_changes; the connection keeps running on its current terms until the merchant accepts or declines in their own dashboard.

ThenWhat happens
The merchant acceptsThe new terms apply from that moment, and account.change_accepted fires
The merchant declinesNothing changes, and account.change_declined fires
You propose againThe new proposal replaces the one still on the table

Sales already made keep the terms they were made under: a pricing change never re-prices a commission already charged. While the connection is still pending, nobody has agreed to anything yet and PUT applies the change outright, answering 200.

Pricing

Pricing is what your platform retains on the connected account's activity. It is a set of rules attached to the connection, not a single number, and POST /accounts creates the first one for you from the pricing object.

percentage_feenumberoptional
Percentage of the payment amount, between 0 and 100. Stored to four decimal places.
fixed_feenumberoptional
Flat amount added on top of the percentage, in major units of the rule currency.
min_feenumberoptional
Floor. A computed fee below it is raised to it.
max_feenumberoptional
Cap. A computed fee above it is lowered to it.
currencystringoptional
Three-letter code the fee figures are expressed in. Required as soon as you set fixed_fee, min_fee or max_fee.

The two kinds combine rather than compete: a rule with both a percentage and a fixed fee charges the percentage of the amount plus the flat figure, then applies the floor and the cap in that order.

How a fee is computed

Reading this sequence once explains every figure you will see on a fee.received.

StepWhat happens
1The payment succeeds and carries a connection
2The connection's rules are walked, specific rules before the fallback
3The first rule whose conditions match the amount and currency wins
4Percentage and fixed fee are summed, then clamped by min_fee and max_fee
5A fee of zero is dropped, nothing is recorded
6The fee is written once against the payment
7The amount leaves the merchant's balance and lands on yours, held under the sale's own retention

Step 6 is idempotent, and the database enforces it: one payment carries at most one commission, whatever happens to the event that triggered it. Step 7 posts in the currency the sale settled in, so the ledger never carries an exchange position; the fee's own currency and the rate applied are recorded on the movement.

A commission is a share of a sale, so a sale that comes undone takes its share with it.

When the sale is refunded

commission_refund_policy, set on the connection, decides what comes back.

PolicyOn a refund
prorata (default)The commission is returned in proportion to the amount refunded
fullThe whole commission is returned on the first refund, partial or not
noneNothing is returned; the merchant carries the refund alone

Set it with POST /accounts, and change it with PUT /accounts/{id} only while the connection is still pending — it is a commercial term the merchant accepted. Nothing is ever given back twice, and several refunds on one sale can never return more than was charged.

The rule currency is the denomination, not a filter

currency says what the fee is expressed in, not which payments the rule applies to. Charging a flat 500 XAF on a payment made in NGN converts at the active rate, and converts a second time if your platform's own balance is in a third currency. The metadata on the fee records both rates.

Conditions

A rule can carry conditions, which decide whether it applies at all.

ConditionEffect
min_amountThe rule is skipped for payments below it
max_amountThe rule is skipped for payments above it
currencyThe rule only applies to payments made in that currency

Conditions are how you charge a different commission on small baskets, or exempt a currency. A connection with several rules needs one without conditions to act as the fallback, otherwise a payment that matches none of them carries no commission at all.

What stays editable outright

Two fields survive acceptance without the merchant's say-so, and they are the only two.

FieldWhy it stays open
callbackThe URL notified of this connection's lifecycle events
payment_statusactive or suspended, your own switch on the connection's ability to charge

Suspending a connection stops both inbound payments and outbound transfers on it, and fires account.payment_suspended. It is the lever to reach for when you would otherwise want to revoke a capability, and unlike a capability it is reversible.

What did you think of this content?