Skip to main content

Decide Gateway: Multi-Objective Routing

What multi-objective routing is

Plain success-rate (SR) routing optimises a single objective: send each payment to the gateway most likely to authorise it. But the cheapest path to a successful payment is not always the one with the highest auth rate — a gateway that is one point worse on auth but materially cheaper per transaction can leave the merchant with more money in hand. Multi-objective routing balances two objectives at once — authorisation and processing cost — so routing maximises the merchant’s economic outcome, not just the raw approval odds. It is implemented as a cost-aware post-step layered on top of SR scoring, not a replacement for it. The SR scorer runs first and produces its usual ranking; the post-step then takes those scores, attaches a per-gateway fee estimate to each, and re-ranks the candidates on expected value. Because it only ever runs after SR scoring, everything SR gives you (dimension-level buckets, elimination, hedging) is preserved — cost is simply an additional lens applied at the end.

How the ranking works

After the success-rate scorer picks its head gateway, the engine fetches per-PSP fee estimates and re-ranks every gateway that has cost data on economic value:
The settlement value is derived from the merchant’s margin and the per-PSP cost estimate (see the margin field on Create success-rate config). If a cheaper PSP has a strictly higher expected value than the SR head, it is promoted (outcome: COST_WON) and routing_approach becomes SR_SELECTION_MULTI_OBJECTIVE. Otherwise the SR head is kept (outcome: AUTH_WON) and routing_approach keeps its normal SR value. Either way, the response carries a multi_objective_info block explaining the decision — which gateway SR would have picked, which one cost analysis chose, and by how much — so every cost-driven override is auditable.

Enablement

Notes:
  • The post-step only runs on SR-scored decisions and is skipped while hedging (exploration) is active for the transaction.
  • margin (fraction of ticket, e.g. 0.20) comes from the merchant’s success-rate config — see Create success-rate config. It defaults to 1.0 when unset.
  • This post-step re-ranks the SR scores it is handed; it does not tune them. Autopilot is the separate self-tuning job that calibrates SR hedging and bucket size, and can run alongside this post-step (they are independent dials — enableMultiObjective and use_autopilot).
  • Gateways without fee data cannot be ranked on expected value and never win on cost; if the SR head itself has no fee data, the SR order is kept.
  • Per-gateway fee data comes from cost ingestion — settlement reports and invoices fitted into a per-cluster cost model. Check cost coverage to see what share of volume actually has a trustworthy fee estimate before relying on this post-step.
  • To compare cost-aware routing against a plain auth-rate baseline on live traffic before flipping the merchant flag, run it as an A/B test experiment arm (enable_multi_objective: true on one arm only).

Request

Response: cost won

adyen is promoted over the SR head stripe because its expected value is higher at the configured margin; fallbacks are re-ordered by descending expected value (gateways without fee data follow, ordered by auth rate).

Response: auth won

The post-step ran but the SR head was already the highest expected-value gateway, so nothing moves and routing_approach keeps its normal SR value. Note margin: 1 — the default applied when the merchant’s success-rate config sets no margin.

multi_objective_info Fields

The block is absent (null) when the post-step did not run at all — feature off, hedging active, or a non-SR routing flavour.