Brand Customization Release Notes - 2026-05-08
This note covers the operator-visible behavior changes shipped with the
brand-scoped customization rollout for servers_v2.
Required Operator Checks
- Public content is now brand-scoped at runtime. Reads for notices, user
notices, banners, promotions, and promotion events filter by the request
brand. Existing rows must have the intended
brand_id; one content row no longer automatically appears for every brand. - New brands need their own public content rows before traffic is routed to them. The historical backfill covers existing rows, but it does not create default announcements, banners, or promotions for future brands.
- Provider visibility is brand-scoped through
brand_provider_config. The first single-provider PATCH on a brand with no provider rows materializes the current globally visible provider snapshot, so later provider additions are not inherited by that brand until the brand policy is cleared or replaced.
Client And Integration Changes
site_settingstill returns the legacy flat fields, but it also includes the nested public brand config objects:brand,frontend_config,registration_policy,feature_policy,payment_policy, andsms_policy. Strict clients and generated DTOs need to allow these additional fields.POST /deposit/gate/supportandPOST /deposit/coin/supportnow requireX-Brand-Id. Direct internal health checks or scripts that called these routes without a brand header must be updated.POST /deposit/gate/createandPOST /deposit/coin/createnow validate the requested amount against the effective brand deposit min/max range. Requests that previously created an order with an out-of-range amount now returnInvalid deposit amount.
Policy Semantics
feature_policy.*_enabledis the maintenance or emergency kill-switch layer. Product/channel objects such asregistration_policyandpayment_policyare the normal operating policy layer. Runtime enablement is an AND across the relevant layers, so a feature only opens when both layers allow it.- For finance limits and Plisio settings, the
payment_policyobject wins over legacy scalar compatibility keys. New server-config exports should emit the policy object only. payment_policy.deposit_maintenance_enabledand maintenance time fields are tri-state. Omitted/null values fall back to legacyglobal_var;falseor an empty string is an explicit brand override.
Follow-Up Items
- Runtime brand config readers currently read PostgreSQL directly. This is acceptable for the rollout, but high-RPS paths such as login and game launch can add a short Redis cache with explicit invalidation if DB load becomes visible.
- The dual-layer policy model is intentional for this release, but admin UI
should label
feature_policyas an emergency/maintenance layer so operators do not confuse it with product-channel switches.