The accrual split (ACCRUAL_DRAIN=1): spend and subscribe park seller shares on a
SETTLEMENT_ACCRUAL shard and the worker's drain sweep moves them to earned in batches, so
concurrent buyers of one seller stop serializing on that seller's row. Off (the default)
posts exactly today's legs. Meant to run with platformShards >= 2.
Max connections in the SQL engine's pool (DB_POOL_MAX). Null keeps each driver's default
of 10. Excess concurrent submits queue for a connection; a transaction holds exactly one
connection for its whole life, so the queue always drains.
How long (ms) topped-up funds must wait before they can be spent or paid out, keyed by funding source ("card", "crypto", "steam", "meta"); unlisted sources use "default".
Processing-attempt cap per inbound webhook; the inbox sweep dead-letters the row when it is reached or the failure is not retryable. Default 10.
Delivery-attempt cap per outbox event; the relay dead-letters the event when it is reached. Default 10.
Force-fail deadline (ms) for a SUBMITTED payout — unlike payoutSla.SUBMITTED, which only
schedules the next settle check.
Retryable-failure cap on a payout saga: at this many attempts the worker stops resubmitting, marks the saga FAILED, and returns the reserved credits to the seller's earned account. Default 5.
Failed-renewal cap per subscription; at this many attempts the sweep lapses the subscription instead of re-billing it. Default 10.
The window's exclusive end (epoch ms); see pauseStartMs for the gate.
Scheduled maintenance window (epoch ms): end-user discretionary writes decline as
ECONOMY_PAUSED while pauseStartMs <= now < pauseEndMs; either bound null means no window.
Settlement (actor 'system'), operator fixes, and reads are never gated.
Payout-rail fee in basis points: the processor's own cut, deducted from the disbursement so the seller receives the net. Not platform revenue.
Smallest payout a user may request, counted only against earned CREDIT — never bought or promo-granted.
Min time (ms) between payout requests. The default is 24h to match the live docs; a deployment bound by the 14-day legal requirement must set 1_209_600_000.
Time budget (ms) per payout-processing step, used to schedule when the worker next examines
a saga. PENDING delays the first submit pass after a request, SUBMITTED delays the next
check on a submitted payout, and DEFAULT covers either when unset.
Platform's cut in basis points (hundredths of a percent); 10000 = 100%, 1530 = 15.3%.
Rows each hot platform account is split across. Shard 0 keeps the bare id, so raising the count later is safe; only ever lower it back to 1.
Max clock skew (ms) the HTTP service accepts on a signed webhook's timestamp; a request dated outside the window is refused as a replay. Default 5 minutes.
Largest subscription price, in CREDIT minor units.
Smallest subscription price, in CREDIT minor units. A price outside the band is refused at subscribe time; the band keeps a typo'd price from silently binding a buyer.
OptionaltopThe purchase catalog: the only top-up amounts accepted, in CREDIT minor units. Stores sell credits in fixed bundles, so a deployment that mirrors its store sets the same list and a mispriced grant fails at submit. Unset means any positive amount.
OptionalvelocityCeiling for the inflow window (topUp, grantPromo) — card testing fills this one. Unset
means velocityLimitMinor.
The single-knob velocity ceiling (CREDIT minor units): both window classes fall back to it unless their own limit below is set. The default is demo-scale; production must state it.
OptionalvelocityCeiling for the outflow window (spend, subscribe, requestPayout) — a drained wallet fills
this one. Unset means velocityLimitMinor.
Length (ms) of the velocity window. Captured at store construction; changing it means a rebuild over the same store (the config object is frozen for exactly this reason).
All tunable policy settings in one object. Policy only — no secrets live here, so the whole object is safe to log; credentials ride in Secrets.
No module reads env vars itself; the startup program builds this once (via loadConfig) and passes it in, so a misconfigured deploy fails at startup rather than deep inside a request.
See
Configuration for every tunable and its default.