Amended 2026-10-26 (STA-1281, owner decision R3-8): the sandbox and live Integrations and
PAYMENT_CONNECTIONS moved to the OS integrations service as connectors. The naming rule stands
there; ConnectionPaymentGatewaysDriver now takes the host’s map as its third argument.Context
Some vendors serve test mode from a separate host (Checkout.com, HyperPay’s OPPWA, Tamara, Fawry); others serve live and test from one host and tell them apart by the key (Stripe, Moyasar, Paymob, Tabby). The managed client never leaves an Integration’s base URL, so a separate host must be a separate Integration, and each Integration has its own provider code (checkout-sandbox). Paymob’s regional hosts (paymob-ksa, paymob-uae, paymob-oman) follow the same rule but
are live hosts, not sandboxes. The question was whether market-pack data should name the -sandbox code for sandbox
tenants, which would make every pack carry two provider lists. Alternatives weighed: a base-URL placeholder switched by
a connection field (rejected: one Integration would then reach two hosts, and its egress allowlist would be wider than
either) and duplicate pack lists (rejected: the two lists drift).
Decision
- A vendor with a separate test host has a separate Integration and connection class whose provider code is the live
code with
-sandboxappended. A vendor whose test mode is a key on the live host has no sandbox code; a sandbox tenant’s Connection holds a test key on the live code. - Market packs list live provider codes only. When a call runs in a sandbox scope (0359 decision 11), the
MarketPaymentDefaultsdriver swaps each listed code for its-sandboxcode when one is registered inPAYMENT_CONNECTIONS, and keeps the live code otherwise. The swap is naming mechanism, not data. - A regional host is never a sandbox:
paymob-ksais chosen by pack data per Market like any other live code. - A sandbox Connection is never promoted to live; promotion creates a live Connection (0359).
Consequences
Packs stay one list per Market. A new vendor with a test host needs both Integrations before it can be used in a sandbox. The sandbox swap needs the call’s sandbox flag in the driver, which themarket-pack driver does not read yet.
Enforcement
planned — amarket-pack-payment-defaults.driver.test.ts case for a sandbox scope, and a check in
payment-connections.constant.test.ts that every -sandbox key has a live key.
Supersedes and sources
Supersedes: none. Sources: notes/handover/build-wave10-2026-10-25.md (@stackra/payments owner question 3); STA-672.